ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGEzNjc5YjEuLmU0ZjEyYzggMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw1ICsyLDYgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKKyAgICAic2VydmljZXMvKiIsCiAgICAgInNvdW5kdHJpZ2dlciIsCiBdCmRpZmYgLS1naXQgYS9jYW1lcmEvQW5kcm9pZC5icCBiL2NhbWVyYS9BbmRyb2lkLmJwCmluZGV4IGM3NmFlNTAuLjI0YjM5MTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9BbmRyb2lkLmJwCkBAIC0yOSwxMiArMjksNyBAQAogICAgICAgICAvLyBBSURMIGZpbGVzIGZvciBjYW1lcmEgaW50ZXJmYWNlcwogICAgICAgICAvLyBUaGUgaGVhZGVycyBmb3IgdGhlc2UgaW50ZXJmYWNlcyB3aWxsIGJlIGF2YWlsYWJsZSB0byBhbnkgbW9kdWxlcyB0aGF0CiAgICAgICAgIC8vIGluY2x1ZGUgbGliY2FtZXJhX2NsaWVudCwgYXQgdGhlIHBhdGggImFpZGwvcGFja2FnZS9wYXRoL0JuRm9vLmgiCi0gICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwiLAotCisgICAgICAgICI6bGliY2FtZXJhX2NsaWVudF9haWRsIiwKIAogICAgICAgICAvLyBTb3VyY2UgZm9yIGNhbWVyYSBpbnRlcmZhY2UgcGFyY2VsYWJsZXMsIGFuZCBtYW51YWxseS13cml0dGVuIGludGVyZmFjZXMKICAgICAgICAgIkNhbWVyYS5jcHAiLApAQCAtODEsMyArNzYsMjUgQEAKICAgICBdLAogCiB9CisKKy8vIEFJREwgaW50ZXJmYWNlIGJldHdlZW4gY2FtZXJhIGNsaWVudHMgYW5kIHRoZSBjYW1lcmEgc2VydmljZS4KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnRfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsIiwKKyAgICBdLAorfQorCisvLyBFeHRyYSBBSURMIGZpbGVzIHRoYXQgYXJlIHVzZWQgYnkgZnJhbWV3b3JrLmphciBidXQgbm90IGxpYmNhbWVyYV9jbGllbnQKKy8vIGJlY2F1c2UgdGhleSBoYXZlIGhhbmQtd3JpdHRlbiBuYXRpdmUgaW1wbGVtZW50YXRpb25zLgorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibGliY2FtZXJhX2NsaWVudF9mcmFtZXdvcmtfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmEuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYUNsaWVudC5haWRsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGFmOTc3YjguLjkwNzgwMmMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTU5LDcgKzU5LDggQEAKICAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCiAgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKICAgICAgICAgbUVycm9yKEFDQU1FUkFfT0spLAotICAgICAgICBtSWRsZSh0cnVlKSB7CisgICAgICAgIG1JZGxlKHRydWUpLAorICAgICAgICBtQ3VycmVudFNlc3Npb24obnVsbHB0cikgewogICAgIG1DbG9zaW5nID0gZmFsc2U7CiAgICAgLy8gU2V0dXAgbG9vcGVyIHRocmVhZCB0byBwZXJmcm9tIGRldmljZSBjYWxsYmFja3MgdG8gYXBwCiAgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CkBAIC05OCwxOCArOTksMzAgQEAKIAogLy8gRGV2aWNlIGNsb3NlIGltcGxlbWVudGFpdG9uCiBDYW1lcmFEZXZpY2U6On5DYW1lcmFEZXZpY2UoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKLSAgICBpZiAoIWlzQ2xvc2VkKCkpIHsKLSAgICAgICAgZGlzY29ubmVjdExvY2tlZCgpOwotICAgIH0KLSAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7Ci0gICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgICAgICBpZiAoIWlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RMb2NrZWQoc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgICAgICB9CiAgICAgfQogICAgIG1DYkxvb3Blci5jbGVhcigpOwogICAgIG1IYW5kbGVyLmNsZWFyKCk7CiB9CiAKK3ZvaWQKK0NhbWVyYURldmljZTo6cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKSB7CisgICAgbXNnLT5wb3N0KCk7CisgICAgbXNnLmNsZWFyKCk7CisgICAgc3A8QU1lc3NhZ2U+IGNsZWFudXBNc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbGVhblVwU2Vzc2lvbnMsIG1IYW5kbGVyKTsKKyAgICBjbGVhbnVwTXNnLT5wb3N0KCk7Cit9CisKIC8vIFRPRE86IGNhY2hlZCBjcmVhdGVkIHJlcXVlc3Q/CiBjYW1lcmFfc3RhdHVzX3QKIENhbWVyYURldmljZTo6Y3JlYXRlQ2FwdHVyZVJlcXVlc3QoCkBAIC0xNDYsMTQgKzE1OSwxNSBAQAogICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCiAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgewotICAgICAgICBtQ3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICBpZiAoY3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBjdXJyZW50U2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOwogICAgICAgICBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CiAgICAgfQogCkBAIC0yNjQsNyArMjc4LDcgQEAKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgbUlkbGUgPSBmYWxzZTsKICAgICBtQnVzeVNlc3Npb24gPSBzZXNzaW9uOwpAQCAtMzI4LDcgKzM0Miw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoc2Vzc2lvbiAhPSBtQ3VycmVudFNlc3Npb24pIHsKKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKICAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBvdGhlciBzZWVzaW9uIG9yIGRldmljZSBpcyBjbG9zZWQKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM0OSw3ICszNjMsNyBAQAogfQogCiB2b2lkCi1DYW1lcmFEZXZpY2U6OmRpc2Nvbm5lY3RMb2NrZWQoKSB7CitDYW1lcmFEZXZpY2U6OmRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbikgewogICAgIGlmIChtQ2xvc2luZy5leGNoYW5nZSh0cnVlKSkgewogICAgICAgICAvLyBBbHJlYWR5IGNsb3NpbmcsIGp1c3QgcmV0dXJuCiAgICAgICAgIEFMT0dXKCJDYW1lcmEgZGV2aWNlICVzIGlzIGFscmVhZHkgY2xvc2luZy4iLCBnZXRJZCgpKTsKQEAgLTM2MSw5ICszNzUsOCBAQAogICAgIH0KICAgICBtUmVtb3RlID0gbnVsbHB0cjsKIAotICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgewotICAgICAgICBtQ3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKLSAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKICAgICB9CiB9CiAKQEAgLTQwNCw3ICs0MTcsNyBAQAogICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gd2lsbCBjbG9zZQogICAgIC8vIHByZXZpb3VzIG9uZSBhbmQgdGh1cyByZWplY3QgYW55IEFQSSBjYWxsIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4KICAgICAvLyBCdXQgc3RpbGwgZ29vZCB0byBjaGVjayBoZXJlIGluIGNhc2Ugc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuLgotICAgIGlmIChzZXNzaW9uICE9IG1DdXJyZW50U2Vzc2lvbikgeworICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgewogICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHNlc3Npb24gJXAgaXMgbm90IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24hIiwgZ2V0SWQoKSwgc2Vzc2lvbik7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTQxNSwxMiArNDI4LDEzIEBACiAgICAgfQogCiAgICAgbUZsdXNoaW5nID0gdHJ1ZTsKKwogICAgIC8vIFNlbmQgb25BY3RpdmUgY2FsbGJhY2sgdG8gZ3VhcmFudGVlIHRoZXJlIGlzIGFsd2F5cyBhY3RpdmUtPnJlYWR5IHRyYW5zaXRpb24KICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7Ci0gICAgbXNnLT5wb3N0KCk7CisgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAKICAgICAvLyBJZiBkZXZpY2UgaXMgYWxyZWFkeSBpZGxpbmcsIHNlbmQgY2FsbGJhY2sgYW5kIGV4aXQgZWFybHkKICAgICBpZiAobUlkbGUpIHsKQEAgLTQyOCw3ICs0NDIsNyBAQAogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgICAgIG1GbHVzaGluZyA9IGZhbHNlOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKICAgICB9CkBAIC01NjgsNyArNTgyLDcgQEAKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgbUJ1c3lTZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CiAgICAgICAgIG1CdXN5U2Vzc2lvbi5jbGVhcigpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgfQogICAgIG1JZGxlID0gdHJ1ZTsKIApAQCAtNzI4LDcgKzc0Miw3IEBACiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQW53S2V5LCAodm9pZCopIGFudyk7CiAgICAgICAgIG1zZy0+c2V0SW50NjQoa0ZyYW1lTnVtYmVyS2V5LCBmcmFtZU51bWJlcik7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9IGVsc2UgeyAvLyBIYW5kbGUgb3RoZXIgY2FwdHVyZSBmYWlsdXJlcwogICAgICAgICAvLyBGaXJlIGNhcHR1cmUgZmFpbHVyZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUgcmVnaXN0ZXJlZAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkVycm9yID0gY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlRmFpbGVkOwpAQCAtNzQ2LDcgKzc2MCw3IEBACiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCBmYWlsdXJlKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogCiAgICAgICAgIC8vIFVwZGF0ZSB0cmFja2VyCiAgICAgICAgIG1GcmFtZU51bWJlclRyYWNrZXIudXBkYXRlVHJhY2tlcihmcmFtZU51bWJlciwgLyppc0Vycm9yKi90cnVlKTsKQEAgLTc2OSw2ICs3ODMsOSBAQAogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CiAgICAgICAgICAgICBBTE9HVigiJXM6IFJlY2VpdmVkIG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1doYXRDbGVhblVwU2Vzc2lvbnM6CisgICAgICAgICAgICBtQ2FjaGVkU2Vzc2lvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCIlczpFcnJvcjogdW5rbm93biBkZXZpY2UgY2FsbGJhY2sgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+d2hhdCgpKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTg0Miw2ICs4NTksNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbihzdGF0aWNfY2FzdDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5wdXNoKHNlc3Npb24pOwogICAgICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RTcCA9IG51bGxwdHI7CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKQEAgLTEwNTMsNyArMTA3MSw3IEBACiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOwogICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFVzZSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAgdG8gdHJhY2sKICAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKQEAgLTExMTAsNyArMTEyOCw3IEBACiAgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KICAgICAgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jawogICAgICAgICAgICAgY2JoLm1TZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gTm8gbmVlZCB0byB0cmFjayBzZXF1ZW5jZSBjb21wbGV0ZSBpZiB0aGVyZSBpcyBubyBjYWxsYmFjayByZWdpc3RlcmVkCkBAIC0xMTM3LDYgKzExNTUsNyBAQAogICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCiAgICAgfQogCisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gZGV2LT5tQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKICAgICBpZiAoZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZApAQCAtMTE0NSwxMCArMTE2NCwxMCBAQAogICAgICAgICBjYXNlIEVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIENhbWVyYSBpcyBkaXNjb25uZWN0ZWQsIGNsb3NlIHRoZSBzZXNzaW9uIGFuZCBleHBlY3Qgbm8gbW9yZSBjYWxsYmFja3MKLSAgICAgICAgICAgIGlmIChkZXYtPm1DdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgZGV2LT5tQ3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICBkZXYtPm1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2LT5tQ3VycmVudFNlc3Npb24gPSBudWxscHRyOwogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRGlzY29ubmVjdGVkLCBkZXYtPm1IYW5kbGVyKTsKICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOwogICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOwpAQCAtMTIxNiw2ICsxMjM1LDcgQEAKICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KKwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIGRldi0+bUhhbmRsZXIpOwogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgZGV2LT5tQnVzeVNlc3Npb24pOwpAQCAtMTIyMyw3ICsxMjQzLDcgQEAKICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNsZWFyIHRoZSBzcCBmaXJzdCBzbyB0aGUgc2Vzc2lvbiBkZXN0cnVjdG9yIGNhbgogICAgICAgICAvLyBvbmx5IGhhcHBlbiBvbiBoYW5kbGVyIHRocmVhZCAod2hlcmUgd2UgZG9uJ3QgaG9sZCBkZXZpY2Uvc2Vzc2lvbiBsb2NrKQogICAgICAgICBkZXYtPm1CdXN5U2Vzc2lvbi5jbGVhcigpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgZGV2LT5tSWRsZSA9IHRydWU7CiAgICAgZGV2LT5tRmx1c2hpbmcgPSBmYWxzZTsKQEAgLTEyNjUsNyArMTI4NSw3IEBACiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRJbnQ2NChrVGltZVN0YW1wS2V5LCB0aW1lc3RhbXApOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTEzMjgsNyArMTM0OCw3IEBACiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblJlc3VsdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCByZXN1bHQpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAKICAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKaW5kZXggODU1ZWZlMS4uNmVkMzg4MSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC00MSw3ICs0MSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVyCisvLyBXcmFwIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSBzbyBpdCBjYW4gYmUgcmVmLWNvdW50ZWQKIHN0cnVjdCBDYW1lcmFDYXB0dXJlRmFpbHVyZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHt9OwogCiBjbGFzcyBDYW1lcmFEZXZpY2UgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CkBAIC05Niw3ICs5Niw3IEBACiAgICAgLy8gZGV2aWNlIGdvZXMgaW50byBmYXRhbCBlcnJvciBzdGF0ZSBhZnRlciB0aGlzCiAgICAgdm9pZCBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpOwogCi0gICAgdm9pZCBkaXNjb25uZWN0TG9ja2VkKCk7IC8vIGRpc2Nvbm5lY3QgZnJvbSBjYW1lcmEgc2VydmljZQorICAgIHZvaWQgZGlzY29ubmVjdExvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+JiBzZXNzaW9uKTsgLy8gZGlzY29ubmVjdCBmcm9tIGNhbWVyYSBzZXJ2aWNlCiAKICAgICBjYW1lcmFfc3RhdHVzX3Qgc3RvcFJlcGVhdGluZ0xvY2tlZCgpOwogCkBAIC0xMzgsNiArMTM4LDkgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zTG9ja2VkKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogb3V0cHV0cyk7CiAKKyAgICAvLyBJbnB1dCBtZXNzYWdlIHdpbGwgYmUgcG9zdGVkIGFuZCBjbGVhcmVkIGFmdGVyIHRoaXMgcmV0dXJucworICAgIHZvaWQgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKTsKKwogICAgIHN0YXRpYyBjYW1lcmFfc3RhdHVzX3QgZ2V0SUdCUGZyb21BbncoCiAgICAgICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBvdXQpOwogCkBAIC0xODUsNyArMTg4LDkgQEAKICAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKICAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAotICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0IC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICAgICAga1doYXRDYXB0dXJlQnVmZmVyTG9zdCwvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgICAgIC8vIEludGVybmFsIGNsZWFudXAKKyAgICAgICAga1doYXRDbGVhblVwU2Vzc2lvbnMgICAvLyBDbGVhbnVwIGNhY2hlZCBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+CiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtEZXZpY2VLZXk7CkBAIC0xOTksMTAgKzIwNCwxNiBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrU2VxdWVuY2VJZEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0ZyYW1lTnVtYmVyS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQW53S2V5OworCiAgICAgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICAgIHB1YmxpYzoKLSAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkge30KICAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIC8vIFRoaXMgaGFuZGxlciB3aWxsIGNhY2hlIGFsbCBjYXB0dXJlIHNlc3Npb24gc3AgdW50aWwga1doYXRDbGVhblVwU2Vzc2lvbnMKKyAgICAgICAgLy8gaXMgcHJvY2Vzc2VkLiBUaGlzIGlzIHVzZWQgdG8gZ3VhcmFudGVlIHRoZSBsYXN0IHNlc3Npb24gcmVmZXJlbmNlIGlzIGFsd2F5cworICAgICAgICAvLyBiZWluZyByZW1vdmVkIGluIGNhbGxiYWNrIHRocmVhZCB3aXRob3V0IGhvbGRpbmcgY2FtZXJhIGRldmljZSBsb2NrCisgICAgICAgIFZlY3RvcjxzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+PiBtQ2FjaGVkU2Vzc2lvbnM7CiAgICAgfTsKICAgICBzcDxDYWxsYmFja0hhbmRsZXI+IG1IYW5kbGVyOwogCkBAIC0yMTAsNyArMjIxLDcgQEAKICAgICAgKiBDYXB0dXJlIHNlc3Npb24gcmVsYXRlZCBtZW1iZXJzICoKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgLy8gVGhlIGN1cnJlbnQgYWN0aXZlIHNlc3Npb24KLSAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisgICAgd3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBtQ3VycmVudFNlc3Npb247CiAgICAgYm9vbCBtRmx1c2hpbmcgPSBmYWxzZTsKIAogICAgIGludCBtTmV4dFNlc3Npb25JZCA9IDA7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAppbmRleCA5YjdmNmY0Li42YzllODVhIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKQEAgLTkwLDE4ICs5MCwxOCBAQAogfTsKIAogLyoqCi0gKiBDYW1lcmEgZGV2aWNlIHN0YXRlIGNhbGxiYWNrcyB0byBiZSB1c2VkIGluIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzfS4KKyAqIENhbWVyYSBkZXZpY2Ugc3RhdGUgY2FsbGJhY2tzIHRvIGJlIHVzZWQgaW4ge0BsaW5rIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3N9LgogICoKLSAqIEBwYXJhbSBjb250ZXh0IFRoZSBvcHRpb25hbCBjb250ZXh0IGluIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzfSB3aWxsIGJlCisgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgY29udGV4dCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrc30gd2lsbCBiZQogICogICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoaXMgY2FsbGJhY2suCiAgKiBAcGFyYW0gZGV2aWNlIFRoZSB7QGxpbmsgQUNhbWVyYURldmljZX0gdGhhdCBpcyBiZWluZyBkaXNjb25uZWN0ZWQuCiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFjaykodm9pZCogY29udGV4dCwgQUNhbWVyYURldmljZSogZGV2aWNlKTsKIAogLyoqCi0gKiBDYW1lcmEgZGV2aWNlIGVycm9yIHN0YXRlIGNhbGxiYWNrcyB0byBiZSB1c2VkIGluIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzfS4KKyAqIENhbWVyYSBkZXZpY2UgZXJyb3Igc3RhdGUgY2FsbGJhY2tzIHRvIGJlIHVzZWQgaW4ge0BsaW5rIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3N9LgogICoKLSAqIEBwYXJhbSBjb250ZXh0IFRoZSBvcHRpb25hbCBjb250ZXh0IGluIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzfSB3aWxsIGJlCisgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgY29udGV4dCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrc30gd2lsbCBiZQogICogICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoaXMgY2FsbGJhY2suCiAgKiBAcGFyYW0gZGV2aWNlIFRoZSB7QGxpbmsgQUNhbWVyYURldmljZX0gdGhhdCBpcyBiZWluZyBkaXNjb25uZWN0ZWQuCiAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIGNvZGUgZGVzY3JpYmVzIHRoZSBjYXVzZSBvZiB0aGlzIGVycm9yIGNhbGxiYWNrLiBTZWUgdGhlIGZvbG93aW5nCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgKgogICAgICAqLwogICAgIEFDYW1lcmFEZXZpY2VfRXJyb3JTdGF0ZUNhbGxiYWNrICBvbkVycm9yOwotfSBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzOworfSBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzOwogCiAvKioKICAqIENsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCBmcmVlIHRoaXMgQUNhbWVyYURldmljZSBzeW5jaHJvbm91c2x5LiBBY2Nlc3MgdG8gdGhlIEFDYW1lcmFEZXZpY2UKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmgKaW5kZXggNWI1Yzk4Yi4uZTViM2FkOCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmgKQEAgLTIzMiwxOCArMjMyLDE4IEBACiAgKiBwcmlvcml0eSB3aGVuIGFjY2Vzc2luZyB0aGUgY2FtZXJhLCBhbmQgdGhpcyBtZXRob2Qgd2lsbCBzdWNjZWVkIGV2ZW4gaWYgdGhlIGNhbWVyYSBkZXZpY2UgaXMKICAqIGluIHVzZSBieSBhbm90aGVyIGNhbWVyYSBBUEkgY2xpZW50LiBBbnkgbG93ZXItcHJpb3JpdHkgYXBwbGljYXRpb24gdGhhdCBsb3NlcyBjb250cm9sIG9mIHRoZQogICogY2FtZXJhIGluIHRoaXMgd2F5IHdpbGwgcmVjZWl2ZSBhbgotICoge0BsaW5rIEFDYW1lcmFEZXZpY2Vfc3RhdGVDYWxsYmFja3Mjb25EaXNjb25uZWN0ZWR9IGNhbGxiYWNrLjwvcD4KKyAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzI29uRGlzY29ubmVjdGVkfSBjYWxsYmFjay48L3A+CiAgKgogICogPHA+T25jZSB0aGUgY2FtZXJhIGlzIHN1Y2Nlc3NmdWxseSBvcGVuZWQsdGhlIEFDYW1lcmFEZXZpY2UgY2FuIHRoZW4gYmUgc2V0IHVwCiAgKiBmb3Igb3BlcmF0aW9uIGJ5IGNhbGxpbmcge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259IGFuZAogICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3R9LjwvcD4KICAqCiAgKiA8cD5JZiB0aGUgY2FtZXJhIGJlY29tZXMgZGlzY29ubmVjdGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbCByZXR1cm5zLAotICoge0BsaW5rIEFDYW1lcmFEZXZpY2Vfc3RhdGVDYWxsYmFja3Mjb25EaXNjb25uZWN0ZWR9IHdpdGggYQorICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3Mjb25EaXNjb25uZWN0ZWR9IHdpdGggYQogICogQUNhbWVyYURldmljZSBpbiB0aGUgZGlzY29ubmVjdGVkIHN0YXRlIHdpbGwgYmUgY2FsbGVkLjwvcD4KICAqCiAgKiA8cD5JZiB0aGUgY2FtZXJhIHJ1bnMgaW50byBlcnJvciBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwgcmV0dXJucywKLSAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzI29uRXJyb3J9IHdpdGggYQorICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3Mjb25FcnJvcn0gd2l0aCBhCiAgKiBBQ2FtZXJhRGV2aWNlIGluIHRoZSBlcnJvciBzdGF0ZSB3aWxsIGJlIGNhbGxlZC48L3A+CiAgKgogICogQHBhcmFtIG1hbmFnZXIgdGhlIHtAbGluayBBQ2FtZXJhTWFuYWdlcn0gb2YgaW50ZXJlc3QuCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0FuZHJvaWQuYnAgYi9kcm0vY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggMDA5OGM4OS4uMTU1MmMzZiAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL2RybS9jb21tb24vQW5kcm9pZC5icApAQCAtMzMsNiArMzMsOCBAQAogICAgICAgICAiUmVhZFdyaXRlVXRpbHMuY3BwIiwKICAgICBdLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIHN0YXRpY19saWJzOiBbImxpYmJpbmRlciJdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLmJwCmluZGV4IDBjMGI2ZjIuLjczNzJlYjcgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLmJwCkBAIC0xOSw1ICsxOSw3IEBACiAKICAgICBzcmNzOiBbInNyYy9NaW1lVHlwZVV0aWwuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCmluZGV4IDNmMGY1ZjcuLjI4YTc4YWEgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCkBAIC0yMSw2ICsyMSw5IEBACiAgICAgICAgICItRFVTRV82NEJJVF9EUk1fQVBJIiwKICAgICAgICAgLy8gVGhlIGZsYWcgYmVsb3cgdHVybnMgb24gbG9jYWwgZGVidWcgcHJpbnRvdXRzCiAgICAgICAgIC8vIi1ERFJNX09NQV9GTF9FTkdJTkVfREVCVUciLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCiAgICAgXSwKIAogICAgIHNyY3M6IFsic3JjL0Z3ZExvY2tFbmdpbmUuY3BwIl0sCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAppbmRleCA4MzBkZWY5Li43M2VlYTg5IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKQEAgLTUwMiw4ICs1MDIsOCBAQAogICAgICAgICBpbnQgcmV0VmFsID0gRndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHkoZmlsZURlc2MpOwogICAgICAgICBEZWNvZGVTZXNzaW9uKiBkZWNvZGVTZXNzaW9uID0gbmV3IERlY29kZVNlc3Npb24oZmlsZURlc2MpOwogCi0gICAgICAgIGlmIChyZXRWYWwgJiYgTlVMTCAhPSBkZWNvZGVTZXNzaW9uKSB7Ci0gICAgICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLmFkZFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCwgZGVjb2RlU2Vzc2lvbik7CisgICAgICAgIGlmIChyZXRWYWwgJiYgTlVMTCAhPSBkZWNvZGVTZXNzaW9uICYmCisgICAgICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLmFkZFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCwgZGVjb2RlU2Vzc2lvbikpIHsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBtaW1lPSBGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShmaWxlRGVzYyk7CiAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRUeXBlID0gU3RyaW5nOChwbWltZSA9PSBOVUxMID8gIiIgOiBwbWltZSk7CiAgICAgICAgICAgICBjb250ZW50VHlwZS50b0xvd2VyKCk7CkBAIC01MTMsNyArNTEzLDExIEBACiAgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CiAgICAgICAgICAgICByZXN1bHQgPSBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gSW50ZWdyaXR5IENoZWNrIGZhaWxlZCBmb3IgdGhlIGZkIik7CisgICAgICAgICAgICBpZiAocmV0VmFsICYmIE5VTEwgIT0gZGVjb2RlU2Vzc2lvbikgeworICAgICAgICAgICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gSW50ZWdyaXR5IENoZWNrIGZhaWxlZCBmb3IgdGhlIGZkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gRGVjb2RlU2Vzc3Npb24gaW5zZXJ0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKGZpbGVEZXNjKTsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNvZGVTZXNzaW9uOwogICAgICAgICB9CkBAIC02MzEsNyArNjM1LDcgQEAKICAgICBzc2l6ZV90IHNpemUgPSAtMTsKIAogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYKLSAgICAgICBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICYmCisgICAgICAgIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgJiYKICAgICAgICAgTlVMTCAhPSBidWZmZXIgJiYKICAgICAgICAgbnVtQnl0ZXMgPiAtMSkgewogICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5icAppbmRleCA2OThmMjc4Li4zYmUzMjdhIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5icApAQCAtMTksNiArMTksOCBAQAogCiAgICAgc3JjczogWyJGd2RMb2NrR2x1ZS5jIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsibGliY3J5cHRvIl0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQuYnAKaW5kZXggMzNmMmZlMC4uZDRlMDRiOCAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDggQEAKIAogICAgIHNyY3M6IFsiRndkTG9ja0NvbnYuYyJdLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIHNoYXJlZF9saWJzOiBbImxpYmNyeXB0byJdLAogICAgIHN0YXRpY19saWJzOiBbImxpYmZ3ZGxvY2stY29tbW9uIl0sCiAKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5icAppbmRleCBiNmQ3YTA2Li4wYmYyNzM3IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSw4IEBACiAKICAgICBzcmNzOiBbIkZ3ZExvY2tGaWxlLmMiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBzaGFyZWRfbGliczogWyJsaWJjcnlwdG8iXSwKICAgICBzdGF0aWNfbGliczogWyJsaWJmd2Rsb2NrLWNvbW1vbiJdLAogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwCmluZGV4IDFkY2Y4OWMuLjA1YjY0NDAgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwCkBAIC0zMiw1ICszMiw3IEBACiAgICAgY2ZsYWdzOiBbCiAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIGZsYWcgdG8gZW5hYmxlIHRoZSBkZWNyeXB0aW9uIHBhc3N0aHJ1IGZsb3cKICAgICAgICAgLy8iLURFTkFCTEVfUEFTU1RIUlVfREVDUllQVElPTiIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCBmOTA2NTY0Li4wYzE0MjAxIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtMzQsOCArMzQsOCBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcAppbmRleCAxZmRjNmUxLi4yMTE0ZDQwIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkJ1ZmZlclR5cGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwpAQCAtMjI3LDYgKzIyOCw5IEBACiAgKiBhcmUgc2VudCBieSBwcm92aWRpbmcgYW4gb2Zmc2V0IGludG8gdGhlIGhlYXAgYW5kIGEgYnVmZmVyIHNpemUuCiAgKi8KIGludDMyX3QgQ3J5cHRvSGFsOjpzZXRIZWFwQmFzZShjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXApIHsKKyAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpmcm9tSGVhcDsKKyAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpIaWRsTWVtb3J5OworCiAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgic2V0SGVhcEJhc2UoKTogaGVhcCBpcyBOVUxMIik7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTI0MCwxMiArMjQ0LDkgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaW50MzJfdCBzZXFOdW0gPSBtSGVhcFNlcU51bSsrOwotICAgIGludCBmZCA9IGhlYXAtPmdldEhlYXBJRCgpOwotICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGF1dG8gaGlkbEhhbmRsZSA9IGhpZGxfaGFuZGxlKG5hdGl2ZUhhbmRsZSk7Ci0gICAgYXV0byBoaWRsTWVtb3J5ID0gaGlkbF9tZW1vcnkoImFzaG1lbSIsIGhpZGxIYW5kbGUsIGhlYXAtPmdldFNpemUoKSk7CisgICAgc3A8SGlkbE1lbW9yeT4gaGlkbE1lbW9yeSA9IGZyb21IZWFwKGhlYXApOwogICAgIG1IZWFwQmFzZXMuYWRkKHNlcU51bSwgbU5leHRCdWZmZXJJZCk7Ci0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKGhpZGxNZW1vcnksIG1OZXh0QnVmZmVySWQrKyk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKCpoaWRsTWVtb3J5LCBtTmV4dEJ1ZmZlcklkKyspOwogICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CiAgICAgcmV0dXJuIHNlcU51bTsKIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCmluZGV4IGNiNjlmOTEuLmVhYTMzOTAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcApAQCAtODksNyArODksNyBAQAogICAgIC8vIGFzc2V0X2lkIGNoYW5nZS4gSWYgaXQgc2VuZHMgYW4gRWNtQ29udGFpbmVyIHdpdGggMiBFY21zIHdpdGggZGlmZmVyZW50CiAgICAgLy8gYXNzZXRfaWRzIChvbGQgYW5kIG5ldykgdGhlbiBpdCBtaWdodCBiZSBiZXN0IHRvIHByZWZldGNoIHRoZSBFbW0uCiAgICAgaWYgKChhc3NldF8uaWQoKSAhPSAwKSAmJiAoKmFzc2V0X2lkICE9IGFzc2V0Xy5pZCgpKSkgewotICAgICAgICBBTE9HVygiQXNzZXRfaWQgY2hhbmdlIGZyb20gJSIgUFJJdTY0ICIgdG8gJSIgUFJJdTY0LCBhc3NldF8uaWQoKSwgKmFzc2V0X2lkKTsKKyAgICAgICAgQUxPR1coIkFzc2V0X2lkIGNoYW5nZSBmcm9tICVsbHUgdG8gJSIgUFJJdTY0LCBhc3NldF8uaWQoKSwgKmFzc2V0X2lkKTsKICAgICAgICAgYXNzZXRfLkNsZWFyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVNlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCmluZGV4IGZhZWEwMDguLjRiNDA1MWQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC05NSw3ICs5NSw3IEBACiB2b2lkIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmRlc3Ryb3lQbHVnaW4oQ2FzUGx1Z2luICpwbHVnaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKIAotICAgIGZvciAoc3NpemVfdCBpbmRleCA9IG1JRFRvU2Vzc2lvbk1hcC5zaXplKCkgLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7CisgICAgZm9yIChzc2l6ZV90IGluZGV4ID0gKHNzaXplX3QpbUlEVG9TZXNzaW9uTWFwLnNpemUoKSAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHsKICAgICAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0gbUlEVG9TZXNzaW9uTWFwLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAoc2Vzc2lvbi0+Z2V0UGx1Z2luKCkgPT0gcGx1Z2luKSB7CiAgICAgICAgICAgICBtSURUb1Nlc3Npb25NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAppbmRleCA2ZTEwMDRjLi5lZThkYmEzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKQEAgLTM2LDggKzM2LDYgQEAKIGNvbnN0IFN0cmluZzgga0Nhc1R5cGVUYWcoImNhc190eXBlIik7CiBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7CiAKLWNvbnN0IHVpbnQzMl90IGtLZXlMZW5ndGggPSAxNjsKLQogSnNvbkFzc2V0TG9hZGVyOjpKc29uQXNzZXRMb2FkZXIoKSB7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKaW5kZXggN2QyOTY1OS4uMjE4Y2UzNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKQEAgLTM4LDggKzM4LDYgQEAKIGNvbnN0IHVpbnQxNl90IGtUb3RhbEVjbVNpemUgPQogICAgICAgICBrRWNtQ2xlYXJGaWVsZHNTaXplICsga0NvbnRlbnRLZXlCeXRlU2l6ZTsgLy8gY2xlYXIgZmllbGRzICsgY2xlYXIga2V5CiAKLWNvbnN0IHVpbnQzMl90IGtLZXlMZW5ndGggPSAxNjsKLQogI2RlZmluZSBVTkFMSUdORURfTE9BRDMyKF9wKSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oX3ApKQogCiBzdGF0aWMgdWludDMyX3QgTG9hZDMyKGNvbnN0IHZvaWQgKnApIHsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0NsZWFyS2V5RmV0Y2hlclRlc3QuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKaW5kZXggYWNlMDg2YS4uZDEyY2ZlYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKQEAgLTkzLDcgKzkzLDcgQEAKICAgICB1aW50NjRfdCBhc3NldF9pZDsKICAgICBzdGQ6OnZlY3RvcjxLZXlGZXRjaGVyOjpLZXlJbmZvPiBrZXlzOwogICAgIEVYUEVDVF9FUShPSywgZmV0Y2hlci5PYnRhaW5LZXkoZWNtXywgJmFzc2V0X2lkLCAma2V5cykpOwotICAgIEVYUEVDVF9FUSgyLCBrZXlzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDJVLCBrZXlzLnNpemUoKSk7CiAgICAgRVhQRUNUX0VRKDAsIGtleXNbMF0ua2V5X2lkKTsKICAgICBFWFBFQ1RfRVEoY29udGVudF9rZXlfWzBdLT5zaXplKCksIGtleXNbMF0ua2V5X2J5dGVzLT5zaXplKCkpOwogICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoY29udGVudF9rZXlfWzBdLT5kYXRhKCksCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcAppbmRleCAxOGNkOWE0Li4wNjUxNmI1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKQEAgLTQ5LDggKzQ5LDggQEAKIAogc3RhdHVzX3QgTW9ja0Nhc0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIHVpbnQ2NF90IGFwcERhdGEsCi0gICAgICAgIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICB1aW50NjRfdCAvKmFwcERhdGEqLywKKyAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgLypjYWxsYmFjayovLAogICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIHsKICAgICBpZiAoIWlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtOTgsNyArOTgsNyBAQAogICAgIE1vY2tTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmRlc3Ryb3lQbHVnaW4odGhpcyk7CiB9CiAKLXN0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEgJmRhdGEpIHsKK3N0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEmIC8qZGF0YSovKSB7CiAgICAgQUxPR1YoInNldFByaXZhdGVEYXRhIik7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAKIHN0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFNlc3Npb25Qcml2YXRlRGF0YSgKLSAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IENhc0RhdGEgJmRhdGEpIHsKKyAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IENhc0RhdGEmIC8qZGF0YSovKSB7CiAgICAgQUxPR1YoInNldFNlc3Npb25Qcml2YXRlRGF0YTogc2Vzc2lvbklkPSVzIiwKICAgICAgICAgICAgIGFycmF5VG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiRUNNOiBzaXplPSVkIiwgZWNtLnNpemUoKSk7CisgICAgQUxPR1YoIkVDTTogc2l6ZT0lenUiLCBlY20uc2l6ZSgpKTsKICAgICBBTE9HVigiRUNNOiBkYXRhPSVzIiwgYXJyYXlUb1N0cmluZyhlY20pLnN0cmluZygpKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTE1NiwxNCArMTU2LDE0IEBACiAgICAgQUxPR1YoInByb2Nlc3NFbW0iKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKLSAgICBBTE9HVigiRU1NOiBzaXplPSVkIiwgZW1tLnNpemUoKSk7CisgICAgQUxPR1YoIkVNTTogc2l6ZT0lenUiLCBlbW0uc2l6ZSgpKTsKICAgICBBTE9HVigiRU1NOiBkYXRhPSVzIiwgYXJyYXlUb1N0cmluZyhlbW0pLnN0cmluZygpKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6c2VuZEV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIHsKKyAgICAgICAgaW50MzJfdCBldmVudCwgaW50IC8qYXJnKi8sIGNvbnN0IENhc0RhdGEmIC8qZXZlbnREYXRhKi8pIHsKICAgICBBTE9HVigic2VuZEV2ZW50OiBldmVudD0lZCIsIGV2ZW50KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTE3OCw3ICsxNzgsNyBAQAogfQogCiBzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpyZWZyZXNoRW50aXRsZW1lbnRzKAotICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCBDYXNEYXRhICZyZWZyZXNoRGF0YSkgeworICAgICAgICBpbnQzMl90IC8qcmVmcmVzaFR5cGUqLywgY29uc3QgQ2FzRGF0YSAmcmVmcmVzaERhdGEpIHsKICAgICBBTE9HVigicmVmcmVzaEVudGl0bGVtZW50czogcmVmcmVzaERhdGE9JXMiLCBhcnJheVRvU3RyaW5nKHJlZnJlc2hEYXRhKS5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAgICAgaW50MzJfdCBzcmNPZmZzZXQsCiAgICAgICAgIHZvaWQgKmRzdFB0ciwKICAgICAgICAgaW50MzJfdCBkc3RPZmZzZXQsCi0gICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSB7CisgICAgICAgIEFTdHJpbmcqIC8qZXJyb3JEZXRhaWxNc2cqLykgewogICAgIEFMT0dWKCJNb2NrRGVzY3JhbWJsZXJQbHVnaW46OmRlc2NyYW1ibGUoc2VjdXJlPSVkLCBzY3RybD0lZCwiCiAgICAgICAgICAgInN1YlNhbXBsZXM9JXMsIHNyY1B0cj0lcCwgZHN0UHRyPSVwLCBzcmNPZmZzZXQ9JWQsIGRzdE9mZnNldD0lZCkiLAogICAgICAgICAgIChpbnQpc2VjdXJlLCAoaW50KXNjcmFtYmxpbmdDb250cm9sLApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAKaW5kZXggMjk3M2ZjZi4uMzg1ODE1YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLmJwCkBAIC0zNSw2ICszNSw4IEBACiAgICAgdmVuZG9yOiB0cnVlLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogIm1lZGlhZHJtIiwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAppbmRleCAwZmNmYzY0Li5lYTE3YmJiIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTIxLDYgKzIxLDggQEAKICAgICBuYW1lOiAiQ2xlYXJLZXlEcm1Vbml0VGVzdCIsCiAgICAgdmVuZG9yOiB0cnVlLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIHNyY3M6IFsKICAgICAgICAgIkFlc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCIsCiAgICAgICAgICJJbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcCIsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKaW5kZXggYWJkMTg4NC4uZGQyYWQ3YiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icApAQCAtMzIsNSArMzIsNyBAQAogICAgIGNmbGFnczogWwogICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBmbGFnIHRvIGVuYWJsZSB0aGUgZGVjcnlwdGlvbiBwYXNzdGhydSBmbG93CiAgICAgICAgIC8vIi1ERU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwCmluZGV4IDU2NDQ3NGYuLjE3MTEyNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcApAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgICAgIGlmIChuZXh0SWZkID09IE5VTEwpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmZCA9IG5leHRJZmQ7CisgICAgICAgIGlmZCA9IHN0ZDo6bW92ZShuZXh0SWZkKTsKICAgICB9CiAgICAgcmV0dXJuIGlmZDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKaW5kZXggNmU2MGYyNC4uZjAwZjdhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKQEAgLTI4LDMgKzI4LDEwIEBACiAgICAgZmlyc3RfdmVyc2lvbjogIjI2IiwKICAgICB1bnZlcnNpb25lZF91bnRpbDogImN1cnJlbnQiLAogfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhYXVkaW9faGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK3N1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmUwMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCmluZGV4IDliMWNlMmMuLmEwYjk4MWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw3IEBACiAKICMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgogTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3IuY3BwCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KIExPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKQEAgLTIyLDYgKzIzLDcgQEAKICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwogCiBMT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwogTE9DQUxfTU9EVUxFIDo9IGlucHV0X21vbml0b3JfY2FsbGJhY2sKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCmluZGV4IDlmZWIxMTguLmU1YWQyZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKQEAgLTQwLDcgKzQwLDYgQEAKICAgICBpbnQgYWN0dWFsU2FtcGxlc1BlckZyYW1lOwogICAgIGludCBhY3R1YWxTYW1wbGVSYXRlOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICBhY3R1YWxEYXRhRm9ybWF0OwotICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxTaGFyaW5nTW9kZTsKIAogICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGU7CkBAIC01NCw3ICs1Myw2IEBACiAgICAgaW50NjRfdCBwcmV2aW91c0ZyYW1lUG9zaXRpb24gPSAtMTsKICAgICBpbnQxNl90ICpkYXRhID0gbnVsbHB0cjsKICAgICBmbG9hdCBwZWFrTGV2ZWwgPSAwLjA7Ci0gICAgaW50IGxvb3BDb3VudGVyID0gMDsKICAgICBpbnQzMl90IGRldmljZUlkOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCmluZGV4IGQ3OGYyODYuLjFmZTNkZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKQEAgLTksNiArOSw3IEBACiAKICMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgogTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2xvb3BiYWNrLmNwcAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCiBMT0NBTF9NT0RVTEUgOj0gYWF1ZGlvX2xvb3BiYWNrCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKaW5kZXggMjFjZjM0MS4uMjc2YjQ1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKQEAgLTQzMiw5ICs0MzIsNyBAQAogICAgICAgICAgICAgaW50IG5lZWRsZVNpemUgPSAoaW50KSAoc2l6ZW9mKHNfSW1wdWxzZSkgLyBzaXplb2YoZmxvYXQpKTsKICAgICAgICAgICAgIGZsb2F0ICpoYXlzdGFjayA9IGF1ZGlvUmVjb3JkZXIuZ2V0RGF0YSgpOwogICAgICAgICAgICAgaW50IGhheXN0YWNrU2l6ZSA9IGF1ZGlvUmVjb3JkZXIuc2l6ZSgpOwotICAgICAgICAgICAgaW50IHJlc3VsdCA9IG1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zKGhheXN0YWNrLCBoYXlzdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGxlLCBuZWVkbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXRlbmN5UmVwb3J0KTsKKyAgICAgICAgICAgIG1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zKGhheXN0YWNrLCBoYXlzdGFja1NpemUsIG5lZWRsZSwgbmVlZGxlU2l6ZSwgJmxhdGVuY3lSZXBvcnQpOwogICAgICAgICAgICAgaWYgKGxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSA8IDAuMDEpIHsKICAgICAgICAgICAgICAgICBwcmludGYoIiAgIEVSUk9SIC0gY29uZmlkZW5jZSB0b28gbG93ID0gJWZcbiIsIGxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTgwLDcgKzU3OCw2IEBACiAKICAgICBpbnQgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDUwMDsKICAgICBpbnQgICAgICAgICAgIG1Mb29wQ291bnRlciA9IDA7Ci0gICAgaW50ICAgICAgICAgICBtTG9vcFN0YXJ0ID0gMTAwMDsKICAgICBmbG9hdCAgICAgICAgIG1QdWxzZVRocmVzaG9sZCA9IDAuMDJmOwogICAgIGZsb2F0ICAgICAgICAgbVNpbGVuY2VUaHJlc2hvbGQgPSAwLjAwMmY7CiAgICAgZmxvYXQgICAgICAgICBtTWVhc3VyZWRMb29wR2FpbiA9IDAuMGY7CkBAIC02NTEsNyArNjQ4LDYgQEAKICAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgb3ZlcnJpZGUgewotICAgICAgICBmbG9hdCBzYW1wbGU7CiAgICAgICAgIGZsb2F0IHBlYWsgPSBtZWFzdXJlUGVha0FtcGxpdHVkZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOwogICAgICAgICBpZiAocGVhayA+IG1QZWFrQW1wbGl0dWRlKSB7CiAgICAgICAgICAgICBtUGVha0FtcGxpdHVkZSA9IHBlYWs7CkBAIC03NzksOCArNzc1LDYgQEAKICAgICBpbnQzMl90IG1GcmFtZUNvdW50ZXIgPSAwOwogICAgIGZsb2F0ICAgbU91dHB1dEFtcGxpdHVkZSA9IDAuNzU7CiAKLSAgICBpbnQzMl90IG1aZXJvQ3Jvc3NpbmdzID0gMDsKLQogICAgIFBzZXVkb1JhbmRvbSAgbVdoaXRlTm9pc2U7CiAgICAgZmxvYXQgICBtTm9pc2VBbXBsaXR1ZGUgPSAwLjAwOyAvLyBVc2VkIHRvIGV4cGVyaW1lbnQgd2l0aCB3YXJibGluZyBjYXVzZWQgYnkgRFJDLgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCmluZGV4IGRmMGRmMDQuLmI2NzhkOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCkBAIC0xOSw5ICsxOSwxMiBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KQEAgLTI1NCwyNCArMjU3LDE3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCByZXF1ZXN0ZWRJbnB1dFNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGludCAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCA9IE5VTV9JTlBVVF9DSEFOTkVMUzsKLSAgICBjb25zdCBpbnQgICAgICAgICAgICAgcmVxdWVzdGVkT3V0cHV0Q2hhbm5lbENvdW50ID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludCAgICAgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlID0gMDsKICAgICBjb25zdCBhYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW5wdXRGb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CiAgICAgY29uc3QgYWF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZE91dHB1dEZvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICBhY3R1YWxJbnB1dEZvcm1hdDsKICAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsT3V0cHV0Rm9ybWF0OwotICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3Qgb3V0cHV0UGVyZm9ybWFuY2VMZXZlbCA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgaW5wdXRQZXJmb3JtYW5jZUxldmVsID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k7CiAKICAgICBpbnQgdGVzdE1vZGUgPSBURVNUX0VDSE9fTEFURU5DWTsKICAgICBkb3VibGUgZ2FpbiA9IDEuMDsKIAotICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gMDsKICAgICBmbG9hdCAqb3V0cHV0RGF0YSA9IE5VTEw7Ci0gICAgZG91YmxlIGRldmlhdGlvbjsKLSAgICBkb3VibGUgbGF0ZW5jeTsKLSAgICBpbnQzMl90IGJ1cnN0c1BlckJ1ZmZlciA9IDE7IC8vIHNpbmdsZSBidWZmZXJlZAogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgKaW5kZXggYzE3OWNlNi4uNDZiODg5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaApAQCAtMTgsOCArMTgsMTAgQEAKICNkZWZpbmUgQUFVRElPX0VYQU1QTEVfVVRJTFNfSAogCiAjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKQEAgLTMwLDYgKzMyLDcgQEAKICNkZWZpbmUgTkFOT1NfUEVSX01JTExJU0VDT05EIChOQU5PU19QRVJfTUlDUk9TRUNPTkQgKiAxMDAwKQogI2RlZmluZSBOQU5PU19QRVJfU0VDT05EICAgICAgKE5BTk9TX1BFUl9NSUxMSVNFQ09ORCAqIDEwMDApCiAKK3RlbXBsYXRlIDxjbGFzcyBUID0gYWF1ZGlvX3NoYXJpbmdfbW9kZV90PgogY29uc3QgY2hhciAqZ2V0U2hhcmluZ01vZGVUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBtb2RlKSB7CiAgICAgY29uc3QgY2hhciAqdGV4dCA9ICJ1bmtub3duIjsKICAgICBzd2l0Y2ggKG1vZGUpIHsKQEAgLTc4LDEzICs4MSwxNSBAQAogICAgIHJldHVybiB0ZXh0OwogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0TmFub3NlY29uZHNUb1RpbWVzcGVjKGludDY0X3QgbmFub3NlY29uZHMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgewordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ2NF90Pgordm9pZCBjb252ZXJ0TmFub3NlY29uZHNUb1RpbWVzcGVjKGludDY0X3QgbmFub3NlY29uZHMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgewogICAgIHRpbWUtPnR2X3NlYyA9IG5hbm9zZWNvbmRzIC8gTkFOT1NfUEVSX1NFQ09ORDsKICAgICAvLyBDYWxjdWxhdGUgdGhlIGZyYWN0aW9uYWwgbmFub3NlY29uZHMuIEF2b2lkcyBleHBlbnNpdmUgJSBvcGVyYXRpb24uCiAgICAgdGltZS0+dHZfbnNlYyA9IG5hbm9zZWNvbmRzIC0gKHRpbWUtPnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQpOwogfQogCi1zdGF0aWMgaW50NjRfdCBnZXROYW5vc2Vjb25kcyhjbG9ja2lkX3QgY2xvY2tJZCA9IENMT0NLX01PTk9UT05JQykgewordGVtcGxhdGUgPGNsYXNzIFQgPSBjbG9ja2lkX3Q+CitpbnQ2NF90IGdldE5hbm9zZWNvbmRzKGNsb2NraWRfdCBjbG9ja0lkID0gQ0xPQ0tfTU9OT1RPTklDKSB7CiAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWU7CiAgICAgaW50IHJlc3VsdCA9IGNsb2NrX2dldHRpbWUoY2xvY2tJZCwgJnRpbWUpOwogICAgIGlmIChyZXN1bHQgPCAwKSB7CkBAIC05Myw3ICs5OCw4IEBACiAgICAgcmV0dXJuICh0aW1lLnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQpICsgdGltZS50dl9uc2VjOwogfQogCi1zdGF0aWMgdm9pZCBkaXNwbGF5UGVha0xldmVsKGZsb2F0IHBlYWtMZXZlbCkgewordGVtcGxhdGUgPGNsYXNzIFQgPSBmbG9hdD4KK3ZvaWQgZGlzcGxheVBlYWtMZXZlbChmbG9hdCBwZWFrTGV2ZWwpIHsKICAgICBwcmludGYoIiU1LjNmICIsIHBlYWtMZXZlbCk7CiAgICAgY29uc3QgaW50IG1heFN0YXJzID0gNTA7IC8vIGFyYml0cmFyeSwgZml0cyBvbiBvbmUgbGluZQogICAgIGludCBudW1TdGFycyA9IChpbnQpIChwZWFrTGV2ZWwgKiBtYXhTdGFycyk7CkBAIC0xMTEsNyArMTE3LDggQEAKICAqIEBwYXJhbSBzYW1wbGVSYXRlCiAgKiBAcmV0dXJuIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzCiAgKi8KLXN0YXRpYyBkb3VibGUgY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyhpbnQ2NF90IHBvc2l0aW9uMSwgaW50NjRfdCBuYW5vc2Vjb25kczEsCit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGludDY0X3Q+Citkb3VibGUgY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyhpbnQ2NF90IHBvc2l0aW9uMSwgaW50NjRfdCBuYW5vc2Vjb25kczEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uMiwgaW50NjRfdCBuYW5vc2Vjb25kczIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZVJhdGUpIHsKICAgICBpbnQ2NF90IGRlbHRhRnJhbWVzID0gcG9zaXRpb24yIC0gcG9zaXRpb24xOwpAQCAtMTI1LDcgKzEzMiw4IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBUaGVzZSBGdXRleCBjYWxscyBhcmUgY29tbW9uIG9ubGluZSBleGFtcGxlcy4KLXN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBzeXNfZnV0ZXgodm9pZCAqYWRkcjEsIGludCBvcCwgaW50IHZhbDEsCit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGludD4KK2FuZHJvaWQ6OnN0YXR1c190IHN5c19mdXRleCh2b2lkICphZGRyMSwgaW50IG9wLCBpbnQgdmFsMSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQsIHZvaWQgKmFkZHIyLCBpbnQgdmFsMykgewogICAgIGFuZHJvaWQ6OnN0YXR1c190IHJlc3VsdCA9IChhbmRyb2lkOjpzdGF0dXNfdCkgc3lzY2FsbChTWVNfZnV0ZXgsIGFkZHIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCwgdmFsMSwgdGltZW91dCwKQEAgLTEzMywxMiArMTQxLDE0IEBACiAgICAgcmV0dXJuIChyZXN1bHQgPT0gMCkgPyAwIDogLWVycm5vOwogfQogCi1zdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZnV0ZXhfd2FrZSh2b2lkICphZGRyLCBpbnQgbnVtV2FrZSkgewordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ+CithbmRyb2lkOjpzdGF0dXNfdCBmdXRleF93YWtlKHZvaWQgKmFkZHIsIGludCBudW1XYWtlKSB7CiAgICAgLy8gVXNlIF9QUklWQVRFIGJlY2F1c2Ugd2UgYXJlIGp1c3QgdXNpbmcgdGhlIGZ1dGV4IGluIG9uZSBwcm9jZXNzLgogICAgIHJldHVybiBzeXNfZnV0ZXgoYWRkciwgRlVURVhfV0FLRV9QUklWQVRFLCBudW1XYWtlLCBOVUxMLCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGZ1dGV4X3dhaXQodm9pZCAqYWRkciwgaW50IGN1cnJlbnQsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgewordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ+CithbmRyb2lkOjpzdGF0dXNfdCBmdXRleF93YWl0KHZvaWQgKmFkZHIsIGludCBjdXJyZW50LCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpIHsKICAgICAvLyBVc2UgX1BSSVZBVEUgYmVjYXVzZSB3ZSBhcmUganVzdCB1c2luZyB0aGUgZnV0ZXggaW4gb25lIHByb2Nlc3MuCiAgICAgcmV0dXJuIHN5c19mdXRleChhZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIGN1cnJlbnQsIHRpbWUsIE5VTEwsIDApOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5tawppbmRleCBkNjMwZTc2Li4xYTFiZDQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5tawpAQCAtMTAsNiArMTAsNyBAQAogCiAjIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KIExPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy93cml0ZV9zaW5lLmNwcAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCiBMT0NBTF9NT0RVTEUgOj0gd3JpdGVfc2luZQogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCkBAIC0yMiw2ICsyMyw3IEBACiAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKIAogTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KIExPQ0FMX01PRFVMRSA6PSB3cml0ZV9zaW5lX2NhbGxiYWNrCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcAppbmRleCA2NzdmYjZjLi44YzZmNzgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwCkBAIC00NCw3ICs0NCw2IEBACiAgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOwogICAgIGludDMyX3QgIGZyYW1lc1BlckJ1cnN0ID0gMDsKICAgICBpbnQzMl90ICBmcmFtZXNQZXJXcml0ZSA9IDA7Ci0gICAgaW50MzJfdCAgYnVmZmVyQ2FwYWNpdHkgPSAwOwogICAgIGludDMyX3QgIGZyYW1lc1RvUGxheSA9IDA7CiAgICAgaW50MzJfdCAgZnJhbWVzTGVmdCA9IDA7CiAgICAgaW50MzJfdCAgeFJ1bkNvdW50ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg4MzNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjYgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhYXVkaW8iLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJiaW5kaW5nIiwKKyAgICAgICAgImNsaWVudCIsCisgICAgICAgICJjb3JlIiwKKyAgICAgICAgImZpZm8iLAorICAgICAgICAibGVnYWN5IiwKKyAgICAgICAgInV0aWxpdHkiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2hlYWRlcnMiXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmFhdWRpb19oZWFkZXJzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJjb3JlL0F1ZGlvU3RyZWFtLmNwcCIsCisgICAgICAgICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAiLAorICAgICAgICAiY29yZS9BQXVkaW9BdWRpby5jcHAiLAorICAgICAgICAiY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCIsCisgICAgICAgICJsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIiwKKyAgICAgICAgImxlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAiLAorICAgICAgICAibGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIiwKKyAgICAgICAgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmNwcCIsCisgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIiwKKyAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5jcHAiLAorICAgICAgICAidXRpbGl0eS9MaW5lYXJSYW1wLmNwcCIsCisgICAgICAgICJmaWZvL0ZpZm9CdWZmZXIuY3BwIiwKKyAgICAgICAgImZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCIsCisgICAgICAgICJjbGllbnQvQXVkaW9FbmRwb2ludC5jcHAiLAorICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIiwKKyAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAiLAorICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCIsCisgICAgICAgICJjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCIsCisgICAgICAgICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAiLAorICAgICAgICAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIiwKKyAgICAgICAgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAiLAorICAgICAgICAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAiLAorICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAorICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisKKyAgICAgICAgLy8gQnkgZGVmYXVsdCwgYWxsIHN5bWJvbHMgYXJlIGhpZGRlbi4KKyAgICAgICAgLy8gIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAvLyBBQVVESU9fQVBJIGlzIHVzZWQgdG8gZXhwbGljaXRseSBleHBvcnQgYSBmdW5jdGlvbiBvciBhIHZhcmlhYmxlIGFzIGEgdmlzaWJsZSBzeW1ib2wuCisgICAgICAgICItREFBVURJT19BUEk9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJhdWRpb21hbmFnZXIiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjEyNDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jID09PT09PT09PT09PT09PT09PT09PT09IFNUQVRJQyBMSUJSQVJZID09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRoaXMgaXMgYmVpbmcgYnVpbHQgYmVjYXVzZSBpdCBtYWtlIEFBdWRpbyB0ZXN0aW5nIHZlcnkgZWFzeSB3aXRoIGEgY29tcGxldGUgZXhlY3V0YWJsZS4KLSMgVE9ETyBSZW1vdmUgdGhpcyB0YXJnZXQgbGF0ZXIsIHdoZW4gbm90IG5lZWRlZC4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MSUJBQVVESU9fRElSIDo9ICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpbwotTElCQUFVRElPX1NSQ19ESVIgOj0gJChMSUJBQVVESU9fRElSKS9zcmMKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCi0gICAgc3lzdGVtL2NvcmUvYmFzZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUgXAotICAgICQoTE9DQUxfUEFUSCkgXAotICAgICQoTE9DQUxfUEFUSCkvYmluZGluZyBcCi0gICAgJChMT0NBTF9QQVRIKS9jbGllbnQgXAotICAgICQoTE9DQUxfUEFUSCkvY29yZSBcCi0gICAgJChMT0NBTF9QQVRIKS9maWZvIFwKLSAgICAkKExPQ0FMX1BBVEgpL2xlZ2FjeSBcCi0gICAgJChMT0NBTF9QQVRIKS91dGlsaXR5Ci0KLSMgSWYgeW91IGFkZCBhIGZpbGUgaGVyZSB0aGVuIGFsc28gYWRkIGl0IGJlbG93IGluIHRoZSBTSEFSRUQgdGFyZ2V0Ci1MT0NBTF9TUkNfRklMRVMgPSBcCi0gICAgY29yZS9BdWRpb1N0cmVhbS5jcHAgXAotICAgIGNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCBcCi0gICAgY29yZS9BQXVkaW9BdWRpby5jcHAgXAotICAgIGNvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgXAotICAgIGxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgXAotICAgIGxlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgXAotICAgIGxlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCBcCi0gICAgdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIFwKLSAgICB1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmNwcCBcCi0gICAgdXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmNwcCBcCi0gICAgdXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmNwcCBcCi0gICAgdXRpbGl0eS9MaW5lYXJSYW1wLmNwcCBcCi0gICAgZmlmby9GaWZvQnVmZmVyLmNwcCBcCi0gICAgZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIFwKLSAgICBjbGllbnQvQXVkaW9FbmRwb2ludC5jcHAgXAotICAgIGNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCBcCi0gICAgY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBcCi0gICAgY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCBcCi0gICAgY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAgXAotICAgIGJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwIFwKLSAgICBiaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAgXAotICAgIGJpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAgXAotICAgIGJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgXAotICAgIGJpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAgXAotICAgIGJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwIFwKLSAgICBiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCBcCi0gICAgYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBcCi0gICAgYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby11bnVzZWQtcGFyYW1ldGVyIC1XYWxsIC1XZXJyb3IKLQotIyBCeSBkZWZhdWx0LCBhbGwgc3ltYm9scyBhcmUgaGlkZGVuLgotIyBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotIyBBQVVESU9fQVBJIGlzIHVzZWQgdG8gZXhwbGljaXRseSBleHBvcnQgYSBmdW5jdGlvbiBvciBhIHZhcmlhYmxlIGFzIGEgdmlzaWJsZSBzeW1ib2wuCi1MT0NBTF9DRkxBR1MgKz0gLURBQVVESU9fQVBJPSdfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKScKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCi0jID09PT09PT09PT09PT09PT09PT09PT09IFNIQVJFRCBMSUJSQVJZID09PT09PT09PT09PT09PT09PT09PT09PT09Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCi0gICAgc3lzdGVtL2NvcmUvYmFzZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICAkKExPQ0FMX1BBVEgpIFwKLSAgICAkKExPQ0FMX1BBVEgpL2JpbmRpbmcgXAotICAgICQoTE9DQUxfUEFUSCkvY2xpZW50IFwKLSAgICAkKExPQ0FMX1BBVEgpL2NvcmUgXAotICAgICQoTE9DQUxfUEFUSCkvZmlmbyBcCi0gICAgJChMT0NBTF9QQVRIKS9sZWdhY3kgXAotICAgICQoTE9DQUxfUEFUSCkvdXRpbGl0eQotCi1MT0NBTF9TUkNfRklMRVMgPSBjb3JlL0F1ZGlvU3RyZWFtLmNwcCBcCi0gICAgY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwIFwKLSAgICBjb3JlL0FBdWRpb0F1ZGlvLmNwcCBcCi0gICAgY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBcCi0gICAgbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBcCi0gICAgbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBcCi0gICAgbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIFwKLSAgICB1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgXAotICAgIHV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIFwKLSAgICB1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIFwKLSAgICB1dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuY3BwIFwKLSAgICB1dGlsaXR5L0xpbmVhclJhbXAuY3BwIFwKLSAgICBmaWZvL0ZpZm9CdWZmZXIuY3BwIFwKLSAgICBmaWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAgXAotICAgIGNsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBcCi0gICAgY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIFwKLSAgICBjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIFwKLSAgICBjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIFwKLSAgICBjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCBcCi0gICAgYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAgXAotICAgIGJpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcCBcCi0gICAgYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCBcCi0gICAgYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBcCi0gICAgYmluZGluZy9JQUF1ZGlvQ2xpZW50LmNwcCBcCi0gICAgYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAgXAotICAgIGJpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwIFwKLSAgICBiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIFwKLSAgICBiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgotCi0jIEJ5IGRlZmF1bHQsIGFsbCBzeW1ib2xzIGFyZSBoaWRkZW4uCi0jIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCi0jIEFBVURJT19BUEkgaXMgdXNlZCB0byBleHBsaWNpdGx5IGV4cG9ydCBhIGZ1bmN0aW9uIG9yIGEgdmFyaWFibGUgYXMgYSB2aXNpYmxlIHN5bWJvbC4KLUxPQ0FMX0NGTEFHUyArPSAtREFBVURJT19BUEk9J19fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpJwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmF1ZGlvY2xpZW50IGxpYmxvZyBsaWJjdXRpbHMgbGlidXRpbHMgbGliYmluZGVyIGxpYmF1ZGlvbWFuYWdlcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCmluZGV4IDI0NTA5MjAuLjYxMmFkMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCkBAIC0zMjMsNyArMzIzLDcgQEAKICAgICBjb25zdCBpbnQzMl90IG1heEJ5dGVzUGVyRnJhbWUgPSBtYXhDaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgLy8gUHJldmVudCBvdmVyZmxvdyBieSBsaW1pdGluZyBtdWx0aXBsaWNhbmRzLgogICAgIGlmIChieXRlc1BlckZyYW1lID4gbWF4Qnl0ZXNQZXJGcmFtZSB8fCBudW1GcmFtZXMgPiAoMHgzRkZGRkZGRiAvIG1heEJ5dGVzUGVyRnJhbWUpKSB7Ci0gICAgICAgIEFMT0dFKCJzaXplIG92ZXJmbG93LCBudW1GcmFtZXMgPSAlZCwgZnJhbWVTaXplID0gJXpkIiwgbnVtRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKKyAgICAgICAgQUxPR0UoInNpemUgb3ZlcmZsb3csIG51bUZyYW1lcyA9ICVkLCBmcmFtZVNpemUgPSAlZCIsIG51bUZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KICAgICAqc2l6ZUluQnl0ZXMgPSBudW1GcmFtZXMgKiBieXRlc1BlckZyYW1lOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0F1ZGlvQ2xvY2suaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BdWRpb0Nsb2NrLmgKaW5kZXggNDNiNzFiMC4uZDVkNGVmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0F1ZGlvQ2xvY2suaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQXVkaW9DbG9jay5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIFVUSUxJVFlfQVVESU9fQ0xPQ0tfSAogI2RlZmluZSBVVElMSVRZX0FVRElPX0NMT0NLX0gKIAorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzU2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDg4IEBACitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9hYXVkaW9fbWFyc2hhbGxpbmciLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9tYXJzaGFsbGluZy5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Jsb2NrX2FkYXB0ZXIiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9ibG9ja19hZGFwdGVyLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF90aW1lc3RhbXBzIiwKKyAgICBzcmNzOiBbInRlc3RfdGltZXN0YW1wcy5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9saW5lYXJfcmFtcCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2xpbmVhcl9yYW1wLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9vcGVuX3BhcmFtcyIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X29wZW5fcGFyYW1zLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3Rfbm9fY2xvc2UiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9ub19jbG9zZS5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2FhdWRpb19yZWNvdmVyeSIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X3JlY292ZXJ5LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3Rfbl9zdHJlYW1zIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3Rfbl9zdHJlYW1zLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjAxMGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X21hcnNoYWxsaW5nLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYmluZGVyIGxpYmN1dGlscyBsaWJ1dGlscwotTE9DQUxfTU9EVUxFIDo9IHRlc3RfYWF1ZGlvX21hcnNoYWxsaW5nCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X2Jsb2NrX2FkYXB0ZXIuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHRlc3RfYmxvY2tfYWRhcHRlcgotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMKLUxPQ0FMX1NSQ19GSUxFUzo9IHRlc3RfdGltZXN0YW1wcy5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF90aW1lc3RhbXBzCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X2xpbmVhcl9yYW1wLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X2xpbmVhcl9yYW1wCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X29wZW5fcGFyYW1zLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYmluZGVyIGxpYmN1dGlscyBsaWJ1dGlscwotTE9DQUxfTU9EVUxFIDo9IHRlc3Rfb3Blbl9wYXJhbXMKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKLUxPQ0FMX1NSQ19GSUxFUzo9IHRlc3Rfbm9fY2xvc2UuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJiaW5kZXIgbGliY3V0aWxzIGxpYnV0aWxzCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF9ub19jbG9zZQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9yZWNvdmVyeS5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmJpbmRlciBsaWJjdXRpbHMgbGlidXRpbHMKLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X2FhdWRpb19yZWNvdmVyeQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9uX3N0cmVhbXMuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJiaW5kZXIgbGliY3V0aWxzIGxpYnV0aWxzCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF9uX3N0cmVhbXMKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X25fc3RyZWFtcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9uX3N0cmVhbXMuY3BwCmluZGV4IDI3MWQwMjQuLmUyZDRhODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X25fc3RyZWFtcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfbl9zdHJlYW1zLmNwcApAQCAtNzEsNyArNzEsNiBAQAogCiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CiAKLWZpbmlzaDoKICAgICByZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9vcGVuX3BhcmFtcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9vcGVuX3BhcmFtcy5jcHAKaW5kZXggMDFiODc5OS4uMzQ1MTI0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfb3Blbl9wYXJhbXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X29wZW5fcGFyYW1zLmNwcApAQCAtMjUsMjEgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRTaGFyaW5nTW9kZVRleHQoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpIHsKLSAgICBjb25zdCBjaGFyICptb2RlVGV4dCA9ICJ1bmtub3duIjsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOgotICAgICAgICBtb2RlVGV4dCA9ICJFWENMVVNJVkUiOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOgotICAgICAgICBtb2RlVGV4dCA9ICJTSEFSRUQiOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIG1vZGVUZXh0OwotfQotCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgTXlEYXRhQ2FsbGJhY2tQcm9jKAogICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKQEAgLTY3LDcgKzUyLDYgQEAKICAgICBpbnQzMl90IGFjdHVhbENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gMDsKICAgICBhYXVkaW9fZm9ybWF0X3QgYWN0dWFsRGF0YUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGFjdHVhbFNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGFjdHVhbERpcmVjdGlvbjsKIAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmVjb3ZlcnkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmVjb3ZlcnkuY3BwCmluZGV4IDcyNjhhMzAuLjZlODlmODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JlY292ZXJ5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9yZWNvdmVyeS5jcHAKQEAgLTIzLDI0ICsyMyw5IEBACiAKICNkZWZpbmUgREVGQVVMVF9USU1FT1VUX05BTk9TICAoKGludDY0X3QpMTAwMDAwMDAwMCkKIAotc3RhdGljIGNvbnN0IGNoYXIgKmdldFNoYXJpbmdNb2RlVGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSkgewotICAgIGNvbnN0IGNoYXIgKm1vZGVUZXh0ID0gInVua25vd24iOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOgotICAgICAgICAgICAgbW9kZVRleHQgPSAiRVhDTFVTSVZFIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOgotICAgICAgICAgICAgbW9kZVRleHQgPSAiU0hBUkVEIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBtb2RlVGV4dDsKLX0KLQogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgKHZvaWQpIGFyZ2M7Ci0gICAgKHZvaWQgKilhcmd2OworICAgICh2b2lkKSBhcmd2OwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIApAQCAtNTIsNyArMzcsNiBAQAogICAgIGludDMyX3QgYWN0dWFsQ2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSAwOwogICAgIGFhdWRpb19mb3JtYXRfdCBhY3R1YWxEYXRhRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7Ci0gICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGFjdHVhbFNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKICAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCmluZGV4IGZiMzYzZTcuLmI1N2YwYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCkBAIC0xMTEsOCArMTExLDYgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCiAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IDA7Ci0gICAgZmxvYXQgKmJ1ZmZlciA9IG51bGxwdHI7Ci0KICAgICBpbnQzMl90IGFjdHVhbENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gMDsKICAgICBpbnQzMl90IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IDA7CkBAIC0yODcsNyArMjg1LDcgQEAKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgKHZvaWQpIGFyZ2M7Ci0gICAgKHZvaWQgKikgYXJndjsKKyAgICAodm9pZCkgYXJndjsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKaW5kZXggMzUyOWQyYy4uYzY2MjJjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKQEAgLTEzOTEsMTQgKzEzOTEsMTQgQEAKIAogICAgICAgICBib29sIHVzZUNhc2VBbGxvd2VkID0gc2hhcmVkQnVmZmVyIHx8IHRyYW5zZmVyQWxsb3dlZDsKICAgICAgICAgaWYgKCF1c2VDYXNlQWxsb3dlZCkgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkLCBub3Qgc2hhcmVkIGJ1ZmZlciBhbmQgdHJhbnNmZXIgPSAlcyIsCisgICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50LCBub3Qgc2hhcmVkIGJ1ZmZlciBhbmQgdHJhbnNmZXIgPSAlcyIsCiAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQobVRyYW5zZmVyKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzYW1wbGUgcmF0ZXMgbXVzdCBhbHNvIG1hdGNoCiAgICAgICAgIGJvb2wgc2FtcGxlUmF0ZUFsbG93ZWQgPSBtU2FtcGxlUmF0ZSA9PSBtQWZTYW1wbGVSYXRlOwogICAgICAgICBpZiAoIXNhbXBsZVJhdGVBbGxvd2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIHJhdGVzIGRvIG5vdCBtYXRjaCAldSBIeiwgcmVxdWlyZSAldSBIeiIsCisgICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50LCBzYW1wbGUgcmF0ZSAldSBIeiBidXQgSEFMIG5lZWRzICV1IEh6IiwKICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtQWZTYW1wbGVSYXRlKTsKICAgICAgICAgfQogCkBAIC0xNTc2LDYgKzE1NzYsMTUgQEAKICAgICAgICAgICAgIC8vIG9yIGF0IGxlYXN0IHRyaXBsZS1idWZmZXJpbmcgaWYgdGhlcmUgaXMgc2FtcGxlIHJhdGUgY29udmVyc2lvbgogICAgICAgICAgICAgY29uc3QgaW50IG5CdWZmZXJpbmcgPSBtT3JpZ2luYWxTYW1wbGVSYXRlID09IG1BZlNhbXBsZVJhdGUgPyAyIDogMzsKICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IGZyYW1lQ291bnQgLyBuQnVmZmVyaW5nOworICAgICAgICAgICAgLy8gSWYgY2xpZW50IHJlcXVlc3RlZCBhIGZhc3QgdHJhY2sgYnV0IHRoaXMgd2FzIGRlbmllZCwgdGhlbiB1c2UgdGhlIHNtYWxsZXIgbWF4aW11bS4KKyAgICAgICAgICAgIC8vIEZNU18yMCBpcyB0aGUgbWluaW11bSB0YXNrIHdha2V1cCBwZXJpb2QgaW4gbXMgZm9yIHdoaWNoIENGUyBvcGVyYXRlcyByZWxpYWJseS4KKyNkZWZpbmUgRk1TXzIwIDIwICAgLy8gRklYTUUgc2hhcmUgYSBjb21tb24gZGVjbGFyYXRpb24gd2l0aCB0aGUgc2FtZSBzeW1ib2wgaW4gVGhyZWFkcy5jcHAKKyAgICAgICAgICAgIGlmIChtT3JpZ0ZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBtYXhOb3RpZmljYXRpb25GcmFtZXNGYXN0RGVuaWVkID0gRk1TXzIwICogbVNhbXBsZVJhdGUgLyAxMDAwOworICAgICAgICAgICAgICAgIGlmIChtYXhOb3RpZmljYXRpb25GcmFtZXMgPiBtYXhOb3RpZmljYXRpb25GcmFtZXNGYXN0RGVuaWVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IG1heE5vdGlmaWNhdGlvbkZyYW1lc0Zhc3REZW5pZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IG1heE5vdGlmaWNhdGlvbkZyYW1lcykgewogICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCA5YmMyNTk0Li5jZmI1YmU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcApAQCAtNzQwLDYgKzc0MCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKICAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCiAgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9SQURJT19BQ0sKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzc1LCAud2F2ZUZyZXEgPSB7IDQwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDM3NSwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfR0JfQlVTWQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzUwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMjUsIC53YXZlRnJlcSA9IHsgNDAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTI1LCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9HQl9DT05HRVNUSU9OCiAgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDAsIDQ1MCwgMCB9LCAwLCAwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgNDUwLCAwIH0sIDAsIDAgfSwKQEAgLTc0Nyw2ICs3NTksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKICAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCiAgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9HQl9SSU5HVE9ORQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyA0MDAsIDQyNSwgNDUwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQVVTVFJBTElBX0RJQUwKICAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgNDUwLCAwIH0sIDAsIDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAwLCA0NTAsIDAgfSwgMCwgMCB9LApAQCAtNzcxLDYgKzc4Nyw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKICAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCiAgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9BVVNUUkFMSUFfQ09OR0VTVElPTgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA3NTAsIC53YXZlRnJlcSA9IHsgNDI1LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNzUwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TR19CVVNZCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDEsIDQyNSwgNDQ5LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAxLCA0MjUsIDQ0OSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NHX1JJTkdUT05FCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSEtfQlVTWQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDQwLCA0ODAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0NDAsIDQ4MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0hLX1JJTkdUT05FCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDAsIDQ1MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgNDUwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0lFX1JJTkdUT05FCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDE4MCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0NTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9JRV9DQUxMX1dBSVRJTkcKIH07CiAKIC8vIFVzZWQgYnkgVG9uZUdlbmVyYXRvcjo6Z2V0VG9uZUZvclJlZ2lvbigpIHRvIGNvbnZlcnQgdXNlciBzcGVjaWZpZWQgc3VwZXJ2aXNvcnkgdG9uZSB0eXBlCkBAIC03OTcsOSArODUxLDkgQEAKICAgICAgICAgICAgIFRPTkVfU1VQX1JJTkdUT05FICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKICAgICAgICAgfSwKICAgICAgICAgeyAgIC8vIEdCCi0gICAgICAgICAgICBUT05FX1NVUF9ESUFMLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKLSAgICAgICAgICAgIFRPTkVfU1VQX0JVU1ksICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQotICAgICAgICAgICAgVE9ORV9TVVBfQ09OR0VTVElPTiwgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCisgICAgICAgICAgICBUT05FX0FOU0lfRElBTCwgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKKyAgICAgICAgICAgIFRPTkVfR0JfQlVTWSwgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQorICAgICAgICAgICAgVE9ORV9HQl9DT05HRVNUSU9OLCAgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCiAgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSwogICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwsICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAogICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgpAQCAtODA3LDcgKzg2MSw3IEBACiAgICAgICAgICAgICBUT05FX0dCX1JJTkdUT05FICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCiAgICAgICAgIH0sCiAgICAgICAgIHsgICAvLyBBVVNUUkFMSUEKLSAgICAgICAgICAgIFRPTkVfQU5TSV9ESUFMLCAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCisgICAgICAgICAgICBUT05FX0FVU1RSQUxJQV9ESUFMLCAgICAgICAgLy8gVE9ORV9TVVBfRElBTAogICAgICAgICAgICAgVE9ORV9BVVNUUkFMSUFfQlVTWSwgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKICAgICAgICAgICAgIFRPTkVfQVVTVFJBTElBX0NPTkdFU1RJT04sICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCiAgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgLy8gVE9ORV9TVVBfUkFESU9fQUNLCkBAIC04MTUsNiArODY5LDM2IEBACiAgICAgICAgICAgICBUT05FX1NVUF9FUlJPUiwgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKICAgICAgICAgICAgIFRPTkVfQVVTVFJBTElBX0NBTExfV0FJVElORywvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKICAgICAgICAgICAgIFRPTkVfQVVTVFJBTElBX1JJTkdUT05FICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQorICAgICAgICB9LAorICAgICAgICB7ICAgLy8gU0lOR0FQT1JFCisgICAgICAgICAgICBUT05FX1NVUF9ESUFMLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKKyAgICAgICAgICAgIFRPTkVfU0dfQlVTWSwgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQorICAgICAgICAgICAgVE9ORV9TVVBfQ09OR0VTVElPTiwgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSworICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwsICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAorICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgorICAgICAgICAgICAgVE9ORV9TVVBfQ0FMTF9XQUlUSU5HLCAgICAgICAvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKKyAgICAgICAgICAgIFRPTkVfU0dfUklOR1RPTkUgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKKyAgICAgICAgfSwKKyAgICAgICAgeyAgIC8vIEhPTkdLT05HCisgICAgICAgICAgICBUT05FX1NVUF9ESUFMLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKKyAgICAgICAgICAgIFRPTkVfSEtfQlVTWSwgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQorICAgICAgICAgICAgVE9ORV9TVVBfQ09OR0VTVElPTiwgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSworICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwsICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAorICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgorICAgICAgICAgICAgVE9ORV9TVVBfQ0FMTF9XQUlUSU5HLCAgICAgICAvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKKyAgICAgICAgICAgIFRPTkVfSEtfUklOR1RPTkUgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKKyAgICAgICAgfSwKKyAgICAgICAgeyAgIC8vIElSRUxBTkQKKyAgICAgICAgICAgIFRPTkVfU1VQX0RJQUwsICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRElBTAorICAgICAgICAgICAgVE9ORV9TVVBfQlVTWSwgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9CVVNZCisgICAgICAgICAgICBUT05FX1NVUF9DT05HRVNUSU9OLCAgICAgICAgIC8vIFRPTkVfU1VQX0NPTkdFU1RJT04KKyAgICAgICAgICAgIFRPTkVfU1VQX1JBRElPX0FDSywgICAgICAgICAgLy8gVE9ORV9TVVBfUkFESU9fQUNLCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19OT1RBVkFJTCwgICAgIC8vIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMCisgICAgICAgICAgICBUT05FX1NVUF9FUlJPUiwgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0VSUk9SCisgICAgICAgICAgICBUT05FX0lFX0NBTExfV0FJVElORywgICAgICAgIC8vIFRPTkVfU1VQX0NBTExfV0FJVElORworICAgICAgICAgICAgVE9ORV9JRV9SSU5HVE9ORSAgICAgICAgICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQogICAgICAgICB9CiB9OwogCkBAIC04NjQsNiArOTQ4LDEzIEBACiAgICAgaWYgKHByb3BlcnR5X2dldCgiZ3NtLm9wZXJhdG9yLmlzby1jb3VudHJ5IiwgdmFsdWUsICIiKSA9PSAwKSB7CiAgICAgICAgIHByb3BlcnR5X2dldCgiZ3NtLnNpbS5vcGVyYXRvci5pc28tY291bnRyeSIsIHZhbHVlLCAiIik7CiAgICAgfQorICAgIC8vIElmIGR1YWwgc2ltIGRldmljZSBoYXMgdHdvIFNJTSBjYXJkcyBpbnNlcnRlZCBhbmQgaXMgbm90IHJlZ2lzdGVyZCB0byBhbnkgbmV0d29yaywKKyAgICAvLyAiLCIgaXMgc2V0IHRvICJnc20ub3BlcmF0b3IuaXNvLWNvdW50cnkiIHByb3AuCisgICAgLy8gSW4gdGhpcyBjYXNlLCAiZ3NtLnNpbS5vcGVyYXRvci5pc28tY291bnRyeSIgcHJvcCBzaG91bGQgYmUgdXNlZC4KKyAgICBpZiAoc3RybGVuKHZhbHVlKSA9PSAxICYmIHN0cnN0cih2YWx1ZSwgIiwiKSAhPSBOVUxMKSB7CisgICAgICAgIHByb3BlcnR5X2dldCgiZ3NtLnNpbS5vcGVyYXRvci5pc28tY291bnRyeSIsIHZhbHVlLCAiIik7CisgICAgfQorCiAgICAgaWYgKHN0cnN0cih2YWx1ZSwgInVzIikgIT0gTlVMTCB8fAogICAgICAgICBzdHJzdHIodmFsdWUsICJjYSIpICE9IE5VTEwpIHsKICAgICAgICAgbVJlZ2lvbiA9IEFOU0k7CkBAIC04NzMsNiArOTY0LDEyIEBACiAgICAgICAgIG1SZWdpb24gPSBHQjsKICAgICB9IGVsc2UgaWYgKHN0cnN0cih2YWx1ZSwgImF1IikgIT0gTlVMTCkgewogICAgICAgICBtUmVnaW9uID0gQVVTVFJBTElBOworICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHZhbHVlLCAic2ciKSAhPSBOVUxMKSB7CisgICAgICAgIG1SZWdpb24gPSBTSU5HQVBPUkU7CisgICAgfSBlbHNlIGlmIChzdHJzdHIodmFsdWUsICJoayIpICE9IE5VTEwpIHsKKyAgICAgICAgbVJlZ2lvbiA9IEhPTkdLT05HOworICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHZhbHVlLCAiaWUiKSAhPSBOVUxMKSB7CisgICAgICAgIG1SZWdpb24gPSBJUkVMQU5EOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1SZWdpb24gPSBDRVBUOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKaW5kZXggZmMzZDNlZS4uMjQ3NzAzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiAKICAgICAvLyBSZWdpb24gc3BlY2lmaWMgdG9uZXMuCi0gICAgLy8gVGhlc2Ugc3VwZXJ2aXNvcnkgdG9uZXMgYXJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvbiAoVVNBL0NBTkFEQSwgSkFQQU4sIHJlc3Qgb2YgdGhlIHdvcmxkKS4KKyAgICAvLyBUaGVzZSBzdXBlcnZpc29yeSB0b25lcyBhcmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uIChVU0EvQ0FOQURBLCBKQVBBTiwgU2luZ2Fwb3JlLCBIb25nIEtvbmcsIHJlc3Qgb2YgdGhlIHdvcmxkKS4KICAgICAvLyBXaGVuIGEgdG9uZSBpbiB0aGUgcmFuZ2UgW0ZJUlNUX1NVUF9UT05FLCBMQVNUX1NVUF9UT05FXSBpcyByZXF1ZXN0ZWQsIHRoZSByZWdpb24gaXMgZGV0ZXJtaW5lZAogICAgIC8vIGZyb20gc3lzdGVtIHByb3BlcnR5IGdzbS5vcGVyYXRvci5pc28tY291bnRyeSBhbmQgdGhlIHByb3BlciB0b25lIGRlc2NyaXB0b3IgaXMgc2VsZWN0ZWQgd2l0aCB0aGUKICAgICAvLyBoZWxwIG9mIHNUb25lTWFwcGluZ1RhYmxlW10KQEAgLTE5NCwxMiArMTk0LDI0IEBACiAgICAgICAgIFRPTkVfSkFQQU5fQlVTWSwgICAgICAgICAgICAvLyBCdXN5IHRvbmU6IDQwMEh6LCA1MDBtcyBPTiwgNTAwbXMgT0ZGLi4uCiAgICAgICAgIFRPTkVfSkFQQU5fUkFESU9fQUNLLCAgICAgICAvLyBSYWRpbyBwYXRoIGFja25vd2xlZ21lbnQ6IDQwMEh6LCAxcyBPTiwgMnMgT0ZGLi4uCiAgICAgICAgIC8vIEdCIFN1cGVydmlzb3J5IHRvbmVzCisgICAgICAgIFRPTkVfR0JfQlVTWSwgICAgICAgICAgICAgICAvLyBCdXN5IHRvbmU6IDQwMCBIeiwgMzc1bXMgT04sIDM3NW1zIE9GRi4uLgorICAgICAgICBUT05FX0dCX0NPTkdFU1RJT04sICAgICAgICAgLy8gQ29uZ2VzdGlvbiBUb25lOiA0MDAgSHosIDQwMG1zIE9OLCAzNTBtcyBPRkYsIDIyNW1zIE9OLCA1MjVtcyBPRkYuLi4KICAgICAgICAgVE9ORV9HQl9SSU5HVE9ORSwgICAgICAgICAgIC8vIFJpbmcgVG9uZTogQSA0MDBIeiArIDQ1MEh6IHRvbmUgcmVwZWF0ZWQgaW4gYSAwLjRzIG9uLCAwLjJzIG9mZiwgMC40cyBvbiwgMi4wcyBvZmYgcGF0dGVybi4KICAgICAgICAgLy8gQVVTVFJBTElBIFN1cGVydmlzb3J5IHRvbmVzCisgICAgICAgIFRPTkVfQVVTVFJBTElBX0RJQUwsICAgICAgICAvLyBEaWFsIHRvbmU6IDQyNSBIeiB0b25lIG1vZHVsYXRlZCB3aXRoIDI1IEh6LCBjb250aW51b3VzCiAgICAgICAgIFRPTkVfQVVTVFJBTElBX1JJTkdUT05FLCAgICAvLyBSaW5nIHRvbmU6IEEgNDAwSHogKyA0NTBIeiB0b25lIHJlcGVhdGVkIGluIGEgMC40cyBvbiwgMC4ycyBvZmYsIDAuNHMgb24sIDIuMHMgb2ZmIHBhdHRlcm4uCiAgICAgICAgIFRPTkVfQVVTVFJBTElBX0JVU1ksICAgICAgICAvLyBCdXN5IHRvbmU6IDQyNSBIeiByZXBlYXRlZCBpbiBhIDAuMzc1cyBvbiwgMC4zNzVzIG9mZiBwYXR0ZXJuLgogICAgICAgICBUT05FX0FVU1RSQUxJQV9DQUxMX1dBSVRJTkcsLy8gQ2FsbCB3YWl0aW5nIHRvbmU6IDQyNUh6IHRvbmUgcmVwZWF0ZWQgaW4gYSAwLjJzIG9uLCAwLjJzIG9mZiwgMC4ycyBvbiwgNC40cyBvZmYgcGF0dGVybi4KICAgICAgICAgVE9ORV9BVVNUUkFMSUFfQ09OR0VTVElPTiwgIC8vIENvbmdlc3Rpb24gdG9uZTogNDI1SHogdG9uZSByZXBlYXRlZCBpbiBhIDAuMzc1cyBvbiwgMC4zNzVzIG9mZiBwYXR0ZXJuCisgICAgICAgIC8vIFNJTkdBUE9SRSBTdXBlcnZpc29yeSB0b25lcworICAgICAgICBUT05FX1NHX0JVU1ksICAgICAgICAgICAgICAgLy8gQnVzeSB0b25lOiA0MjUgSHosIDc1MG1zIE9OLCA3NTBtcyBPRkYuLi4KKyAgICAgICAgVE9ORV9TR19SSU5HVE9ORSwgICAgICAgICAgIC8vIFJpbmcgVG9uZTogNDI1IEh6IHRvbmUgbW9kdWxhdGVkIHdpdGggMjQgSHosIDQwMG1zIE9OLCAyMDBtcyBPRkYsIDQwMG1zIE9OLCAycyBPRkYuLi4KKyAgICAgICAgLy8gSE9ORyBLT05HIFN1cGVydmlzb3J5IHRvbmVzCisgICAgICAgIFRPTkVfSEtfQlVTWSwgICAgICAgICAgICAgICAvLyBCdXN5IHRvbmU6IDQ4MCBIeiArIDYyMCBIeiwgNTAwbXMgT04sIDUwMG1zIE9GRi4uLgorICAgICAgICBUT05FX0hLX1JJTkdUT05FLCAgICAgICAgICAgLy8gUmluZyBUb25lOiA0NDAgSHogKyA0ODAgSHogcmVwZWF0ZWQgd2l0aCBwYXR0ZXJuIDAsNHMgb24sIDAsMnMgb2ZmLCAwLDRzIG9uIGFuZCAzcyBvZmYuCisgICAgICAgIC8vIElSRUxBTkQgU3VwZXJ2aXNvcnkgdG9uZXMKKyAgICAgICAgVE9ORV9JRV9SSU5HVE9ORSwgICAgICAgICAgIC8vIFJpbmcgVG9uZTogQSA0MDBIeiArIDQ1MEh6IHRvbmUgcmVwZWF0ZWQgaW4gYSAwLjRzIG9uLCAwLjJzIG9mZiwgMC40cyBvbiwgMi4wcyBvZmYgcGF0dGVybi4KKyAgICAgICAgVE9ORV9JRV9DQUxMX1dBSVRJTkcsICAgICAgIC8vIENhbGwgd2FpdGluZyB0b25lOiA0MjVIeiB0b25lIHJlcGVhdGVkIGluIGEgMC4xOHMgb24sIDAuMnMgb2ZmLCAwLjJzIG9uLCA0LjVzIG9mZiBwYXR0ZXJuLgogICAgICAgICBOVU1fQUxURVJOQVRFX1RPTkVTCiAgICAgfTsKIApAQCAtMjA4LDYgKzIyMCw5IEBACiAgICAgICAgIEpBUEFOLAogICAgICAgICBHQiwKICAgICAgICAgQVVTVFJBTElBLAorICAgICAgICBTSU5HQVBPUkUsCisgICAgICAgIEhPTkdLT05HLAorICAgICAgICBJUkVMQU5ELAogICAgICAgICBDRVBULAogICAgICAgICBOVU1fUkVHSU9OUwogICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKaW5kZXggOTc0NjJmOC4uOThhMzdhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMjU1LDggKzI1NSw4IEBACiAgICAgWE1MRG9jdW1lbnQgZG9jOwogICAgIGRvYy5Mb2FkRmlsZShwYXRoKTsKICAgICBpZiAoZG9jLkVycm9yKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSAlczogVGlueXhtbDIgZXJyb3IgKCVkKTogJXMgJXMiLCBwYXRoLAotICAgICAgICAgICAgICBkb2MuRXJyb3JJRCgpLCBkb2MuR2V0RXJyb3JTdHIxKCksIGRvYy5HZXRFcnJvclN0cjIoKSk7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgJXM6IFRpbnl4bWwyIGVycm9yICglZCk6ICVzIiwgcGF0aCwKKyAgICAgICAgICAgICAgZG9jLkVycm9ySUQoKSwgZG9jLkVycm9yU3RyKCkpOwogICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwppbmRleCBjZDBlNzY1Li5jMWNlNTEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwpAQCAtMjYxLDcgKzI2MSw2IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CiAgICAgZWZmZWN0X2hhbmRsZV90IGl0ZmU7CiAgICAgZWZmZWN0X2VudHJ5X3QgKmZ4OwotICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IHJldDsKIAogICAgIGlmICh1dWlkID09IE5VTEwgfHwgcEhhbmRsZSA9PSBOVUxMKSB7CkBAIC00MjgsOCArNDI3LDYgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogaW50IGluaXQoKSB7Ci0gICAgaW50IGhkbDsKLQogICAgIGlmIChnSW5pdERvbmUpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNTUyLDcgKzU0OSw2IEBACiAgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CiAgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOwogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOwotICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IHJldCA9IDA7CiAKICAgICBkcHJpbnRmKGZkLCAiTGlicmFyaWVzIGxvYWRlZDpcbiIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggYWFlODBiNi4uOTRkNDUxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CiAgICAgaW50IHJldCA9IDA7Ci0gICAgaW50IHNlc3Npb25ObzsKKyAgICBpbnQgc2Vzc2lvbk5vID0gLTE7CiAgICAgaW50IGk7CiAgICAgRWZmZWN0Q29udGV4dCAqcENvbnRleHQgPSBOVUxMOwogICAgIGJvb2wgbmV3QnVuZGxlID0gZmFsc2U7CkBAIC0yMTgsMjIgKzIxOCwyNyBAQAogICAgICAgICBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpOwogICAgIH0KIAotICAgIC8vIEZpbmQgbmV4dCBhdmFpbGFibGUgc2Vzc2lvbk5vCisgICAgLy8gRmluZCBzZXNzaW9uTm86IGlmIG9uZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHNlc3Npb25JZCB1c2UgaXQsCisgICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgZmlyc3QgYXZhaWxhYmxlIGVtcHR5IHNsb3QuCiAgICAgZm9yKGk9MDsgaTxMVk1fTUFYX1NFU1NJT05TOyBpKyspewotICAgICAgICBpZigoU2Vzc2lvbkluZGV4W2ldID09IExWTV9VTlVTRURfU0VTU0lPTil8fChTZXNzaW9uSW5kZXhbaV0gPT0gc2Vzc2lvbklkKSl7Ci0gICAgICAgICAgICBzZXNzaW9uTm8gICAgICAgPSBpOwotICAgICAgICAgICAgU2Vzc2lvbkluZGV4W2ldID0gc2Vzc2lvbklkOwotICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlOiBBbGxvY2F0aW5nIFNlc3Npb25ObyAlZCBmb3IgU2Vzc2lvbklkICVkXG4iLCBzZXNzaW9uTm8sc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKFNlc3Npb25JbmRleFtpXSA9PSBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgIHNlc3Npb25ObyA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBpZiAoc2Vzc2lvbk5vIDwgMCAmJiBTZXNzaW9uSW5kZXhbaV0gPT0gTFZNX1VOVVNFRF9TRVNTSU9OKSB7CisgICAgICAgICAgICBzZXNzaW9uTm8gPSBpOworICAgICAgICAgICAgLy8gZG8gbm90IGJyZWFrOyBhbGxvdyBsb29wIHRvIGNvbnRpbnVlIHRvIHNlYXJjaCBmb3IgYSBzZXNzaW9uSWQgbWF0Y2guCisgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZihpPT1MVk1fTUFYX1NFU1NJT05TKXsKKyAgICBpZiAoc2Vzc2lvbk5vIDwgMCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBDYW5ub3QgZmluZCBtZW1vcnkgdG8gYWxsb2NhdGUgZm9yIGN1cnJlbnQgc2Vzc2lvbiIpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCisgICAgU2Vzc2lvbkluZGV4W3Nlc3Npb25Ob10gPSBzZXNzaW9uSWQ7CisgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlOiBBbGxvY2F0aW5nIHNlc3Npb25ObyAlZCBmb3Igc2Vzc2lvbklkICVkXG4iLCBzZXNzaW9uTm8sIHNlc3Npb25JZCk7CisKICAgICBwQ29udGV4dCA9IG5ldyBFZmZlY3RDb250ZXh0OwogCiAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgY3JlYXRlIGluIHRoaXMgc2Vzc2lvbgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IDBlODIzMzkuLmMzM2Y5ZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTU5NCw3ICs1OTQsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YVNtcGwgPSBDQVBUVVJFX0JVRl9TSVpFOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gZGVsdGFTbXBsOworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gKGludDMyX3QpcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gZGVsdGFTbXBsOwogICAgICAgICAgICAgICAgIC8vIGEgbmVnYXRpdmUgY2FwdHVyZVBvaW50IG1lYW5zIHdlIHdyYXAgdGhlIGJ1ZmZlci4KICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVBvaW50IDwgMCkgewogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDNjNDNhNzIuLmE4YTdiODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCkBAIC0zMjMsMTMgKzMyNCwyMSBAQAogCiBzdGF0dXNfdCBkdW1wRXh0cmFjdG9ycyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSB7CiAgICAgU3RyaW5nOCBvdXQ7Ci0gICAgb3V0LmFwcGVuZCgiUmVjZW50IGV4dHJhY3RvcnMsIG1vc3QgcmVjZW50IGZpcnN0OlxuIik7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzRXh0cmFjdG9yc0xvY2spOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNFeHRyYWN0b3JzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBFeHRyYWN0b3JJbnN0YW5jZSAmaW5zdGFuY2UgPSBzRXh0cmFjdG9ycy5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBvdXQuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgb3V0LmFwcGVuZChpbnN0YW5jZS50b1N0cmluZygpKTsKKyAgICBjb25zdCBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIiksIHBpZCwgdWlkKSkgeworICAgICAgICBvdXQuYXBwZW5kRm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgICAgICJjYW4ndCBkdW1wIE1lZGlhRXh0cmFjdG9yIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsIHBpZCwgdWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQuYXBwZW5kKCJSZWNlbnQgZXh0cmFjdG9ycywgbW9zdCByZWNlbnQgZmlyc3Q6XG4iKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc0V4dHJhY3RvcnNMb2NrKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc0V4dHJhY3RvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBFeHRyYWN0b3JJbnN0YW5jZSAmaW5zdGFuY2UgPSBzRXh0cmFjdG9ycy5pdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGluc3RhbmNlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHdyaXRlKGZkLCBvdXQuc3RyaW5nKCksIG91dC5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCmluZGV4IDJmNjM5ZDIuLjgyN2NiYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKQEAgLTMzMSw3ICszMzEsOCBAQAogICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKICAgICAvLyBVcGRhdGUgbGVuZ3RocwogICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKLSAgICBidWZmZXJbc2l6ZW9mKGJ1ZmZlcikgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOworICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgZGF0YSkgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSArIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKV0KKyAgICAgICAgPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKICAgICAvLyBXcml0ZSBuZXcgYnVmZmVyIGludG8gRklGTwogICAgIGRzdC0+d3JpdGUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5uZXh0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCBjOGQ0ZTRhLi5hYzRlODE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTExMyw3ICsxMTMsNiBAQAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYnl1dl9zdGF0aWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYWFjZW5jIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21lZGlhZmlsdGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKaW5kZXggMjJkZjUyMi4uMTNmOTkyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCkBAIC02NzIsNiArNjcyLDE1IEBACiAgICAgb2ZmNjRfdCBwb3MgPSAwOwogICAgIG9mZjY0X3QgcG9zdF9pZDNfcG9zOwogICAgIHVpbnQzMl90IGhlYWRlcjsKKyAgICB1aW50OF90IG1wZWdfaGVhZGVyWzVdOworICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBtcGVnX2hlYWRlciwgc2l6ZW9mKG1wZWdfaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YobXBlZ19oZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1lbWNtcCgiXHgwMFx4MDBceDAxXHhiYSIsIG1wZWdfaGVhZGVyLCA0KSAmJiAobXBlZ19oZWFkZXJbNF0gPj4gNCkgPT0gMikgeworICAgICAgICBBTE9HVigiTVBFRzFQUyBjb250YWluZXIgaXMgbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBpZiAoIVJlc3luYyhzb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggOWM3NzdiMy4uYThiNjYxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtNDQxLDYgKzQ0MSw4MiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBbPV0geworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgICAgICBpbnQzMl90IHNhbXBsZXJhdGU7CisgICAgICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwICYmCisgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikgJiYKKyAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKKworICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICh0cmFjay0+ZWxzdF9zZWdtZW50X2R1cmF0aW9uID4gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2R1cmF0aW9uID0gdHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbjsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZSA9IHRyYWNrLT5lbHN0X21lZGlhX3RpbWU7CisgICAgICAgICAgICBpbnQ2NF90IGhhbGZzY2FsZSA9IG1IZWFkZXJUaW1lc2NhbGUgLyAyOworICAgICAgICAgICAgQUxPR1YoInNlZ21lbnRfZHVyYXRpb24gPSAlIiBQUklkNjQgIiwgbWVkaWFfdGltZSA9ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgIiwgaGFsZnNjYWxlID0gJSIgUFJJZDY0ICIsIHRpbWVzY2FsZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgIHNlZ21lbnRfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICBtZWRpYV90aW1lLAorICAgICAgICAgICAgICAgICAgaGFsZnNjYWxlLAorICAgICAgICAgICAgICAgICAgbUhlYWRlclRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIGludDY0X3QgZGVsYXk7CisgICAgICAgICAgICAvLyBkZWxheSA9ICgobWVkaWFfdGltZSAqIHNhbXBsZXJhdGUpICsgaGFsZnNjYWxlKSAvIG1IZWFkZXJUaW1lc2NhbGU7CisgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBzYW1wbGVyYXRlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVsYXksIGhhbGZzY2FsZSwgJmRlbGF5KSB8fAorICAgICAgICAgICAgICAgICAgICAoZGVsYXkgLz0gbUhlYWRlclRpbWVzY2FsZSwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgIGRlbGF5ID4gSU5UMzJfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgSU5UMzJfTUlOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImRlbGF5ID0gJSIgUFJJZDY0LCBkZWxheSk7CisgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOworCisgICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKKyAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisKKyAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7CisgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmc7CisgICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICsgbWVkaWFfdGltZSkgKiAxMDAwMDAwKTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb24sIG1lZGlhX3RpbWUsICZzZWdtZW50X2VuZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhzZWdtZW50X2VuZCwgMTAwMDAwMCwgJnNlZ21lbnRfZW5kKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CisKKyAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IGtLZXlEdXJhdGlvbiBpcykgbWlnaHQKKyAgICAgICAgICAgICAgICAvLyBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlczsKKyAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OworICAgICAgICAgICAgaW50NjRfdCB0aW1lc2NhbGVfZTY7CisgICAgICAgICAgICAvLyBwYWRkaW5nc2FtcGxlcyA9ICgocGFkZGluZyAqIHNhbXBsZXJhdGUpICsgKGhhbGZzY2FsZSAqIDEwMDAwMDApKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGhhbGZzY2FsZSwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHBhZGRpbmdzYW1wbGVzLCBoYWxmc2NhbGVfZTYsICZwYWRkaW5nc2FtcGxlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInBhZGRpbmdzYW1wbGVzID0gJSIgUFJJZDY0LCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgIH0KKyAgICB9KCk7CisKICAgICBpZiAoKGZsYWdzICYga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSkKICAgICAgICAgICAgICYmICF0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhKSB7CiAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSB0cnVlOwpAQCAtOTkwLDYgKzEwNjYsNyBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gMDsKICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwpAQCAtMTA1Niw2ICsxMTMzLDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAorICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gU2VlIDE0NDk2LTEyIDguNi42CiAgICAgICAgICAgICB1aW50OF90IHZlcnNpb247CiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnZlcnNpb24sIDEpIDwgMSkgewpAQCAtMTA3MCw4ICsxMTUxLDYgQEAKICAgICAgICAgICAgIGlmIChlbnRyeV9jb3VudCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIGVudHJ5IGF0IHRoZSBtb21lbnQsIGZvciBnYXBsZXNzIHBsYXliYWNrCiAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoICVkIGVudHJpZXMiLCBlbnRyeV9jb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1IZWFkZXJUaW1lc2NhbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3QgYmVjYXVzZSB0aW1lc2NhbGUgaXMgMCIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvZmY2NF90IGVudHJpZXNvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7CiAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2VnbWVudF9kdXJhdGlvbjsKQEAgLTEwOTUsMzEgKzExNzQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHVpbnQ2NF90IGhhbGZzY2FsZSA9IG1IZWFkZXJUaW1lc2NhbGUgLyAyOwotICAgICAgICAgICAgICAgIHNlZ21lbnRfZHVyYXRpb24gPSAoc2VnbWVudF9kdXJhdGlvbiAqIDEwMDAwMDAgKyBoYWxmc2NhbGUpLyBtSGVhZGVyVGltZXNjYWxlOwotICAgICAgICAgICAgICAgIG1lZGlhX3RpbWUgPSAobWVkaWFfdGltZSAqIDEwMDAwMDAgKyBoYWxmc2NhbGUpIC8gbUhlYWRlclRpbWVzY2FsZTsKLQotICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOwotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjaykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5ID0gKG1lZGlhX3RpbWUgICogc2FtcGxlcmF0ZSArIDUwMDAwMCkgLyAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5ndXMgPSBkdXJhdGlvbiAtIChpbnQ2NF90KShzZWdtZW50X2R1cmF0aW9uICsgbWVkaWFfdGltZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWRkaW5ndXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBrS2V5RHVyYXRpb24gaXMpIG1pZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIG5lZ2F0aXZlLiBDbGFtcCB0byB6ZXJvLgotICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3VzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzID0gKHBhZGRpbmd1cyAqIHNhbXBsZXJhdGUgKyA1MDAwMDApIC8gMTAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlc2UgZm9yIGxhdGVyLCBiZWNhdXNlIHRoZSBlbHN0IGF0b20gbWlnaHQgcHJlY2VkZQorICAgICAgICAgICAgICAgIC8vIHRoZSBhdG9tcyB0aGF0IGFjdHVhbGx5IGdpdmVzIHVzIHRoZSBkdXJhdGlvbiBhbmQgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAvLyBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWRkaW5nIGFuZCBkZWxheSB2YWx1ZXMKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5oYXNfZWxzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+ZWxzdF9tZWRpYV90aW1lID0gbWVkaWFfdGltZTsKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb24gPSBzZWdtZW50X2R1cmF0aW9uOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM1MDIsNiArMzU2MiwxOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCisgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBtYXhCaXRyYXRlID0gMDsKKyAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IDA7CisgICAgICAgIGVzZHMuZ2V0Qml0UmF0ZSgmbWF4Qml0cmF0ZSwgJmF2Z0JpdHJhdGUpOworICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgeworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBjb25zdCB1aW50OF90ICpjc2Q7CiAgICAgc2l6ZV90IGNzZF9zaXplOwogICAgIGlmIChlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKApAQCAtNTM1MSw3ICs1NDIzLDcgQEAKICAgICAgICAgb2ZmNjRfdCBjaHVua0RhdGFTaXplID0gY2h1bmtTaXplIC0gKGNodW5rRGF0YU9mZnNldCAtIG9mZnNldCk7CiAgICAgICAgIGlmIChjaHVua0RhdGFTaXplIDwgMCkgewogICAgICAgICAgICAgQUxPR0UoImIvMjM1NDA5MTQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggODEwYjBkNi4uNzY2MjMwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCkBAIC0xMTIzLDYgKzExMjMsNyBAQAogICAgICAgICAgICAgbU1ldGEtPnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGRhdGEsIHNpemUpOwogICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtVmkucmF0ZSk7CiAgICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbVZpLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CiAKICAgICAgICAgICAgIEFMT0dWKCJsb3dlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfbG93ZXIpOwogICAgICAgICAgICAgQUxPR1YoInVwcGVyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV91cHBlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAKaW5kZXggNGYzMWM1Zi4uNzVmNzQ0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcApAQCAtMTcyLDcgKzE3Miw3IEBACiAgICAgICAgIGlmIChtU2FtcGxlVG9DaHVua0luZGV4ICsgMSA8IG1UYWJsZS0+bU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKSB7CiAgICAgICAgICAgICBtU3RvcENodW5rID0gZW50cnlbMV0uc3RhcnRDaHVuazsKIAotICAgICAgICAgICAgaWYgKG1TdG9wQ2h1bmsgPCBtRmlyc3RDaHVuayB8fAorICAgICAgICAgICAgaWYgKG1TYW1wbGVzUGVyQ2h1bmsgPT0gMCB8fCBtU3RvcENodW5rIDwgbUZpcnN0Q2h1bmsgfHwKICAgICAgICAgICAgICAgICAobVN0b3BDaHVuayAtIG1GaXJzdENodW5rKSA+IFVJTlQzMl9NQVggLyBtU2FtcGxlc1BlckNodW5rIHx8CiAgICAgICAgICAgICAgICAgKChtU3RvcENodW5rIC0gbUZpcnN0Q2h1bmspICogbVNhbXBsZXNQZXJDaHVuayA+CiAgICAgICAgICAgICAgICAgIFVJTlQzMl9NQVggLSBtRmlyc3RDaHVua1NhbXBsZUluZGV4KSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKaW5kZXggYTc0NTY5Mi4uYjc1YjQ2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCkBAIC0yMDAsMTAgKzIwMCwyMiBAQAogICAgICAgICAgICAgIGZyYW1lX2Nyb3BfdG9wX29mZnNldCwgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0LAogICAgICAgICAgICAgIGNyb3BVbml0WCwgY3JvcFVuaXRZKTsKIAotICAgICAgICAqd2lkdGggLT0KLSAgICAgICAgICAgIChmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ICsgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQpICogY3JvcFVuaXRYOwotICAgICAgICAqaGVpZ2h0IC09Ci0gICAgICAgICAgICAoZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ICsgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KSAqIGNyb3BVbml0WTsKKworICAgICAgICAvLyAqd2lkdGggLT0gKGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgKyBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCkgKiBjcm9wVW5pdFg7CisgICAgICAgIGlmKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZnJhbWVfY3JvcF9sZWZ0X29mZnNldCwgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQsICZmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0KSB8fAorICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0LCBjcm9wVW5pdFgsICZmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0KSB8fAorICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygqd2lkdGgsIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQsIHdpZHRoKSB8fAorICAgICAgICAgICAgKndpZHRoIDwgMCkgeworICAgICAgICAgICAgKndpZHRoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vKmhlaWdodCAtPSAoZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ICsgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KSAqIGNyb3BVbml0WTsKKyAgICAgICAgaWYoX19idWlsdGluX2FkZF9vdmVyZmxvdyhmcmFtZV9jcm9wX3RvcF9vZmZzZXQsIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCwgJmZyYW1lX2Nyb3BfdG9wX29mZnNldCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coZnJhbWVfY3JvcF90b3Bfb2Zmc2V0LCBjcm9wVW5pdFksICZmcmFtZV9jcm9wX3RvcF9vZmZzZXQpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCpoZWlnaHQsIGZyYW1lX2Nyb3BfdG9wX29mZnNldCwgaGVpZ2h0KSB8fAorICAgICAgICAgICAgKmhlaWdodCA8IDApIHsKKyAgICAgICAgICAgICpoZWlnaHQgPSAwOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHNhcldpZHRoICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FBQ0VuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjU2MTM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQUFDRW5jb2RlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkFBQ0VuY29kZXIuaCIKLSNpbmNsdWRlICJ2b0FBQy5oIgotI2luY2x1ZGUgImNtbk1lbW9yeS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUFBQ0VuY29kZXI6OkFBQ0VuY29kZXIoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtTWV0YShtZXRhKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1CdWZmZXJHcm91cChOVUxMKSwKLSAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1JbnB1dEZyYW1lKE5VTEwpLAotICAgICAgbUVuY29kZXJIYW5kbGUoTlVMTCksCi0gICAgICBtQXBpSGFuZGxlKE5VTEwpLAotICAgICAgbU1lbU9wZXJhdG9yKE5VTEwpIHsKLX0KLQotc3RhdHVzX3QgQUFDRW5jb2Rlcjo6aW5pdENoZWNrKCkgewotICAgIENIRUNLKG1BcGlIYW5kbGUgPT0gTlVMTCAmJiBtRW5jb2RlckhhbmRsZSA9PSBOVUxMKTsKLSAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKLSAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtQ2hhbm5lbHMpKTsKLSAgICBDSEVDSyhtQ2hhbm5lbHMgPD0gMiAmJiBtQ2hhbm5lbHMgPj0gMSk7Ci0gICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJm1CaXRSYXRlKSk7Ci0KLSAgICBtQXBpSGFuZGxlID0gbmV3IFZPX0FVRElPX0NPREVDQVBJOwotICAgIENIRUNLKG1BcGlIYW5kbGUpOwotCi0gICAgaWYgKFZPX0VSUl9OT05FICE9IHZvR2V0QUFDRW5jQVBJKG1BcGlIYW5kbGUpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGFwaSBoYW5kbGUiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbU1lbU9wZXJhdG9yID0gbmV3IFZPX01FTV9PUEVSQVRPUjsKLSAgICBDSEVDSyhtTWVtT3BlcmF0b3IgIT0gTlVMTCk7Ci0gICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOwotICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7Ci0gICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKLSAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKLSAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7Ci0KLSAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOwotICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOwotICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOwotICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSBtTWVtT3BlcmF0b3I7Ci0gICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPkluaXQoJm1FbmNvZGVySGFuZGxlLCBWT19BVURJT19Db2RpbmdBQUMsICZ1c2VyRGF0YSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFBQyBlbmNvZGVyIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLSAgICBpZiAoT0sgIT0gc2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEoKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBBQUMgZW5jb2RlciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBDb25maWd1cmUgQUFDIGVuY29kZXIkCi0gICAgQUFDRU5DX1BBUkFNIHBhcmFtczsKLSAgICBtZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwotICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgcGFyYW1zLmJpdFJhdGUgPSBtQml0UmF0ZTsKLSAgICBwYXJhbXMubkNoYW5uZWxzID0gbUNoYW5uZWxzOwotICAgIHBhcmFtcy5hZHRzVXNlZCA9IDA7ICAvLyBXZSBhZGQgYWR0cyBoZWFkZXIgaW4gdGhlIGZpbGUgd3JpdGVyIGlmIG5lZWRlZC4KLSAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0obUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BQUNfRU5DUEFSQU0sICAmcGFyYW1zKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHN0YXR1c190IGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCAmaW5kZXgpIHsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZVRhYmxlW10gPSB7Ci0gICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCi0gICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAotICAgIH07Ci0gICAgY29uc3QgaW50MzJfdCB0YWJsZVNpemUgPSBzaXplb2Yoa1NhbXBsZVJhdGVUYWJsZSkgLyBzaXplb2Yoa1NhbXBsZVJhdGVUYWJsZVswXSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFibGVTaXplOyArK2kpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgPT0ga1NhbXBsZVJhdGVUYWJsZVtpXSkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR0UoIlNhbXBsaW5nIHJhdGUgJWQgYnBzIGlzIG5vdCBzdXBwb3J0ZWQiLCBzYW1wbGVSYXRlKTsKLSAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLX0KLQotc3RhdHVzX3QgQUFDRW5jb2Rlcjo6c2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEoKSB7Ci0gICAgQUxPR1YoInNldEF1ZGlvU3BlY2lmaWNDb25maWdEYXRhOiAlZCBoeiwgJWQgYnBzLCBhbmQgJWQgY2hhbm5lbHMiLAotICAgICAgICAgbVNhbXBsZVJhdGUsIG1CaXRSYXRlLCBtQ2hhbm5lbHMpOwotCi0gICAgaW50MzJfdCBpbmRleCA9IDA7Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBnZXRTYW1wbGVSYXRlVGFibGVJbmRleChtU2FtcGxlUmF0ZSwgaW5kZXgpKTsKLSAgICBpZiAobUNoYW5uZWxzID4gMiB8fCBtQ2hhbm5lbHMgPD0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzKCVkKSIsIG1DaGFubmVscyk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIE9NWF9BVURJT19BQUNPYmplY3RMQwotICAgIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YVswXSA9ICgoMHgwMiA8PCAzKSB8IChpbmRleCA+PiAxKSk7Ci0gICAgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhWzFdID0gKChpbmRleCAmIDB4MDEpIDw8IDcpIHwgKG1DaGFubmVscyA8PCAzKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLUFBQ0VuY29kZXI6On5BQUNFbmNvZGVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBQUNFbmNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIEFMT0dXKCJDYWxsIHN0YXJ0KCkgd2hlbiBlbmNvZGVyIGFscmVhZHkgc3RhcnRlZCIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcigyMDQ4KSk7Ci0KLSAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGluaXRDaGVjaygpKTsKLQotICAgIG1OdW1JbnB1dFNhbXBsZXMgPSAwOwotICAgIG1BbmNob3JUaW1lVXMgPSAwOwotICAgIG1GcmFtZUNvdW50ID0gMDsKLQotICAgIG1JbnB1dEZyYW1lID0gbmV3IGludDE2X3RbbUNoYW5uZWxzICoga051bVNhbXBsZXNQZXJGcmFtZV07Ci0gICAgQ0hFQ0sobUlucHV0RnJhbWUgIT0gTlVMTCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChwYXJhbXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgIEFMT0dFKCJBdWRpb1NvdXJjZSBpcyBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBQUNFbmNvZGVyOjpzdG9wKCkgewotICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKLSAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOwotCi0gICAgaWYgKG1JbnB1dEZyYW1lKSB7Ci0gICAgICAgIGRlbGV0ZVtdIG1JbnB1dEZyYW1lOwotICAgICAgICBtSW5wdXRGcmFtZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICBBTE9HVygiQ2FsbCBzdG9wKCkgd2hlbiBlbmNvZGVyIGhhcyBub3Qgc3RhcnRlZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgaWYgKG1FbmNvZGVySGFuZGxlKSB7Ci0gICAgICAgIENIRUNLX0VRKChWT19VMzIpVk9fRVJSX05PTkUsIG1BcGlIYW5kbGUtPlVuaW5pdChtRW5jb2RlckhhbmRsZSkpOwotICAgICAgICBtRW5jb2RlckhhbmRsZSA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSBtQXBpSGFuZGxlOwotICAgIG1BcGlIYW5kbGUgPSBOVUxMOwotCi0gICAgZGVsZXRlIG1NZW1PcGVyYXRvcjsKLSAgICBtTWVtT3BlcmF0b3IgPSBOVUxMOwotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IEFBQ0VuY29kZXI6OmdldEZvcm1hdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLQotICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQUFDRW5jb2RlciIpOwotCi0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBBQUNFbmNvZGVyOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBDSEVDSyhvcHRpb25zID09IE5VTEwgfHwgIW9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKTsKLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKSwgKHN0YXR1c190KU9LKTsKLSAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotICAgIGJvb2wgcmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsKLSAgICBpbnQ2NF90IHdhbGxDbG9ja1RpbWVVcyA9IC0xOwotCi0gICAgaWYgKG1GcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgbWVtY3B5KG91dFB0ciwgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhLCAyKTsKLSAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMik7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCB0cnVlKTsKLSAgICAgICAgKm91dCA9IGJ1ZmZlcjsKLSAgICAgICAgKyttRnJhbWVDb3VudDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZiAobUZyYW1lQ291bnQgPT0gMSkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgZmFsc2UpOwotICAgIH0KLQotICAgIGNvbnN0IGludDMyX3QgblNhbXBsZXMgPSBtQ2hhbm5lbHMgKiBrTnVtU2FtcGxlc1BlckZyYW1lOwotICAgIHdoaWxlIChtTnVtSW5wdXRTYW1wbGVzIDwgblNhbXBsZXMpIHsKLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKSAhPSBPSykgewotICAgICAgICAgICAgICAgIGlmIChtTnVtSW5wdXRTYW1wbGVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1zZXQoJm1JbnB1dEZyYW1lW21OdW1JbnB1dFNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MTZfdCkgKiAoblNhbXBsZXMgLSBtTnVtSW5wdXRTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgbU51bUlucHV0U2FtcGxlcyA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCBhbGlnbiA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgJSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBDSEVDS19FUShhbGlnbiwgKHNpemVfdCkwKTsKLQotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEcmlmdFRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgd2FsbENsb2NrVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5QW5jaG9yVGltZSwgJnRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgY29weSA9IChuU2FtcGxlcyAtIG1OdW1JbnB1dFNhbXBsZXMpICogc2l6ZW9mKGludDE2X3QpOwotCi0gICAgICAgIGlmIChjb3B5ID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewotICAgICAgICAgICAgY29weSA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoJm1JbnB1dEZyYW1lW21OdW1JbnB1dFNhbXBsZXNdLAotICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikgbUlucHV0QnVmZmVyLT5kYXRhKCkKLSAgICAgICAgICAgICAgICAgICAgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgY29weSk7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpICsgY29weSwKLSAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBjb3B5KTsKLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbU51bUlucHV0U2FtcGxlcyArPSBjb3B5IC8gc2l6ZW9mKGludDE2X3QpOwotICAgICAgICBpZiAobU51bUlucHV0U2FtcGxlcyA+PSBuU2FtcGxlcykgewotICAgICAgICAgICAgbU51bUlucHV0U2FtcGxlcyAlPSBuU2FtcGxlczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOwotICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7Ci0gICAgaW5wdXREYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKikgbUlucHV0RnJhbWU7Ci0gICAgaW5wdXREYXRhLkxlbmd0aCA9IG5TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpOwotICAgIENIRUNLKChWT19VMzIpVk9fRVJSX05PTkUgPT0gbUFwaUhhbmRsZS0+U2V0SW5wdXREYXRhKG1FbmNvZGVySGFuZGxlLCZpbnB1dERhdGEpKTsKLQotICAgIFZPX0NPREVDQlVGRkVSIG91dHB1dERhdGE7Ci0gICAgbWVtc2V0KCZvdXRwdXREYXRhLCAwLCBzaXplb2Yob3V0cHV0RGF0YSkpOwotICAgIFZPX0FVRElPX09VVFBVVElORk8gb3V0cHV0SW5mbzsKLSAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7Ci0KLSAgICBWT19VMzIgcmV0ID0gVk9fRVJSX05PTkU7Ci0gICAgc2l6ZV90IG5PdXRwdXRCeXRlcyA9IDA7Ci0gICAgZG8gewotICAgICAgICBvdXRwdXREYXRhLkJ1ZmZlciA9IG91dFB0cjsKLSAgICAgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBidWZmZXItPnNpemUoKSAtIG5PdXRwdXRCeXRlczsKLSAgICAgICAgcmV0ID0gbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKLSAgICAgICAgaWYgKHJldCA9PSBWT19FUlJfTk9ORSkgewotICAgICAgICAgICAgb3V0UHRyICs9IG91dHB1dERhdGEuTGVuZ3RoOwotICAgICAgICAgICAgbk91dHB1dEJ5dGVzICs9IG91dHB1dERhdGEuTGVuZ3RoOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAocmV0ICE9IFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG5PdXRwdXRCeXRlcyk7Ci0KLSAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0KLSAgICAgICAgKChtRnJhbWVDb3VudCAtIDEpICogMTAwMDAwMExMICoga051bVNhbXBsZXNQZXJGcmFtZSkgLyBtU2FtcGxlUmF0ZTsKLQotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQW5jaG9yVGltZVVzICsgbWVkaWFUaW1lVXMpOwotICAgIGlmIChyZWFkRnJvbVNvdXJjZSAmJiB3YWxsQ2xvY2tUaW1lVXMgIT0gLTEpIHsKLSAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwgbWVkaWFUaW1lVXMgLSB3YWxsQ2xvY2tUaW1lVXMpOwotICAgIH0KLSAgICArK21GcmFtZUNvdW50OwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKaW5kZXggZmIzNjhjMi4uZDczNGI5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icApAQCAtMSwxMTUgKzEsMyBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hYWNlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJiYXNpY19vcC9iYXNpY29wMi5jIiwKLSAgICAgICAgImJhc2ljX29wL29wZXJfMzJiLmMiLAotCi0gICAgICAgICJBQUNFbmNvZGVyLmNwcCIsCi0gICAgICAgICJzcmMvYWFjX3JvbS5jIiwKLSAgICAgICAgInNyYy9hYWNlbmMuYyIsCi0gICAgICAgICJzcmMvYWFjZW5jX2NvcmUuYyIsCi0gICAgICAgICJzcmMvYWRqX3Roci5jIiwKLSAgICAgICAgInNyYy9iYW5kX25yZy5jIiwKLSAgICAgICAgInNyYy9iaXRfY250LmMiLAotICAgICAgICAic3JjL2JpdGJ1ZmZlci5jIiwKLSAgICAgICAgInNyYy9iaXRlbmMuYyIsCi0gICAgICAgICJzcmMvYmxvY2tfc3dpdGNoLmMiLAotICAgICAgICAic3JjL2NoYW5uZWxfbWFwLmMiLAotICAgICAgICAic3JjL2R5bl9iaXRzLmMiLAotICAgICAgICAic3JjL2dycF9kYXRhLmMiLAotICAgICAgICAic3JjL2ludGVyZmFjZS5jIiwKLSAgICAgICAgInNyYy9saW5lX3BlLmMiLAotICAgICAgICAic3JjL21zX3N0ZXJlby5jIiwKLSAgICAgICAgInNyYy9wcmVfZWNob19jb250cm9sLmMiLAotICAgICAgICAic3JjL3BzeV9jb25maWd1cmF0aW9uLmMiLAotICAgICAgICAic3JjL3BzeV9tYWluLmMiLAotICAgICAgICAic3JjL3FjX21haW4uYyIsCi0gICAgICAgICJzcmMvcXVhbnRpemUuYyIsCi0gICAgICAgICJzcmMvc2ZfZXN0aW0uYyIsCi0gICAgICAgICJzcmMvc3ByZWFkaW5nLmMiLAotICAgICAgICAic3JjL3N0YXRfYml0cy5jIiwKLSAgICAgICAgInNyYy90bnMuYyIsCi0gICAgICAgICJzcmMvdHJhbnNmb3JtLmMiLAotICAgICAgICAic3JjL21lbWFsaWduLmMiLAotICAgIF0sCi0KLSAgICBhcmNoOiB7Ci0gICAgICAgIGFybTogewotICAgICAgICAgICAgc3JjczogWwotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9BdXRvQ29ycmVsYXRpb25fdjUucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9QcmVQb3N0TURDVF92NS5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucyIsCi0gICAgICAgICAgICBdLAotCi0gICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLURBUk1WNUUiLAotICAgICAgICAgICAgICAgICItREFSTV9JTkFTTSIsCi0gICAgICAgICAgICAgICAgIi1EQVJNVjVfSU5BU00iLAotICAgICAgICAgICAgXSwKLQotICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYy9hc20vQVJNVjVFIl0sCi0KLSAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCi0KLSAgICAgICAgICAgIGFybXY3X2FfbmVvbjogewotICAgICAgICAgICAgICAgIGV4Y2x1ZGVfc3JjczogWwotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucyIsCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L1ByZVBvc3RNRENUX3Y3LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9SNFI4Rmlyc3RfdjcucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgICAgICItREFSTVY3TmVvbiIsCi0gICAgICAgICAgICAgICAgICAgICItREFSTVY2X0lOQVNNIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYy9hc20vQVJNVjciXSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIC8vIGxpYnN0YWdlZnJpZ2h0IGxpbmtzIHRoaXMgc3RhdGljIGxpYnJhcnksIHNvIGl0IHByb2JhYmx5IGlzbid0IGFwcHJvcHJpYXRlIHRvCi0gICAgLy8gbGluayBsaWJzdGFnZWZyaWdodC4gIEhvd2V2ZXIsIHRoaXMgbGlicmFyeSBpbmNsdWRlcyBsaWJzdGFnZWZyaWdodCBoZWFkZXJzLAotICAgIC8vIGFuZCBuZWVkcyBsaWJiaW5kZXIgdG8gYmUgYWJsZSB0byBkbyBzbyBjb3JyZWN0bHkuCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKLSAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICBdLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzcmMiLAotICAgICAgICAiaW5jIiwKLSAgICAgICAgImJhc2ljX29wIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi0KLX0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNlbmMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0xNDcsMzYgKzM1LDMgQEAKICAgICBdLAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9Ci0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNlbmNfdmlzdWFsb24iLAotCi0gICAgc3JjczogWyJTb2Z0QUFDRW5jb2Rlci5jcHAiXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICB9LAotCi0gICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYWFjZW5jIl0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FBQ19FX1NBTVBMRVMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzMWRlNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJQUFDX0VfU0FNUExFUy5oCi0KLQlDb250ZW50OglzYW1wbGUgY29kZSBmb3IgQUFDIGVuY29kZXIKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUJCTxkbGZjbi5oPgotI2luY2x1ZGUJCTxzdGRpby5oPgotI2luY2x1ZGUJCTxzdGRsaWIuaD4KLSNpbmNsdWRlCQk8c3RyaW5nLmg+Ci0jaW5jbHVkZQkJPHRpbWUuaD4KLSNpbmNsdWRlCQkidm9BQUMuaCIKLSNpbmNsdWRlCQkiY21uTWVtb3J5LmgiCi0KLSNkZWZpbmUgIFZPX0FBQ19FX09VVFBVVAkgIDEKLSNkZWZpbmUgUkVBRF9TSVpFCSgxMDI0KjgpCi11bnNpZ25lZCBjaGFyIG91dEJ1ZlsxMDI0KjhdOwotdW5zaWduZWQgY2hhciBpbkJ1ZltSRUFEX1NJWkVdOwotCi1jb25zdCBjaGFyKiBIZWxwU3RyaW5nID0KLSJWaXN1YWxPbiBBQUMgZW5jb2RlciBVc2FnZTpcbiIKLSJ2b0FBQ0VuY1Rlc3QgLWlmIDxpbnB1dGZpbGUucGNtPiAtb2YgPG91dHB1dGZpbGUuYWFjPiAtc3IgPHNhbXBsZXJhdGU+IC1jaCA8Y2hhbm5lbD4gLWJyIDxiaXRyYXRlPiAtYWR0cyA8YWR0cz4gXG4iCi0iLWlmIGlucHV0IGZpbGUgbmFtZSBcbiIKLSItb2Ygb3V0cHV0IGZpbGUgbmFtZSBcbiIKLSItc3IgaW5wdXQgcGNtIHNhbXBsZXJhdGUsIGRlZmF1bHQgNDQxMDAgXG4iCi0iLWNoIGlucHV0IHBjbSBjaGFubmVsLCBkZWZhdWx0IDIgY2hhbm5lbCBcbiIKLSItYnIgZW5jb2RlZCBhYWMgYml0cmF0ZSwgZGVmYXVsdCA2NDAwMCAqIChzYW1wbGVyYXRlLzEwMCkqY2hhbm5lbC80NDEoNDgwKVxuIgotIi1hZHRzIGFkZCBvciBubyBhZHRzIGhlYWRlciwgZGVmYXVsdCBhZGQgYWR0cyBoZWFkZXJcbiIKLSJGb3IgZXhhbXBsZTogXG4iCi0iLi92b0FBQ0VuY1Rlc3QgLWlmIHJhdy5wY20gLW9mIHJhdy5hYWMgLXNyIDQ0MTAwIC1jaCAyIC1iciAxMjgwMDBcbiI7Ci0KLXN0YXRpYyBpbnQgcGFyc2VjbWRsaW5lKGludCBhcmdjLCBjaGFyICoqYXJndixjaGFyICAqKmlucHV0X2ZpbGVuYW1lLCBjaGFyICAqKm91dHB1dF9maWxlbmFtZSwgQUFDRU5DX1BBUkFNICpwYXJhbSkKLXsKLQkvLyBub3RpY2UgdGhhdDoKLQkvLyBiaXRSYXRlL25DaGFubmVscyA+IDgwMDAKLQkvLyBiaXRSYXRlL25DaGFubmVscyA8IDE2MDAwMAotCS8vIGJpdFJhdGUvbkNoYW5uZWxzIDwgc2FtcGxlUmF0ZSo2Ci0JcGFyYW0tPmFkdHNVc2VkID0gMTsKLQlwYXJhbS0+Yml0UmF0ZSA9IDA7Ci0JcGFyYW0tPm5DaGFubmVscyA9IDI7Ci0JcGFyYW0tPnNhbXBsZVJhdGUgPSA0NDEwMDsKLQotCWlmKGFyZ2MgPCA1IHx8IGFyZ2MgPiAxMykKLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlhcmdjLS07Ci0JYXJndisrOwotCXdoaWxlIChhcmdjID4gMCkKLQl7Ci0JCWlmICghc3RyY21wKCphcmd2LCAiLWlmIikpCi0JCXsKLQkJCWFyZ3YrKzsKLQkJCWFyZ2MtLTsKLQkJCSppbnB1dF9maWxlbmFtZSA9ICphcmd2OwotCQl9Ci0JCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItb2YiKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJKm91dHB1dF9maWxlbmFtZSA9ICphcmd2OwotCQl9Ci0JCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItc3IiKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJcGFyYW0tPnNhbXBsZVJhdGUgPSBhdG9pKCphcmd2KTsKLQkJfQotCQllbHNlIGlmICghc3RyY21wKCphcmd2LCAiLWNoIikpCi0JCXsKLQkJCWFyZ3YrKzsKLQkJCWFyZ2MtLTsKLQkJCXBhcmFtLT5uQ2hhbm5lbHMgPSBhdG9pKCphcmd2KTsKLQkJfQotCQllbHNlIGlmICghc3RyY21wKCphcmd2LCAiLWJyIikpCi0JCXsKLQkJCWFyZ3YrKzsKLQkJCWFyZ2MtLTsKLQkJCXBhcmFtLT5iaXRSYXRlID0gYXRvaSgqYXJndik7Ci0JCX0KLQkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLWFkdHMiKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJcGFyYW0tPmFkdHNVc2VkID0gYXRvaSgqYXJndik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlhcmd2Kys7Ci0JCWFyZ2MtLTsKLQl9Ci0KLQlpZihwYXJhbS0+Yml0UmF0ZSA9PSAwKQotCXsKLQkJaW50IHNjYWxlID0gNDQxOwotCQlpZihwYXJhbS0+c2FtcGxlUmF0ZSU4MDAwID09IDApCi0JCQlzY2FsZSA9IDQ4MDsKLQkJcGFyYW0tPmJpdFJhdGUgPSA2NDAqcGFyYW0tPm5DaGFubmVscypwYXJhbS0+c2FtcGxlUmF0ZS9zY2FsZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IFJlYWRGaWxlMkJ1ZihGSUxFKiBpbmZpbGUsdW5zaWduZWQgY2hhciogZGVzdCxpbnQgcmVhZFNpemUpCi17Ci0JaW50IHJlYWRCeXRlcyA9IDA7Ci0JcmVhZEJ5dGVzID0gZnJlYWQoZGVzdCwgMSwgcmVhZFNpemUsIGluZmlsZSk7Ci0JcmV0dXJuIHJlYWRCeXRlczsKLX0KLQotdHlwZWRlZiBpbnQgKFZPX0FQSSAqIFZPR0VUQVVESU9ERUNBUEkpIChWT19BVURJT19DT0RFQ0FQSSAqIHBEZWNIYW5kbGUpOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JRklMRQkJCQkJCSppbmZpbGUsICpvdXRmaWxlOwotCWludAkJCQkJCQl0MSwgdDI7Ci0JVk9fQVVESU9fQ09ERUNBUEkJCQlBdWRpb0FQSTsKLQlWT19NRU1fT1BFUkFUT1IJCQkJbW9wZXI7Ci0JVk9fQ09ERUNfSU5JVF9VU0VSREFUQQkJdXNlRGF0YTsKLQlWT19IQU5ETEUJCQkJCWhDb2RlYzsKLQlWT19DT0RFQ0JVRkZFUgkJCQlpbkRhdGE7Ci0JVk9fQ09ERUNCVUZGRVIJCQkJb3V0RGF0YTsKLQlWT19BVURJT19PVVRQVVRJTkZPCQkJb3V0SW5mbzsKLSAgICBpbnQJCQkJCQkJZmlyc3RXcml0ZSA9IDE7Ci0JaW50CQkJCQkJCWVvZkZpbGUgPSAwOwotCWludAkJCQkJCQkqaW5mbz0oaW50KilpbkJ1ZjsKLQlpbnQJCQkJCQkJYnl0ZXNMZWZ0LCBuUmVhZDsKLQlpbnQJCQkJCQkJRW5jb2RlcmRGcmFtZSA9IDA7Ci0JaW50CQkJCQkJCXRvdGFsID0gMDsKLQlpbnQJCQkJCQkJaXNPdXRwdXQgPSAxOwotCWludAkJCQkJCQlyZXR1cm5Db2RlOwotCUFBQ0VOQ19QQVJBTQkJCQlhYWNwYXJhOwotCXZvaWQJCQkJCQkqaGFuZGxlOwotCXZvaWQJCQkJCQkqcGZ1bmM7Ci0JVk9HRVRBVURJT0RFQ0FQSQkJCXBHZXRBUEk7Ci0JY29uc3QgY2hhcgkJCQkJKmluZmlsZU5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIJCQkJCSpvdXRmaWxlTmFtZSA9IE5VTEw7Ci0KLQlyZXR1cm5Db2RlID0gcGFyc2VjbWRsaW5lKGFyZ2MsYXJndiwgJmluZmlsZU5hbWUsICZvdXRmaWxlTmFtZSwgJmFhY3BhcmEpOwotCWlmKHJldHVybkNvZGUpCi0JewotCQlwcmludGYoIiVzIiwgSGVscFN0cmluZyk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIG9wZW4gaW5wdXQgZmlsZSAqLwotCWluZmlsZSA9IGZvcGVuKGluZmlsZU5hbWUsICJyYiIpOwotCWlmICghaW5maWxlKSB7Ci0JCXByaW50ZigiT3BlbiBpbnB1dCBmaWxlIGZhaWwuLi4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIG9wZW4gb3V0cHV0IGZpbGUgKi8KLQlpZihpc091dHB1dCkKLQl7Ci0JCW91dGZpbGUgPSBmb3BlbihvdXRmaWxlTmFtZSwgIndiIik7Ci0JCWlmICghb3V0ZmlsZSkgewotCQkJcHJpbnRmKCJPcGVuIG91dHB1dCBmaWxlIGZhaWwuLi4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQkvLyBzZXQgbWVtb3J5IG9wZXJhdG9yczsKLQltb3Blci5BbGxvYyA9IGNtbk1lbUFsbG9jOwotCW1vcGVyLkNvcHkgPSBjbW5NZW1Db3B5OwotCW1vcGVyLkZyZWUgPSBjbW5NZW1GcmVlOwotCW1vcGVyLlNldCA9IGNtbk1lbVNldDsKLQltb3Blci5DaGVjayA9IGNtbk1lbUNoZWNrOwotCXVzZURhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7Ci0JdXNlRGF0YS5tZW1EYXRhID0gKFZPX1BUUikoJm1vcGVyKTsKLQkvLyBvcGVuIGVuY29kZXIgZGxsOwotCWhhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHQuc28iLCBSVExEX05PVyk7Ci0JaWYoaGFuZGxlID09IDApCi0JewotCQlwcmludGYoIm9wZW4gZGxsIGVycm9yLi4uLi4uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLy8gR2V0IEFQSTsKLQlwZnVuYyA9IGRsc3ltKGhhbmRsZSwgInZvR2V0QUFDRW5jQVBJIik7Ci0JaWYocGZ1bmMgPT0gMCkKLQl7Ci0JCXByaW50Zigib3BlbiBmdW5jdGlvbiBlcnJvci4uLi4uLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBHZXRBUEkgPSAoVk9HRVRBVURJT0RFQ0FQSSlwZnVuYzsKLQlyZXR1cm5Db2RlICA9IHBHZXRBUEkoJkF1ZGlvQVBJKTsKLQlpZihyZXR1cm5Db2RlKQotCQlyZXR1cm4gLTE7Ci0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBJbml0IEVuY29kaW5nIFNlY3Rpb24gICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCXJldHVybkNvZGUgPSBBdWRpb0FQSS5Jbml0KCZoQ29kZWMsIFZPX0FVRElPX0NvZGluZ0FBQywgJnVzZURhdGEpOwotCWlmKHJldHVybkNvZGUgPCAwKQotCXsKLQkJcHJpbnRmKCIjIyMjIFZPSV9FcnJvcjI6ZmFpbCB0byBpbml0aWFsaXplIHRoZSBFbmNvZGVyciMjI1xuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuU2V0UGFyYW0oaENvZGVjLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAmYWFjcGFyYSk7Ci0KLQlpbkRhdGEuQnVmZmVyID0gaW5CdWY7Ci0JYnl0ZXNMZWZ0ID0gUmVhZEZpbGUyQnVmKGluZmlsZSxpbkRhdGEuQnVmZmVyLFJFQURfU0laRSk7Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIEVuY29kaW5nIFNlY3Rpb24gICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0JZG8gewotCi0JCWluRGF0YS5MZW5ndGggICAgPSBieXRlc0xlZnQ7Ci0JCW91dERhdGEuQnVmZmVyICAgPSBvdXRCdWY7Ci0JCW91dERhdGEuTGVuZ3RoID0gMTAyNCo4OwotCi0JCXQxID0gY2xvY2soKTsKLQotCQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuU2V0SW5wdXREYXRhKGhDb2RlYywmaW5EYXRhKTsKLQotCQlkbyB7Ci0JCQlvdXREYXRhLkJ1ZmZlciAgID0gb3V0QnVmOwotCQkJb3V0RGF0YS5MZW5ndGggPSAxMDI0Kjg7Ci0KLQkJCXJldHVybkNvZGUgPSBBdWRpb0FQSS5HZXRPdXRwdXREYXRhKGhDb2RlYywmb3V0RGF0YSwgJm91dEluZm8pOwotCi0JCQlpZihyZXR1cm5Db2RlID09IDApCi0JCQkJRW5jb2RlcmRGcmFtZSsrOwotCQkJaWYocmV0dXJuQ29kZSA9PSBWT19FUlJfTElDRU5TRV9FUlJPUikKLQkJCQlicmVhazsKLQotI2lmIFZPX0FBQ19FX09VVFBVVAotCQkJaWYgKGlzT3V0cHV0ICYmIHJldHVybkNvZGUgPT0gMCkKLQkJCXsKLQkJCQlmd3JpdGUob3V0RGF0YS5CdWZmZXIsIDEsIG91dERhdGEuTGVuZ3RoLCBvdXRmaWxlKTsKLQkJCX0KLSNlbmRpZgotCQl9IHdoaWxlKHJldHVybkNvZGUgIT0gKFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpKTsKLQotCQlpZihyZXR1cm5Db2RlID09IFZPX0VSUl9MSUNFTlNFX0VSUk9SKQotCQkJYnJlYWs7Ci0KLQkJdDIgPSBjbG9jaygpOwotCQl0b3RhbCArPSB0MiAtIHQxOwotCi0JCWlmICghZW9mRmlsZSkgewotCQkJblJlYWQgPSBSZWFkRmlsZTJCdWYoaW5maWxlLCBpbkJ1ZixSRUFEX1NJWkUpOwotCQkJYnl0ZXNMZWZ0ID0gblJlYWQ7Ci0JCQlpbkRhdGEuQnVmZmVyID0gaW5CdWY7Ci0JCQlpZiAoZmVvZihpbmZpbGUpKQotCQkJCWVvZkZpbGUgPSAxOwotCQl9Ci0KLQl9IHdoaWxlICghZW9mRmlsZSAmJiByZXR1cm5Db2RlKTsKLQotCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgRW5kIEVuY29kaW5nIFNlY3Rpb24gICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuVW5pbml0KGhDb2RlYyk7Ci0KLQlmY2xvc2UoaW5maWxlKTsKLQlpZiAob3V0ZmlsZSkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShvdXRmaWxlKTsKLSAgICB9Ci0JZGxjbG9zZShoYW5kbGUpOwotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmE0ZjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJBQUNFbmNUZXN0IiwKLQotICAgIHNyY3M6IFsiQUFDX0VfU0FNUExFUy5jIl0sCi0KLSAgICBhcmNoOiB7Ci0gICAgICAgIGFybTogewotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImxpYmRsIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiJdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTk9USUNFIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzA0Mjk0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlNvZnRBQUNFbmNvZGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiU29mdEFBQ0VuY29kZXIuaCIKLQotI2luY2x1ZGUgInZvQUFDLmgiCi0jaW5jbHVkZSAiY21uTWVtb3J5LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1zdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgewotICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7Ci0gICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOwotICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKLSAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKLSAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOwotfQotCi1Tb2Z0QUFDRW5jb2Rlcjo6U29mdEFBQ0VuY29kZXIoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAotICAgICAgbUVuY29kZXJIYW5kbGUoTlVMTCksCi0gICAgICBtQXBpSGFuZGxlKE5VTEwpLAotICAgICAgbU1lbU9wZXJhdG9yKE5VTEwpLAotICAgICAgbU51bUNoYW5uZWxzKDEpLAotICAgICAgbVNhbXBsZVJhdGUoNDQxMDApLAotICAgICAgbUJpdFJhdGUoMCksCi0gICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKLSAgICAgIG1JbnB1dFNpemUoMCksCi0gICAgICBtSW5wdXRGcmFtZShOVUxMKSwKLSAgICAgIG1JbnB1dFRpbWVVcygtMWxsKSwKLSAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCi0gICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKLSAgICBpbml0UG9ydHMoKTsKLSAgICBDSEVDS19FUShpbml0RW5jb2RlcigpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgc2V0QXVkaW9QYXJhbXMoKTsKLX0KLQotU29mdEFBQ0VuY29kZXI6On5Tb2Z0QUFDRW5jb2RlcigpIHsKLSAgICBvblJlc2V0KCk7Ci0KLSAgICBpZiAobUVuY29kZXJIYW5kbGUpIHsKLSAgICAgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwgbUFwaUhhbmRsZS0+VW5pbml0KG1FbmNvZGVySGFuZGxlKSk7Ci0gICAgICAgIG1FbmNvZGVySGFuZGxlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBkZWxldGUgbUFwaUhhbmRsZTsKLSAgICBtQXBpSGFuZGxlID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtTWVtT3BlcmF0b3I7Ci0gICAgbU1lbU9wZXJhdG9yID0gTlVMTDsKLX0KLQotdm9pZCBTb2Z0QUFDRW5jb2Rlcjo6aW5pdFBvcnRzKCkgewotICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwotICAgIEluaXRPTVhQYXJhbXMoJmRlZik7Ci0KLSAgICBkZWYublBvcnRJbmRleCA9IDA7Ci0gICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwotICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkgKiAyOwotICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwotICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwotICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKLSAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMTsKLQotICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKLSAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOwotICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOwotICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKLQotICAgIGFkZFBvcnQoZGVmKTsKLQotICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKLSAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwotICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7Ci0gICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7Ci0gICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwotICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOwotCi0gICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL2FhYyIpOwotICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7Ci0gICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nQUFDOwotCi0gICAgYWRkUG9ydChkZWYpOwotfQotCi1zdGF0dXNfdCBTb2Z0QUFDRW5jb2Rlcjo6aW5pdEVuY29kZXIoKSB7Ci0gICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKLQotICAgIGlmIChWT19FUlJfTk9ORSAhPSB2b0dldEFBQ0VuY0FQSShtQXBpSGFuZGxlKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7Ci0gICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOwotICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7Ci0gICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKLSAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKLSAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7Ci0KLSAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOwotICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOwotICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOwotICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSBtTWVtT3BlcmF0b3I7Ci0gICAgaWYgKFZPX0VSUl9OT05FICE9Ci0gICAgICAgICAgICBtQXBpSGFuZGxlLT5Jbml0KCZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQUFDLCAmdXNlckRhdGEpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBBQUMgZW5jb2RlciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgU29mdEFBQ0VuY29kZXI6OmludGVybmFsR2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQotICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9Ci0gICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdQQ00gOiBPTVhfQVVESU9fQ29kaW5nQUFDOwotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQotICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1BhcmFtcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYWFjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhYWNQYXJhbXMtPm5CaXRSYXRlID0gbUJpdFJhdGU7Ci0gICAgICAgICAgICBhYWNQYXJhbXMtPm5BdWRpb0JhbmRXaWR0aCA9IDA7Ci0gICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyA9IDA7Ci0gICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUNFUnRvb2xzID0gMDsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUFBQ1Byb2ZpbGUgPSBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbjsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUFBQ1N0cmVhbUZvcm1hdCA9IE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRGRjsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUNoYW5uZWxNb2RlID0gT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvOwotCi0gICAgICAgICAgICBhYWNQYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+bkZyYW1lTGVuZ3RoID0gMDsKLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KLSAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwotCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKLQotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOwotICAgIH0KLX0KLQotT01YX0VSUk9SVFlQRSBTb2Z0QUFDRW5jb2Rlcjo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7Ci0gICAgc3dpdGNoIChpbmRleCkgewotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHJvbGVQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19lbmNvZGVyLmFhYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKLQotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkKLSAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdBQUMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KLSAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICopcGFyYW1zOwotCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJpdFJhdGUgPSBhYWNQYXJhbXMtPm5CaXRSYXRlOwotICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gYWFjUGFyYW1zLT5uQ2hhbm5lbHM7Ci0gICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IGFhY1BhcmFtcy0+blNhbXBsZVJhdGU7Ci0KLSAgICAgICAgICAgIGlmIChzZXRBdWRpb1BhcmFtcygpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KLSAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwotCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gcGNtUGFyYW1zLT5uQ2hhbm5lbHM7Ci0gICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZTsKLQotICAgICAgICAgICAgaWYgKHNldEF1ZGlvUGFyYW1zKCkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFNvZnRBQUNFbmNvZGVyOjpzZXRBdWRpb1BhcmFtcygpIHsKLSAgICAvLyBXZSBjYWxsIHRoaXMgd2hlbmV2ZXIgc2FtcGxlIHJhdGUsIG51bWJlciBvZiBjaGFubmVscyBvciBiaXRyYXRlIGNoYW5nZQotICAgIC8vIGluIHJlcG9uc2UgdG8gc2V0UGFyYW1ldGVyIGNhbGxzLgotCi0gICAgQUxPR1YoInNldEF1ZGlvUGFyYW1zOiAldSBIeiwgJXUgY2hhbm5lbHMsICV1IGJwcyIsCi0gICAgICAgICBtU2FtcGxlUmF0ZSwgbU51bUNoYW5uZWxzLCBtQml0UmF0ZSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIEFBQ0VOQ19QQVJBTSBwYXJhbXM7Ci0gICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKLSAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgIHBhcmFtcy5iaXRSYXRlID0gbUJpdFJhdGU7Ci0gICAgcGFyYW1zLm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKLSAgICBwYXJhbXMuYWR0c1VzZWQgPSAwOyAgLy8gV2UgYWRkIGFkdHMgaGVhZGVyIGluIHRoZSBmaWxlIHdyaXRlciBpZiBuZWVkZWQuCi0gICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKAotICAgICAgICAgICAgICAgIG1FbmNvZGVySGFuZGxlLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAgJnBhcmFtcykpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlVGFibGVJbmRleChpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgJmluZGV4KSB7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsZVJhdGVUYWJsZVtdID0gewotICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAotICAgICAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKLSAgICB9OwotICAgIGNvbnN0IGludDMyX3QgdGFibGVTaXplID0KLSAgICAgICAgc2l6ZW9mKGtTYW1wbGVSYXRlVGFibGUpIC8gc2l6ZW9mKGtTYW1wbGVSYXRlVGFibGVbMF0pOwotCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFibGVTaXplOyArK2kpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgPT0ga1NhbXBsZVJhdGVUYWJsZVtpXSkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci19Ci0KLXN0YXR1c190IFNvZnRBQUNFbmNvZGVyOjpzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpIHsKLSAgICAvLyBUaGUgQUFDIGVuY29kZXIncyBhdWRpbyBzcGVjaWZpYyBjb25maWcgcmVhbGx5IG9ubHkgZW5jb2RlcwotICAgIC8vIG51bWJlciBvZiBjaGFubmVscyBhbmQgdGhlIHNhbXBsZSByYXRlIChtYXBwZWQgdG8gYW4gaW5kZXggaW50bwotICAgIC8vIGEgZml4ZWQgc2FtcGxlIHJhdGUgdGFibGUpLgotCi0gICAgaW50MzJfdCBpbmRleDsKLSAgICBzdGF0dXNfdCBlcnIgPSBnZXRTYW1wbGVSYXRlVGFibGVJbmRleChtU2FtcGxlUmF0ZSwgaW5kZXgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICgldSBIeikiLCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1OdW1DaGFubmVscyA+IDIgfHwgbU51bUNoYW5uZWxzIDw9IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscygldSkiLCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBPTVhfQVVESU9fQUFDT2JqZWN0TEMKLSAgICBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGFbMF0gPSAoKDB4MDIgPDwgMykgfCAoaW5kZXggPj4gMSkpOwotICAgIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YVsxXSA9ICgoaW5kZXggJiAweDAxKSA8PCA3KSB8IChtTnVtQ2hhbm5lbHMgPDwgMyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgU29mdEFBQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKnBvcnRJbmRleCovKSB7Ci0gICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7Ci0KLSAgICBpZiAoIW1TZW50Q29kZWNTcGVjaWZpY0RhdGEpIHsKLSAgICAgICAgLy8gVGhlIHZlcnkgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBvdXRwdXQgaXMgdGhlIGNvZGVjIHNwZWNpZmljCi0gICAgICAgIC8vIGRhdGEuIEl0IGRvZXMgbm90IHJlcXVpcmUgYW55IGlucHV0IGRhdGEgYnV0IHdlIHdpbGwgbmVlZCBhbgotICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIGl0IGluLgotCi0gICAgICAgIGlmIChvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBzaXplb2YobUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKTsKLSAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKLQotICAgICAgICB1aW50OF90ICpvdXQgPSBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIG1lbWNweShvdXQsIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YSwgc2l6ZW9mKG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YSkpOwotCi0jaWYgMAotICAgICAgICBBTE9HSSgic2VuZGluZyBjb2RlYyBzcGVjaWZpYyBkYXRhLiIpOwotICAgICAgICBoZXhkdW1wKG91dCwgc2l6ZW9mKG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YSkpOwotI2VuZGlmCi0KLSAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLQotICAgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0KLSAgICAgICAgbU51bUNoYW5uZWxzICoga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgLy8gV2UgZG8gdGhlIGZvbGxvd2luZyB1bnRpbCB3ZSBydW4gb3V0IG9mIGJ1ZmZlcnMuCi0KLSAgICAgICAgd2hpbGUgKG1JbnB1dFNpemUgPCBudW1CeXRlc1BlcklucHV0RnJhbWUpIHsKLSAgICAgICAgICAgIC8vIEFzIGxvbmcgYXMgdGhlcmUncyBzdGlsbCBpbnB1dCBkYXRhIHRvIGJlIHJlYWQgd2UKLSAgICAgICAgICAgIC8vIHdpbGwgZHJhaW4gImtOdW1TYW1wbGVzUGVyRnJhbWUgKiBtTnVtQ2hhbm5lbHMiIHNhbXBsZXMKLSAgICAgICAgICAgIC8vIGludG8gdGhlICJtSW5wdXRGcmFtZSIgYnVmZmVyIGFuZCB0aGVuIGVuY29kZSB0aG9zZQotICAgICAgICAgICAgLy8gYXMgYSB1bml0IGludG8gYW4gb3V0cHV0IGJ1ZmZlci4KLQotICAgICAgICAgICAgaWYgKG1TYXdJbnB1dEVPUyB8fCBpblF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluRGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7Ci0KLSAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gbnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUlucHV0U2l6ZTsKLSAgICAgICAgICAgIGlmIChjb3B5ID4gaW5IZWFkZXItPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgICAgICAgICBjb3B5ID0gaW5IZWFkZXItPm5GaWxsZWRMZW47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSW5wdXRGcmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0RnJhbWUgPSBuZXcgaW50MTZfdFtrTnVtU2FtcGxlc1BlckZyYW1lICogbU51bUNoYW5uZWxzXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1JbnB1dFNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIG1JbnB1dFRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKiltSW5wdXRGcmFtZSArIG1JbnB1dFNpemUsIGluRGF0YSwgY29weSk7Ci0gICAgICAgICAgICBtSW5wdXRTaXplICs9IGNvcHk7Ci0KLSAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGNvcHk7Ci0gICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBjb3B5OwotCi0gICAgICAgICAgICAvLyAiVGltZSIgb24gdGhlIGlucHV0IGJ1ZmZlciBoYXMgaW4gZWZmZWN0IGFkdmFuY2VkIGJ5IHRoZQotICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3ZSBqdXN0IGFkdmFuY2VkIG5PZmZzZXQgYnkuCi0gICAgICAgICAgICBpbkhlYWRlci0+blRpbWVTdGFtcCArPQotICAgICAgICAgICAgICAgIChjb3B5ICogMTAwMDAwMGxsIC8gbVNhbXBsZVJhdGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1OdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0KLSAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNhdyBpbnB1dCBFT1MiKTsKLSAgICAgICAgICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBQYWQgYW55IHJlbWFpbmluZyBkYXRhIHdpdGggemVyb2VzLgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKiltSW5wdXRGcmFtZSArIG1JbnB1dFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUlucHV0U2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSA9IG51bUJ5dGVzUGVySW5wdXRGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLQotICAgICAgICAgICAgICAgIGluRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBdCB0aGlzICBwb2ludCB3ZSBoYXZlIGFsbCB0aGUgaW5wdXQgZGF0YSBuZWNlc3NhcnkgdG8gZW5jb2RlCi0gICAgICAgIC8vIGEgc2luZ2xlIGZyYW1lLCBhbGwgd2UgbmVlZCBpcyBhbiBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSByZXN1bHQKLSAgICAgICAgLy8gaW4uCi0KLSAgICAgICAgaWYgKG91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOwotICAgICAgICBtZW1zZXQoJmlucHV0RGF0YSwgMCwgc2l6ZW9mKGlucHV0RGF0YSkpOwotICAgICAgICBpbnB1dERhdGEuQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKiltSW5wdXRGcmFtZTsKLSAgICAgICAgaW5wdXREYXRhLkxlbmd0aCA9IG51bUJ5dGVzUGVySW5wdXRGcmFtZTsKLSAgICAgICAgQ0hFQ0soKFZPX1UzMilWT19FUlJfTk9ORSA9PQotICAgICAgICAgICAgICAgIG1BcGlIYW5kbGUtPlNldElucHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJmlucHV0RGF0YSkpOwotCi0gICAgICAgIFZPX0NPREVDQlVGRkVSIG91dHB1dERhdGE7Ci0gICAgICAgIG1lbXNldCgmb3V0cHV0RGF0YSwgMCwgc2l6ZW9mKG91dHB1dERhdGEpKTsKLSAgICAgICAgVk9fQVVESU9fT1VUUFVUSU5GTyBvdXRwdXRJbmZvOwotICAgICAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7Ci0KLSAgICAgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKilvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBvdXRBdmFpbGFibGUgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldDsKLQotICAgICAgICBWT19VMzIgcmV0ID0gVk9fRVJSX05PTkU7Ci0gICAgICAgIHNpemVfdCBuT3V0cHV0Qnl0ZXMgPSAwOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBvdXRwdXREYXRhLkJ1ZmZlciA9IG91dFB0cjsKLSAgICAgICAgICAgIG91dHB1dERhdGEuTGVuZ3RoID0gb3V0QXZhaWxhYmxlIC0gbk91dHB1dEJ5dGVzOwotICAgICAgICAgICAgcmV0ID0gbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsICZvdXRwdXREYXRhLCAmb3V0cHV0SW5mbyk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IFZPX0VSUl9OT05FKSB7Ci0gICAgICAgICAgICAgICAgb3V0UHRyICs9IG91dHB1dERhdGEuTGVuZ3RoOwotICAgICAgICAgICAgICAgIG5PdXRwdXRCeXRlcyArPSBvdXRwdXREYXRhLkxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmV0ICE9IFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpOwotCi0gICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG5PdXRwdXRCeXRlczsKLQotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7Ci0KLSAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgewotICAgICAgICAgICAgLy8gV2UgYWxzbyB0YWcgdGhpcyBvdXRwdXQgYnVmZmVyIHdpdGggRU9TIGlmIGl0IGNvcnJlc3BvbmRzCi0gICAgICAgICAgICAvLyB0byB0aGUgZmluYWwgaW5wdXQgYnVmZmVyLgotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtSW5wdXRUaW1lVXM7Ci0KLSNpZiAwCi0gICAgICAgIEFMT0dJKCJzZW5kaW5nICVkIGJ5dGVzIG9mIGRhdGEgKHRpbWUgPSAlbGxkIHVzLCBmbGFncyA9IDB4JTA4bHgpIiwKLSAgICAgICAgICAgICAgbk91dHB1dEJ5dGVzLCBtSW5wdXRUaW1lVXMsIG91dEhlYWRlci0+bkZsYWdzKTsKLQotICAgICAgICBoZXhkdW1wKG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKLSNlbmRpZgotCi0gICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0KLSAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKLSAgICAgICAgb3V0SW5mbyA9IE5VTEw7Ci0KLSAgICAgICAgbUlucHV0U2l6ZSA9IDA7Ci0gICAgfQotfQotCi12b2lkIFNvZnRBQUNFbmNvZGVyOjpvblJlc2V0KCkgewotICAgIGRlbGV0ZVtdIG1JbnB1dEZyYW1lOwotICAgIG1JbnB1dEZyYW1lID0gTlVMTDsKLSAgICBtSW5wdXRTaXplID0gMDsKLQotICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKLSAgICBtSW5wdXRUaW1lVXMgPSAtMWxsOwotICAgIG1TYXdJbnB1dEVPUyA9IGZhbHNlOwotICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi1hbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCi0gICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKLSAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRBQUNFbmNvZGVyKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNzUzYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYmFzaWNvcDIuaAotCi0JQ29udGVudDoJQ29uc3RhbnRzICwgR2xvYmFscyBhbmQgQmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19CQVNJQ19PUF9ICi0jZGVmaW5lIF9fQkFTSUNfT1BfSAotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi0jZGVmaW5lIE1BWF8zMiAoV29yZDMyKTB4N2ZmZmZmZmZMCi0jZGVmaW5lIE1JTl8zMiAoV29yZDMyKTB4ODAwMDAwMDBMCi0KLSNkZWZpbmUgTUFYXzE2IChXb3JkMTYpMHg3ZmZmCi0jZGVmaW5lIE1JTl8xNiAoV29yZDE2KTB4ODAwMAotI2RlZmluZSBBQlMoYSkJKChhKSA+PSAwKSA/IChhKSA6ICgtKGEpKQotCi0vKiBTaG9ydCBhYnMsICAgICAgICAgICAxICAgKi8KLSNkZWZpbmUgYWJzX3MoeCkgICAgICAgKChXb3JkMTYpKCgoeCkgIT0gTUlOXzE2KSA/ICgoKHgpID49IDApID8gKHgpIDogKC0oeCkpKSA6IE1BWF8xNikpCi0KLS8qIDE2IGJpdCB2YXIxIC0+IE1TQiwgICAgIDIgKi8KLSNkZWZpbmUgTF9kZXBvc2l0X2goeCkgKCgoV29yZDMyKSh4KSkgPDwgMTYpCi0KLQotLyogMTYgYml0IHZhcjEgLT4gTFNCLCAgICAgMiAqLwotI2RlZmluZSBMX2RlcG9zaXRfbCh4KSAoKFdvcmQzMikoeCkpCi0KLQotLyogTG9uZyBhYnMsICAgICAgICAgICAgICAzICAqLwotI2RlZmluZSBMX2Ficyh4KSAoKCh4KSAhPSBNSU5fMzIpID8gKCgoeCkgPj0gMCkgPyAoeCkgOiAoLSh4KSkpIDogTUFYXzMyKQotCi0KLS8qIFNob3J0IG5lZ2F0ZSwgICAgICAgIDEgICAqLwotI2RlZmluZSBuZWdhdGUodmFyMSkgKChXb3JkMTYpKCgodmFyMSkgPT0gTUlOXzE2KSA/IE1BWF8xNiA6ICgtKHZhcjEpKSkpCi0KLQotLyogTG9uZyBuZWdhdGUsICAgICAyICovCi0jZGVmaW5lIExfbmVnYXRlKExfdmFyMSkgKCgoTF92YXIxKSA9PSAoTUlOXzMyKSkgPyAoTUFYXzMyKSA6ICgtKExfdmFyMSkpKQotCi0KLSNkZWZpbmUgTVVMSElHSChBLEIpIChpbnQpKCgoV29yZDY0KShBKSooV29yZDY0KShCKSkgPj4gMzIpCi0jZGVmaW5lIGZpeG11bChhLCBiKSAoaW50KSgoKChXb3JkNjQpKGEpKihXb3JkNjQpKGIpKSA+PiAzMikgPDwgMSkKLQotCi0jaWYgIChTQVRSVUFURV9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc2F0dXJhdGUoV29yZDMyIExfdmFyMSk7Ci0jZWxzZQotV29yZDE2IHNhdHVyYXRlKFdvcmQzMiBMX3ZhcjEpOwotI2VuZGlmCi0KLS8qIFNob3J0IHNoaWZ0IGxlZnQsICAgIDEgICAqLwotI2lmIChTSExfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHNobCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIFNob3J0IHNoaWZ0IHJpZ2h0LCAgIDEgICAqLwotI2lmIChTSFJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHNociAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLSNpZiAoTF9NVUxUX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX211bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMzIgTF9tdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogTXN1LCAgMSAgKi8KLSNpZiAoTF9NU1VfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX21zdSAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBMb25nIHN1YiwgICAgICAgIDIgKi8KLSNpZiAoTF9TVUJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsKLSNlbmRpZgotCi0vKiBMb25nIHNoaWZ0IGxlZnQsIDIgKi8KLSNpZiAoTF9TSExfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogTG9uZyBzaGlmdCByaWdodCwgMiovCi0jaWYgKExfU0hSX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3NociAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX3NociAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIFNob3J0IGFkZCwgICAgICAgICAgIDEgICAqLwotI2lmIChBRERfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIFNob3J0IHN1YiwgICAgICAgICAgIDEgICAqLwotI2lmIChTVUJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBzdWIoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBTaG9ydCBkaXZpc2lvbiwgICAgICAgMTggICovCi0jaWYgKERJVl9TX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgZGl2X3MgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogU2hvcnQgbXVsdCwgICAgICAgICAgMSAgICovCi0jaWYgKE1VTFRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogU2hvcnQgbm9ybSwgICAgICAgICAgIDE1ICAqLwotI2lmIChOT1JNX1NfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpOwotI2Vsc2UKLVdvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKTsKLSNlbmRpZgotCi0vKiBMb25nIG5vcm0sICAgICAgICAgICAgMzAgICovCi0jaWYgKE5PUk1fTF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKTsKLSNlbHNlCi1Xb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKTsKLSNlbmRpZgotCi0vKiBSb3VuZCwgICAgICAgICAgICAgICAxICAgKi8KLSNpZiAoUk9VTkRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSk7Ci0jZWxzZQotV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSk7Ci0jZW5kaWYKLQotLyogTWFjLCAgMSAgKi8KLSNpZiAoTF9NQUNfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0jaWYgKExfQUREX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX2FkZCAoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMik7Ci0jZWxzZQotV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsKLSNlbmRpZgotCi0vKiBFeHRyYWN0IGhpZ2gsICAgICAgICAxICAgKi8KLSNpZiAoRVhUUkFDVF9IX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBleHRyYWN0X2ggKFdvcmQzMiBMX3ZhcjEpOwotI2Vsc2UKLVdvcmQxNiBleHRyYWN0X2ggKFdvcmQzMiBMX3ZhcjEpOwotI2VuZGlmCi0KLS8qIEV4dHJhY3QgbG93LCAgICAgICAgIDEgICAqLwotI2lmIChFWFRSQUNUX0xfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfbChXb3JkMzIgTF92YXIxKTsKLSNlbHNlCi1Xb3JkMTYgZXh0cmFjdF9sKFdvcmQzMiBMX3ZhcjEpOwotI2VuZGlmCi0KLS8qIE11bHQgd2l0aCByb3VuZCwgMiAqLwotI2lmIChNVUxUX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG11bHRfcihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBtdWx0X3IoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBTaGlmdCByaWdodCB3aXRoIHJvdW5kLCAyICAgICAgICAgICAqLwotI2lmIChTSFJfUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc2hyX3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDE2IHNocl9yIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIE1hYyB3aXRoIHJvdW5kaW5nLDIgKi8KLSNpZiAoTUFDX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBNc3Ugd2l0aCByb3VuZGluZywyICovCi0jaWYgKE1TVV9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBtc3VfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgbXN1X3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogTG9uZyBzaGlmdCByaWdodCB3aXRoIHJvdW5kLCAgMyAgICAgICAgICAgICAqLwotI2lmIChMX1NIUl9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0jaWYgQVJNVjRfSU5BU00KLV9faW5saW5lIFdvcmQzMiBBU01fTF9zaHIoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0JcmV0dXJuIExfdmFyMSA+PiB2YXIyOwotfQotCi1fX2lubGluZSBXb3JkMzIgQVNNX0xfc2hsKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQotewotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIk1PVgklW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNMICVbdmFyMl0gXG4iCi0JCSJURVEJJVtMX3ZhcjFdLCAlW3Jlc3VsdF0sIEFTUiAlW3ZhcjJdXG4iCi0JCSJFT1JORSAgJVtyZXN1bHRdLCAlW21hc2tdLCAlW0xfdmFyMV0sIEFTUiAjMzFcbiIKLQkJOltyZXN1bHRdIj0mciIocmVzdWx0KQotCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpLCBbbWFza10iciIoMHg3ZmZmZmZmZikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1fX2lubGluZSBXb3JkMzIgQVNNX3NocihXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJDTVAJJVt2YXIyXSwgIzE1XG4iCi0JCSJNT1ZMVAklW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNSICVbdmFyMl1cbiIKLQkJIk1PVkdFCSVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU1IgIzE1XG4iCi0JCTpbcmVzdWx0XSI9ciIocmVzdWx0KQotCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotX19pbmxpbmUgV29yZDMyIEFTTV9zaGwoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjZfU0FUCi0JV29yZDMyIHJlc3VsdDsKLQlhc20gKAotCQkiQ01QCSVbdmFyMl0sICMxNlxuIgotCQkiTU9WTFQgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgJVt2YXIyXVxuIgotCQkiTU9WR0UgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgIzE2XG4iCi0JCSJTU0FUICAgJVtyZXN1bHRdLCAjMTYsICVbcmVzdWx0XVxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotCVdvcmQzMiByZXN1bHQ7Ci0JV29yZDMyIHRtcDsKLQlhc20gKAotCQkiQ01QCSVbdmFyMl0sICMxNlxuIgotCQkiTU9WTFQgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgJVt2YXIyXVxuIgotCQkiTU9WR0UgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgIzE2XG4iCi0gICAgICAgICJNT1YgICAgJVt0bXBdLCAlW3Jlc3VsdF0sIEFTUiAjMTVcbiIKLSAgICAgICAgIlRFUSAgICAlW3RtcF0sICVbcmVzdWx0XSwgQVNSICMzMSBcbiIKLSAgICAgICAgIkVPUk5FICAlW3Jlc3VsdF0sICVbbWFza10sICVbcmVzdWx0XSxBU1IgIzMxIgotCQk6W3Jlc3VsdF0iPSZyIihyZXN1bHQpLCBbdG1wXSI9JnIiKHRtcCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKSwgW21hc2tdInIiKDB4N2ZmZikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBkZWZpbml0aW9ucyBmb3IgaW5saW5lIGJhc2ljIGFyaXRobWV0aWMgb3BlcmF0b3JzICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKFNBVFJVQVRFX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzYXR1cmF0ZShXb3JkMzIgTF92YXIxKQotewotI2lmIEFSTVY2X1NBVAotICAgIFdvcmQxNiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNTQVQgJVtyZXN1bHRdLCAjMTYsICVbTF92YXIxXSIKLQkJOiBbcmVzdWx0XSI9ciIocmVzdWx0KQotCQk6IFtMX3ZhcjFdInIiKExfdmFyMSkKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2VsaWYgQVJNVjVURV9TQVQKLQlXb3JkMTYgcmVzdWx0OwotCVdvcmQzMiB0bXA7Ci0JYXNtIHZvbGF0aWxlICgKLQkJIk1PVgklW3RtcF0sICVbTF92YXIxXSxBU1IjMTVcbiIKLQkJIlRFUQklW3RtcF0sICVbTF92YXIxXSxBU1IjMzFcbiIKLQkJIkVPUk5FCSVbcmVzdWx0XSwgJVttYXNrXSwlW0xfdmFyMV0sQVNSIzMxXG4iCi0JCSJNT1ZFUQklW3Jlc3VsdF0sICVbTF92YXIxXVxuIgotCQk6W3Jlc3VsdF0iPSZyIihyZXN1bHQpLCBbdG1wXSI9JnIiKHRtcCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFttYXNrXSJyIigweDdmZmYpCi0JKTsKLQotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgLy92YXJfb3V0ID0gKExfdmFyMSA+IChXb3JkMzIpMFgwMDAwN2ZmZkwpID8gKE1BWF8xNikgOiAoKExfdmFyMSA8IChXb3JkMzIpMHhmZmZmODAwMEwpID8gKE1JTl8xNikgOiAoKFdvcmQxNilMX3ZhcjEpKTsKLQotICAgIGlmIChMX3ZhcjEgPiAwWDAwMDA3ZmZmTCkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBNQVhfMTY7Ci0gICAgfQotICAgIGVsc2UgaWYgKExfdmFyMSA8IChXb3JkMzIpIDB4ZmZmZjgwMDBMKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IE1JTl8xNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IGV4dHJhY3RfbChMX3ZhcjEpOwotICAgIH0KLQotICAgIHJldHVybiAodmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBTaG9ydCBzaGlmdCBsZWZ0LCAgICAxICAgKi8KLSNpZiAoU0hMX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzaGwgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX1NITAotCWlmKHZhcjI+PTApCi0JewotCQlyZXR1cm4gQVNNX3NobCggdmFyMSwgdmFyMik7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBBU01fc2hyKCB2YXIxLCAtdmFyMik7Ci0JfQotI2Vsc2UKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgcmVzdWx0OwotCi0gICAgaWYgKHZhcjIgPCAwKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IHNociAodmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChXb3JkMzIpIHZhcjEgKigoV29yZDMyKSAxIDw8IHZhcjIpOwotCi0gICAgICAgIGlmICgodmFyMiA+IDE1ICYmIHZhcjEgIT0gMCkgfHwgKHJlc3VsdCAhPSAoV29yZDMyKSAoKFdvcmQxNikgcmVzdWx0KSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA+IDApID8gTUFYXzE2IDogTUlOXzE2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhcl9vdXQgPSBleHRyYWN0X2wocmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogU2hvcnQgc2hpZnQgcmlnaHQsICAgMSAgICovCi0jaWYgKFNIUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9TSFIKLQlpZih2YXIyPj0wKQotCXsKLQkJcmV0dXJuICBBU01fc2hyKCB2YXIxLCB2YXIyKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuICBBU01fc2hsKCB2YXIxLCAtdmFyMik7Ci0JfQotI2Vsc2UKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIGlmICh2YXIyIDwgMCkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBzaGwgKHZhcjEsIChXb3JkMTYpLXZhcjIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmFyMiA+PSAxNSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxIDwgMCkgPyAtMSA6IDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhcjEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSh+KCh+dmFyMSkgPj4gdmFyMikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSh2YXIxID4+IHZhcjIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLQotI2lmIChMX01VTFRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbXVsdChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9MX01VTFQKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJTTVVMQkIgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIgotCQkiUUFERCAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgJVtyZXN1bHRdIFxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7Ci0KLSAgICBpZiAoTF92YXJfb3V0ICE9IChXb3JkMzIpIDB4NDAwMDAwMDBMKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0IDw8PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMX3Zhcl9vdXQgPSBNQVhfMzI7Ci0gICAgfQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiAoTF9NU1VfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9MX01TVQotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iCi0JCSJRRFNVQiAlW3Jlc3VsdF0sICVbTF92YXIzXSwgJVtyZXN1bHRdXG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCkKLQkJOltMX3ZhcjNdInIiKExfdmFyMyksIFt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0OwotCi0gICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOwotICAgIExfdmFyX291dCA9IExfc3ViKExfdmFyMywgTF9wcm9kdWN0KTsKLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0jaWYgKExfU1VCX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQotewotI2lmIEFSTVY1VEVfTF9TVUIKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJRU1VCICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCAlW0xfdmFyMl1cbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbTF92YXIyXSJyIihMX3ZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IExfdmFyMSAtIExfdmFyMjsKLQotICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpICE9IDApCi0gICAgewotICAgICAgICBpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwTCkgPyBNSU5fMzIgOiBNQVhfMzI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0jaWYgKExfU0hMX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3NobChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX0xfU0hMCi0gICAgaWYodmFyMj49MCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAgQVNNX0xfc2hsKCBMX3ZhcjEsIHZhcjIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gIEFTTV9MX3NociggTF92YXIxLCAtdmFyMik7Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAodmFyMiA8PSAwKQotICAgIHsKLSAgICAgICAgTF92YXIxID0gTF9zaHIoTF92YXIxLCAoV29yZDE2KS12YXIyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yICg7IHZhcjIgPiAwOyB2YXIyLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMX3ZhcjEgPiAoV29yZDMyKSAwWDNmZmZmZmZmTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTUFYXzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGMwMDAwMDAwTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNSU5fMzI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTF92YXIxIDw8PSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoTF92YXIxKTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiAoTF9TSFJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX0xfU0hSCi0JaWYodmFyMj49MCkKLQl7Ci0JCXJldHVybiBBU01fTF9zaHIoIExfdmFyMSwgdmFyMik7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBBU01fTF9zaGwoIExfdmFyMSwgLXZhcjIpOwotCX0KLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIGlmICh2YXIyIDwgMCkKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IExfc2hsIChMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmFyMiA+PSAzMSkKLSAgICAgICAgewotICAgICAgICAgICAgTF92YXJfb3V0ID0gKExfdmFyMSA8IDBMKSA/IC0xIDogMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyX291dCA9IH4oKH5MX3ZhcjEpID4+IHZhcjIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyX291dCA9IExfdmFyMSA+PiB2YXIyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLS8qIFNob3J0IGFkZCwgICAgICAgICAgIDEgICAqLwotI2lmIChBRERfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotI2lmIEFSTVY1VEVfQURECi0JV29yZDMyIHJlc3VsdDsKLQlXb3JkMzIgdG1wOwotCWFzbSAoCi0JCSJBREQgICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKLQkJIk1PViAgJVt0bXBdLCAlW3Jlc3VsdF0sIEFTUiAjMTUgXG4iCi0JCSJURVEgICVbdG1wXSwgJVtyZXN1bHRdLCBBU1IgIzMxIFxuIgotCQkiRU9STkUgJVtyZXN1bHRdLCAlW21hc2tdLCAlW3Jlc3VsdF0sIEFTUiAjMzEiCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMiksIFttYXNrXSJyIigweDdmZmYpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfc3VtOwotCi0gICAgTF9zdW0gPSAoV29yZDMyKSB2YXIxICsgdmFyMjsKLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9zdW0pOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLS8qIFNob3J0IHN1YiwgICAgICAgICAgIDEgICAqLwotI2lmIChTVUJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9TVUIKLQlXb3JkMzIgcmVzdWx0OwotCVdvcmQzMiB0bXA7Ci0JYXNtICgKLQkJIlNVQiAgICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKLQkJIk1PViAgICVbdG1wXSwgJVt2YXIxXSwgQVNSICMxNSBcbiIKLQkJIlRFUSAgICVbdG1wXSwgJVt2YXIxXSwgQVNSICMzMSBcbiIKLQkJIkVPUk5FICVbcmVzdWx0XSwgJVttYXNrXSwgJVtyZXN1bHRdLCBBU1IgIzMxIFxuIgotCQk6W3Jlc3VsdF0iPSZyIihyZXN1bHQpLCBbdG1wXSI9JnIiKHRtcCkKLQkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpLCBbbWFza10iciIoMHg3ZmZmKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX2RpZmY7Ci0KLSAgICBMX2RpZmYgPSAoV29yZDMyKSB2YXIxIC0gdmFyMjsKLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9kaWZmKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBTaG9ydCBkaXZpc2lvbiwgICAgICAgMTggICovCi0jaWYgKERJVl9TX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0ID0gMDsKLSAgICBXb3JkMTYgaXRlcmF0aW9uOwotICAgIFdvcmQzMiBMX251bTsKLSAgICBXb3JkMzIgTF9kZW5vbTsKLQotICAgIHZhcl9vdXQgPSBNQVhfMTY7Ci0gICAgaWYgKHZhcjEhPSB2YXIyKS8vdmFyMSE9IHZhcjIKLSAgICB7Ci0gICAgCXZhcl9vdXQgPSAwOwotICAgIAlMX251bSA9IChXb3JkMzIpIHZhcjE7Ci0KLSAgICAJTF9kZW5vbSA9IChXb3JkMzIpIHZhcjI7Ci0KLQkJLy9yZXR1cm4gKExfbnVtPDwxNSkvdmFyMjsKLQotICAgIAlmb3IgKGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IDE1OyBpdGVyYXRpb24rKykKLSAgICAJewotICAgIAkJdmFyX291dCA8PD0gMTsKLSAgICAJCUxfbnVtIDw8PSAxOwotCi0gICAgCQlpZiAoTF9udW0gPj0gTF9kZW5vbSkKLSAgICAJCXsKLSAgICAJCQlMX251bSAtPSBMX2Rlbm9tOwotICAgIAkJCXZhcl9vdXQrKzsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qIFNob3J0IG11bHQsICAgICAgICAgIDEgICAqLwotI2lmIChNVUxUX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBtdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9NVUxUICYmIEFSTVY2X1NBVAotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iCi0JCSJTU0FUICAgJVtyZXN1bHRdLCAjMTYsICVbcmVzdWx0XSwgQVNSICMxNSBcbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxpZiBBUk1WNVRFX01VTFQKLQlXb3JkMzIgcmVzdWx0LCB0bXA7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3RtcF0sICVbdmFyMV0sICVbdmFyMl0gXG4iCi0JCSJNT1YJJVtyZXN1bHRdLCAlW3RtcF0sIEFTUiAjMTVcbiIKLQkJIk1PVgklW3RtcF0sICVbcmVzdWx0XSwgQVNSICMxNVxuIgotCQkiVEVRCSVbdG1wXSwgJVtyZXN1bHRdLCBBU1IgIzMxXG4iCi0JCSJFT1JORSAgJVtyZXN1bHRdLCAlW21hc2tdLCAlW3Jlc3VsdF0sIEFTUiAjMzEgXG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMiksIFttYXNrXSJyIigweDdmZmYpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfcHJvZHVjdDsKLQotICAgIExfcHJvZHVjdCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7Ci0gICAgTF9wcm9kdWN0ID0gKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4ZmZmZjgwMDBMKSA+PiAxNTsKLSAgICBpZiAoTF9wcm9kdWN0ICYgKFdvcmQzMikgMHgwMDAxMDAwMEwpCi0gICAgICAgIExfcHJvZHVjdCA9IExfcHJvZHVjdCB8IChXb3JkMzIpIDB4ZmZmZjAwMDBMOwotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3Byb2R1Y3QpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLQotLyogU2hvcnQgbm9ybSwgICAgICAgICAgIDE1ICAqLwotI2lmIChOT1JNX1NfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpCi17Ci0jaWYgQVJNVjVURV9OT1JNX1MKLQlXb3JkMTYgcmVzdWx0OwotCVdvcmQzMiB0bXA7Ci0JYXNtICgKLQkJIlJTQlMgICVbdG1wXSwgJVt2YXIxXSwgIzAgXG4iCi0JCSJDTFpMVCAlW3Jlc3VsdF0sICVbdmFyMV1cbiIKLQkJIkNMWkdUICVbcmVzdWx0XSwgJVt0bXBdXG4iCi0JCSJTVUJORSAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgIzE3XG4iCi0JCSJNT1ZFUSAlW3Jlc3VsdF0sICMwXG4iCi0JCSJDTVAgICAlW3ZhcjFdLCAjLTFcbiIKLQkJIk1PVkVRICVbcmVzdWx0XSwgIzE1XG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W3ZhcjFdInIiKHZhcjEpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMSA9PSAwKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIxID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gMTU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyMSA9IChXb3JkMTYpfnZhcjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHZhcl9vdXQgPSAwOyB2YXIxIDwgMHg0MDAwOyB2YXJfb3V0KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyMSA8PD0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogTG9uZyBub3JtLCAgICAgICAgICAgIDMwICAqLwotI2lmIChOT1JNX0xfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG5vcm1fbCAoV29yZDMyIExfdmFyMSkKLXsKLSNpZiBBUk1WNVRFX05PUk1fTAotCVdvcmQxNiByZXN1bHQ7Ci0JYXNtIHZvbGF0aWxlKAotCQkiQ01QICAgICVbTF92YXIxXSwgIzBcbiIKLQkJIkNMWk5FICAlW3Jlc3VsdF0sICVbTF92YXIxXVxuIgotCQkiU1VCTkUgICVbcmVzdWx0XSwgJVtyZXN1bHRdLCAjMVxuIgotCQkiTU9WRVEgICVbcmVzdWx0XSwgIzBcbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgLy9Xb3JkMTYgdmFyX291dDsKLQotICAgIC8vaWYgKExfdmFyMSA9PSAwKQotICAgIC8vewotICAgIC8vICAgIHZhcl9vdXQgPSAwOwotICAgIC8vfQotICAgIC8vZWxzZQotICAgIC8vewotICAgIC8vICAgIGlmIChMX3ZhcjEgPT0gKFdvcmQzMikgMHhmZmZmZmZmZkwpCi0gICAgLy8gICAgewotICAgIC8vICAgICAgICB2YXJfb3V0ID0gMzE7Ci0gICAgLy8gICAgfQotICAgIC8vICAgIGVsc2UKLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICAgIGlmIChMX3ZhcjEgPCAwKQotICAgIC8vICAgICAgICB7Ci0gICAgLy8gICAgICAgICAgICBMX3ZhcjEgPSB+TF92YXIxOwotICAgIC8vICAgICAgICB9Ci0gICAgLy8gICAgICAgIGZvciAodmFyX291dCA9IDA7IExfdmFyMSA8IChXb3JkMzIpIDB4NDAwMDAwMDBMOyB2YXJfb3V0KyspCi0gICAgLy8gICAgICAgIHsKLSAgICAvLyAgICAgICAgICAgIExfdmFyMSA8PD0gMTsKLSAgICAvLyAgICAgICAgfQotICAgIC8vICAgIH0KLSAgICAvL30KLSAgICAvL3JldHVybiAodmFyX291dCk7Ci0gIFdvcmQxNiBhMTY7Ci0gIFdvcmQxNiByID0gMCA7Ci0KLQotICBpZiAoIExfdmFyMSA8IDAgKSB7Ci0gICAgTF92YXIxID0gfkxfdmFyMTsKLSAgfQotCi0gIGlmICgwID09IChMX3ZhcjEgJiAweDdmZmY4MDAwKSkgewotICAgIGExNiA9IGV4dHJhY3RfbChMX3ZhcjEpOwotICAgIHIgKz0gMTY7Ci0KLSAgICBpZiAoMCA9PSAoYTE2ICYgMHg3ZjgwKSkgewotICAgICAgciArPSA4OwotCi0gICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDc4KSkgewotICAgICAgICByICs9IDQ7Ci0KLSAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNikpIHsKLSAgICAgICAgICByICs9IDI7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDAxKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMDQpKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDYwKSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMTApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA0MCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgIGlmICgwID09IChhMTYgJiAweDc4MDApKSB7Ci0gICAgICAgIHIgKz0gNDsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNjAwKSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAxMDApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDQwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotCi0gICAgICAgIGlmICgwID09IChhMTYgJiAweDYwMDApKSB7Ci0gICAgICAgICAgciArPSAyOwotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MTAwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg0MDAwKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBhMTYgPSBleHRyYWN0X2goTF92YXIxKTsKLQotICAgIGlmICgwID09IChhMTYgJiAweDdmODApKSB7Ci0gICAgICByICs9IDg7Ci0KLSAgICAgIGlmICgwID09IChhMTYgJiAweDAwNzgpKSB7Ci0gICAgICAgIHIgKz0gNCA7Ci0KLSAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNikpIHsKLSAgICAgICAgICByICs9IDI7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDAxKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMDQpKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDYwKSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMTApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA0MCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgIGlmICgwID09IChhMTYgJiAweDc4MDApKSB7Ci0gICAgICAgIHIgKz0gNDsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNjAwKSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAxMDApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDQwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotCi0gICAgICAgIGlmICgwID09IChhMTYgJiAweDYwMDApKSB7Ci0gICAgICAgICAgciArPSAyOwotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MTAwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg0MDAwKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHIgOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogUm91bmQsICAgICAgICAgICAgICAgMSAgICovCi0jaWYgKFJPVU5EX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiByb3VuZDE2KFdvcmQzMiBMX3ZhcjEpCi17Ci0jaWYgQVJNVjVURV9ST1VORAotCVdvcmQxNiByZXN1bHQ7Ci0JYXNtICgKLQkJIlFBREQgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCAlW2JpYXNdXG4iCi0JCSJNT1YgICAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgQVNSICMxNiBcbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbYmlhc10iciIoMHg4MDAwKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3JvdW5kZWQ7Ci0KLSAgICBMX3JvdW5kZWQgPSBMX2FkZCAoTF92YXIxLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7Ci0gICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF9yb3VuZGVkKTsKLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogTWFjLCAgMSAgKi8KLSNpZiAoTF9NQUNfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9MX01BQwotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl1cbiIKLQkJIlFEQUREICAlW3Jlc3VsdF0sICVbTF92YXIzXSwgJVtyZXN1bHRdXG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCkKLQkJOiBbTF92YXIzXSJyIihMX3ZhcjMpLCBbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0gICAgV29yZDMyIExfcHJvZHVjdDsKLQotICAgIExfcHJvZHVjdCA9IExfbXVsdCh2YXIxLCB2YXIyKTsKLSAgICBMX3Zhcl9vdXQgPSBMX2FkZCAoTF92YXIzLCBMX3Byb2R1Y3QpOwotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiAoTF9BRERfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQotewotI2lmIEFSTVY1VEVfTF9BREQKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJRQUREICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCAlW0xfdmFyMl1cbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbTF92YXIyXSJyIihMX3ZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IExfdmFyMSArIExfdmFyMjsKLSAgICBpZiAoKChMX3ZhcjEgXiBMX3ZhcjIpICYgTUlOXzMyKSA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKChMX3Zhcl9vdXQgXiBMX3ZhcjEpICYgTUlOXzMyKQotICAgICAgICB7Ci0gICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMCkgPyBNSU5fMzIgOiBNQVhfMzI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotCi0KLSNpZiAoTVVMVF9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBtdWx0X3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0X2FycjsKLQotICAgIExfcHJvZHVjdF9hcnIgPSAoV29yZDMyKXZhcjEgKihXb3JkMzIpdmFyMjsgICAgICAgLyogcHJvZHVjdCAqLwotICAgIExfcHJvZHVjdF9hcnIgKz0gKFdvcmQzMikweDAwMDA0MDAwTDsgICAgICAvKiByb3VuZCAqLwotICAgIExfcHJvZHVjdF9hcnIgPj49IDE1OyAgICAgICAvKiBzaGlmdCAqLwotCi0gICAgdmFyX291dCA9IHNhdHVyYXRlKExfcHJvZHVjdF9hcnIpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0jaWYgKFNIUl9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzaHJfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPiAxNSkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gc2hyKHZhcjEsIHZhcjIpOwotCi0gICAgICAgIGlmICh2YXIyID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCh2YXIxICYgKChXb3JkMTYpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0jaWYgKE1BQ19SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgTF92YXIzID0gTF9tYWMgKExfdmFyMywgdmFyMSwgdmFyMik7Ci0gICAgdmFyX291dCA9IChXb3JkMTYpKChMX3ZhcjMgKyAweDgwMDBMKSA+PiAxNik7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLSNpZiAoTVNVX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG1zdV9yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBMX3ZhcjMgPSBMX21zdSAoTF92YXIzLCB2YXIxLCB2YXIyKTsKLSAgICB2YXJfb3V0ID0gKFdvcmQxNikoKExfdmFyMyArIDB4ODAwMEwpID4+IDE2KTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotI2lmIChMX1NIUl9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPiAzMSkKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IExfc2hyKExfdmFyMSwgdmFyMik7Ci0KLSAgICAgICAgaWYgKHZhcjIgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKExfdmFyMSAmICgoV29yZDMyKSAxIDw8ICh2YXIyIC0gMSkpKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyX291dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0KLSNpZiAoRVhUUkFDVF9IX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBleHRyYWN0X2ggKFdvcmQzMiBMX3ZhcjEpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICB2YXJfb3V0ID0gKFdvcmQxNikgKExfdmFyMSA+PiAxNik7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLSNpZiAoRVhUUkFDVF9MX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBleHRyYWN0X2woV29yZDMyIExfdmFyMSkKLXsKLQlyZXR1cm4gKFdvcmQxNikgTF92YXIxOwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY29wMi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY29wMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNiYmQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNvcDIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MjQgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliYXNpY29wMi5jCi0KLQlDb250ZW50OglCYXNpYyBhcml0aG1ldGljIG9wZXJhdG9ycy4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJiYXNpY19vcC5oIgotCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBzYXR1cmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExpbWl0IHRoZSAzMiBiaXQgaW5wdXQgdG8gdGhlIHJhbmdlIG9mIGEgMTYgYml0IHdvcmQuICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIVNBVFJVQVRFX0lTX0lOTElORSkKLVdvcmQxNiBzYXR1cmF0ZShXb3JkMzIgTF92YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKExfdmFyMSA+IDBYMDAwMDdmZmZMKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IE1BWF8xNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTF92YXIxIDwgKFdvcmQzMikgMHhmZmZmODAwMEwpCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gTUlOXzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gZXh0cmFjdF9sKExfdmFyMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIFBlcmZvcm1zIHRoZSBhZGRpdGlvbiAodmFyMSt2YXIyKSB3aXRoIG92ZXJmbG93IGNvbnRyb2wgYW5kIHNhdHVyYXRpb247fAotIHwgICAgdGhlIDE2IGJpdCByZXN1bHQgaXMgc2V0IGF0ICszMjc2NyB3aGVuIG92ZXJmbG93IG9jY3VycyBvciBhdCAtMzI3NjggICB8Ci0gfCAgICB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFBRERfSVNfSU5MSU5FKQotV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3N1bTsKLQotICAgIExfc3VtID0gKFdvcmQzMil2YXIxICsgKFdvcmQzMil2YXIyOwotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3N1bSk7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHN1YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgUGVyZm9ybXMgdGhlIHN1YnRyYWN0aW9uICh2YXIxK3ZhcjIpIHdpdGggb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dS0gICB8Ci0gfCAgICByYXRpb247IHRoZSAxNiBiaXQgcmVzdWx0IGlzIHNldCBhdCArMzI3Njcgd2hlbiBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgIHwKLSB8ICAgIC0zMjc2OCB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFTVUJfSVNfSU5MSU5FKQotV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfZGlmZjsKLQotICAgIExfZGlmZiA9IChXb3JkMzIpIHZhcjEgLSB2YXIyOwotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX2RpZmYpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBhYnNfcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIEFic29sdXRlIHZhbHVlIG9mIHZhcjE7IGFic19zKC0zMjc2OCkgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMTYgYWJzX3MgKFdvcmQxNiB2YXIxKQotLy97Ci0vLyAgICBXb3JkMTYgdmFyX291dDsKLS8vCi0vLyAgICBpZiAodmFyMSA9PSBNSU5fMTYpCi0vLyAgICB7Ci0vLyAgICAgICAgdmFyX291dCA9IE1BWF8xNjsKLS8vICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgICBpZiAodmFyMSA8IDApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNiktdmFyMTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgdmFyX291dCA9IHZhcjE7Ci0vLyAgICAgICAgfQotLy8gICAgfQotLy8KLS8vICAgIHJldHVybiAodmFyX291dCk7Ci0vL30KLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBzaGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDE2IGJpdCBpbnB1dCB2YXIxIGxlZnQgdmFyMiBwb3NpdGlvbnMuWmVybyBmaWxsfAotIHwgICB0aGUgdmFyMiBMU0Igb2YgdGhlIHJlc3VsdC4gSWYgdmFyMiBpcyBuZWdhdGl2ZSwgYXJpdGhtZXRpY2FsbHkgc2hpZnQgICB8Ci0gfCAgIHZhcjEgcmlnaHQgYnkgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHwKLSB8ICAgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIVNITF9JU19JTkxJTkUpCi1Xb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIHJlc3VsdDsKLQotICAgIGlmICh2YXIyIDwgMCkKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyIDwgLTE2KQotICAgICAgICAgICAgdmFyMiA9IC0xNjsKLSAgICAgICAgdmFyX291dCA9IHNociAodmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChXb3JkMzIpIHZhcjEgKigoV29yZDMyKSAxIDw8IHZhcjIpOwotCi0gICAgICAgIGlmICgodmFyMiA+IDE1ICYmIHZhcjEgIT0gMCkgfHwgKHJlc3VsdCAhPSAoV29yZDMyKSAoKFdvcmQxNikgcmVzdWx0KSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vT3ZlcmZsb3cgPSAxOwotICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxID4gMCkgPyBNQVhfMTYgOiBNSU5fMTYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IGV4dHJhY3RfbChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotLy8gZW5kCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHNociAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMTYgYml0IGlucHV0IHZhcjEgcmlnaHQgdmFyMiBwb3NpdGlvbnMgd2l0aCAgICB8Ci0gfCAgIHNpZ24gZXh0ZW5zaW9uLiBJZiB2YXIyIGlzIG5lZ2F0aXZlLCBhcml0aG1ldGljYWxseSBzaGlmdCB2YXIxIGxlZnQgYnkgIHwKLSB8ICAgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHVuZGVyZmxvd3Mgb3IgfAotIHwgICBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghU0hSX0lTX0lOTElORSkKLVdvcmQxNiBzaHIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIGlmICh2YXIyIDwgMCkKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyIDwgLTE2KQotICAgICAgICAgICAgdmFyMiA9IC0xNjsKLSAgICAgICAgdmFyX291dCA9IHNobCAodmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyID49IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPCAwKSA/IC0xIDogMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKH4oKH52YXIxKSA+PiB2YXIyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKHZhcjEgPj4gdmFyMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogbXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBQZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdmFyMSBieSB2YXIyIGFuZCBnaXZlcyBhIDE2IGJpdCByZXN1bHQgIHwKLSB8ICAgIHdoaWNoIGlzIHNjYWxlZCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgbXVsdCh2YXIxLHZhcjIpID0gZXh0cmFjdF9sKExfc2hyKCh2YXIxIHRpbWVzIHZhcjIpLDE1KSkgYW5kICB8Ci0gfCAgICAgICAgICAgICBtdWx0KC0zMjc2OCwtMzI3NjgpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTVVMVF9JU19JTkxJTkUpCi1Xb3JkMTYgbXVsdCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3Byb2R1Y3Q7Ci0KLSAgICBMX3Byb2R1Y3QgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOwotCi0gICAgTF9wcm9kdWN0ID0gKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4ZmZmZjgwMDBMKSA+PiAxNTsKLQotICAgIGlmIChMX3Byb2R1Y3QgJiAoV29yZDMyKSAweDAwMDEwMDAwTCkKLSAgICAgICAgTF9wcm9kdWN0ID0gTF9wcm9kdWN0IHwgKFdvcmQzMikgMHhmZmZmMDAwMEw7Ci0KLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9wcm9kdWN0KTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9tdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIExfbXVsdCBpcyB0aGUgMzIgYml0IHJlc3VsdCBvZiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdmFyMSB0aW1lcyB2YXIyICAgIHwKLSB8ICAgd2l0aCBvbmUgc2hpZnQgbGVmdCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgIExfbXVsdCh2YXIxLHZhcjIpID0gTF9zaGwoKHZhcjEgdGltZXMgdmFyMiksMSkgYW5kICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgTF9tdWx0KC0zMjc2OCwtMzI3NjgpID0gMjE0NzQ4MzY0Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFMX01VTFRfSVNfSU5MSU5FKQotV29yZDMyIExfbXVsdChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7Ci0KLSAgICBpZiAoTF92YXJfb3V0ICE9IChXb3JkMzIpIDB4NDAwMDAwMDBMKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0IDw8PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMX3Zhcl9vdXQgPSBNQVhfMzI7Ci0gICAgfQotCi0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0vLyBlbmQKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogbmVnYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE5lZ2F0ZSB2YXIxIHdpdGggc2F0dXJhdGlvbiwgc2F0dXJhdGUgaW4gdGhlIGNhc2Ugd2hlcmUgaW5wdXQgaXMgLTMyNzY4OnwKLSB8ICAgICAgICAgICAgICAgIG5lZ2F0ZSh2YXIxKSA9IHN1YigwLHZhcjEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMTYgbmVnYXRlIChXb3JkMTYgdmFyMSkKLS8vewotLy8gICAgV29yZDE2IHZhcl9vdXQ7Ci0vLwotLy8gICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxID09IE1JTl8xNikgPyBNQVhfMTYgOiAtdmFyMSk7Ci0vLwotLy8gICAgcmV0dXJuICh2YXJfb3V0KTsKLS8vfQotCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IGV4dHJhY3RfaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gdGhlIDE2IE1TQiBvZiBMX3ZhcjEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyICkgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFFWFRSQUNUX0hfSVNfSU5MSU5FKQotV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSkKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIHZhcl9vdXQgPSAoV29yZDE2KSAoTF92YXIxID4+IDE2KTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogZXh0cmFjdF9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiB0aGUgMTYgTFNCIG9mIExfdmFyMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIgKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIUVYVFJBQ1RfTF9JU19JTkxJTkUpCi1Xb3JkMTYgZXh0cmFjdF9sKFdvcmQzMiBMX3ZhcjEpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICB2YXJfb3V0ID0gKFdvcmQxNikgTF92YXIxOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiByb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUm91bmQgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIDMyIGJpdCBpbnB1dCBudW1iZXIgaW50byB0aGUgTVMgMTYgYml0cyAgfAotIHwgICB3aXRoIHNhdHVyYXRpb24uIFNoaWZ0IHRoZSByZXN1bHRpbmcgYml0cyByaWdodCBieSAxNiBhbmQgcmV0dXJuIHRoZSAxNiB8Ci0gfCAgIGJpdCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgcm91bmQoTF92YXIxKSA9IGV4dHJhY3RfaChMX2FkZChMX3ZhcjEsMzI3NjgpKSAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMiApIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFST1VORF9JU19JTkxJTkUpCi1Xb3JkMTYgcm91bmQxNihXb3JkMzIgTF92YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3JvdW5kZWQ7Ci0KLSAgICBMX3JvdW5kZWQgPSBMX2FkZCAoTF92YXIxLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7Ci0gICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF9yb3VuZGVkKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLS8vIGVuZAotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX21hYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTXVsdGlwbHkgdmFyMSBieSB2YXIyIGFuZCBzaGlmdCB0aGUgcmVzdWx0IGxlZnQgYnkgMS4gQWRkIHRoZSAzMiBiaXQgICAgfAotIHwgICByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbiwgcmV0dXJuIGEgMzIgYml0IHJlc3VsdDogICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgTF9tYWMoTF92YXIzLHZhcjEsdmFyMikgPSBMX2FkZChMX3ZhcjMsTF9tdWx0KHZhcjEsdmFyMikpLiAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTF9NU1VfSVNfSU5MSU5FKQotV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0OwotCi0gICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOwotICAgIExfdmFyX291dCA9IExfYWRkIChMX3ZhcjMsIExfcHJvZHVjdCk7Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9tc3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE11bHRpcGx5IHZhcjEgYnkgdmFyMiBhbmQgc2hpZnQgdGhlIHJlc3VsdCBsZWZ0IGJ5IDEuIFN1YnRyYWN0IHRoZSAzMiAgIHwKLSB8ICAgYml0IHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLCByZXR1cm4gYSAzMiBiaXQgcmVzdWx0OiAgICAgICAgICAgfAotIHwgICAgICAgIExfbXN1KExfdmFyMyx2YXIxLHZhcjIpID0gTF9zdWIoTF92YXIzLExfbXVsdCh2YXIxLHZhcjIpKS4gICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghTF9NU1VfSVNfSU5MSU5FKQotV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0OwotCi0gICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOwotICAgIExfdmFyX291dCA9IExfc3ViIChMX3ZhcjMsIExfcHJvZHVjdCk7Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgMzIgYml0cyBhZGRpdGlvbiBvZiB0aGUgdHdvIDMyIGJpdHMgdmFyaWFibGVzIChMX3ZhcjErTF92YXIyKSB3aXRoICAgICAgfAotIHwgICBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1cmF0aW9uOyB0aGUgcmVzdWx0IGlzIHNldCBhdCArMjE0NzQ4MzY0NyB3aGVuICB8Ci0gfCAgIG92ZXJmbG93IG9jY3VycyBvciBhdCAtMjE0NzQ4MzY0OCB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjIgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFMX0FERF9JU19JTkxJTkUpCi1Xb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IExfdmFyMSArIExfdmFyMjsKLQotICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpID09IDApCi0gICAgewotICAgICAgICBpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwKSA/IE1JTl8zMiA6IE1BWF8zMjsKLSAgICAgICAgICAgIC8vT3ZlcmZsb3cgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IExfc3ViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAzMiBiaXRzIHN1YnRyYWN0aW9uIG9mIHRoZSB0d28gMzIgYml0cyB2YXJpYWJsZXMgKExfdmFyMS1MX3ZhcjIpIHdpdGggICB8Ci0gfCAgIG92ZXJmbG93IGNvbnRyb2wgYW5kIHNhdHVyYXRpb247IHRoZSByZXN1bHQgaXMgc2V0IGF0ICsyMTQ3NDgzNjQ3IHdoZW4gIHwKLSB8ICAgb3ZlcmZsb3cgb2NjdXJzIG9yIGF0IC0yMTQ3NDgzNjQ4IHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMiAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIUxfU1VCX0lTX0lOTElORSkKLVdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQotewotICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0KLSAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgLSBMX3ZhcjI7Ci0KLSAgICBpZiAoKChMX3ZhcjEgXiBMX3ZhcjIpICYgTUlOXzMyKSAhPSAwKQotICAgIHsKLSAgICAgICAgaWYgKChMX3Zhcl9vdXQgXiBMX3ZhcjEpICYgTUlOXzMyKQotICAgICAgICB7Ci0gICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gTUlOXzMyIDogTUFYXzMyOwotICAgICAgICAgICAgLy9PdmVyZmxvdyA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX25lZ2F0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTmVnYXRlIHRoZSAzMiBiaXQgdmFyaWFibGUgTF92YXIxIHdpdGggc2F0dXJhdGlvbjsgc2F0dXJhdGUgaW4gdGhlIGNhc2UgfAotIHwgICB3aGVyZSBpbnB1dCBpcyAtMjE0NzQ4MzY0OCAoMHg4MDAwIDAwMDApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMzIgTF9uZWdhdGUgKFdvcmQzMiBMX3ZhcjEpCi0vL3sKLS8vICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0vLwotLy8gICAgTF92YXJfb3V0ID0gKExfdmFyMSA9PSBNSU5fMzIpID8gTUFYXzMyIDogLUxfdmFyMTsKLS8vCi0vLyAgICByZXR1cm4gKExfdmFyX291dCk7Ci0vL30KLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBtdWx0X3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgU2FtZSBhcyBtdWx0IHdpdGggcm91bmRpbmcsIGkuZS46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgIG11bHRfcih2YXIxLHZhcjIpID0gZXh0cmFjdF9sKExfc2hyKCgodmFyMSAqIHZhcjIpICsgMTYzODQpLDE1KSkgYW5kICB8Ci0gfCAgICAgbXVsdF9yKC0zMjc2OCwtMzI3NjgpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTVVMVF9SX0lTX0lOTElORSkKLVdvcmQxNiBtdWx0X3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0X2FycjsKLQotICAgIExfcHJvZHVjdF9hcnIgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOyAgICAgICAvKiBwcm9kdWN0ICovCi0gICAgTF9wcm9kdWN0X2FyciArPSAoV29yZDMyKSAweDAwMDA0MDAwTDsgICAgICAvKiByb3VuZCAqLwotICAgIExfcHJvZHVjdF9hcnIgJj0gKFdvcmQzMikgMHhmZmZmODAwMEw7Ci0gICAgTF9wcm9kdWN0X2FyciA+Pj0gMTU7ICAgICAgIC8qIHNoaWZ0ICovCi0KLSAgICBpZiAoTF9wcm9kdWN0X2FyciAmIChXb3JkMzIpIDB4MDAwMTAwMDBMKSAgIC8qIHNpZ24gZXh0ZW5kIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgewotICAgICAgICBMX3Byb2R1Y3RfYXJyIHw9IChXb3JkMzIpIDB4ZmZmZjAwMDBMOwotICAgIH0KLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9wcm9kdWN0X2Fycik7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IExfc2hsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMzIgYml0IGlucHV0IExfdmFyMSBsZWZ0IHZhcjIgcG9zaXRpb25zLiBaZXJvICB8Ci0gfCAgIGZpbGwgdGhlIHZhcjIgTFNCIG9mIHRoZSByZXN1bHQuIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5ICAgIHwKLSB8ICAgc2hpZnQgTF92YXIxIHJpZ2h0IGJ5IC12YXIyIHdpdGggc2lnbiBleHRlbnNpb24uIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gfAotIHwgICBjYXNlIG9mIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIUxfU0hMX0lTX0lOTElORSkKLVdvcmQzMiBMX3NobCAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dCA9IDBMOwotCi0gICAgaWYgKHZhcjIgPD0gMCkKLSAgICB7Ci0gICAgICAgIExfdmFyMSA9IExfc2hyKExfdmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoOyB2YXIyID4gMDsgdmFyMi0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTF92YXIxID4gKFdvcmQzMikgMFgzZmZmZmZmZkwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE1BWF8zMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoTF92YXIxIDwgKFdvcmQzMikgMHhjMDAwMDAwMEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUlOXzMyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExfdmFyMSA8PD0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKExfdmFyMSk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zaHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAzMiBiaXQgaW5wdXQgTF92YXIxIHJpZ2h0IHZhcjIgcG9zaXRpb25zIHdpdGggIHwKLSB8ICAgc2lnbiBleHRlbnNpb24uIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5IHNoaWZ0IExfdmFyMSBsZWZ0ICAgfAotIHwgICBieSAtdmFyMiBhbmQgemVybyBmaWxsIHRoZSAtdmFyMiBMU0Igb2YgdGhlIHJlc3VsdC4gU2F0dXJhdGUgdGhlIHJlc3VsdCB8Ci0gfCAgIGluIGNhc2Ugb2YgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghTF9TSFJfSVNfSU5MSU5FKQotV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPCAwKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0ID0gTF9zaGwgKExfdmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyID49IDMxKQotICAgICAgICB7Ci0gICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gLTEgOiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKExfdmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXJfb3V0ID0gfigofkxfdmFyMSkgPj4gdmFyMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXJfb3V0ID0gTF92YXIxID4+IHZhcjI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHNocl9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBTYW1lIGFzIHNocih2YXIxLHZhcjIpIGJ1dCB3aXRoIHJvdW5kaW5nLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIGNhc2Ugb2Z8Ci0gfCAgIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIC0gSWYgdmFyMiBpcyBncmVhdGVyIHRoYW4gemVybyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgaWYgKHN1YihzaGwoc2hyKHZhcjEsdmFyMiksMSksc2hyKHZhcjEsc3ViKHZhcjIsMSkpKSkgICAgICAgICAgICB8Ci0gfCAgICAgICAgICBpcyBlcXVhbCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICBzaHJfcih2YXIxLHZhcjIpID0gc2hyKHZhcjEsdmFyMikgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgc2hyX3IodmFyMSx2YXIyKSA9IGFkZChzaHIodmFyMSx2YXIyKSwxKSAgICAgICAgICAgICAgfAotIHwgICAgLSBJZiB2YXIyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIHNocl9yKHZhcjEsdmFyMikgPSBzaHIodmFyMSx2YXIyKS4gICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghU0hSX1JfSVNfSU5MSU5FKQotV29yZDE2IHNocl9yIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMiA+IDE1KQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBzaHIgKHZhcjEsIHZhcjIpOwotCi0gICAgICAgIGlmICh2YXIyID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCh2YXIxICYgKChXb3JkMTYpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBtYWNfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTXVsdGlwbHkgdmFyMSBieSB2YXIyIGFuZCBzaGlmdCB0aGUgcmVzdWx0IGxlZnQgYnkgMS4gQWRkIHRoZSAzMiBiaXQgICAgfAotIHwgICByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbi4gUm91bmQgdGhlIExTIDE2IGJpdHMgb2YgdGhlIHJlc3VsdCAgICB8Ci0gfCAgIGludG8gdGhlIE1TIDE2IGJpdHMgd2l0aCBzYXR1cmF0aW9uIGFuZCBzaGlmdCB0aGUgcmVzdWx0IHJpZ2h0IGJ5IDE2LiAgIHwKLSB8ICAgUmV0dXJuIGEgMTYgYml0IHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICBtYWNfcihMX3ZhcjMsdmFyMSx2YXIyKSA9IHJvdW5kKExfbWFjKExfdmFyMyx2YXIxLHZhcjIpKSAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCA4MDAwIDw9IExfdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIU1BQ19SX0lTX0lOTElORSkKLVdvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgTF92YXIzID0gTF9tYWMgKExfdmFyMywgdmFyMSwgdmFyMik7Ci0gICAgTF92YXIzID0gTF9hZGQgKExfdmFyMywgKFdvcmQzMikgMHgwMDAwODAwMEwpOwotICAgIHZhcl9vdXQgPSBleHRyYWN0X2ggKExfdmFyMyk7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IG1zdV9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBTdWJ0cmFjdCB0aGUgMzIgICB8Ci0gfCAgIGJpdCByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbi4gUm91bmQgdGhlIExTIDE2IGJpdHMgb2YgdGhlIHJlcy0gIHwKLSB8ICAgdWx0IGludG8gdGhlIE1TIDE2IGJpdHMgd2l0aCBzYXR1cmF0aW9uIGFuZCBzaGlmdCB0aGUgcmVzdWx0IHJpZ2h0IGJ5ICAgfAotIHwgICAxNi4gUmV0dXJuIGEgMTYgYml0IHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgIG1zdV9yKExfdmFyMyx2YXIxLHZhcjIpID0gcm91bmQoTF9tc3UoTF92YXIzLHZhcjEsdmFyMikpICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDgwMDAgPD0gTF92YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTVNVX1JfSVNfSU5MSU5FKQotV29yZDE2IG1zdV9yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBMX3ZhcjMgPSBMX21zdSAoTF92YXIzLCB2YXIxLCB2YXIyKTsKLSAgICBMX3ZhcjMgPSBMX2FkZCAoTF92YXIzLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7Ci0gICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF92YXIzKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9kZXBvc2l0X2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIERlcG9zaXQgdGhlIDE2IGJpdCB2YXIxIGludG8gdGhlIDE2IE1TIGJpdHMgb2YgdGhlIDMyIGJpdCBvdXRwdXQuIFRoZSAgIHwKLSB8ICAgMTYgTFMgYml0cyBvZiB0aGUgb3V0cHV0IGFyZSB6ZXJvZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDdmZmYgMDAwMC4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMzIgTF9kZXBvc2l0X2ggKFdvcmQxNiB2YXIxKQotLy97Ci0vLyAgICBXb3JkMzIgTF92YXJfb3V0OwotLy8KLS8vICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgPDwgMTY7Ci0vLwotLy8gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotLy99Ci0KLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9kZXBvc2l0X2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIERlcG9zaXQgdGhlIDE2IGJpdCB2YXIxIGludG8gdGhlIDE2IExTIGJpdHMgb2YgdGhlIDMyIGJpdCBvdXRwdXQuIFRoZSAgIHwKLSB8ICAgMTYgTVMgYml0cyBvZiB0aGUgb3V0cHV0IGFyZSBzaWduIGV4dGVuZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhGRkZGIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMzIgTF9kZXBvc2l0X2wgKFdvcmQxNiB2YXIxKQotLy97Ci0vLyAgICBXb3JkMzIgTF92YXJfb3V0OwotLy8KLS8vICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjE7Ci0vLwotLy8gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotLy99Ci0KLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zaHJfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFNhbWUgYXMgTF9zaHIoTF92YXIxLHZhcjIpIGJ1dCB3aXRoIHJvdW5kaW5nLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluICAgIHwKLSB8ICAgY2FzZSBvZiB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgLSBJZiB2YXIyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICBpZiAoTF9zdWIoTF9zaGwoTF9zaHIoTF92YXIxLHZhcjIpLDEpLExfc2hyKExfdmFyMSxzdWIodmFyMiwxKSkpKXwKLSB8ICAgICAgICAgIGlzIGVxdWFsIHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICB0aGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIExfc2hyX3IoTF92YXIxLHZhcjIpID0gTF9zaHIoTF92YXIxLHZhcjIpICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICBMX3Nocl9yKExfdmFyMSx2YXIyKSA9IExfYWRkKExfc2hyKExfdmFyMSx2YXIyKSwxKSAgICB8Ci0gfCAgICAtIElmIHZhcjIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgTF9zaHJfcihMX3ZhcjEsdmFyMikgPSBMX3NocihMX3ZhcjEsdmFyMikuICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFMX1NIUl9SX0lTX0lOTElORSkKLVdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPiAzMSkKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IExfc2hyIChMX3ZhcjEsIHZhcjIpOwotCi0gICAgICAgIGlmICh2YXIyID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChMX3ZhcjEgJiAoKFdvcmQzMikgMSA8PCAodmFyMiAtIDEpKSkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMX3Zhcl9vdXQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2FicyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIEFic29sdXRlIHZhbHVlIG9mIExfdmFyMTsgU2F0dXJhdGUgaW4gY2FzZSB3aGVyZSB0aGUgaW5wdXQgaXMgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjE0NzgzNjQ4ICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0vL1dvcmQzMiBMX2FicyAoV29yZDMyIExfdmFyMSkKLS8vewotLy8gICAgV29yZDMyIExfdmFyX291dDsKLS8vCi0vLyAgICBpZiAoTF92YXIxID09IE1JTl8zMikKLS8vICAgIHsKLS8vICAgICAgICBMX3Zhcl9vdXQgPSBNQVhfMzI7Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgICAgaWYgKExfdmFyMSA8IDApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBMX3Zhcl9vdXQgPSAtTF92YXIxOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBMX3Zhcl9vdXQgPSBMX3ZhcjE7Ci0vLyAgICAgICAgfQotLy8gICAgfQotLy8KLS8vICAgIHJldHVybiAoTF92YXJfb3V0KTsKLS8vfQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBub3JtX3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHJvZHVjZXMgdGhlIG51bWJlciBvZiBsZWZ0IHNoaWZ0IG5lZWRlZCB0byBub3JtYWxpemUgdGhlIDE2IGJpdCB2YXJpYS0gfAotIHwgICBibGUgdmFyMSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9uIHRoZSBpbnRlcnZhbCB3aXRoIG1pbmltdW0gb2YgMTYzODQgYW5kICB8Ci0gfCAgIG1heGltdW0gb2YgMzI3NjcsIGFuZCBmb3IgbmVnYXRpdmUgdmFsdWVzIG9uIHRoZSBpbnRlcnZhbCB3aXRoIG1pbmltdW0gIHwKLSB8ICAgb2YgLTMyNzY4IGFuZCBtYXhpbXVtIG9mIC0xNjM4NDsgaW4gb3JkZXIgdG8gbm9ybWFsaXplIHRoZSByZXN1bHQsIHRoZSAgfAotIHwgICBmb2xsb3dpbmcgb3BlcmF0aW9uIG11c3QgYmUgZG9uZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgbm9ybV92YXIxID0gc2hsKHZhcjEsbm9ybV9zKHZhcjEpKS4gICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDAwMGYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghTk9STV9TX0lTX0lOTElORSkKLVdvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKHZhcjEgPT0gMCkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmFyMSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IDE1OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhcjEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhcjEgPSAoV29yZDE2KX52YXIxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh2YXJfb3V0ID0gMDsgdmFyMSA8IDB4NDAwMDsgdmFyX291dCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhcjEgPDw9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IGRpdl9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQcm9kdWNlcyBhIHJlc3VsdCB3aGljaCBpcyB0aGUgZnJhY3Rpb25hbCBpbnRlZ2VyIGRpdmlzaW9uIG9mIHZhcjEgIGJ5ICB8Ci0gfCAgIHZhcjI7IHZhcjEgYW5kIHZhcjIgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgdmFyMiBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgIHwKLSB8ICAgdG8gdmFyMTsgdGhlIHJlc3VsdCBpcyBwb3NpdGl2ZSAobGVhZGluZyBiaXQgZXF1YWwgdG8gMCkgYW5kIHRydW5jYXRlZCAgfAotIHwgICB0byAxNiBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElmIHZhcjEgPSB2YXIyIHRoZW4gZGl2KHZhcjEsdmFyMikgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXIxIDw9IHZhcjIgYW5kIHZhcjIgIT0gMC4gICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IHZhcjEgPD0gdmFyMiA8PSAweDAwMDAgN2ZmZiBhbmQgdmFyMiAhPSAwLiAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgSXQncyBhIFExNSB2YWx1ZSAocG9pbnQgYmV0d2VlbiBiMTUgYW5kIGIxNCkuICAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIURJVl9TX0lTX0lOTElORSkKLVdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0ID0gMDsKLSAgICBXb3JkMTYgaXRlcmF0aW9uOwotICAgIFdvcmQzMiBMX251bTsKLSAgICBXb3JkMzIgTF9kZW5vbTsKLQotICAgIGlmICh2YXIxID09IDApCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHZhcjEgPT0gdmFyMikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IE1BWF8xNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfbnVtID0gTF9kZXBvc2l0X2wgKHZhcjEpOwotICAgICAgICAgICAgTF9kZW5vbSA9IExfZGVwb3NpdF9sICh2YXIyKTsKLQotICAgICAgICAgICAgZm9yIChpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCAxNTsgaXRlcmF0aW9uKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCA8PD0gMTsKLSAgICAgICAgICAgICAgICBMX251bSA8PD0gMTsKLQotICAgICAgICAgICAgICAgIGlmIChMX251bSA+PSBMX2Rlbm9tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTF9udW0gPSBMX3N1YihMX251bSwgTF9kZW5vbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhcl9vdXQgPSBhZGQgKHZhcl9vdXQsIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogbm9ybV9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFByb2R1Y2VzIHRoZSBudW1iZXIgb2YgbGVmdCBzaGlmdHMgbmVlZGVkIHRvIG5vcm1hbGl6ZSB0aGUgMzIgYml0IHZhcmlhLXwKLSB8ICAgYmxlIExfdmFyMSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9uIHRoZSBpbnRlcnZhbCB3aXRoIG1pbmltdW0gb2YgICAgICAgICAgfAotIHwgICAxMDczNzQxODI0IGFuZCBtYXhpbXVtIG9mIDIxNDc0ODM2NDcsIGFuZCBmb3IgbmVnYXRpdmUgdmFsdWVzIG9uIHRoZSBpbi18Ci0gfCAgIHRlcnZhbCB3aXRoIG1pbmltdW0gb2YgLTIxNDc0ODM2NDggYW5kIG1heGltdW0gb2YgLTEwNzM3NDE4MjQ7IGluIG9yZGVyIHwKLSB8ICAgdG8gbm9ybWFsaXplIHRoZSByZXN1bHQsIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uIG11c3QgYmUgZG9uZSA6ICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgbm9ybV9MX3ZhcjEgPSBMX3NobChMX3ZhcjEsbm9ybV9sKExfdmFyMSkpLiAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCAwMDFmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIU5PUk1fTF9JU19JTkxJTkUpCi1Xb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKExfdmFyMSA9PSAwKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChMX3ZhcjEgPT0gKFdvcmQzMikgMHhmZmZmZmZmZkwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhcl9vdXQgPSAzMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyMSA9IH5MX3ZhcjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHZhcl9vdXQgPSAwOyBMX3ZhcjEgPCAoV29yZDMyKSAweDQwMDAwMDAwTDsgdmFyX291dCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyMSA8PD0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYwMzJiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCW9wZXJfMzJiLmMKLQotCUNvbnRlbnQ6CSAgVGhpcyBmaWxlIGNvbnRhaW5zIG9wZXJhdGlvbnMgaW4gZG91YmxlIHByZWNpc2lvbi4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgIm9wZXJfMzJiLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIEZ1bmN0aW9uIExfRXh0cmFjdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBFeHRyYWN0IGZyb20gYSAzMiBiaXQgaW50ZWdlciB0d28gMTYgYml0IERQRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBMXzMyICAgICAgOiAzMiBiaXQgaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgIDB4ODAwMCAwMDAwIDw9IExfMzIgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaGkgICAgICAgIDogYjE2IHRvIGIzMSBvZiBMXzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBsbyAgICAgICAgOiAoTF8zMiAtIGhpPDwxNik+PjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXZvaWQgTF9FeHRyYWN0IChXb3JkMzIgTF8zMiwgV29yZDE2ICpoaSwgV29yZDE2ICpsbykKLXsKLSAgICAqaGkgPSBleHRyYWN0X2ggKExfMzIpOwotICAgICpsbyA9IGV4dHJhY3RfbCAoTF9tc3UgKExfc2hyIChMXzMyLCAxKSwgKmhpLCAxNjM4NCkpOwotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBGdW5jdGlvbiBMX0NvbXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgQ29tcG9zZSBmcm9tIHR3byAxNiBiaXQgRFBGIGEgMzIgYml0IGludGVnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgIExfMzIgPSBoaTw8MTYgKyBsbzw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGhpICAgICAgICBtc2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgbG8gICAgICAgIGxzZiAod2l0aCBzaWduKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAqCi0gKiAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfMzIgPD0gMHg3ZmZmIGZmZjAuICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1Xb3JkMzIgTF9Db21wIChXb3JkMTYgaGksIFdvcmQxNiBsbykKLXsKLSAgICBXb3JkMzIgTF8zMjsKLQotICAgIExfMzIgPSBMX2RlcG9zaXRfaCAoaGkpOwotICAgIHJldHVybiAoTF9tYWMgKExfMzIsIGxvLCAxKSk7ICAgICAgIC8qID0gaGk8PDE2ICsgbG88PDEgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiBNcHlfMzIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBNdWx0aXBseSB0d28gMzIgYml0IGludGVnZXJzIChEUEYpLiBUaGUgcmVzdWx0IGlzIGRpdmlkZWQgYnkgMioqMzEgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgTF8zMiA9IChoaTEqaGkyKTw8MSArICggKGhpMSpsbzIpPj4xNSArIChsbzEqaGkyKT4+MTUgKTw8MSAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIFRoaXMgb3BlcmF0aW9uIGNhbiBhbHNvIGJlIHZpZXdlZCBhcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdHdvIFEzMSAgICAgICoKLSAqICAgbnVtYmVyIGFuZCB0aGUgcmVzdWx0IGlzIGFsc28gaW4gUTMxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGhpMSAgICAgICAgIGhpIHBhcnQgb2YgZmlyc3QgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgbG8xICAgICAgICAgbG8gcGFydCBvZiBmaXJzdCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBoaTIgICAgICAgICBoaSBwYXJ0IG9mIHNlY29uZCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGxvMiAgICAgICAgIGxvIHBhcnQgb2Ygc2Vjb25kIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotV29yZDMyIE1weV8zMiAoV29yZDE2IGhpMSwgV29yZDE2IGxvMSwgV29yZDE2IGhpMiwgV29yZDE2IGxvMikKLXsKLSAgICBXb3JkMzIgTF8zMjsKLQotICAgIExfMzIgPSBMX211bHQgKGhpMSwgaGkyKTsKLSAgICBMXzMyID0gTF9tYWMgKExfMzIsIG11bHQgKGhpMSwgbG8yKSwgMSk7Ci0gICAgTF8zMiA9IExfbWFjIChMXzMyLCBtdWx0IChsbzEsIGhpMiksIDEpOwotCi0gICAgcmV0dXJuIChMXzMyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiBNcHlfMzJfMTYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBNdWx0aXBseSBhIDE2IGJpdCBpbnRlZ2VyIGJ5IGEgMzIgYml0IChEUEYpLiBUaGUgcmVzdWx0IGlzIGRpdmlkZWQgICAgICAqCi0gKiAgIGJ5IDIqKjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIExfMzIgPSAoaGkxKmxvMik8PDEgKyAoKGxvMSpsbzIpPj4xNSk8PDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBoaSAgICAgICAgICBoaSBwYXJ0IG9mIDMyIGJpdCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGxvICAgICAgICAgIGxvIHBhcnQgb2YgMzIgYml0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgbiAgICAgICAgICAgMTYgYml0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1Xb3JkMzIgTXB5XzMyXzE2IChXb3JkMTYgaGksIFdvcmQxNiBsbywgV29yZDE2IG4pCi17Ci0gICAgV29yZDMyIExfMzI7Ci0KLSAgICBMXzMyID0gTF9tdWx0IChoaSwgbik7Ci0gICAgTF8zMiA9IExfbWFjIChMXzMyLCBtdWx0IChsbywgbiksIDEpOwotCi0gICAgcmV0dXJuIChMXzMyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgRnVuY3Rpb24gTmFtZSA6IERpdl8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIEZyYWN0aW9uYWwgaW50ZWdlciBkaXZpc2lvbiBvZiB0d28gMzIgYml0IG51bWJlcnMuICAgICAgICAgICAgKgotICogICAgICAgICAgICAgTF9udW0gLyBMX2Rlbm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICBMX251bSBhbmQgTF9kZW5vbSBtdXN0IGJlIHBvc2l0aXZlIGFuZCBMX251bSA8IExfZGVub20uICAgICAgICoKLSAqICAgICAgICAgICAgIExfZGVub20gPSBkZW5vbV9oaTw8MTYgKyBkZW5vbV9sbzw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgZGVub21faGkgaXMgYSBub3JtYWxpemUgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICBMX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgKgotICogICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8IExfbnVtIDwgTF9kZW5vbSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgIExfZGVub20gPSBkZW5vbV9oaTw8MTYgKyBkZW5vbV9sbzw8MSAgICAgIChEUEYpICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICBkZW5vbV9oaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIDE2IGJpdCBwb3NpdGl2ZSBub3JtYWxpemVkIGludGVnZXIgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAgKgotICogICAgICAgICAgICAgcmFuZ2UgOiAweDQwMDAgPCBoaSA8IDB4N2ZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICBkZW5vbV9sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIDE2IGJpdCBwb3NpdGl2ZSBpbnRlZ2VyIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgcmFuZ2UgOiAwIDwgbG8gPCAweDdmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICBMX2RpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgKgotICogICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSBMX2RpdiA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBBbGdvcml0aG06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgLSBmaW5kID0gMS9MX2Rlbm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgRmlyc3QgYXBwcm94aW1hdGlvbjogYXBwcm94ID0gMSAvIGRlbm9tX2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAxL0xfZGVub20gPSBhcHByb3ggKiAoMi4wIC0gTF9kZW5vbSAqIGFwcHJveCApICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAtICByZXN1bHQgPSBMX251bSAqICgxL0xfZGVub20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1Xb3JkMzIgRGl2XzMyIChXb3JkMzIgTF9udW0sIFdvcmQzMiBkZW5vbSkKLXsKLSAgICBXb3JkMTYgYXBwcm94OwotICAgIFdvcmQzMiBMXzMyOwotICAgIC8qIEZpcnN0IGFwcHJveGltYXRpb246IDEgLyBMX2Rlbm9tID0gMS9kZW5vbV9oaSAqLwotCi0gICAgYXBwcm94ID0gZGl2X3MgKChXb3JkMTYpIDB4M2ZmZiwgZGVub20gPj4gMTYpOwotCi0gICAgLyogMS9MX2Rlbm9tID0gYXBwcm94ICogKDIuMCAtIExfZGVub20gKiBhcHByb3gpICovCi0KLSAgICBMXzMyID0gTF9tcHlfbHMgKGRlbm9tLCBhcHByb3gpOwotCi0gICAgTF8zMiA9IExfc3ViICgoV29yZDMyKSAweDdmZmZmZmZmTCwgTF8zMik7Ci0KLQlMXzMyID0gTF9tcHlfbHMgKExfMzIsIGFwcHJveCk7Ci0gICAgLyogTF9udW0gKiAoMS9MX2Rlbm9tKSAqLwotCi0JTF8zMiA9IE1VTEhJR0goTF8zMiwgTF9udW0pOwotICAgIExfMzIgPSBMX3NobCAoTF8zMiwgMyk7Ci0KLSAgICByZXR1cm4gKExfMzIpOwotfQotCi0vKiEKLQotICBcYnJpZWYgIGNhbGN1bGF0ZXMgdGhlIGxvZyBkdWFsaXMgdGltZXMgNCBvZiBhcmd1bWVudAotICAgICAgICAgIGlMb2c0KHgpID0gKFdvcmQzMikoNCAqIGxvZyh2YWx1ZSkvbG9nKDIuMCkpCi0KLSAgXHJldHVybiBpbG9nNCB2YWx1ZQotCi0qLwotV29yZDE2IGlMb2c0KFdvcmQzMiB2YWx1ZSkKLXsKLSAgV29yZDE2IGlMb2c0OwotCi0gIGlmKHZhbHVlICE9IDApewotICAgIFdvcmQzMiB0bXA7Ci0gICAgV29yZDE2IHRtcDE2OwotICAgIGlMb2c0ID0gbm9ybV9sKHZhbHVlKTsKLSAgICB0bXAgPSAodmFsdWUgPDwgaUxvZzQpOwotICAgIHRtcDE2ID0gcm91bmQxNih0bXApOwotICAgIHRtcCA9IExfbXVsdCh0bXAxNiwgdG1wMTYpOwotICAgIHRtcDE2ID0gcm91bmQxNih0bXApOwotICAgIHRtcCA9IExfbXVsdCh0bXAxNiwgdG1wMTYpOwotICAgIHRtcDE2ID0gcm91bmQxNih0bXApOwotCi0gICAgaUxvZzQgPSAoLShpTG9nNCA8PCAyKSAtIG5vcm1fcyh0bXAxNikpIC0gMTsKLSAgfQotICBlbHNlIHsKLSAgICBpTG9nNCA9IC0xMjg7IC8qIC0oSU5UX0JJVFMqNCk7ICovCi0gIH0KLQotICByZXR1cm4gaUxvZzQ7Ci19Ci0KLSNkZWZpbmUgc3RlcChzaGlmdCkgXAotICAgIGlmICgoMHg0MDAwMDAwMGwgPj4gKHNoaWZ0KSkgKyByb290IDw9IHZhbHVlKSAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHZhbHVlIC09ICgweDQwMDAwMDAwbCA+PiAoc2hpZnQpKSArIHJvb3Q7ICAgICAgIFwKLSAgICAgICAgcm9vdCA9IChyb290ID4+IDEpIHwgKDB4NDAwMDAwMDBsID4+IChzaGlmdCkpOyAgXAotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByb290ID0gcm9vdCA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotV29yZDMyIHJzcXJ0KFdvcmQzMiB2YWx1ZSwgICAgIC8qITwgT3BlcmFuZCB0byBzcXVhcmUgcm9vdCAoMC4wIC4uLiAxKSAqLwotICAgICAgICAgICAgIFdvcmQzMiBhY2N1cmFjeSkgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGJpdHMgdGhhdCB3aWxsIGJlIGNhbGN1bGF0ZWQgKi8KLXsKLSAgICBXb3JkMzIgcm9vdCA9IDA7Ci0JV29yZDMyIHNjYWxlOwotICAgIFVOVVNFRChhY2N1cmFjeSk7Ci0KLQlpZih2YWx1ZSA8IDApCi0JCXJldHVybiAwOwotCi0Jc2NhbGUgPSBub3JtX2wodmFsdWUpOwotCWlmKHNjYWxlICYgMSkgc2NhbGUtLTsKLQotCXZhbHVlIDw8PSBzY2FsZTsKLQotCXN0ZXAoIDApOyBzdGVwKCAyKTsgc3RlcCggNCk7IHN0ZXAoIDYpOwotICAgIHN0ZXAoIDgpOyBzdGVwKDEwKTsgc3RlcCgxMik7IHN0ZXAoMTQpOwotICAgIHN0ZXAoMTYpOyBzdGVwKDE4KTsgc3RlcCgyMCk7IHN0ZXAoMjIpOwotICAgIHN0ZXAoMjQpOyBzdGVwKDI2KTsgc3RlcCgyOCk7IHN0ZXAoMzApOwotCi0gICAgc2NhbGUgPj49IDE7Ci0JaWYgKHJvb3QgPCB2YWx1ZSkKLSAgICAgICAgKytyb290OwotCi0Jcm9vdCA+Pj0gc2NhbGU7Ci0gICAgcmV0dXJuIHJvb3QqIDQ2MzM0OwotfQotCi1zdGF0aWMgY29uc3QgV29yZDMyIHBvdzJUYWJsZVtQT1cyX1RBQkxFX1NJWkVdID0gewotMHg3ZmZmZmZmZiwgMHg3ZmE3NjVhZCwgMHg3ZjRmMDhhZSwgMHg3ZWY2ZThkYSwKLTB4N2U5ZjA2MDYsIDB4N2U0NzYwMDksIDB4N2RlZmY2YjYsIDB4N2Q5OGM5ZTYsCi0weDdkNDFkOTZlLCAweDdjZWIyNTIzLCAweDdjOTRhY2RlLCAweDdjM2U3MDczLAotMHg3YmU4NmZiOSwgMHg3YjkyYWE4OCwgMHg3YjNkMjBiNiwgMHg3YWU3ZDIxYSwKLTB4N2E5MmJlOGIsIDB4N2EzZGU1ZGYsIDB4NzllOTQ3ZWYsIDB4Nzk5NGU0OTIsCi0weDc5NDBiYjllLCAweDc4ZWNjY2VjLCAweDc4OTkxODU0LCAweDc4NDU5ZGFjLAotMHg3N2YyNWNjZSwgMHg3NzlmNTU5MSwgMHg3NzRjODdjYywgMHg3NmY5ZjM1OSwKLTB4NzZhNzk4MGYsIDB4NzY1NTc1YzgsIDB4NzYwMzhjNWIsIDB4NzViMWRiYTIsCi0weDc1NjA2Mzc0LCAweDc1MGYyM2FiLCAweDc0YmUxYzIwLCAweDc0NmQ0Y2FjLAotMHg3NDFjYjUyOCwgMHg3M2NjNTU2ZCwgMHg3MzdjMmQ1NSwgMHg3MzJjM2NiYSwKLTB4NzJkYzgzNzQsIDB4NzI4ZDAxNWQsIDB4NzIzZGI2NTAsIDB4NzFlZWEyMjYsCi0weDcxOWZjNGI5LCAweDcxNTExZGU0LCAweDcxMDJhZDgwLCAweDcwYjQ3MzY4LAotMHg3MDY2NmY3NiwgMHg3MDE4YTE4NSwgMHg2ZmNiMDk2ZiwgMHg2ZjdkYTcxMCwKLTB4NmYzMDdhNDEsIDB4NmVlMzgyZGUsIDB4NmU5NmMwYzMsIDB4NmU0YTMzYzksCi0weDZkZmRkYmNjLCAweDZkYjFiOGE4LCAweDZkNjVjYTM4LCAweDZkMWExMDU3LAotMHg2Y2NlOGFlMSwgMHg2YzgzMzliMiwgMHg2YzM4MWNhNiwgMHg2YmVkMzM5OCwKLTB4NmJhMjdlNjYsIDB4NmI1N2ZjZTksIDB4NmIwZGFlZmYsIDB4NmFjMzk0ODUsCi0weDZhNzlhZDU2LCAweDZhMmZmOTRmLCAweDY5ZTY3ODRkLCAweDY5OWQyYTJjLAotMHg2OTU0MGVjOSwgMHg2OTBiMjYwMSwgMHg2OGMyNmZiMSwgMHg2ODc5ZWJiNiwKLTB4NjgzMTk5ZWQsIDB4NjdlOTdhMzQsIDB4NjdhMThjNjgsIDB4Njc1OWQwNjUsCi0weDY3MTI0NjBiLCAweDY2Y2FlZDM1LCAweDY2ODNjNWMzLCAweDY2M2NjZjkyLAotMHg2NWY2MGE4MCwgMHg2NWFmNzY2YSwgMHg2NTY5MTMyZiwgMHg2NTIyZTBhZCwKLTB4NjRkY2RlYzMsIDB4NjQ5NzBkNGYsIDB4NjQ1MTZjMmUsIDB4NjQwYmZiNDEsCi0weDYzYzZiYTY0LCAweDYzODFhOTc4LCAweDYzM2NjODViLCAweDYyZjgxNmViLAotMHg2MmIzOTUwOSwgMHg2MjZmNDI5MiwgMHg2MjJiMWY2NiwgMHg2MWU3MmI2NSwKLTB4NjFhMzY2NmQsIDB4NjE1ZmQwNWYsIDB4NjExYzY5MTksIDB4NjBkOTMwN2IsCi0weDYwOTYyNjY1LCAweDYwNTM0YWI3LCAweDYwMTA5ZDUxLCAweDVmY2UxZTEyLAotMHg1ZjhiY2NkYiwgMHg1ZjQ5YTk4YywgMHg1ZjA3YjQwNSwgMHg1ZWM1ZWMyNiwKLTB4NWU4NDUxZDAsIDB4NWU0MmU0ZTMsIDB4NWUwMWE1NDAsIDB4NWRjMDkyYzcsCi0weDVkN2ZhZDU5LCAweDVkM2VmNGQ3LCAweDVjZmU2OTIzLCAweDVjYmUwYTFjLAotMHg1YzdkZDdhNCwgMHg1YzNkZDE5YywgMHg1YmZkZjdlNSwgMHg1YmJlNGE2MSwKLTB4NWI3ZWM4ZjIsIDB4NWIzZjczNzcsIDB4NWIwMDQ5ZDQsIDB4NWFjMTRiZWEsCi0weDVhODI3OTlhLCAweDVhNDNkMmM2LCAweDVhMDU1NzUxLCAweDU5YzcwNzFjLAotMHg1OTg4ZTIwOSwgMHg1OTRhZTdmYiwgMHg1OTBkMThkMywgMHg1OGNmNzQ3NCwKLTB4NTg5MWZhYzEsIDB4NTg1NGFiOWIsIDB4NTgxNzg2ZTYsIDB4NTdkYThjODMsCi0weDU3OWRiYzU3LCAweDU3NjExNjQyLCAweDU3MjQ5YTI5LCAweDU2ZTg0N2VmLAotMHg1NmFjMWY3NSwgMHg1NjcwMjBhMCwgMHg1NjM0NGI1MiwgMHg1NWY4OWY3MCwKLTB4NTViZDFjZGIsIDB4NTU4MWMzNzgsIDB4NTU0NjkzMjksIDB4NTUwYjhiZDQsCi0weDU0ZDBhZDViLCAweDU0OTVmN2ExLCAweDU0NWI2YThiLCAweDU0MjEwNWZkLAotMHg1M2U2YzlkYiwgMHg1M2FjYjYwNywgMHg1MzcyY2E2OCwgMHg1MzM5MDZlMCwKLTB4NTJmZjZiNTUsIDB4NTJjNWY3YWEsIDB4NTI4Y2FiYzMsIDB4NTI1Mzg3ODYsCi0weDUyMWE4YWQ3LCAweDUxZTFiNTlhLCAweDUxYTkwN2I0LCAweDUxNzA4MTBiLAotMHg1MTM4MjE4MiwgMHg1MGZmZThmZSwgMHg1MGM3ZDc2NSwgMHg1MDhmZWM5YywKLTB4NTA1ODI4ODgsIDB4NTAyMDhiMGUsIDB4NGZlOTE0MTMsIDB4NGZiMWMzN2MsCi0weDRmN2E5OTMwLCAweDRmNDM5NTE0LCAweDRmMGNiNzBjLCAweDRlZDVmZjAwLAotMHg0ZTlmNmNkNCwgMHg0ZTY5MDA2ZSwgMHg0ZTMyYjliNCwgMHg0ZGZjOTg4YywKLTB4NGRjNjljZGQsIDB4NGQ5MGM2OGIsIDB4NGQ1YjE1N2UsIDB4NGQyNTg5OWMsCi0weDRjZjAyMmNhLCAweDRjYmFlMGVmLCAweDRjODVjM2YxLCAweDRjNTBjYmI4LAotMHg0YzFiZjgyOSwgMHg0YmU3NDkyYiwgMHg0YmIyYmVhNSwgMHg0YjdlNTg3ZCwKLTB4NGI0YTE2OWMsIDB4NGIxNWY4ZTYsIDB4NGFlMWZmNDMsIDB4NGFhZTI5OWIsCi0weDRhN2E3N2Q1LCAweDRhNDZlOWQ2LCAweDRhMTM3Zjg4LCAweDQ5ZTAzOGQwLAotMHg0OWFkMTU5OCwgMHg0OTdhMTVjNCwgMHg0OTQ3MzkzZiwgMHg0OTE0N2ZlZSwKLTB4NDhlMWU5YmEsIDB4NDhhZjc2OGEsIDB4NDg3ZDI2NDYsIDB4NDg0YWY4ZDYsCi0weDQ4MThlZTIyLCAweDQ3ZTcwNjExLCAweDQ3YjU0MDhjLCAweDQ3ODM5ZDdiLAotMHg0NzUyMWNjNiwgMHg0NzIwYmU1NSwgMHg0NmVmODIxMCwgMHg0NmJlNjdlMCwKLTB4NDY4ZDZmYWUsIDB4NDY1Yzk5NjEsIDB4NDYyYmU0ZTIsIDB4NDVmYjUyMWEsCi0weDQ1Y2FlMGYyLCAweDQ1OWE5MTUyLCAweDQ1NmE2MzIzLCAweDQ1M2E1NjRkLAotMHg0NTBhNmFiYiwgMHg0NGRhYTA1NCwgMHg0NGFhZjcwMiwgMHg0NDdiNmVhZCwKLTB4NDQ0YzA3NDAsIDB4NDQxY2MwYTMsIDB4NDNlZDlhYzAsIDB4NDNiZTk1ODAsCi0weDQzOGZiMGNiLCAweDQzNjBlYzhkLCAweDQzMzI0OGFlLCAweDQzMDNjNTE3LAotMHg0MmQ1NjFiNCwgMHg0MmE3MWU2YywgMHg0Mjc4ZmIyYiwgMHg0MjRhZjdkYSwKLTB4NDIxZDE0NjIsIDB4NDFlZjUwYWUsIDB4NDFjMWFjYTgsIDB4NDE5NDI4MzksCi0weDQxNjZjMzRjLCAweDQxMzk3ZGNjLCAweDQxMGM1N2EyLCAweDQwZGY1MGI4LAotMHg0MGIyNjhmYSwgMHg0MDg1YTA1MSwgMHg0MDU4ZjZhOCwgMHg0MDJjNmJlOQotfTsKLQotLyohCi0KLSAgXGJyaWVmIGNhbGN1bGF0ZXMgMiBeICh4L3kpIGZvciB4PD0wLCB5ID4gMCwgeCA8PSAzMjc2OCAqIHkKLQotICBhdm9pZHMgaW50ZWdlciBkaXZpc2lvbgotCi0gIFxyZXR1cm4KLSovCi1Xb3JkMzIgcG93Ml94eShXb3JkMzIgeCwgV29yZDMyIHkpCi17Ci0gIFVXb3JkMzIgaVBhcnQ7Ci0gIFVXb3JkMzIgZlBhcnQ7Ci0gIFdvcmQzMiByZXM7Ci0gIFdvcmQzMiB0bXA7Ci0KLSAgdG1wID0gLXg7Ci0gIGlQYXJ0ID0gdG1wIC8geTsKLSAgZlBhcnQgPSB0bXAgLSBpUGFydCp5OwotICBpUGFydCA9IG1pbihpUGFydCxJTlRfQklUUy0xKTsKLQotICByZXMgPSBwb3cyVGFibGVbKFBPVzJfVEFCTEVfU0laRSpmUGFydCkveV0gPj4gaVBhcnQ7Ci0KLSAgcmV0dXJuKHJlcyk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTg0NGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlvcGVyXzMyYi5oCi0KLQlDb250ZW50OglEb3VibGUgcHJlY2lzaW9uIG9wZXJhdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX09QRVJfMzJiX0gKLSNkZWZpbmUgX19PUEVSXzMyYl9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBQT1cyX1RBQkxFX0JJVFMgOAotI2RlZmluZSBQT1cyX1RBQkxFX1NJWkUgKDE8PFBPVzJfVEFCTEVfQklUUykKLQotdm9pZCBMX0V4dHJhY3QgKFdvcmQzMiBMXzMyLCBXb3JkMTYgKmhpLCBXb3JkMTYgKmxvKTsKLVdvcmQzMiBMX0NvbXAgKFdvcmQxNiBoaSwgV29yZDE2IGxvKTsKLVdvcmQzMiBNcHlfMzIgKFdvcmQxNiBoaTEsIFdvcmQxNiBsbzEsIFdvcmQxNiBoaTIsIFdvcmQxNiBsbzIpOwotV29yZDMyIE1weV8zMl8xNiAoV29yZDE2IGhpLCBXb3JkMTYgbG8sIFdvcmQxNiBuKTsKLVdvcmQzMiBEaXZfMzIgKFdvcmQzMiBMX251bSwgV29yZDMyIGRlbm9tKTsKLVdvcmQxNiBpTG9nNChXb3JkMzIgdmFsdWUpOwotV29yZDMyIHJzcXJ0KFdvcmQzMiB2YWx1ZSwgIFdvcmQzMiBhY2N1cmFjeSk7Ci1Xb3JkMzIgcG93Ml94eShXb3JkMzIgeCwgV29yZDMyIHkpOwotCi1fX2lubGluZSBXb3JkMzIgTF9tcHlfbHMoV29yZDMyIExfdmFyMiwgV29yZDE2IHZhcjEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgc3dMb3cxOwotICAgIFdvcmQxNiBzd0hpZ2gxOwotICAgIFdvcmQzMiBsX3Zhcl9vdXQ7Ci0KLSAgICBzd0xvdzEgPSAodW5zaWduZWQgc2hvcnQpKExfdmFyMik7Ci0gICAgc3dIaWdoMSA9IChXb3JkMTYpKExfdmFyMiA+PiAxNik7Ci0KLSAgICBsX3Zhcl9vdXQgPSAobG9uZylzd0xvdzEgKiAobG9uZyl2YXIxID4+IDE1OwotCi0gICAgbF92YXJfb3V0ICs9IHN3SGlnaDEgKiB2YXIxIDw8IDE7Ci0KLSAgICByZXR1cm4obF92YXJfb3V0KTsKLX0KLQotX19pbmxpbmUgV29yZDMyIExfbXB5X3d4KFdvcmQzMiBMX3ZhcjIsIFdvcmQxNiB2YXIxKQotewotI2lmIEFSTVY1VEVfTF9NUFlfTFMKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSB2b2xhdGlsZSgKLQkJIlNNVUxXQiAgJVtyZXN1bHRdLCAlW0xfdmFyMl0sICVbdmFyMV0gXG4iCi0JCTpbcmVzdWx0XSI9ciIocmVzdWx0KQotCQk6W0xfdmFyMl0iciIoTF92YXIyKSwgW3ZhcjFdInIiKHZhcjEpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgdW5zaWduZWQgc2hvcnQgc3dMb3cxOwotICAgIFdvcmQxNiBzd0hpZ2gxOwotICAgIFdvcmQzMiBsX3Zhcl9vdXQ7Ci0KLSAgICBzd0xvdzEgPSAodW5zaWduZWQgc2hvcnQpKExfdmFyMik7Ci0gICAgc3dIaWdoMSA9IChXb3JkMTYpKExfdmFyMiA+PiAxNik7Ci0KLSAgICBsX3Zhcl9vdXQgPSAobG9uZylzd0xvdzEgKiAobG9uZyl2YXIxID4+IDE2OwotICAgIGxfdmFyX291dCArPSBzd0hpZ2gxICogdmFyMTsKLQotICAgIHJldHVybihsX3Zhcl9vdXQpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmODIyNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdHlwZWRlZi5oCi0KLQlDb250ZW50Ogl0eXBlIGRlZmluZWQgZm9yIGRlZmZlcmVudCBwYWx0Zm9ybQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIHR5cGVkZWZfaAotI2RlZmluZSB0eXBlZGVmX2ggIiRJZCAkIgotCi0jdW5kZWYgT1JJR0lOQUxfVFlQRURFRl9IIC8qIGRlZmluZSB0byBnZXQgIm9yaWdpbmFsIiBFVFNJIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdHlwZWRlZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIE9SSUdJTkFMX1RZUEVERUZfSAotLyoKLSAqIHRoaXMgaXMgdGhlIG9yaWdpbmFsIGNvZGUgZnJvbSB0aGUgRVRTSSBmaWxlIHR5cGVkZWYuaAotICovCi0KLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX1pUQ19fKQotdHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsKLXR5cGVkZWYgc2hvcnQgV29yZDE2OwotdHlwZWRlZiBsb25nIFdvcmQzMjsKLXR5cGVkZWYgaW50IEZsYWc7Ci0KLSNlbGlmIGRlZmluZWQoX19zdW4pCi10eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwotdHlwZWRlZiBzaG9ydCBXb3JkMTY7Ci10eXBlZGVmIGxvbmcgV29yZDMyOwotdHlwZWRlZiBpbnQgRmxhZzsKLQotI2VsaWYgZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZChfX3VuaXgpCi10eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwotdHlwZWRlZiBzaG9ydCBXb3JkMTY7Ci10eXBlZGVmIGludCBXb3JkMzI7Ci10eXBlZGVmIGludCBGbGFnOwotCi0jZW5kaWYKLSNlbHNlIC8qIG5vdCBvcmlnaW5hbCB0eXBlZGVmLmggKi8KLQotLyoKLSAqIHVzZSAoaW1wcm92ZWQpIHR5cGUgZGVmaW5pdGlvbiBmaWxlIHR5cGRlZnMuaCBhbmQgYWRkIGEgIkZsYWciIHR5cGUKLSAqLwotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi10eXBlZGVmIGludCBGbGFnOwotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDM1MGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdHlwZWRlZnMuaAotCi0JQ29udGVudDoJdHlwZSBkZWZpbmVkIG9yIGNvbnN0IGRlZmluZWQKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiB0eXBlZGVmc19oCi0jZGVmaW5lIHR5cGVkZWZzX2ggIiRJZCAkIgotCi0jaWZuZGVmIENIQVJfQklUCi0jZGVmaW5lIENIQVJfQklUICAgICAgOCAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGEgY2hhciAqLwotI2VuZGlmCi0KLSNpZm5kZWYgVk9BQUNfU0hSVF9NQVgKLSNkZWZpbmUgVk9BQUNfU0hSVF9NQVggICAgKDMyNzY3KSAgICAgICAgLyogbWF4aW11bSAoc2lnbmVkKSBzaG9ydCB2YWx1ZSAqLwotI2VuZGlmCi0KLSNpZm5kZWYgVk9BQUNfU0hSVF9NSU4KLSNkZWZpbmUgVk9BQUNfU0hSVF9NSU4gICAgKC0zMjc2OCkgICAgICAgIC8qIG1pbmltdW0gKHNpZ25lZCkgc2hvcnQgdmFsdWUgKi8KLSNlbmRpZgotCi0vKiBEZWZpbmUgTlVMTCBwb2ludGVyIHZhbHVlICovCi0jaWZuZGVmIE5VTEwKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBOVUxMICAgIDAKLSNlbHNlCi0jZGVmaW5lIE5VTEwgICAgKCh2b2lkICopMCkKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgYXNzZXJ0Ci0jZGVmaW5lIGFzc2VydChfRXhwcmVzc2lvbikgICAgICgodm9pZCkwKQotI2VuZGlmCi0KLSNkZWZpbmUgX19pbmxpbmUgc3RhdGljIF9faW5saW5lCi0KLSNkZWZpbmUgSU5UX0JJVFMgICAzMgotLyoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09OU1RBTlRTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qCi0gKioqKioqKioqIGRlZmluZSBjaGFyIHR5cGUKLSAqLwotdHlwZWRlZiBjaGFyIENoYXI7Ci0KLS8qCi0gKioqKioqKioqIGRlZmluZSA4IGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMKLSAqLwotdHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVV29yZDg7Ci0vKgotICoqKioqKioqKiBkZWZpbmUgMTYgYml0IHNpZ25lZC91bnNpZ25lZCB0eXBlcyAmIGNvbnN0YW50cwotICovCi10eXBlZGVmIHNob3J0IFdvcmQxNjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVdvcmQxNjsKLQotLyoKLSAqKioqKioqKiogZGVmaW5lIDMyIGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMKLSAqLwotdHlwZWRlZiBpbnQgV29yZDMyOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVVdvcmQzMjsKLQotCi0KLSNpZm5kZWYgX01TQ19WRVIKLXR5cGVkZWYgbG9uZyBsb25nIFdvcmQ2NDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVXb3JkNjQ7Ci0jZWxzZQotdHlwZWRlZiBfX2ludDY0IFdvcmQ2NDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVV29yZDY0OwotI2VuZGlmCi0KLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICggKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLSNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICggKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLSNpZmRlZiBBUk1fSU5BU00KLSNpZmRlZiBBUk1WNV9JTkFTTQotI2RlZmluZSBBUk1WNUVfSU5BU00JMQotI2VuZGlmCi0jZGVmaW5lIEFSTVY0X0lOQVNNCQkxCi0jZW5kaWYKLQotI2lmIEFSTVY0X0lOQVNNCi0JI2RlZmluZSBBUk1WNVRFX1NBVCAgICAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9BREQgICAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfU1VCICAgICAgICAgICAxCi0JI2RlZmluZSBBUk1WNVRFX1NITCAgICAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9TSFIgICAgICAgICAgIDEKLQkjZGVmaW5lIEFSTVY1VEVfTF9TSEwgICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX0xfU0hSICAgICAgICAgMQotI2VuZGlmLy9BUk1WNAotI2lmIEFSTVY1RV9JTkFTTQotICAgICNkZWZpbmUgQVJNVjVURV9MX0FERCAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfTF9TVUIgICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX0xfTVVMVCAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9MX01BQyAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfTF9NU1UgICAgICAgICAxCi0KLQotICAgICNkZWZpbmUgQVJNVjVURV9ESVZfUyAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfUk9VTkQgICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX01VTFQgICAgICAgICAgMQotCi0gICAgI2RlZmluZSBBUk1WNVRFX05PUk1fUyAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9OT1JNX0wgICAgICAgIDEKLQkjZGVmaW5lIEFSTVY1VEVfTF9NUFlfTFMJICAxCi0jZW5kaWYKLSNpZiBBUk1WNl9JTkFTTQotICAgICN1bmRlZiAgQVJNVjVURV9BREQKLSAgICAjZGVmaW5lIEFSTVY1VEVfQUREICAgICAgICAgICAwCi0gICAgI3VuZGVmICBBUk1WNVRFX1NVQgotICAgICNkZWZpbmUgQVJNVjVURV9TVUIgICAgICAgICAgIDAKLSAgICAjZGVmaW5lIEFSTVY2X1NBVCAgICAgICAgICAgICAxCi0jZW5kaWYKLQotLy9iYXNpYyBvcGVyYXRpb24gZnVuY3Rpb25zIG9wdGltaXphdGlvbiBmbGFncwotI2RlZmluZSBTQVRSVUFURV9JU19JTkxJTkUgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBzYXR1cmF0ZSBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgU0hMX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAvL2RlZmluZSBzaGwgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIFNIUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHNociBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTF9NVUxUX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9tdWx0IGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX01TVV9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX21zdSBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTF9TVUJfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9zdWIgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIExfU0hMX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfc2hsIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX1NIUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX3NociBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgQUREX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgYWRkIGFzIGlubGluZSBmdW5jdGlvbiAvL2FkZCwgaW5saW5lIGlzIHRoZSBiZXN0Ci0jZGVmaW5lIFNVQl9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHN1YiBhcyBpbmxpbmUgZnVuY3Rpb24gLy9zdWIsIGlubGluZSBpcyB0aGUgYmVzdAotI2RlZmluZSBESVZfU19JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBkaXZfcyBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTVVMVF9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbXVsdCBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTk9STV9TX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbm9ybV9zIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBOT1JNX0xfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBub3JtX2wgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIFJPVU5EX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHJvdW5kIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX01BQ19JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX21hYyBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTF9BRERfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9hZGQgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIEVYVFJBQ1RfSF9JU19JTkxJTkUgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIGV4dHJhY3RfaCBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgRVhUUkFDVF9MX0lTX0lOTElORSAgICAgICAgICAgICAxICAgLy9kZWZpbmUgZXh0cmFjdF9sIGFzIGlubGluZSBmdW5jdGlvbiAgICAgICAgLy8/Pz8KLSNkZWZpbmUgTVVMVF9SX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbXVsdF9yIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBTSFJfUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBzaHJfciBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTUFDX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbWFjX3IgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIE1TVV9SX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIG1zdV9yIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX1NIUl9SX0lTX0lOTElORSAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX3Nocl9yIGFzIGlubGluZSBmdW5jdGlvbgotCi0jZGVmaW5lIFBSRUZJWAkJCQl2b0FBQ0VuYwotI2RlZmluZSBMSU5LMCh4LCB5LCB6KQkJTElOSzEoeCx5LHopCi0jZGVmaW5lIExJTksxKHgseSx6KQkJeCMjeSMjegotI2RlZmluZSBBRERfUFJFRklYKGZ1bmMpCUxJTkswKFBSRUZJWCwgXywgZnVuYykKLQotI2RlZmluZSAgTF9FeHRyYWN0CQlBRERfUFJFRklYKExfRXh0cmFjdCkKLSNkZWZpbmUgIExfQ29tcAkJCUFERF9QUkVGSVgoTF9Db21wKQotI2RlZmluZSAgTXB5XzMyCQkJQUREX1BSRUZJWChNcHlfMzIpCi0jZGVmaW5lICBNcHlfMzJfMTYJCUFERF9QUkVGSVgoTXB5XzMyXzE2KQotI2RlZmluZSAgRGl2XzMyCQkJQUREX1BSRUZJWChEaXZfMzIpCi0jZGVmaW5lICBpTG9nNAkJCUFERF9QUkVGSVgoaUxvZzQpCi0jZGVmaW5lICByc3FydAkJCUFERF9QUkVGSVgocnNxcnQpCi0jZGVmaW5lICBwb3cyX3h5CQlBRERfUFJFRklYKHBvdzJfeHkpCi0jZGVmaW5lICBMX21weV9scwkJQUREX1BSRUZJWChMX21weV9scykKLSNkZWZpbmUgIExfbXB5X3d4CQlBRERfUFJFRklYKExfbXB5X3d4KQotCi0jZGVmaW5lIG1lbV9tYWxsb2MJCUFERF9QUkVGSVgobWVtX21hbGxvYykKLSNkZWZpbmUgbWVtX2ZyZWUJCUFERF9QUkVGSVgobWVtX2ZyZWUpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9kb2Mvdm9BQUNFbmNvZGVyU0RLLnBkZiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvZG9jL3ZvQUFDRW5jb2RlclNESy5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NGQwZjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9kb2Mvdm9BQUNFbmNvZGVyU0RLLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2ZjY1Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hYWNfcm9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhYWNfcm9tLmgKLQotCUNvbnRlbnQ6CWNvbnN0YW50IHRhYmxlcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFJPTV9ICi0jZGVmaW5lIFJPTV9ICi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJ0bnNfcGFyYW0uaCIKLQotLyoKLSAgbWRjdAotKi8KLWV4dGVybiBjb25zdCBpbnQgU2hvcnRXaW5kb3dTaW5lW0ZSQU1FX0xFTl9TSE9SVC8yXTsKLWV4dGVybiBjb25zdCBpbnQgTG9uZ1dpbmRvd0tCRFtGUkFNRV9MRU5fTE9ORy8yXTsKLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgYml0cmV2VGFiWzE3ICsgMTI5XTsKLWV4dGVybiBjb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdOwotCi0jaWYgZGVmaW5lZCAoQVJNVjVFKSAmJiAhZGVmaW5lZCAoQVJNVjdOZW9uKQotZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNjRbKDQqNiArIDE2KjYpLzJdOwotZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNTEyWyg4KjYgKyAzMio2ICsgMTI4KjYpLzJdOwotI2Vsc2UKLWV4dGVybiBjb25zdCBpbnQgdHdpZFRhYjY0WzQqNiArIDE2KjZdOwotZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNTEyWzgqNiArIDMyKjYgKyAxMjgqNl07Ci0jZW5kaWYKLQotLyoKLSAgZm9ybSBmYWN0b3IKLSovCi1leHRlcm4gY29uc3QgV29yZDMyIGZvcm1mYWNfc3FydHRhYmxlWzk2XTsKLQotLyoKLSAgcXVhbnRpemVyCi0qLwotZXh0ZXJuIGNvbnN0IFdvcmQzMiBtVGFiXzNfNFs1MTJdOwotZXh0ZXJuIGNvbnN0IFdvcmQzMiBtVGFiXzRfM1s1MTJdOwotLyohICQyXnstXGZyYWN7bn17MTZ9fSQgdGFibGUgKi8KLWV4dGVybiBjb25zdCBXb3JkMTYgcG93MnRvbWludXNOb3ZlcjE2WzE3XSA7Ci0KLWV4dGVybiBjb25zdCBXb3JkMzIgc3BlY0V4cE1hbnRUYWJsZUNvbWJfZW5jWzRdWzE0XTsKLWV4dGVybiBjb25zdCBVV29yZDggc3BlY0V4cFRhYmxlQ29tYl9lbmNbNF1bMTRdOwotCi1leHRlcm4gY29uc3QgV29yZDE2IHF1YW50Qm9yZGVyc1s0XVs0XTsKLS8vZXh0ZXJuIGNvbnN0IFdvcmQxNiBxdWFudFJlY29uWzNdWzRdOwotZXh0ZXJuIGNvbnN0IFdvcmQxNiBxdWFudFJlY29uWzRdWzNdOwotCi0vKgotICBodWZmbWFuCi0qLwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiNV82WzldWzldOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiN184WzhdWzhdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiOV8xMFsxM11bMTNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMTFbMTddWzE3XTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfbHRhYnNjZlsxMjFdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMVszXVszXVszXVszXTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjJbM11bM11bM11bM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIzWzNdWzNdWzNdWzNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNFszXVszXVszXVszXTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjVbOV1bOV07Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI2WzldWzldOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiN1s4XVs4XTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjhbOF1bOF07Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI5WzEzXVsxM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIxMFsxM11bMTNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMTFbMTddWzE3XTsKLWV4dGVybiBjb25zdCBVV29yZDMyIGh1ZmZfY3RhYnNjZlsxMjFdOwotCi0KLQotLyoKLSAgbWlzYwotKi8KLWV4dGVybiBjb25zdCBpbnQgc2FtcFJhdGVUYWJbTlVNX1NBTVBMRV9SQVRFU107Ci1leHRlcm4gY29uc3QgaW50IEJhbmR3aXRoQ29lZlRhYls4XVtOVU1fU0FNUExFX1JBVEVTXTsKLWV4dGVybiBjb25zdCBpbnQgcmF0ZXNbOF07Ci1leHRlcm4gY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsU2hvcnRbTlVNX1NBTVBMRV9SQVRFU107Ci1leHRlcm4gY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsTG9uZ1tOVU1fU0FNUExFX1JBVEVTXTsKLWV4dGVybiBjb25zdCBpbnQgc2ZCYW5kVGFiU2hvcnRPZmZzZXRbTlVNX1NBTVBMRV9SQVRFU107Ci1leHRlcm4gY29uc3Qgc2hvcnQgc2ZCYW5kVGFiU2hvcnRbNzZdOwotZXh0ZXJuIGNvbnN0IGludCBzZkJhbmRUYWJMb25nT2Zmc2V0W05VTV9TQU1QTEVfUkFURVNdOwotZXh0ZXJuIGNvbnN0IHNob3J0IHNmQmFuZFRhYkxvbmdbMzI1XTsKLQotZXh0ZXJuIGNvbnN0IFdvcmQzMiBtX2xvZzJfdGFibGVbSU5UX0JJVFNdOwotCi0vKgotICBUTlMKLSovCi1leHRlcm4gY29uc3QgV29yZDMyIHRuc0NvZWZmM1s4XTsKLWV4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmYzQm9yZGVyc1s4XTsKLWV4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmY0WzE2XTsKLWV4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmY0Qm9yZGVyc1sxNl07Ci1leHRlcm4gY29uc3QgV29yZDMyIGludlNCRlsyNF07Ci1leHRlcm4gY29uc3QgV29yZDE2IHNpZGVJbmZvVGFiTG9uZ1tNQVhfU0ZCX0xPTkcgKyAxXTsKLWV4dGVybiBjb25zdCBXb3JkMTYgc2lkZUluZm9UYWJTaG9ydFtNQVhfU0ZCX1NIT1JUICsgMV07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY2VuY19jb3JlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hYWNlbmNfY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjc1YjZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY2VuY19jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhYWNlbmNfY29yZS5oCi0KLQlDb250ZW50OglhYWMgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX2FhY2VuY19jb3JlX2hfCi0jZGVmaW5lIF9hYWNlbmNfY29yZV9oXwotCi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiYml0ZW5jLmgiCi0KLSNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInBzeV9tYWluLmgiCi0jaW5jbHVkZSAicWNfbWFpbi5oIgotI2luY2x1ZGUgInBzeV9tYWluLmgiCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmICBzdHJ1Y3QgewotICBXb3JkMzIgICBzYW1wbGVSYXRlOyAgICAgICAgICAgIC8qIGF1ZGlvIGZpbGUgc2FtcGxlIHJhdGUgKi8KLSAgV29yZDMyICAgYml0UmF0ZTsgICAgICAgICAgICAgICAvKiBlbmNvZGVyIGJpdCByYXRlIGluIGJpdHMvc2VjICovCi0gIFdvcmQxNiAgIG5DaGFubmVsc0luOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIG9uIGlucHV0ICgxLDIpICovCi0gIFdvcmQxNiAgIG5DaGFubmVsc091dDsgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIG9uIG91dHB1dCAoMSwyKSAqLwotICBXb3JkMTYgICBiYW5kV2lkdGg7ICAgICAgICAgICAgIC8qIHRhcmdldGVkIGF1ZGlvIGJhbmR3aWR0aCBpbiBIeiAqLwotICBXb3JkMTYgICBhZHRzVXNlZDsJCQkgIC8qIHdoZXRoZXIgd3JpdGUgYWR0cyBoZWFkZXIgKi8KLX0gQUFDRU5DX0NPTkZJRzsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgQUFDRU5DX0NPTkZJRyBjb25maWc7ICAgICAvKiBXb3JkMTYgc2l6ZTogOCAqLwotCi0gIEVMRU1FTlRfSU5GTyBlbEluZm87ICAgICAgLyogV29yZDE2IHNpemU6IDQgKi8KLQotICBRQ19TVEFURSBxY0tlcm5lbDsgICAgICAgIC8qIFdvcmQxNiBzaXplOiA2ICsgNShQQURESU5HKSArIDcoRUxFTUVOVF9CSVRTKSArIDU0KEFESl9USFJfU1RBVEUpID0gNzIgKi8KLSAgUUNfT1VUICAgcWNPdXQ7ICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogTUFYX0NIQU5ORUxTKjkyMChRQ19PVVRfQ0hBTk5FTCkgKyA1KFFDX09VVF9FTEVNRU5UKSArIDcgPSA5MzIgLyAxODUyICovCi0KLSAgUFNZX09VVCAgICBwc3lPdXQ7ICAgICAgICAvKiBXb3JkMTYgc2l6ZTogTUFYX0NIQU5ORUxTKjE4NiArIDIgPSAxODggLyAzNzQgKi8KLSAgUFNZX0tFUk5FTCBwc3lLZXJuZWw7ICAgICAvKiBXb3JkMTYgc2l6ZTogIDI1ODcgLyA0NDkxICovCi0KLSAgc3RydWN0IEJJVFNUUkVBTUVOQ09ERVJfSU5JVCBic2VJbml0OyAvKiBXb3JkMTYgc2l6ZTogNiAqLwotICBzdHJ1Y3QgQklUX0JVRiAgYml0U3RyZWFtOyAgICAgICAgICAgIC8qIFdvcmQxNiBzaXplOiA4ICovCi0gIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtOwotICBpbnQJCQkgIGluaXRPSzsKLQotICBzaG9ydAkJCSppbnRidWY7Ci0gIHNob3J0CQkJKmVuY2J1ZjsKLSAgc2hvcnQJCQkqaW5idWY7Ci0gIGludAkJCWVuY2xlbjsKLSAgaW50CQkJaW5sZW47Ci0gIGludAkJCWludGxlbjsKLSAgaW50CQkJdXNlbGVuZ3RoOwotCi0gIHZvaWQJCQkqaENoZWNrOwotICBWT19NRU1fT1BFUkFUT1IgKnZvTWVtb3A7Ci0gIFZPX01FTV9PUEVSQVRPUiB2b01lbW9wcmF0b3I7Ci0KLX1BQUNfRU5DT0RFUjsgLyogV29yZDE2IHNpemU6IDM4MDkgLyA2ODUxICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb25uYW1lOiBBYWNJbml0RGVmYXVsdENvbmZpZwotZGVzY3JpcHRpb246ICBnaXZlcyByZWFzb25hYmxlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotcmV0dXJuczogICAgICAtLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAqY29uZmlnKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb25uYW1lOkFhY0VuY09wZW4KLWRlc2NyaXB0aW9uOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCi1yZXR1cm5zOiAgICAgQUFDRU5DX09LIGlmIHN1Y2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotV29yZDE2ICBBYWNFbmNPcGVuIChBQUNfRU5DT0RFUgkJCQkqaEFhY0VuYywgICAgICAgLyogcG9pbnRlciB0byBhbiBlbmNvZGVyIGhhbmRsZSwgaW5pdGlhbGl6ZWQgb24gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0ICBBQUNFTkNfQ09ORklHICAgICBjb25maWcpOyAgICAgICAgLyogcHJlLWluaXRpYWxpemVkIGNvbmZpZyBzdHJ1Y3QgKi8KLQotV29yZDE2IEFhY0VuY0VuY29kZShBQUNfRU5DT0RFUgkJICAgKmhBYWNFbmMsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAqdGltZVNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQ4ICAgICAgICphbmNCeXRlcywgICAgICAvKiE8IHBvaW50ZXIgdG8gYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICpudW1BbmNCeXRlcywgICAvKiE8IG51bWJlciBvZiBhbmNpbGxhcnkgRGF0YSBCeXRlcywgc2VuZCBhcyBmaWxsIGVsZW1lbnQgICovCi0gICAgICAgICAgICAgICAgICAgIFVXb3JkOCAgICAgICAgICAgICAqb3V0Qnl0ZXMsICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBWT19VMzIgICAgICAgICAgICAgKm51bU91dEJ5dGVzICAgIC8qITwgbnVtYmVyIG9mIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb25uYW1lOkFhY0VuY0Nsb3NlCi1kZXNjcmlwdGlvbjogZGVhbGxvY2F0ZSBhbiBlbmNvZGVyIGluc3RhbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgQWFjRW5jQ2xvc2UgKEFBQ19FTkNPREVSKiBoQWFjRW5jLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7IC8qIGFuIGVuY29kZXIgaGFuZGxlICovCi0KLSNlbmRpZiAvKiBfYWFjZW5jX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNGJiNWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Roci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhZGpfdGhyLmgKLQotCUNvbnRlbnQ6CVRocmVzaG9sZCBjb21wZW5zYXRpb24gZnVuY3Rpb24KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0FESl9USFJfSAotI2RlZmluZSBfX0FESl9USFJfSAotCi0jaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotCi1Xb3JkMTYgYml0czJwZShjb25zdCBXb3JkMTYgYml0cyk7Ci0KLVdvcmQzMiBBZGpUaHJOZXcoQURKX1RIUl9TVEFURSoqIHBoQWRqVGhyLAotICAgICAgICAgICAgICAgICBXb3JkMzIgbkVsZW1lbnRzKTsKLQotdm9pZCBBZGpUaHJEZWxldGUoQURKX1RIUl9TVEFURSAqaEFkalRocik7Ci0KLXZvaWQgQWRqVGhySW5pdChBREpfVEhSX1NUQVRFICpoQWRqVGhyLAotICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBwZU1lYW4sCi0gICAgICAgICAgICAgICAgV29yZDMyIGNoQml0cmF0ZSk7Ci0KLXZvaWQgQWRqdXN0VGhyZXNob2xkcyhBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogQWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2hCaXREaXN0cmlidXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogcWNPRSwKLQkJCQkJICBFTEVNRU5UX0JJVFMqIGVsQml0cywKLQkJCQkJICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhCaXRGYWMpOwotCi12b2lkIEFkalRoclVwZGF0ZShBVFNfRUxFTUVOVCAqQWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGR5bkJpdHNVc2VkKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHJfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMTMyZDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWFkal90aHJfZGF0YS5oCi0KLQlDb250ZW50OglUaHJlc2hvbGQgY29tcGVuc2F0aW9uIHBhcmFtZXRlcgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fQURKX1RIUl9EQVRBX0gKLSNkZWZpbmUgX19BREpfVEhSX0RBVEFfSAotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImxpbmVfcGUuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgV29yZDE2IGNsaXBTYXZlTG93LCBjbGlwU2F2ZUhpZ2g7Ci0gICBXb3JkMTYgbWluQml0U2F2ZSwgbWF4Qml0U2F2ZTsKLSAgIFdvcmQxNiBjbGlwU3BlbmRMb3csIGNsaXBTcGVuZEhpZ2g7Ci0gICBXb3JkMTYgbWluQml0U3BlbmQsIG1heEJpdFNwZW5kOwotfSBCUkVTX1BBUkFNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBVV29yZDggbW9kaWZ5TWluU25yOwotICAgV29yZDE2IHN0YXJ0U2ZiTCwgc3RhcnRTZmJTOwotfSBBSF9QQVJBTTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBXb3JkMzIgbWF4UmVkOwotICBXb3JkMzIgc3RhcnRSYXRpbywgbWF4UmF0aW87Ci0gIFdvcmQzMiByZWRSYXRpb0ZhYzsKLSAgV29yZDMyIHJlZE9mZnM7Ci19IE1JTlNOUl9BREFQVF9QQVJBTTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXNlcnZvaXIgY29udHJvbCAqLwotICBXb3JkMTYgcGVNaW4sIHBlTWF4OwotICAvKiBjb25zdGFudCBvZmZzZXQgdG8gcGUgICAgICAgICAgICAgICAqLwotICBXb3JkMTYgIHBlT2Zmc2V0OwotICAvKiBhdm9pZCBob2xlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAqLwotICBBSF9QQVJBTSBhaFBhcmFtOwotICAvKiBwYXJhbXRlcnMgZm9yIGFkYXB0YXRpb24gb2YgbWluU25yICovCi0gIE1JTlNOUl9BREFQVF9QQVJBTSBtaW5TbnJBZGFwdFBhcmFtOwotICAvKiB2YWx1ZXMgZm9yIGNvcnJlY3Rpb24gb2YgcGUgKi8KLSAgV29yZDE2IHBlTGFzdDsKLSAgV29yZDE2IGR5bkJpdHNMYXN0OwotICBXb3JkMTYgcGVDb3JyZWN0aW9uRmFjdG9yOwotfSBBVFNfRUxFTUVOVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCUkVTX1BBUkFNICAgYnJlc1BhcmFtTG9uZywgYnJlc1BhcmFtU2hvcnQ7IC8qIFdvcmQxNiBzaXplOiAyKjggKi8KLSAgQVRTX0VMRU1FTlQgIGFkalRoclN0YXRlRWxlbTsgICAgICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogMTkgKi8KLX0gQURKX1RIUl9TVEFURTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iYW5kX25yZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmFuZF9ucmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0NTNjMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iYW5kX25yZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliYW5kX25yZy5oCi0KLQlDb250ZW50OglCYW5kL0xpbmUgZW5lcmd5IGNhbGN1bGF0aW9ucyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9CQU5EX05SR19ICi0jZGVmaW5lIF9CQU5EX05SR19ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLQotdm9pZCBDYWxjQmFuZEVuZXJneShjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG51bUJhbmRzLAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVN1bSk7Ci0KLQotdm9pZCBDYWxjQmFuZEVuZXJneU1TKGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG51bUJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lNaWRTdW0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTaWRlU3VtKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRfY250LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRfY250LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmEyMTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0X2NudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYml0X2NudC5oCi0KLQlDb250ZW50OglIdWZmbWFuIEJpdGNvdW50ZXIgJiBjb2RlciBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fQklUQ09VTlRfSAotI2RlZmluZSBfX0JJVENPVU5UX0gKLQotI2luY2x1ZGUgImJpdGJ1ZmZlci5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jZGVmaW5lIElOVkFMSURfQklUQ09VTlQgKE1BWF8xNi80KQotCi0vKgotICBjb2RlIGJvb2sgbnVtYmVyIHRhYmxlCi0qLwotCi1lbnVtIGNvZGVCb29rTm97Ci0gIENPREVfQk9PS19aRVJPX05PPSAgICAgICAgICAgICAgIDAsCi0gIENPREVfQk9PS18xX05PPSAgICAgICAgICAgICAgICAgIDEsCi0gIENPREVfQk9PS18yX05PPSAgICAgICAgICAgICAgICAgIDIsCi0gIENPREVfQk9PS18zX05PPSAgICAgICAgICAgICAgICAgIDMsCi0gIENPREVfQk9PS180X05PPSAgICAgICAgICAgICAgICAgIDQsCi0gIENPREVfQk9PS181X05PPSAgICAgICAgICAgICAgICAgIDUsCi0gIENPREVfQk9PS182X05PPSAgICAgICAgICAgICAgICAgIDYsCi0gIENPREVfQk9PS183X05PPSAgICAgICAgICAgICAgICAgIDcsCi0gIENPREVfQk9PS184X05PPSAgICAgICAgICAgICAgICAgIDgsCi0gIENPREVfQk9PS185X05PPSAgICAgICAgICAgICAgICAgIDksCi0gIENPREVfQk9PS18xMF9OTz0gICAgICAgICAgICAgICAgMTAsCi0gIENPREVfQk9PS19FU0NfTk89ICAgICAgICAgICAgICAgMTEsCi0gIENPREVfQk9PS19SRVNfTk89ICAgICAgICAgICAgICAgMTIsCi0gIENPREVfQk9PS19QTlNfTk89ICAgICAgICAgICAgICAgMTMKLX07Ci0KLS8qCi0gIGNvZGUgYm9vayBpbmRleCB0YWJsZQotKi8KLQotZW51bSBjb2RlQm9va05keHsKLSAgQ09ERV9CT09LX1pFUk9fTkRYPTAsCi0gIENPREVfQk9PS18xX05EWCwKLSAgQ09ERV9CT09LXzJfTkRYLAotICBDT0RFX0JPT0tfM19ORFgsCi0gIENPREVfQk9PS180X05EWCwKLSAgQ09ERV9CT09LXzVfTkRYLAotICBDT0RFX0JPT0tfNl9ORFgsCi0gIENPREVfQk9PS183X05EWCwKLSAgQ09ERV9CT09LXzhfTkRYLAotICBDT0RFX0JPT0tfOV9ORFgsCi0gIENPREVfQk9PS18xMF9ORFgsCi0gIENPREVfQk9PS19FU0NfTkRYLAotICBDT0RFX0JPT0tfUkVTX05EWCwKLSAgQ09ERV9CT09LX1BOU19ORFgsCi0gIE5VTUJFUl9PRl9DT0RFX0JPT0tTCi19OwotCi0vKgotICBjb2RlIGJvb2sgbGF2IHRhYmxlCi0qLwotCi1lbnVtIGNvZGVCb29rTGF2ewotICBDT0RFX0JPT0tfWkVST19MQVY9MCwKLSAgQ09ERV9CT09LXzFfTEFWPTEsCi0gIENPREVfQk9PS18yX0xBVj0xLAotICBDT0RFX0JPT0tfM19MQVY9MiwKLSAgQ09ERV9CT09LXzRfTEFWPTIsCi0gIENPREVfQk9PS181X0xBVj00LAotICBDT0RFX0JPT0tfNl9MQVY9NCwKLSAgQ09ERV9CT09LXzdfTEFWPTcsCi0gIENPREVfQk9PS184X0xBVj03LAotICBDT0RFX0JPT0tfOV9MQVY9MTIsCi0gIENPREVfQk9PS18xMF9MQVY9MTIsCi0gIENPREVfQk9PS19FU0NfTEFWPTE2LAotICBDT0RFX0JPT0tfU0NGX0xBVj02MCwKLSAgQ09ERV9CT09LX1BOU19MQVY9NjAKLX07Ci0KLVdvcmQxNiBiaXRDb3VudChjb25zdCBXb3JkMTYgKmFRdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbm9PZlNwZWNMaW5lcywKLSAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIG1heFZhbCwKLSAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50THV0KTsKLQotV29yZDE2IGNvZGVWYWx1ZXMoV29yZDE2ICp2YWx1ZXMsIFdvcmQxNiB3aWR0aCwgV29yZDE2IGNvZGVCb29rLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKTsKLQotV29yZDE2IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShXb3JkMTYgZGVsdGEpOwotV29yZDE2IGNvZGVTY2FsZWZhY3RvckRlbHRhKFdvcmQxNiBzY2FsZWZhY3RvciwgSEFORExFX0JJVF9CVUYgaEJpdHN0cmVhbSk7Ci0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0YnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzlmMDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0YnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJpdGJ1ZmZlci5oCi0KLQlDb250ZW50OglCaXQgQnVmZmVyIE1hbmFnZW1lbnQgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCSVRCVUZGRVJfSAotI2RlZmluZSBCSVRCVUZGRVJfSAotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi0KLWVudW0gZGlyZWN0aW9uCi17Ci0gIGZvcndhcmREaXJlY3Rpb24sCi0gIGJhY2t3YXJkRGlyZWN0aW9uCi19OwotCi0KLS8qIQotICAgVGhlIHBvaW50ZXIgJ3BSZWFkTmV4dCcgcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSB3b3JkLCB3aGVyZSBiaXRzIGNhbiBiZSByZWFkIGZyb20uIFRoZSBwb2ludGVyCi0gICAncFdyaXRlTmV4dCcgcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSB3b3JkLCB3aGVyZSBiaXRzIGNhbiBiZSB3cml0dGVuIHRvLiBUaGUgcG9pbnRlciBwQml0QnVmQmFzZQotICAgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgYml0c3RyZWFtIGJ1ZmZlciBhbmQgdGhlIHBvaW50ZXIgcEJpdEJ1ZkVuZCBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgYml0c3RyZWFtCi0gICBidWZmZXIuIFRoZSB0d28gcG9pbnRlcnMgYXJlIHVzZWQgYXMgbG93ZXItYm91bmQgcmVzcGVjdGl2ZWx5IHVwcGVyLWJvdW5kIGFkZHJlc3MgZm9yIHRoZSBtb2R1bG8gYWRkcmVzc2luZwotICAgbW9kZS4KLQotICAgVGhlIGVsZW1lbnQgY250Qml0cyBjb250YWlucyB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBiaXRzIGluIHRoZSBiaXQgYnVmZmVyLiBJdCB3aWxsIGJlIGluY3JlbWVudGVkIHdoZW4KLSAgIGJpdHMgYXJlIHdyaXR0ZW4gdG8gdGhlIGJpdHN0cmVhbSBidWZmZXIgYW5kIGRlY3JlbWVudGVkIHdoZW4gYml0cyBhcmUgcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0gYnVmZmVyLgotKi8KLXN0cnVjdCBCSVRfQlVGCi17Ci0gIFVXb3JkOCAqcEJpdEJ1ZkJhc2U7ICAgICAgICAgIC8qITwgcG9pbnRlciBwb2ludHMgdG8gZmlyc3QgcG9zaXRpb24gaW4gYml0c3RyZWFtIGJ1ZmZlciAqLwotICBVV29yZDggKnBCaXRCdWZFbmQ7ICAgICAgICAgICAvKiE8IHBvaW50ZXIgcG9pbnRzIHRvIGxhc3QgcG9zaXRpb24gaW4gYml0c3RyZWFtIGJ1ZmZlciAqLwotCi0gIFVXb3JkOCAqcFdyaXRlTmV4dDsgICAgICAgICAgIC8qITwgcG9pbnRlciBwb2ludHMgdG8gbmV4dCBhdmFpbGFibGUgd29yZCBpbiBiaXRzdHJlYW0gYnVmZmVyIHRvIHdyaXRlICovCi0KLSAgVVdvcmQzMiBjYWNoZTsKLQotICBXb3JkMTYgIHdCaXRQb3M7ICAgICAgICAgICAgICAvKiE8IDMxPD13Qml0UG9zPD0wKi8KLSAgV29yZDE2ICBjbnRCaXRzOyAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBiaXRzIHRvIGJpdHN0cmVhbSBidWZmZXIgID0+IGluY3JlbWVudCBjbnRCaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBiaXRzIGZyb20gYml0c3RyZWFtIGJ1ZmZlciA9PiBkZWNyZW1lbnQgY250Qml0cyAqLwotICBXb3JkMTYgIHNpemU7ICAgICAgICAgICAgICAgICAvKiE8IHNpemUgb2YgYml0YnVmZmVyIGluIGJpdHMgKi8KLSAgV29yZDE2ICBpc1ZhbGlkOyAgICAgICAgICAgICAgLyohPCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLX07IC8qIHNpemUgV29yZDE2OiA4ICovCi0KLS8qISBEZWZpbmUgcG9pbnRlciB0byBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgQklUX0JVRiAqSEFORExFX0JJVF9CVUY7Ci0KLQotSEFORExFX0JJVF9CVUYgQ3JlYXRlQml0QnVmZmVyKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGJpdEJ1ZlNpemUpOwotCi0KLXZvaWQgRGVsZXRlQml0QnVmZmVyKEhBTkRMRV9CSVRfQlVGICpoQml0QnVmKTsKLQotCi1Xb3JkMTYgR2V0Qml0c0F2YWlsKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYpOwotCi0KLVdvcmQxNiBXcml0ZUJpdHMoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgVVdvcmQzMiB3cml0ZVZhbHVlLAotICAgICAgICAgICAgICAgICBXb3JkMTYgbm9CaXRzVG9Xcml0ZSk7Ci0KLXZvaWQgUmVzZXRCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKLSAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKTsKLQotI2RlZmluZSBHZXROckJpdHNBdmFpbGFibGUoaEJpdEJ1ZikgKCAoaEJpdEJ1ZiktPmNudEJpdHMpCi0jZGVmaW5lIEdldE5yQml0c1JlYWQoaEJpdEJ1ZikgICAgICAgKChoQml0QnVmKS0+c2l6ZS0oaEJpdEJ1ZiktPmNudEJpdHMpCi0KLSNlbmRpZiAvKiBCSVRCVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0ZW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRlbmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1OGFlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRlbmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYml0ZW5jLmgKLQotCUNvbnRlbnQ6CUJpdHN0cmVhbSBlbmNvZGVyIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0JJVEVOQ19ICi0jZGVmaW5lIF9CSVRFTkNfSAotCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgInRucy5oIgotI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0KLXN0cnVjdCBCSVRTVFJFQU1FTkNPREVSX0lOSVQKLXsKLSAgV29yZDE2IG5DaGFubmVsczsKLSAgV29yZDMyIGJpdHJhdGU7Ci0gIFdvcmQzMiBzYW1wbGVSYXRlOwotICBXb3JkMTYgcHJvZmlsZTsKLX07Ci0KLQotCi1Xb3JkMTYgV3JpdGVCaXRzdHJlYW0gKEhBTkRMRV9CSVRfQlVGIGhCaXRzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgKnBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpnbG9iVXNlZEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkOCAqYW5jQnl0ZXMsCi0JCQkJCSAgIFdvcmQxNiBzYW1wbGVyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSNlbmRpZiAvKiBfQklURU5DX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Jsb2NrX3N3aXRjaC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmxvY2tfc3dpdGNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDNlOGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmxvY2tfc3dpdGNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJsb2NrX3N3aXRjaC5oCi0KLQlDb250ZW50OglCbG9jayBzd2l0Y2hpbmcgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfQkxPQ0tfU1dJVENIX0gKLSNkZWZpbmUgX0JMT0NLX1NXSVRDSF9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX0lJUl9MRU4gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgSGlnaFBhc3MtRklSLUZpbHRlciBmb3IgQXR0YWNrLURldGVjdGlvbiAqLwotI2RlZmluZSBCTE9DS19TV0lUQ0hfV0lORE9XUyBUUkFOU19GQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB3aW5kb3dzIGZvciBlbmVyZ3kgY2FsY3VsYXRpb24gKi8KLSNkZWZpbmUgQkxPQ0tfU1dJVENIX1dJTkRPV19MRU4gRlJBTUVfTEVOX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbWFsIGdyYW51bGFyaXR5IG9mIGVuZXJneSBjYWxjdWxhdGlvbiAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKiBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgaW52QXR0YWNrUmF0aW87Ci0gIFdvcmQxNiB3aW5kb3dTZXF1ZW5jZTsKLSAgV29yZDE2IG5leHR3aW5kb3dTZXF1ZW5jZTsKLSAgRmxhZyBhdHRhY2s7Ci0gIEZsYWcgbGFzdGF0dGFjazsKLSAgV29yZDE2IGF0dGFja0luZGV4OwotICBXb3JkMTYgbGFzdEF0dGFja0luZGV4OwotICBXb3JkMTYgbm9PZkdyb3VwczsKLSAgV29yZDE2IGdyb3VwTGVuW1RSQU5TX0ZBQ107Ci0gIFdvcmQzMiB3aW5kb3dOcmdbMl1bQkxPQ0tfU1dJVENIX1dJTkRPV1NdOyAgICAgLyogdGltZSBzaWduYWwgZW5lcmd5IGluIFN1YndpbmRvd3MgKGxhc3QgYW5kIGN1cnJlbnQpICovCi0gIFdvcmQzMiB3aW5kb3dOcmdGWzJdW0JMT0NLX1NXSVRDSF9XSU5ET1dTXTsgICAgLyogZmlsdGVyZWQgdGltZSBzaWduYWwgZW5lcmd5IGluIHNlZ21lbnRzIChsYXN0IGFuZCBjdXJyZW50KSAqLwotICBXb3JkMzIgaWlyU3RhdGVzW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXTsgICAgIC8qIGZpbHRlciBkZWxheS1saW5lICovCi0gIFdvcmQzMiBtYXhXaW5kb3dOcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4IGVuZXJneSBpbiBzdWJ3aW5kb3dzICovCi0gIFdvcmQzMiBhY2NXaW5kb3dOcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdXJzaXZlbHkgYWNjdW11bGF0ZWQgd2luZG93TnJnRiAqLwotfUJMT0NLX1NXSVRDSElOR19DT05UUk9MOwotCi0KLQotCi0KLVdvcmQxNiBJbml0QmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIGJpdFJhdGUsIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpOwotCi1Xb3JkMTYgQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCi0JCQkJCSAgV29yZDMyICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCk7Ci0KLVdvcmQxNiBTeW5jQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5vT2ZDaGFubmVscyk7Ci0KLQotCi0jZW5kaWYgIC8qICNpZm5kZWYgX0JMT0NLX1NXSVRDSF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jaGFubmVsX21hcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY2hhbm5lbF9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2MWZlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jaGFubmVsX21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQljaGFubmVsX21hcC5oCi0KLQlDb250ZW50OgljaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0NIQU5ORUxfTUFQX0gKLSNkZWZpbmUgX0NIQU5ORUxfTUFQX0gKLQotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLQotV29yZDE2IEluaXRFbGVtZW50SW5mbyAoV29yZDE2IG5DaGFubmVscywgRUxFTUVOVF9JTkZPKiBlbEluZm8pOwotCi1Xb3JkMTYgSW5pdEVsZW1lbnRCaXRzKEVMRU1FTlRfQklUUyAqZWxlbWVudEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRyYXRlVG90LAotICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYXZlcmFnZUJpdHNUb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdGF0aWNCaXRzVG90KTsKLQotI2VuZGlmIC8qIENIQU5ORUxfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2NvbmZpZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjRjMjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWNvbmZpZy5oCi0KLQlDb250ZW50OglhYWMgZW5jb2RlciBwYXJhbWV0ZXIKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfQUFDRU5DX0NPTkZJR19IXwotI2RlZmluZSBfQUFDRU5DX0NPTkZJR19IXwotCi0jZGVmaW5lIE1BWF9DSEFOTkVMUyAgICAgICAgMgotCi0jZGVmaW5lIEFBQ0VOQ19CTE9DS1NJWkUgICAgMTAyNCAgIC8qISBlbmNvZGVyIG9ubHkgdGFrZXMgQkxPQ0tTSVpFIHNhbXBsZXMgYXQgYSB0aW1lICovCi0jZGVmaW5lIEFBQ0VOQ19UUkFOU19GQUMgICAgOCAgICAgIC8qISBlbmNvZGVyIHNob3J0IGxvbmcgcmF0aW8gKi8KLQotCi0jZGVmaW5lIE1BWEJJVFNfQ09FRgkJNjE0NAotI2RlZmluZSBNSU5CSVRTX0NPRUYJCTc0NAotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZHluX2JpdHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2R5bl9iaXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYThhNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZHluX2JpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJZHluX2JpdHMuaAotCi0JQ29udGVudDoJTm9pc2VsZXNzIGNvZGVyIG1vZHVsZSBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fRFlOX0JJVFNfSAotI2RlZmluZSBfX0RZTl9CSVRTX0gKLQotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInRucy5oIgotI2luY2x1ZGUgImJpdF9jbnQuaCIKLQotCi0KLSNkZWZpbmUgTUFYX1NFQ1RJT05TICAgICAgICAgIE1BWF9HUk9VUEVEX1NGQgotI2RlZmluZSBTRUNUX0VTQ19WQUxfTE9ORyAgICAzMQotI2RlZmluZSBTRUNUX0VTQ19WQUxfU0hPUlQgICAgNwotI2RlZmluZSBDT0RFX0JPT0tfQklUUyAgICAgICAgNAotI2RlZmluZSBTRUNUX0JJVFNfTE9ORyAgICAgICAgNQotI2RlZmluZSBTRUNUX0JJVFNfU0hPUlQgICAgICAgMwotCi10eXBlZGVmIHN0cnVjdAotewotICBXb3JkMTYgY29kZUJvb2s7Ci0gIFdvcmQxNiBzZmJTdGFydDsKLSAgV29yZDE2IHNmYkNudDsKLSAgV29yZDE2IHNlY3Rpb25CaXRzOwotfQotU0VDVElPTl9JTkZPOwotCi0KLQotCi10eXBlZGVmIHN0cnVjdAotewotICBXb3JkMTYgYmxvY2tUeXBlOwotICBXb3JkMTYgbm9PZkdyb3VwczsKLSAgV29yZDE2IHNmYkNudDsKLSAgV29yZDE2IG1heFNmYlBlckdyb3VwOwotICBXb3JkMTYgc2ZiUGVyR3JvdXA7Ci0gIFdvcmQxNiBub09mU2VjdGlvbnM7Ci0gIFNFQ1RJT05fSU5GTyBzZWN0aW9uSW5mb1tNQVhfU0VDVElPTlNdOwotICBXb3JkMTYgc2lkZUluZm9CaXRzOyAgICAgICAgICAgICAvKiBzZWN0aW9uaW5nIGJpdHMgICAgICAgKi8KLSAgV29yZDE2IGh1ZmZtYW5CaXRzOyAgICAgICAgICAgICAgLyogaHVmZm1hbiAgICBjb2RlZCBiaXRzICovCi0gIFdvcmQxNiBzY2FsZWZhY0JpdHM7ICAgICAgICAgICAgIC8qIHNjYWxlZmFjICAgY29kZWQgYml0cyAqLwotICBXb3JkMTYgZmlyc3RTY2Y7ICAgICAgICAgICAgICAgICAvKiBmaXJzdCBzY2YgdG8gYmUgY29kZWQgKi8KLSAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkcqKENPREVfQk9PS19FU0NfTkRYKzEpXTsKLSAgV29yZDE2IG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddOwotfQotU0VDVElPTl9EQVRBOyAvKiAgV29yZDE2IHNpemU6IDEwICsgNjAoTUFYX1NFQ1RJT05TKSo0KFNFQ1RJT05fSU5GTykgKyA1MShNQVhfU0ZCX0xPTkcpKjEyKENPREVfQk9PS19FU0NfTkRYKzEpICsgNTEoTUFYX1NGQl9MT05HKSA9IDkxMyAqLwotCi0KLVdvcmQxNiBCQ0luaXQodm9pZCk7Ci0KLVdvcmQxNiBkeW5CaXRDb3VudChjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNjYWxlZmFjLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2dycF9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9ncnBfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFiMmNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2dycF9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWdycF9kYXRhLmgKLQotCUNvbnRlbnQ6CVNob3J0IGJsb2NrIGdyb3VwaW5nIGZ1bmN0aW9uCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19HUlBfREFUQV9IX18KLSNkZWZpbmUgX19HUlBfREFUQV9IX18KLSNpbmNsdWRlICJwc3lfZGF0YS5oIgotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0KLXZvaWQKLWdyb3VwU2hvcnREYXRhKFdvcmQzMiAgICAgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgKnRtcFNwZWN0cnVtLAotICAgICAgICAgICAgICAgU0ZCX1RIUkVTSE9MRCAqc2ZiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5TVMsCi0gICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJTcHJlYWRlZEVuZXJneSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHNmYkNudCwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk1pblNuciwKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmdyb3VwZWRTZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICptYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmdyb3VwZWRTZmJNaW5TbnIsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBub09mR3JvdXBzLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqZ3JvdXBMZW4pOwotCi0jZW5kaWYgLyogX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9pbnRlcmZhY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDJlNmE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJaW50ZXJmYWNlLmgKLQotCUNvbnRlbnQ6CXBzeWNob2FjY291c3RpYy9xdWFudGl6ZXIgc3RydWN0dXJlcyBhbmQgaW50ZXJmYWNlCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0lOVEVSRkFDRV9ICi0jZGVmaW5lIF9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAicHN5X2RhdGEuaCIKLSNpbmNsdWRlICJ0eXBlZGVmcy5oIgotCi0KLWVudW0KLXsKLSAgTVNfTk9ORSA9IDAsCi0gIE1TX1NPTUUgPSAxLAotICBNU19BTEwgID0gMgotfTsKLQotZW51bQotewotICBNU19PTiA9IDEKLX07Ci0KLXN0cnVjdCBUT09MU0lORk8gewotICBXb3JkMTYgbXNEaWdlc3Q7Ci0gIFdvcmQxNiBtc01hc2tbTUFYX0dST1VQRURfU0ZCXTsKLX07Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBXb3JkMTYgIHNmYkNudDsKLSAgV29yZDE2ICBzZmJQZXJHcm91cDsKLSAgV29yZDE2ICBtYXhTZmJQZXJHcm91cDsKLSAgV29yZDE2ICB3aW5kb3dTZXF1ZW5jZTsKLSAgV29yZDE2ICB3aW5kb3dTaGFwZTsKLSAgV29yZDE2ICBncm91cGluZ01hc2s7Ci0gIFdvcmQxNiAgc2ZiT2Zmc2V0c1tNQVhfR1JPVVBFRF9TRkIrMV07Ci0gIFdvcmQxNiAgbWRjdFNjYWxlOwotICBXb3JkMzIgKnNmYkVuZXJneTsKLSAgV29yZDMyICpzZmJTcHJlYWRlZEVuZXJneTsKLSAgV29yZDMyICpzZmJUaHJlc2hvbGQ7Ci0gIFdvcmQzMiAqbWRjdFNwZWN0cnVtOwotICBXb3JkMzIgIHNmYkVuU3VtTFI7Ci0gIFdvcmQzMiAgc2ZiRW5TdW1NUzsKLSAgV29yZDMyIHNmYkRpc3RbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDMyIHNmYkRpc3ROZXdbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2ICBzZmJNaW5TbnJbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IG1pblNmTWF4UXVhbnRbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IG1pblNjZkNhbGN1bGF0ZWRbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IHByZXZTY2ZMYXN0W01BWF9HUk9VUEVEX1NGQl07Ci0gIFdvcmQxNiBwcmV2U2NmTmV4dFtNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMTYgZGVsdGFQZUxhc3RbTUFYX0dST1VQRURfU0ZCXTsKLSAgVE5TX0lORk8gdG5zSW5mbzsKLX0gUFNZX09VVF9DSEFOTkVMOyAvKiBXb3JkMTYgc2l6ZTogMTQgKyA2MChNQVhfR1JPVVBFRF9TRkIpICsgMTEyKFROU19JTkZPKSA9IDE4NiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBUT09MU0lORk8gdG9vbHNJbmZvOwotICBXb3JkMTYgZ3JvdXBlZFNmYk9mZnNldFtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQisxXTsgIC8qIHBsdXMgb25lIGZvciBsYXN0IGR1bW15IG9mZnNldCAhICovCi0gIFdvcmQxNiBncm91cGVkU2ZiTWluU25yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLX0gUFNZX09VVF9FTEVNRU5UOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIGluZm9ybWF0aW9uIHNoYXJlZCBieSBib3RoIGNoYW5uZWxzICAqLwotICBQU1lfT1VUX0VMRU1FTlQgIHBzeU91dEVsZW1lbnQ7Ci0gIC8qIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGVhY2ggY2hhbm5lbCAqLwotICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXTsKLX1QU1lfT1VUOwotCi12b2lkIEJ1aWxkSW50ZXJmYWNlKFdvcmQzMiAgICAgICAgICAgICAgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICAgICAgICAgICpzZmJUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgICAgICAgICAgKnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAqc2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgIHNmYkVuZXJneVN1bUxSLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTRkJfRU5FUkdZX1NVTSAgICBzZmJFbmVyZ3lTdW1NUywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgd2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgIHdpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKmdyb3VwZWRTZmJNaW5TbnIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgIG5vT2ZHcm91cHMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKmdyb3VwTGVuLAotICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICpwc3lPdXRDaCk7Ci0KLSNlbmRpZiAvKiBfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2xpbmVfcGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2xpbmVfcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2ZDVhOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9saW5lX3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWxpbmVfcGUuaAotCi0JQ29udGVudDoJUGVyY2VwdHVhbCBlbnRyb3BpZSBtb2R1bGUgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0xJTkVfUEVfSAotI2RlZmluZSBfX0xJTkVfUEVfSAotCi0KLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBXb3JkMTYgc2ZiTGRFbmVyZ3lbTUFYX0dST1VQRURfU0ZCXTsgICAgIC8qIDQqbG9nKHNmYkVuZXJneSkvbG9nKDIpICovCi0gICBXb3JkMTYgc2ZiTkxpbmVzNFtNQVhfR1JPVVBFRF9TRkJdOyAgICAgIC8qIDQqbnVtYmVyIG9mIHJlbGV2YW50IGxpbmVzIGluIHNmYiAqLwotICAgV29yZDE2IHNmYlBlW01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgICAvKiBwZSBmb3IgZWFjaCBzZmIgKi8KLSAgIFdvcmQxNiBzZmJDb25zdFBhcnRbTUFYX0dST1VQRURfU0ZCXTsgICAgLyogY29uc3RhbnQgcGFydCBmb3IgZWFjaCBzZmIgKi8KLSAgIFdvcmQxNiBzZmJOQWN0aXZlTGluZXNbTUFYX0dST1VQRURfU0ZCXTsgLyogbnVtYmVyIG9mIGFjdGl2ZSBsaW5lcyBpbiBzZmIgKi8KLSAgIFdvcmQxNiBwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYlBlICovCi0gICBXb3JkMTYgY29uc3RQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSBvZiBzZmJDb25zdFBhcnQgKi8KLSAgIFdvcmQxNiBuQWN0aXZlTGluZXM7ICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYk5BY3RpdmVMaW5lcyAqLwotfSBQRV9DSEFOTkVMX0RBVEE7IC8qIHNpemUgV29yZDE2OiAzMDMgKi8KLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBQRV9DSEFOTkVMX0RBVEEgcGVDaGFubmVsRGF0YVtNQVhfQ0hBTk5FTFNdOwotICAgV29yZDE2IHBlOwotICAgV29yZDE2IGNvbnN0UGFydDsKLSAgIFdvcmQxNiBuQWN0aXZlTGluZXM7Ci0gICBXb3JkMTYgb2Zmc2V0OwotICAgV29yZDE2IGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07Ci0gICBXb3JkMzIgdGhyRXhwW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLSAgIFdvcmQzMiBzZmJQZUZhY3RvcnNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOwotfSBQRV9EQVRBOyAvKiBzaXplIFdvcmQxNjogMzAzICsgNCArIDEyMCArIDI0MCA9IDY2NyAqLwotCi0KLQotCi12b2lkIHByZXBhcmVTZmJQZShQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVPZmZzZXQpOwotCi0KLQotCi0KLXZvaWQgY2FsY1NmYlBlKFBFX0RBVEEgKnBlRGF0YSwKLSAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKTsKLQotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tZW1hbGlnbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbWVtYWxpZ24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiYmY0NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tZW1hbGlnbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQltZW1hbGlnbi5oCi0KLQlDb250ZW50OglNZW1vcnkgYWxsb2MgYWxpZ25tZW50cyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1ZPX0FBQ0VOQ19NRU1fQUxJR05fSF9fCi0jZGVmaW5lIF9fVk9fQUFDRU5DX01FTV9BTElHTl9IX18KLQotI2luY2x1ZGUgInZvTWVtLmgiCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi1leHRlcm4gdm9pZCAqbWVtX21hbGxvYyhWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgYWxpZ25tZW50LCB1bnNpZ25lZCBpbnQgQ29kZWNJRCk7Ci1leHRlcm4gdm9pZCBtZW1fZnJlZShWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdm9pZCAqbWVtX3B0ciwgdW5zaWduZWQgaW50IENvZGVjSUQpOwotCi0jZW5kaWYJLyogX19WT19NRU1fQUxJR05fSF9fICovCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tc19zdGVyZW8uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21zX3N0ZXJlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzAzZGVhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21zX3N0ZXJlby5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQltc19zdGVyZW8uaAotCi0JQ29udGVudDoJRGVjbGFyYXRpb24gTVMgc3RlcmVvIHByb2Nlc3Npbmcgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX01TX1NURVJFT19IX18KLSNkZWZpbmUgX19NU19TVEVSRU9fSF9fCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi12b2lkIE1zU3RlcmVvUHJvY2Vzc2luZyhXb3JkMzIgICAgICAgKnNmYkVuZXJneUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYkVuZXJneVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3lNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKnNmYkVuZXJneVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiU3ByZWFkZWRFbkxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlNwcmVhZGVkRW5SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqbXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wcmVfZWNob19jb250cm9sLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wcmVfZWNob19jb250cm9sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTliYTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHJlX2VjaG9fY29udHJvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlwcmVfZWNob19jb250cm9sLmgKLQotCUNvbnRlbnQ6CVByZSBlY2hvIGNvbnRyb2wgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19QUkVfRUNIT19DT05UUk9MX0gKLSNkZWZpbmUgX19QUkVfRUNIT19DT05UUk9MX0gKLQotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0KLXZvaWQgSW5pdFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRubTEsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bVBiLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZFF1aWV0KTsKLQotCi12b2lkIFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRObTEsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWRjdFNjYWxlbm0xKTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25maWd1cmF0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uZmlndXJhdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk4MWZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25maWd1cmF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlwc3lfY29uZmlndXJhdGlvbi5oCi0KLQlDb250ZW50OglQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9QU1lfQ09ORklHVVJBVElPTl9ICi0jZGVmaW5lIF9QU1lfQ09ORklHVVJBVElPTl9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmcy5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInRucy5oIgotCi10eXBlZGVmIHN0cnVjdHsKLQotICBXb3JkMTYgc2ZiQ250OwotICBXb3JkMTYgc2ZiQWN0aXZlOyAgIC8qIG51bWJlciBvZiBzZiBiYW5kcyBjb250YWluaW5nIGVuZXJneSBhZnRlciBsb3dwYXNzICovCi0gIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0OwotCi0gIFdvcmQzMiBzZmJUaHJlc2hvbGRRdWlldFtNQVhfU0ZCX0xPTkddOwotCi0gIFdvcmQxNiBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7ICAgLyogcHJlZWNobyBjb250cm9sICovCi0gIFdvcmQxNiBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7Ci0KLSAgV29yZDE2IGxvd3Bhc3NMaW5lOwotICBXb3JkMTYgc2FtcFJhdGVJZHg7Ci0gIFdvcmQzMiBjbGlwRW5lcmd5OyAgICAgICAgICAgICAgICAgLyogZm9yIGxldmVsIGRlcGVuZGVuZCB0bW4gKi8KLQotICBXb3JkMTYgcmF0aW87Ci0gIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yW01BWF9TRkJfTE9OR107Ci0gIFdvcmQxNiBzZmJNYXNrSGlnaEZhY3RvcltNQVhfU0ZCX0xPTkddOwotCi0gIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yU3ByRW5bTUFYX1NGQl9MT05HXTsKLSAgV29yZDE2IHNmYk1hc2tIaWdoRmFjdG9yU3ByRW5bTUFYX1NGQl9MT05HXTsKLQotCi0gIFdvcmQxNiBzZmJNaW5TbnJbTUFYX1NGQl9MT05HXTsgICAgICAgLyogbWluaW11bSBzbnIgKGZvcm1lcmx5IGtub3duIGFzIGJtYXgpICovCi0KLSAgVE5TX0NPTkZJRyB0bnNDb25mOwotCi19UFNZX0NPTkZJR1VSQVRJT05fTE9ORzsgLypXb3JkMTYgc2l6ZTogOCArIDUyICsgMTAyICsgNTEgKyA1MSArIDUxICsgNTEgKyA0NyA9IDUxNSAqLwotCi0KLXR5cGVkZWYgc3RydWN0ewotCi0gIFdvcmQxNiBzZmJDbnQ7Ci0gIFdvcmQxNiBzZmJBY3RpdmU7ICAgLyogbnVtYmVyIG9mIHNmIGJhbmRzIGNvbnRhaW5pbmcgZW5lcmd5IGFmdGVyIGxvd3Bhc3MgKi8KLSAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQ7Ci0KLSAgV29yZDMyIHNmYlRocmVzaG9sZFF1aWV0W01BWF9TRkJfU0hPUlRdOwotCi0gIFdvcmQxNiBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7ICAgLyogcHJlZWNobyBjb250cm9sICovCi0gIFdvcmQxNiBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7Ci0KLSAgV29yZDE2IGxvd3Bhc3NMaW5lOwotICBXb3JkMTYgc2FtcFJhdGVJZHg7Ci0gIFdvcmQzMiBjbGlwRW5lcmd5OyAgICAgICAgICAgICAgICAgLyogZm9yIGxldmVsIGRlcGVuZGVuZCB0bW4gKi8KLQotICBXb3JkMTYgcmF0aW87Ci0gIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yW01BWF9TRkJfU0hPUlRdOwotICBXb3JkMTYgc2ZiTWFza0hpZ2hGYWN0b3JbTUFYX1NGQl9TSE9SVF07Ci0KLSAgV29yZDE2IHNmYk1hc2tMb3dGYWN0b3JTcHJFbltNQVhfU0ZCX1NIT1JUXTsKLSAgV29yZDE2IHNmYk1hc2tIaWdoRmFjdG9yU3ByRW5bTUFYX1NGQl9TSE9SVF07Ci0KLQotICBXb3JkMTYgc2ZiTWluU25yW01BWF9TRkJfU0hPUlRdOyAgICAgICAvKiBtaW5pbXVtIHNuciAoZm9ybWVybHkga25vd24gYXMgYm1heCkgKi8KLQotICBUTlNfQ09ORklHIHRuc0NvbmY7Ci0KLX1QU1lfQ09ORklHVVJBVElPTl9TSE9SVDsgLypXb3JkMTYgc2l6ZTogOCArIDE2ICsgMTYgKyAxNiArIDE2ICsgMTYgKyAxNiArIDE2ICsgNDcgPSAxNjcgKi8KLQotCi0vKiBSZXR1cm5zIHRoZSBzYW1wbGUgcmF0ZSBpbmRleCAqLwotV29yZDMyIEdldFNSSW5kZXgoV29yZDMyIHNhbXBsZVJhdGUpOwotCi0KLVdvcmQxNiBJbml0UHN5Q29uZmlndXJhdGlvbkxvbmcoV29yZDMyIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpwc3lDb25mKTsKLQotV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcHN5Q29uZik7Ci0KLSNlbmRpZiAvKiBfUFNZX0NPTkZJR1VSQVRJT05fSCAqLwotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbnN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5ZjhjMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcHN5X2NvbnN0LmgKLQotCUNvbnRlbnQ6CUdsb2JhbCBwc3ljaG9hY291c3RpYyBjb25zdGFudHMgc3RydWN0dXJlcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9QU1lDT05TVF9ICi0jZGVmaW5lIF9QU1lDT05TVF9ICi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2RlZmluZSBUUlVFICAxCi0jZGVmaW5lIEZBTFNFIDAKLQotI2RlZmluZSBGUkFNRV9MRU5fTE9ORyAgICBBQUNFTkNfQkxPQ0tTSVpFCi0jZGVmaW5lIFRSQU5TX0ZBQyAgICAgICAgIDgKLSNkZWZpbmUgRlJBTUVfTEVOX1NIT1JUICAgKEZSQU1FX0xFTl9MT05HL1RSQU5TX0ZBQykKLQotCi0KLS8qIEJsb2NrIHR5cGVzICovCi1lbnVtCi17Ci0gIExPTkdfV0lORE9XID0gMCwKLSAgU1RBUlRfV0lORE9XLAotICBTSE9SVF9XSU5ET1csCi0gIFNUT1BfV0lORE9XCi19OwotCi0vKiBXaW5kb3cgc2hhcGVzICovCi1lbnVtCi17Ci0gIFNJTkVfV0lORE9XID0gMCwKLSAgS0JEX1dJTkRPVyAgPSAxCi19OwotCi0vKgotICBNUyBzdHVmZgotKi8KLWVudW0KLXsKLSAgU0lfTVNfTUFTS19OT05FID0gMCwKLSAgU0lfTVNfTUFTS19TT01FID0gMSwKLSAgU0lfTVNfTUFTS19BTEwgID0gMgotfTsKLQotI2RlZmluZSBNQVhfTk9fT0ZfR1JPVVBTIDQKLSNkZWZpbmUgTUFYX1NGQl9TSE9SVCAgIDE1ICAvKiAxNSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSAxNiBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgTUFYX1NGQl9MT05HICAgIDUxICAvKiA1MSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSA2NCBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgTUFYX1NGQiAgICAgICAgIChNQVhfU0ZCX1NIT1JUID4gTUFYX1NGQl9MT05HID8gTUFYX1NGQl9TSE9SVCA6IE1BWF9TRkJfTE9ORykgICAvKiA9IE1BWF9TRkJfTE9ORyAqLwotI2RlZmluZSBNQVhfR1JPVVBFRF9TRkIgKE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTk9fT0ZfR1JPVVBTKk1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpCi0KLSNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX09GRlNFVAkJICAgKDEqMTAyNCszKjEyOCs2NCsxMjgpCi0jZGVmaW5lIEJMT0NLX1NXSVRDSElOR19EQVRBX1NJWkUgICAgICAgICAgRlJBTUVfTEVOX0xPTkcKLQotI2RlZmluZSBUUkFOU0ZPUk1fT0ZGU0VUX0xPTkcgICAgMAotI2RlZmluZSBUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JUICAgNDQ4Ci0KLSNkZWZpbmUgTE9HX05PUk1fUENNICAgICAgICAgICgtMTUpCi0KLSNkZWZpbmUgTlVNX1NBTVBMRV9SQVRFUwkxMgotCi0jZW5kaWYgLyogX1BTWUNPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE2YTg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXBzeV9kYXRhLmgKLQotCUNvbnRlbnQ6CVBzeWNob2Fjb3VzdGljIGRhdGEgYW5kIHN0cnVjdHVyZXMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfUFNZX0RBVEFfSAotI2RlZmluZSBfUFNZX0RBVEFfSAotCi0jaW5jbHVkZSAiYmxvY2tfc3dpdGNoLmgiCi0jaW5jbHVkZSAidG5zLmgiCi0KLS8qCi0gIHRoZSBzdHJ1Y3RzIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyB1bmlvbnMKLSovCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgc2ZiTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMzIgc2ZiU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKLX1TRkJfVEhSRVNIT0xEOyAvKiBXb3JkMTYgc2l6ZTogMjYwICovCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgc2ZiTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMzIgc2ZiU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKLX1TRkJfRU5FUkdZOyAvKiBXb3JkMTYgc2l6ZTogMjYwICovCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgc2ZiTG9uZzsKLSAgV29yZDMyIHNmYlNob3J0W1RSQU5TX0ZBQ107Ci19U0ZCX0VORVJHWV9TVU07IC8qIFdvcmQxNiBzaXplOiAxOCAqLwotCi0KLXR5cGVkZWYgc3RydWN0ewotICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbDsgICAgICAgICAgLyogYmxvY2sgc3dpdGNoaW5nICovCi0gIFdvcmQxNiAgICAgICAgICAgICAgICAgICAgKm1kY3REZWxheUJ1ZmZlcjsgICAgICAgICAgICAgICAvKiBtZGN0IGRlbGF5IGJ1ZmZlciBbQkxPQ0tfU1dJVENISU5HX09GRlNFVF0qLwotICBXb3JkMzIgICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZG5tMVtNQVhfU0ZCXTsgICAgICAgLyogUHJlRWNob0NvbnRyb2wgKi8KLSAgV29yZDE2ICAgICAgICAgICAgICAgICAgICBtZGN0U2NhbGVubTE7ICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIG9mIGxhc3QgYmxvY2sncyBtZGN0IChQcmVFY2hvQ29udHJvbCkgKi8KLQotICBTRkJfVEhSRVNIT0xEICAgICAgICAgICAgIHNmYlRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYWRhcHQgICAgICAgICAgICovCi0gIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiRW5lcmd5OyAgICAgICAgICAgICAgICAgICAgICAvKiBzZmIgRW5lcmd5ICAgICAgKi8KLSAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJFbmVyZ3lNUzsKLSAgU0ZCX0VORVJHWV9TVU0gICAgICAgICAgICBzZmJFbmVyZ3lTdW07Ci0gIFNGQl9FTkVSR1lfU1VNICAgICAgICAgICAgc2ZiRW5lcmd5U3VtTVM7Ci0gIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiU3ByZWFkZWRFbmVyZ3k7Ci0KLSAgV29yZDMyICAgICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtOyAgICAgICAgICAgICAgICAgIC8qIG1kY3Qgc3BlY3RydW0gW0ZSQU1FX0xFTl9MT05HXSAqLwotICBXb3JkMTYgICAgICAgICAgICAgICAgICAgIG1kY3RTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgb2YgbWRjdCAgICovCi19UFNZX0RBVEE7IC8qIFdvcmQxNiBzaXplOiA0ICsgODcgKyAxMDIgKyAzNjAgKyAzNjAgKyAzNjAgKyAxOCArIDE4ICsgMzYwID0gMTY2OSAqLwotCi0jZW5kaWYgLyogX1BTWV9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NhYzYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXBzeV9tYWluLmgKLQotCUNvbnRlbnQ6CVBzeWNob2Fjb3VzdGljIG1ham9yIGZ1bmN0aW9uIGJsb2NrCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1BTWU1BSU5fSAotI2RlZmluZSBfUFNZTUFJTl9ICi0KLSNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLSNpbmNsdWRlICJtZW1hbGlnbi5oIgotCi0vKgotICBwc3kga2VybmVsCi0qLwotdHlwZWRlZiBzdHJ1Y3QgIHsKLSAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAgcHN5Q29uZkxvbmc7ICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogNTE1ICovCi0gIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUIHBzeUNvbmZTaG9ydDsgICAgICAgICAgLyogV29yZDE2IHNpemU6IDE2NyAqLwotICBQU1lfREFUQSAgICAgICAgICAgICAgICBwc3lEYXRhW01BWF9DSEFOTkVMU107IC8qIFdvcmQxNiBzaXplOiBNQVhfQ0hBTk5FTFMqMTY2OSovCi0gIFROU19EQVRBICAgICAgICAgICAgICAgIHRuc0RhdGFbTUFYX0NIQU5ORUxTXTsgLyogV29yZDE2IHNpemU6IE1BWF9DSEFOTkVMUyoyMzUgKi8KLSAgV29yZDMyKiAgICAgICAgICAgICAgICAgcFNjcmF0Y2hUbnM7Ci0gIFdvcmQxNgkJCQkgIHNhbXBsZVJhdGVJZHg7Ci19UFNZX0tFUk5FTDsgLyogV29yZDE2IHNpemU6IDI1ODcgLyA0NDkxICovCi0KLQotV29yZDE2IFBzeU5ldyggUFNZX0tFUk5FTCAgKmhQc3ksIFdvcmQzMiBuQ2hhbiwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotV29yZDE2IFBzeURlbGV0ZSggUFNZX0tFUk5FTCAgKmhQc3ksIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKLQotV29yZDE2IFBzeU91dE5ldyggUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotV29yZDE2IFBzeU91dERlbGV0ZSggUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotCi1Xb3JkMTYgcHN5TWFpbkluaXQoIFBTWV9LRVJORUwgKmhQc3ksCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG5zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJhbmR3aWR0aCk7Ci0KLQotV29yZDE2IHBzeU1haW4oV29yZDE2ICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgICAvKiE8IHRvdGFsIG51bWJlciBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAgICAgICplbGVtSW5mbywKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgICAgICAqdGltZVNpZ25hbCwgLyohPCBpbnRlcmxlYXZlZCB0aW1lIHNpZ25hbCAqLwotICAgICAgICAgICAgICAgUFNZX0RBVEEgICAgICAgICAgICAgICAgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIFROU19EQVRBICAgICAgICAgICAgICAgICB0bnNEYXRhW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HKiAgcHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCogcHN5Q29uZlNob3J0LAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICAgICAgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAgICAgICAgICAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2hUbnMsCi0JCQkgICBXb3JkMzIJCQkJCXNhbXBsZVJhdGUpOwotCi0jZW5kaWYgLyogX1BTWU1BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk5MjJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXFjX2RhdGEuaAotCi0JQ29udGVudDoJUXVhbnRpemluZyAmIGNvZGluZyBzdHJ1Y3R1cmVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1FDX0RBVEFfSAotI2RlZmluZSBfUUNfREFUQV9ICi0KLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJkeW5fYml0cy5oIgotI2luY2x1ZGUgImFkal90aHJfZGF0YS5oIgotCi0KLSNkZWZpbmUgTUFYX01PREVTIDEwCi0KLXR5cGVkZWYgZW51bSB7Ci0gIE1PREVfSU5WQUxJRCA9IDAsCi0gIE1PREVfMSwgICAgICAgIC8qIG1vbm8gICAgICAqLwotICBNT0RFXzFfMSwgICAgICAvKiBkdWFsIG1vbm8gKi8KLSAgTU9ERV8yICAgICAgICAgLyogc3RlcmVvICAgICovCi19IEVOQ09ERVJfTU9ERTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgSURfU0NFPTAsICAgICAvKiBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50ICAgKi8KLSAgSURfQ1BFPTEsICAgICAvKiBDaGFubmVsIFBhaXIgRWxlbWVudCAgICAgKi8KLSAgSURfQ0NFPTIsICAgICAvKiBDb3VwbGluZyBDaGFubmVsIEVsZW1lbnQgKi8KLSAgSURfTEZFPTMsICAgICAvKiBMRkUgQ2hhbm5lbCBFbGVtZW50ICAgICAgKi8KLSAgSURfRFNFPTQsICAgICAvKiBjdXJyZW50IG9uZSBEU0UgZWxlbWVudCBmb3IgYW5jaWxsYXJ5IGlzIHN1cHBvcnRlZCAqLwotICBJRF9QQ0U9NSwKLSAgSURfRklMPTYsCi0gIElEX0VORD03Ci19RUxFTUVOVF9UWVBFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEVMRU1FTlRfVFlQRSBlbFR5cGU7Ci0gIFdvcmQxNiBpbnN0YW5jZVRhZzsKLSAgV29yZDE2IG5DaGFubmVsc0luRWw7Ci0gIFdvcmQxNiBDaGFubmVsSW5kZXhbTUFYX0NIQU5ORUxTXTsKLX0gRUxFTUVOVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFdvcmQzMiBwYWRkaW5nUmVzdDsKLX0gUEFERElORzsKLQotCi0vKiBRdWFudGl6aW5nICYgY29kaW5nIHN0YWdlICovCi0KLXN0cnVjdCBRQ19JTklUewotICBFTEVNRU5UX0lORk8gKmVsSW5mbzsKLSAgV29yZDE2IG1heEJpdHM7ICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIHJlc2Vydm9pciAgKi8KLSAgV29yZDE2IGF2ZXJhZ2VCaXRzOyAvKiBhdmVyYWdlIG51bWJlciBvZiBiaXRzIHdlIHNob3VsZCB1c2UgKi8KLSAgV29yZDE2IGJpdFJlczsKLSAgV29yZDE2IG1lYW5QZTsKLSAgV29yZDMyIGNoQml0cmF0ZTsKLSAgV29yZDE2IG1heEJpdEZhYzsKLSAgV29yZDMyIGJpdHJhdGU7Ci0KLSAgUEFERElORyBwYWRkaW5nOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgV29yZDE2ICAgICAgICAgICpxdWFudFNwZWM7ICAgICAgIC8qIFtGUkFNRV9MRU5fTE9OR107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVXb3JkMTYgICAgICAgICAqbWF4VmFsdWVJblNmYjsgICAvKiBbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBXb3JkMTYgICAgICAgICAgKnNjZjsgICAgICAgICAgICAgLyogW01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgV29yZDE2ICAgICAgICAgIGdsb2JhbEdhaW47Ci0gIFdvcmQxNiAgICAgICAgICBtZGN0U2NhbGU7Ci0gIFdvcmQxNiAgICAgICAgICBncm91cGluZ01hc2s7Ci0gIFNFQ1RJT05fREFUQSAgICBzZWN0aW9uRGF0YTsKLSAgV29yZDE2ICAgICAgICAgIHdpbmRvd1NoYXBlOwotfSBRQ19PVVRfQ0hBTk5FTDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgV29yZDE2CQkgIGFkdHNVc2VkOwotICBXb3JkMTYgICAgICAgICAgc3RhdGljQml0c1VzZWQ7IC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KLSAgV29yZDE2ICAgICAgICAgIGR5bkJpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCi0gIFdvcmQxNiAgICAgICAgICBwZTsKLSAgV29yZDE2ICAgICAgICAgIGFuY0JpdHNVc2VkOwotICBXb3JkMTYgICAgICAgICAgZmlsbEJpdHM7Ci19IFFDX09VVF9FTEVNRU5UOwotCi10eXBlZGVmIHN0cnVjdAotewotICBRQ19PVVRfQ0hBTk5FTCAgcWNDaGFubmVsW01BWF9DSEFOTkVMU107Ci0gIFFDX09VVF9FTEVNRU5UICBxY0VsZW1lbnQ7Ci0gIFdvcmQxNiAgICAgICAgICB0b3RTdGF0aWNCaXRzVXNlZDsgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLwotICBXb3JkMTYgICAgICAgICAgdG90RHluQml0c1VzZWQ7ICAgIC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KLSAgV29yZDE2ICAgICAgICAgIHRvdEFuY0JpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCi0gIFdvcmQxNiAgICAgICAgICB0b3RGaWxsQml0czsKLSAgV29yZDE2ICAgICAgICAgIGFsaWduQml0czsKLSAgV29yZDE2ICAgICAgICAgIGJpdFJlc1RvdDsKLSAgV29yZDE2ICAgICAgICAgIGF2ZXJhZ2VCaXRzVG90OwotfSBRQ19PVVQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgV29yZDMyIGNoQml0cmF0ZTsKLSAgV29yZDE2IGF2ZXJhZ2VCaXRzOyAgICAgICAgICAgICAgIC8qIGJydXR0byAtPiBsb29rIGFuY2lsbGFyeS5oICovCi0gIFdvcmQxNiBtYXhCaXRzOwotICBXb3JkMTYgYml0UmVzTGV2ZWw7Ci0gIFdvcmQxNiBtYXhCaXRSZXNCaXRzOwotICBXb3JkMTYgcmVsYXRpdmVCaXRzOyAgICAgICAgICAgIC8qIEJpdHMgcmVsYXRpdmUgdG8gdG90YWwgQml0cyBzY2FsZWQgZG93biBieSAyICovCi19IEVMRU1FTlRfQklUUzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogdGhpcyBpcyBiYXNpY2FsbHkgc3RydWN0IFFDX0lOSVQgKi8KLSAgV29yZDE2IGF2ZXJhZ2VCaXRzVG90OwotICBXb3JkMTYgbWF4Qml0c1RvdDsKLSAgV29yZDE2IGdsb2JTdGF0Qml0czsKLSAgV29yZDE2IG5DaGFubmVsczsKLSAgV29yZDE2IGJpdFJlc1RvdDsKLQotICBXb3JkMTYgbWF4Qml0RmFjOwotCi0gIFBBRERJTkcgICBwYWRkaW5nOwotCi0gIEVMRU1FTlRfQklUUyAgZWxlbWVudEJpdHM7Ci0gIEFESl9USFJfU1RBVEUgYWRqVGhyOwotCi0gIFdvcmQxNiBsb2dTZmJGb3JtRmFjdG9yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07Ci19IFFDX1NUQVRFOwotCi0jZW5kaWYgLyogX1FDX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgzOTczLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcWNfbWFpbi5oCi0KLQlDb250ZW50OglRdWFudGl6aW5nICYgY29kaW5nIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9RQ19NQUlOX0gKLSNkZWZpbmUgX1FDX01BSU5fSAotCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgIm1lbWFsaWduLmgiCi0KLS8qIFF1YW50aXppbmcgJiBjb2Rpbmcgc3RhZ2UgKi8KLQotV29yZDE2IFFDT3V0TmV3KFFDX09VVCAqaFFDLCBXb3JkMTYgbkNoYW5uZWxzLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7Ci0KLXZvaWQgUUNPdXREZWxldGUoUUNfT1VUICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKLQotV29yZDE2IFFDTmV3KFFDX1NUQVRFICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKLQotV29yZDE2IFFDSW5pdChRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCk7Ci0KLXZvaWQgUUNEZWxldGUoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotCi0KLVdvcmQxNiBRQ01haW4oUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsCi0gICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sIC8qIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSAqLwotICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgICAvKiBvdXQgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIHFjT3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywKLQkJCSAgV29yZDE2IGFuY2lsbGFyeURhdGFCeXRlcyk7ICAgICAvKiByZXR1cm5zIGVycm9yIGNvZGUgICAgICAgKi8KLQotdm9pZCB1cGRhdGVCaXRyZXMoUUNfU1RBVEUqIHFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgUUNfT1VUKiBxY091dCk7Ci0KLVdvcmQxNiBGaW5hbGl6ZUJpdENvbnN1bXB0aW9uKFFDX1NUQVRFICpoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0KTsKLQotV29yZDE2IEFkanVzdEJpdHJhdGUoUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUpOwotCi0jZW5kaWYgLyogX1FDX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3F1YW50aXplLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYWZlZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcXVhbnRpemUuaAotCi0JQ29udGVudDoJUXVhbnRpemF0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9RVUFOVElaRV9IXwotI2RlZmluZSBfUVVBTlRJWkVfSF8KLSNpbmNsdWRlICJ0eXBlZGVmcy5oIgotCi0vKiBxdWFudGl6aW5nICovCi0KLSNkZWZpbmUgTUFYX1FVQU5UIDgxOTEKLQotdm9pZCBRdWFudGl6ZVNwZWN0cnVtKFdvcmQxNiBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk9mZnNldCwgV29yZDMyICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGdsb2JhbEdhaW4sIFdvcmQxNiAqc2NhbGVmYWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcXVhbnRpemVkU3BlY3RydW0pOwotCi1Xb3JkMzIgY2FsY1NmYkRpc3QoY29uc3QgV29yZDMyICpzcGVjLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgV29yZDE2ICBnYWluKTsKLQotI2VuZGlmIC8qIF9RVUFOVElaRV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc2ZfZXN0aW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NmX2VzdGltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5N2ViYTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc2ZfZXN0aW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc2ZfZXN0aW0uaAotCi0JQ29udGVudDoJU2NhbGUgZmFjdG9yIGVzdGltYXRpb24gZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19TRl9FU1RJTV9IX18KLSNkZWZpbmUgX19TRl9FU1RJTV9IX18KLS8qCi0gICBTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgotICovCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotCi12b2lkCi1DYWxjRm9ybUZhY3RvcihXb3JkMTYgICAgICAgICAgbG9nU2ZiRm9ybUZhY3RvcltNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgIG5DaGFubmVscyk7Ci0KLXZvaWQKLUVzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgcWNPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJGb3JtRmFjdG9yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgbkNoYW5uZWxzKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3ByZWFkaW5nLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zcHJlYWRpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5NmZjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zcHJlYWRpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc3ByZWFkaW5nLmgKLQotCUNvbnRlbnQ6CVNwcmVhZGluZyBvZiBlbmVyZ3kgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1NQUkVBRElOR19ICi0jZGVmaW5lIF9TUFJFQURJTkdfSAotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0KLQotdm9pZCBTcHJlYWRpbmdNYXgoY29uc3QgV29yZDE2IHBiQ250LAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrSGlnaEZhY3RvciwKLSAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqcGJTcHJlYWRlZEVuZXJneSk7Ci0KLSNlbmRpZiAvKiAjaWZuZGVmIF9TUFJFQURJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3RhdF9iaXRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zdGF0X2JpdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkZGMxZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zdGF0X2JpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc3RhdF9iaXRzLmgKLQotCUNvbnRlbnQ6CVN0YXRpYyBiaXQgY291bnRlciBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1NUQVRfQklUU19ICi0jZGVmaW5lIF9fU1RBVF9CSVRTX0gKLQotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotCi1Xb3JkMTYgY291bnRTdGF0aWNCaXRkZW1hbmQoUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywKLQkJCQkJCQlXb3JkMTYgYWR0c1VzZWQpOwotCi0jZW5kaWYgLyogX19TVEFUX0JJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjZmFlZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRucy5oCi0KLQlDb250ZW50OglUTlMgc3RydWN0dXJlcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9UTlNfSAotI2RlZmluZSBfVE5TX0gKLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLQotCi0KLSNkZWZpbmUgVE5TX01BWF9PUkRFUiAxMgotI2RlZmluZSBUTlNfTUFYX09SREVSX1NIT1JUIDUKLQotI2RlZmluZSBGSUxURVJfRElSRUNUSU9OICAgIDAKLQotdHlwZWRlZiBzdHJ1Y3R7IC8qc3R1ZmYgdGhhdCBpcyB0YWJ1bGF0ZWQgZGVwZW5kZW50IG9uIGJpdHJhdGUgZXRjLiAqLwotICBXb3JkMTYgICAgIHRocmVzaE9uOyAgICAgICAgICAgICAgICAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMICogMTAwKi8KLSAgV29yZDMyICAgICBscGNTdGFydEZyZXE7ICAgICAgICAgICAgLyogbG93ZXN0IGZyZXEgZm9yIGxwYyBUQUJVTCovCi0gIFdvcmQzMiAgICAgbHBjU3RvcEZyZXE7ICAgICAgICAgICAgIC8qIFRBQlVMICovCi0gIFdvcmQzMiAgICAgdG5zVGltZVJlc29sdXRpb247Ci19VE5TX0NPTkZJR19UQUJVTEFURUQ7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgeyAgIC8qYXNzaWduZWQgYXQgSW5pdFRpbWUqLwotICBXb3JkMTYgdG5zQWN0aXZlOwotICBXb3JkMTYgdG5zTWF4U2ZiOwotCi0gIFdvcmQxNiBtYXhPcmRlcjsgICAgICAgICAgICAgICAgLyogbWF4LiBvcmRlciBvZiB0bnMgZmlsdGVyICovCi0gIFdvcmQxNiB0bnNTdGFydEZyZXE7ICAgICAgICAgICAgLyogbG93ZXN0IGZyZXEuIGZvciB0bnMgZmlsdGVyaW5nICovCi0gIFdvcmQxNiBjb2VmUmVzOwotCi0gIFROU19DT05GSUdfVEFCVUxBVEVEIGNvbmZUYWI7Ci0KLSAgV29yZDMyIGFjZldpbmRvd1tUTlNfTUFYX09SREVSKzFdOwotCi0gIFdvcmQxNiB0bnNTdGFydEJhbmQ7Ci0gIFdvcmQxNiB0bnNTdGFydExpbmU7Ci0KLSAgV29yZDE2IHRuc1N0b3BCYW5kOwotICBXb3JkMTYgdG5zU3RvcExpbmU7Ci0KLSAgV29yZDE2IGxwY1N0YXJ0QmFuZDsKLSAgV29yZDE2IGxwY1N0YXJ0TGluZTsKLQotICBXb3JkMTYgbHBjU3RvcEJhbmQ7Ci0gIFdvcmQxNiBscGNTdG9wTGluZTsKLQotICBXb3JkMTYgdG5zUmF0aW9QYXRjaExvd2VzdENiOwotICBXb3JkMTYgdG5zTW9kaWZ5QmVnaW5DYjsKLQotICBXb3JkMTYgdGhyZXNob2xkOyAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMICogMTAwICovCi0KLX1UTlNfQ09ORklHOwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgV29yZDE2IHRuc0FjdGl2ZTsKLSAgV29yZDMyIHBhcmNvcltUTlNfTUFYX09SREVSXTsKLSAgV29yZDE2IHByZWRpY3Rpb25HYWluOwotfSBUTlNfU1VCQkxPQ0tfSU5GTzsgLyogV29yZDE2IHNpemU6IDI2ICovCi0KLXR5cGVkZWYgc3RydWN0ewotICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm9bVFJBTlNfRkFDXTsKLX0gVE5TX0RBVEFfU0hPUlQ7Ci0KLXR5cGVkZWYgc3RydWN0ewotICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm87Ci19IFROU19EQVRBX0xPTkc7Ci0KLXR5cGVkZWYgc3RydWN0ewotICBUTlNfREFUQV9MT05HIHRuc0xvbmc7Ci0gIFROU19EQVRBX1NIT1JUIHRuc1Nob3J0OwotfVROU19EQVRBX1JBVzsKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQxNiBudW1PZlN1YmJsb2NrczsKLSAgVE5TX0RBVEFfUkFXIGRhdGFSYXc7Ci19VE5TX0RBVEE7IC8qIFdvcmQxNiBzaXplOiAxICsgOCoyNiArIDI2ID0gMjM1ICovCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMTYgdG5zQWN0aXZlW1RSQU5TX0ZBQ107Ci0gIFdvcmQxNiBjb2VmUmVzW1RSQU5TX0ZBQ107Ci0gIFdvcmQxNiBsZW5ndGhbVFJBTlNfRkFDXTsKLSAgV29yZDE2IG9yZGVyW1RSQU5TX0ZBQ107Ci0gIFdvcmQxNiBjb2VmW1RSQU5TX0ZBQypUTlNfTUFYX09SREVSX1NIT1JUXTsKLX1UTlNfSU5GTzsgLyogV29yZDE2IHNpemU6IDcyICovCi0KLSNlbmRpZiAvKiBfVE5TX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19mdW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfZnVuYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmRmMjRkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19mdW5jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRuc19mdW5jLmgKLQotCUNvbnRlbnQ6CVROUyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAgIFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKLSAqLwotI2lmbmRlZiBfVE5TX0ZVTkNfSAotI2RlZmluZSBfVE5TX0ZVTkNfSAotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgotCi1Xb3JkMTYgSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nKFdvcmQzMiBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0bnNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBzeUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSk7Ci0KLVdvcmQxNiBJbml0VG5zQ29uZmlndXJhdGlvblNob3J0KFdvcmQzMiBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0bnNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcHN5Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSk7Ci0KLVdvcmQzMiBUbnNEZXRlY3QoVE5TX0RBVEEqIHRuc0RhdGEsCi0gICAgICAgICAgICAgICAgIFROU19DT05GSUcgdEMsCi0gICAgICAgICAgICAgICAgIFdvcmQzMiogcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBzZmJPZmZzZXRbXSwKLSAgICAgICAgICAgICAgICAgV29yZDMyKiBzcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICBXb3JkMzIgKiBzZmJFbmVyZ3kpOwotCi12b2lkIFRuc1N5bmMoVE5TX0RBVEEgKnRuc0RhdGFEZXN0LAotICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhU3JjLAotICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgdEMsCi0gICAgICAgICAgICAgY29uc3QgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUpOwotCi1Xb3JkMTYgVG5zRW5jb2RlKFROU19JTkZPKiB0bnNJbmZvLAotICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IG51bU9mU2ZiLAotICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLAotICAgICAgICAgICAgICAgICBXb3JkMTYgbG93UGFzc0xpbmUsCi0gICAgICAgICAgICAgICAgIFdvcmQzMiogc3BlY3RydW0sCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBzdWJCbG9ja051bWJlciwKLSAgICAgICAgICAgICAgICAgV29yZDE2IGJsb2NrVHlwZSk7Ci0KLXZvaWQgQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcyhXb3JkMTYgc3RhcnRDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc3RvcENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19TVUJCTE9DS19JTkZPIHN1YkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICp0aHJlc2hvbGRzKTsKLQotCi0jZW5kaWYgLyogX1ROU19GVU5DX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19wYXJhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTMzYzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRuc19wYXJhbS5oCi0KLQlDb250ZW50OglUTlMgcGFyYW1ldGVycwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICAgVE5TIHBhcmFtZXRlcnMKLSAqLwotI2lmbmRlZiBfVE5TX1BBUkFNX0gKLSNkZWZpbmUgX1ROU19QQVJBTV9ICi0KLSNpbmNsdWRlICJ0bnMuaCIKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQzMiBzYW1wbGluZ1JhdGU7Ci0gIFdvcmQxNiBtYXhCYW5kTG9uZzsKLSAgV29yZDE2IG1heEJhbmRTaG9ydDsKLX1UTlNfTUFYX1RBQl9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgV29yZDMyIGJpdFJhdGVGcm9tOwotICAgIFdvcmQzMiBiaXRSYXRlVG87Ci0gICAgY29uc3QgVE5TX0NPTkZJR19UQUJVTEFURUQgKnBhcmFtTW9ub19Mb25nOyAgLyogY29udGFpbnMgVE5TIHBhcmFtZXRlcnMgKi8KLSAgICBjb25zdCBUTlNfQ09ORklHX1RBQlVMQVRFRCAqcGFyYW1Nb25vX1Nob3J0OwotICAgIGNvbnN0IFROU19DT05GSUdfVEFCVUxBVEVEICpwYXJhbVN0ZXJlb19Mb25nOwotICAgIGNvbnN0IFROU19DT05GSUdfVEFCVUxBVEVEICpwYXJhbVN0ZXJlb19TaG9ydDsKLX1UTlNfSU5GT19UQUI7Ci0KLQotdm9pZCBHZXRUbnNQYXJhbShUTlNfQ09ORklHX1RBQlVMQVRFRCAqdG5zQ29uZmlnVGFiLAotICAgICAgICAgICAgICAgICBXb3JkMzIgYml0UmF0ZSwgV29yZDE2IGNoYW5uZWxzLCBXb3JkMTYgYmxvY2tUeXBlKTsKLQotdm9pZCBHZXRUbnNNYXhCYW5kcyhXb3JkMzIgc2FtcGxpbmdSYXRlLCBXb3JkMTYgYmxvY2tUeXBlLCBXb3JkMTYqIHRuc01heFNmYik7Ci0KLSNlbmRpZiAvKiBfVE5TX1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3RyYW5zZm9ybS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdHJhbnNmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMWNlZjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdHJhbnNmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRyYW5zZm9ybS5oCi0KLQlDb250ZW50OglNRENUIFRyYW5zZm9ybSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiAgX19UUkFOU0ZPUk1fSF9fCi0jZGVmaW5lIF9fVFJBTlNGT1JNX0hfXwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi12b2lkIFRyYW5zZm9ybV9SZWFsKFdvcmQxNiAqbWRjdERlbGF5QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCwgICAgIC8qISBjaGFubmVsIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnJlYWxPdXQsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93U2VxdWVuY2UKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNfcm9tLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNfcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOGYzYTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjX3JvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM2MyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWFhY19yb20uYwotCi0JQ29udGVudDoJY29uc3RhbnQgdGFibGVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJhYWNfcm9tLmgiCi0KLSNpZiBkZWZpbmVkIChBUk1WNUUpICYmICFkZWZpbmVkIChBUk1WN05lb24pCi0KLS8qCi0gKiAgUTMwIGZvciAxMjggYW5kIDEwMjQKLSAqCi0gKiBmb3IgKGkgPSAwOyBpIDwgbnVtLzQ7IGkrKykgewotICogICBhbmdsZSA9IChpICsgMC4xMjUpICogTV9QSSAvIG51bTsKLSAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwotICoKLSAqICAgYW5nbGUgPSAobnVtLzIgLSAxIC0gaSArIDAuMTI1KSAqIE1fUEkgLyBudW07Ci0gKiAgIHggPSBjb3MoYW5nbGUpICogKDEgPDwgMzApOwotICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDMwKTsKLSAqIH0KLSAqLwotY29uc3QgaW50IGNvc3NpbnRhYlsxMjggKyAxMDI0XSA9IHsKLQkvKiAxMjggKi8KLQkweDNmZmZlYzQzLCAweDAwMzI0M2YxLCAweDAxNWZkNGQyLCAweDNmZmMzOGQxLCAweDNmZjljMTNhLCAweDAxYzQ1NGY1LCAweDAyZjFiNzU1LCAweDNmZWVhNzc2LAotCTB4M2ZlOWI4YTksIDB4MDM1NjIwMzgsIDB4MDQ4MzI1OWQsIDB4M2ZkNzNhNGEsIDB4M2ZjZmQ1MGIsIDB4MDRlNzY3YzUsIDB4MDYxM2UxYzUsIDB4M2ZiNWY0ZWEsCi0JMHgzZmFjMWE1YiwgMHgwNjc3ZWRiYiwgMHgwN2EzYWRmZiwgMHgzZjhhZGM3NywgMHgzZjdlOGUxZSwgMHgwODA3NzQ1NywgMHgwOTMyNGNhNywgMHgzZjU1Zjc5NiwKLQkweDNmNDczNzU5LCAweDA5OTViZGZkLCAweDBhYmY4MDQzLCAweDNmMTc0ZTcwLCAweDNmMDYxZTk1LCAweDBiMjI4ZDQyLCAweDBjNGIwYjk0LCAweDNlY2VlYWFkLAotCTB4M2ViYjRkZGIsIDB4MGNhZGE0ZjUsIDB4MGRkNGIxOWEsIDB4M2U3Y2Q3NzgsIDB4M2U2NmQwYjQsIDB4MGUzNmM4MmEsIDB4MGY1YzM1YTMsIDB4M2UyMTIxNzksCi0JMHgzZTA4YjQyYSwgMHgwZmJkYmE0MCwgMHgxMGUxNWI0ZSwgMHgzZGJiZDZkNCwgMHgzZGExMDZiZCwgMHgxMTQyM2VmMCwgMHgxMjYzZTY5OSwgMHgzZDRkMDcyOCwKLQkweDNkMmZkODZjLCAweDEyYzQxYTRmLCAweDEzZTM5YmU5LCAweDNjZDRjMzhiLCAweDNjYjUzYWFhLCAweDE0NDMxMGRkLCAweDE1NjA0MDEzLCAweDNjNTMxZTg4LAotCTB4M2MzMTQwNjAsIDB4MTViZWU3OGMsIDB4MTZkOTk4NjQsIDB4M2JjODJjMWYsIDB4M2JhM2ZkZTcsIDB4MTczNzYzYzksIDB4MTg0ZjZhYWIsIDB4M2IzNDAxYmIsCi0JMHgzYjBkODkwOSwgMHgxOGFjNGI4NywgMHgxOWMxN2Q0NCwgMHgzYTk2YjYzNiwgMHgzYTZkZjhmOCwgMHgxYTFkNjU0NCwgMHgxYjJmOTcxZSwgMHgzOWYwNjFkMiwKLQkweDM5YzU2NjRmLCAweDFiOGE3ODE1LCAweDFjOTk3ZmM0LCAweDM5NDExZTMzLCAweDM5MTNlYjBlLCAweDFjZjM0YmFmLCAweDFkZmVmZjY3LCAweDM4ODkwNjYzLAotCTB4Mzg1OWEyOTIsIDB4MWU1N2E4NmQsIDB4MWY1ZmRlZTYsIDB4MzdjODM2YzIsIDB4Mzc5NmE5OTYsIDB4MWZiNzU3NWMsIDB4MjBiYmU3ZDgsIDB4MzZmZWNkMGUsCi0JMHgzNmNiMWUyYSwgMHgyMTEyMjI0MCwgMHgyMjEyZTQ5MiwgMHgzNjJjZTg1NSwgMHgzNWY3MWZiMSwgMHgyMjY3ZDNhMCwgMHgyMzY0YTAyZSwgMHgzNTUyYThmNCwKLQkweDM1MWFjZWRkLCAweDIzYjgzNmNhLCAweDI0YjBlNjk5LCAweDM0NzAzMDk1LCAweDM0MzY0ZGE2LCAweDI1MDMxN2RmLCAweDI1Zjc4NDk3LCAweDMzODVhMjIyLAotCTB4MzM0OWJmNDgsIDB4MjY0ODQzZDksIDB4MjczODQ3YzgsIDB4MzI5MzIxYzcsIDB4MzI1NTQ4NDAsIDB4Mjc4Nzg4OTMsIDB4Mjg3MmZlYjYsIDB4MzE5OGQ0ZWEsCi0JMHgzMTU5MGUzZSwgMHgyOGMwYjRkMiwgMHgyOWE3NzhkYiwgMHgzMDk2ZTIyMywgMHgzMDU1MzgyOCwgMHgyOWYzOTg0YywgMHgyYWQ1ODZhMywgMHgyZjhkNzEzYSwKLQkweDJmNDllZTBmLCAweDJiMjAwM2FjLCAweDJiZmNmOTdjLCAweDJlN2NhYjFjLCAweDJlMzc1OTJjLCAweDJjNDVjOGEwLCAweDJkMWRhM2Q1LCAweDJkNjRiOWRhLAotCS8qIDEwMjQgKi8KLQkweDNmZmZmZmIxLCAweDAwMDY0ODdmLCAweDAwMmJmYjc0LCAweDNmZmZmMGUzLCAweDNmZmZlNzA1LCAweDAwMzg4YzZlLCAweDAwNWUzZjRjLCAweDNmZmZiYTliLAotCTB4M2ZmZmE2ZGUsIDB4MDA2YWQwM2IsIDB4MDA5MDgyZWEsIDB4M2ZmZjVjZDgsIDB4M2ZmZjNmM2MsIDB4MDA5ZDEzYzUsIDB4MDBjMmM2MmYsIDB4M2ZmZWQ3OWIsCi0JMHgzZmZlYjAyMSwgMHgwMGNmNTZlZiwgMHgwMGY1MDhmYywgMHgzZmZlMmFlNSwgMHgzZmZkZjk4YywgMHgwMTAxOTk5OCwgMHgwMTI3NGIzMSwgMHgzZmZkNTZiNSwKLQkweDNmZmQxYjdlLCAweDAxMzNkYmEzLCAweDAxNTk4Y2IxLCAweDNmZmM1YjBjLCAweDNmZmMxNWY3LCAweDAxNjYxY2YwLCAweDAxOGJjZDViLCAweDNmZmIzN2VjLAotCTB4M2ZmYWU4ZjksIDB4MDE5ODVkNjAsIDB4MDFiZTBkMTEsIDB4M2ZmOWVkNTMsIDB4M2ZmOTk0ODMsIDB4MDFjYTljZDQsIDB4MDFmMDRiYjQsIDB4M2ZmODdiNDQsCi0JMHgzZmY4MTg5NiwgMHgwMWZjZGIyZSwgMHgwMjIyODkyNCwgMHgzZmY2ZTFiZiwgMHgzZmY2NzUzNCwgMHgwMjJmMTg0ZCwgMHgwMjU0YzU0NCwgMHgzZmY1MjBjNSwKLQkweDNmZjRhYTVkLCAweDAyNjE1NDE0LCAweDAyODZmZmYzLCAweDNmZjMzODU4LCAweDNmZjJiODEzLCAweDAyOTM4ZTYyLCAweDAyYjkzOTE0LCAweDNmZjEyODc4LAotCTB4M2ZmMDllNTYsIDB4MDJjNWM3MWEsIDB4MDJlYjcwODYsIDB4M2ZlZWYxMjYsIDB4M2ZlZTVkMjgsIDB4MDJmN2ZlMWMsIDB4MDMxZGE2MmIsIDB4M2ZlYzkyNjUsCi0JMHgzZmViZjQ4YiwgMHgwMzJhMzM0OSwgMHgwMzRmZDllNSwgMHgzZmVhMGMzNSwgMHgzZmU5NjQ4MCwgMHgwMzVjNjY4MiwgMHgwMzgyMGI5MywgMHgzZmU3NWU5OCwKLQkweDNmZTZhZDA4LCAweDAzOGU5N2E5LCAweDAzYjQzYjE3LCAweDNmZTQ4OTkwLCAweDNmZTNjZTI2LCAweDAzYzBjNjllLCAweDAzZTY2ODUyLCAweDNmZTE4ZDFmLAotCTB4M2ZlMGM3ZGEsIDB4MDNmMmYzNDIsIDB4MDQxODkzMjYsIDB4M2ZkZTY5NDUsIDB4M2ZkZDlhMjcsIDB4MDQyNTFkNzcsIDB4MDQ0YWJiNzMsIDB4M2ZkYjFlMDYsCi0JMHgzZmRhNDUwZiwgMHgwNDU3NDUxZCwgMHgwNDdjZTExYSwgMHgzZmQ3YWI2NCwgMHgzZmQ2Yzg5NCwgMHgwNDg5NmExNiwgMHgwNGFmMDNmYywgMHgzZmQ0MTE1ZiwKLQkweDNmZDMyNGI3LCAweDA0YmI4YzQyLCAweDA0ZTEyM2ZhLCAweDNmZDA0ZmZjLCAweDNmY2Y1OTdjLCAweDA0ZWRhYjgzLCAweDA1MTM0MGY2LCAweDNmY2M2NzNiLAotCTB4M2ZjYjY2ZTQsIDB4MDUxZmM3YjksIDB4MDU0NTVhZDEsIDB4M2ZjODU3MWYsIDB4M2ZjNzRjZjMsIDB4MDU1MWUwYzcsIDB4MDU3NzcxNmIsIDB4M2ZjNDFmYWMsCi0JMHgzZmMzMGJhYSwgMHgwNTgzZjY4YywgMHgwNWE5ODRhNiwgMHgzZmJmYzBlMywgMHgzZmJlYTMwYywgMHgwNWI2MDhlYiwgMHgwNWRiOTQ2MywgMHgzZmJiM2FjNywKLQkweDNmYmExMzFiLCAweDA1ZTgxN2MzLCAweDA2MGRhMDgzLCAweDNmYjY4ZDViLCAweDNmYjU1YmRjLCAweDA2MWEyMmY3LCAweDA2M2ZhOGU3LCAweDNmYjFiOGEyLAotCTB4M2ZiMDdkNTAsIDB4MDY0YzJhNjcsIDB4MDY3MWFkNzEsIDB4M2ZhY2JjOWYsIDB4M2ZhYjc3N2IsIDB4MDY3ZTJkZjUsIDB4MDZhM2FlMDAsIDB4M2ZhNzk5NTQsCi0JMHgzZmE2NGE1ZiwgMHgwNmIwMmQ4MSwgMHgwNmQ1YWE3NywgMHgzZmEyNGVjNiwgMHgzZmEwZjYwMCwgMHgwNmUyMjhlZSwgMHgwNzA3YTJiNywgMHgzZjljZGNmNywKLQkweDNmOWI3YTYyLCAweDA3MTQyMDFiLCAweDA3Mzk5NmExLCAweDNmOTc0M2ViLCAweDNmOTVkNzg3LCAweDA3NDYxMmViLCAweDA3NmI4NjE2LCAweDNmOTE4M2E1LAotCTB4M2Y5MDBkNzIsIDB4MDc3ODAxM2QsIDB4MDc5ZDcwZjcsIDB4M2Y4YjljMjgsIDB4M2Y4YTFjMjksIDB4MDdhOWVhZjUsIDB4MDdjZjU3MjYsIDB4M2Y4NThkNzksCi0JMHgzZjg0MDNhZSwgMHgwN2RiY2ZmMiwgMHgwODAxMzg4MywgMHgzZjdmNTc5YiwgMHgzZjdkYzQwNSwgMHgwODBkYjAxNiwgMHgwODMzMTRmMSwgMHgzZjc4ZmE5MiwKLQkweDNmNzc1ZDMxLCAweDA4M2Y4YjQzLCAweDA4NjRlYzRmLCAweDNmNzI3NjYxLCAweDNmNzBjZjM4LCAweDA4NzE2MTU5LCAweDA4OTZiZTgwLCAweDNmNmJjYjBlLAotCTB4M2Y2YTFhMWMsIDB4MDhhMzMyM2EsIDB4MDhjODhiNjUsIDB4M2Y2NGY4OWIsIDB4M2Y2MzNkZTIsIDB4MDhkNGZkYzYsIDB4MDhmYTUyZGUsIDB4M2Y1ZGZmMGUsCi0JMHgzZjVjM2E4ZiwgMHgwOTA2YzNlMCwgMHgwOTJjMTRjZSwgMHgzZjU2ZGU2YSwgMHgzZjU1MTAyNiwgMHgwOTM4ODQ2OSwgMHgwOTVkZDExNiwgMHgzZjRmOTZiNCwKLQkweDNmNGRiZWFjLCAweDA5NmEzZjQyLCAweDA5OGY4Nzk2LCAweDNmNDgyN2YwLCAweDNmNDY0NjI2LCAweDA5OWJmNDRjLCAweDA5YzEzODMxLCAweDNmNDA5MjIzLAotCTB4M2YzZWE2OTcsIDB4MDljZGEzNjgsIDB4MDlmMmUyYzcsIDB4M2YzOGQ1NTIsIDB4M2YzNmUwMDYsIDB4MDlmZjRjNzgsIDB4MGEyNDg3M2EsIDB4M2YzMGYxODEsCi0JMHgzZjJlZjI3NiwgMHgwYTMwZWY1ZSwgMHgwYTU2MjU2YywgMHgzZjI4ZTZiNiwgMHgzZjI2ZGRlYywgMHgwYTYyOGJmYSwgMHgwYTg3YmQzZCwgMHgzZjIwYjRmNSwKLQkweDNmMWVhMjZlLCAweDBhOTQyMjJmLCAweDBhYjk0ZThmLCAweDNmMTg1YzQzLCAweDNmMTY0MDAxLCAweDBhYzViMWRjLCAweDBhZWFkOTQ0LCAweDNmMGZkY2E1LAotCTB4M2YwZGI2YTksIDB4MGFmNzNhZTUsIDB4MGIxYzVkM2QsIDB4M2YwNzM2MjEsIDB4M2YwNTA2NmQsIDB4MGIyOGJkMmEsIDB4MGI0ZGRhNWMsIDB4M2VmZTY4YmMsCi0JMHgzZWZjMmY1MCwgMHgwYjVhMzg4ZCwgMHgwYjdmNTA4MSwgMHgzZWY1NzQ3YiwgMHgzZWYzMzE1YSwgMHgwYjhiYWNmMCwgMHgwYmIwYmY4ZiwgMHgzZWVjNTk2NSwKLQkweDNlZWEwYzhlLCAweDBiYmQxYTMzLCAweDBiZTIyNzY2LCAweDNlZTMxNzdlLCAweDNlZTBjMGY0LCAweDBiZWU4MDM4LCAweDBjMTM4N2U5LCAweDNlZDlhZWNjLAotCTB4M2VkNzRlOTEsIDB4MGMxZmRlZTEsIDB4MGM0NGUwZjksIDB4M2VkMDFmNTUsIDB4M2VjZGI1NmEsIDB4MGM1MTM2MTAsIDB4MGM3NjMyNzgsIDB4M2VjNjY5MjAsCi0JMHgzZWMzZjU4NSwgMHgwYzgyODVhNSwgMHgwY2E3N2M0NywgMHgzZWJjOGMzMSwgMHgzZWJhMGVlOSwgMHgwY2IzY2Q4NCwgMHgwY2Q4YmU0NywgMHgzZWIyODg4ZiwKLQkweDNlYjAwMTljLCAweDBjZTUwZDhjLCAweDBkMDlmODViLCAweDNlYTg1ZTQxLCAweDNlYTVjZGEzLCAweDBkMTY0NWEwLCAweDBkM2IyYTY0LCAweDNlOWUwZDRjLAotCTB4M2U5YjczMDYsIDB4MGQ0Nzc1YTEsIDB4MGQ2YzU0NDMsIDB4M2U5Mzk1YjcsIDB4M2U5MGYxY2EsIDB4MGQ3ODlkNzEsIDB4MGQ5ZDc1ZGIsIDB4M2U4OGY3ODgsCi0JMHgzZTg2NDlmNSwgMHgwZGE5YmNmMiwgMHgwZGNlOGYwZCwgMHgzZTdlMzJjNiwgMHgzZTdiN2I5MCwgMHgwZGRhZDQwNiwgMHgwZGZmOWZiYSwgMHgzZTczNDc3OCwKLQkweDNlNzA4NjlmLCAweDBlMGJlMjhlLCAweDBlMzBhN2M1LCAweDNlNjgzNWE0LCAweDNlNjU2YjJiLCAweDBlM2NlODZiLCAweDBlNjFhNzBmLCAweDNlNWNmZDUxLAotCTB4M2U1YTI5MzksIDB4MGU2ZGU1ODAsIDB4MGU5MjlkN2EsIDB4M2U1MTllODYsIDB4M2U0ZWMwZDEsIDB4MGU5ZWQ5YWYsIDB4MGVjMzhhZTgsIDB4M2U0NjE5NGEsCi0JMHgzZTQzMzFmYSwgMHgwZWNmYzRkOSwgMHgwZWY0NmYzYiwgMHgzZTNhNmRhNCwgMHgzZTM3N2NiYiwgMHgwZjAwYTZkZiwgMHgwZjI1NGE1MywgMHgzZTJlOWI5YywKLQkweDNlMmJhMTFiLCAweDBmMzE3ZmE1LCAweDBmNTYxYzE1LCAweDNlMjJhMzM4LCAweDNlMWY5ZjIxLCAweDBmNjI0ZjBjLCAweDBmODZlNDYwLCAweDNlMTY4NDgwLAotCTB4M2UxMzc2ZDUsIDB4MGY5MzE0ZjUsIDB4MGZiN2EzMTcsIDB4M2UwYTNmN2IsIDB4M2UwNzI4M2YsIDB4MGZjM2QxNDMsIDB4MGZlODU4MWQsIDB4M2RmZGQ0MzIsCi0JMHgzZGZhYjM2NSwgMHgwZmY0ODNkNywgMHgxMDE5MDM1MiwgMHgzZGYxNDJhYiwgMHgzZGVlMTg1MSwgMHgxMDI1MmM5NCwgMHgxMDQ5YTQ5YSwgMHgzZGU0OGFlZiwKLQkweDNkZTE1NzA4LCAweDEwNTVjYjViLCAweDEwN2EzYmQ1LCAweDNkZDdhZDA1LCAweDNkZDQ2Zjk0LCAweDEwODY2MDBlLCAweDEwYWFjOGU2LCAweDNkY2FhOGY1LAotCTB4M2RjNzYxZmMsIDB4MTBiNmVhOTAsIDB4MTBkYjRiYWYsIDB4M2RiZDdlYzcsIDB4M2RiYTJlNDgsIDB4MTBlNzZhYzMsIDB4MTEwYmM0MTMsIDB4M2RiMDJlODQsCi0JMHgzZGFjZDQ4MSwgMHgxMTE3ZTA4OCwgMHgxMTNjMzFmMywgMHgzZGEyYjgzNCwgMHgzZDlmNTRhZiwgMHgxMTQ4NGJjMiwgMHgxMTZjOTUzMSwgMHgzZDk1MWJkZSwKLQkweDNkOTFhZWQ5LCAweDExNzhhYzUzLCAweDExOWNlZGFmLCAweDNkODc1OThjLCAweDNkODNlMzA5LCAweDExYTkwMjFkLCAweDExY2QzYjUwLCAweDNkNzk3MTQ1LAotCTB4M2Q3NWYxNDcsIDB4MTFkOTRkMDIsIDB4MTFmZDdkZjYsIDB4M2Q2YjYzMTMsIDB4M2Q2N2Q5OWIsIDB4MTIwOThjZTUsIDB4MTIyZGI1ODMsIDB4M2Q1ZDJlZmUsCi0JMHgzZDU5OWMwZSwgMHgxMjM5YzFhNywgMHgxMjVkZTFkYSwgMHgzZDRlZDUwZiwgMHgzZDRiMzhhYSwgMHgxMjY5ZWIyYiwgMHgxMjhlMDJkYywgMHgzZDQwNTU0ZSwKLQkweDNkM2NhZjc2LCAweDEyOWEwOTU0LCAweDEyYmUxODZjLCAweDNkMzFhZmM1LCAweDNkMmUwMDdjLCAweDEyY2ExYzAzLCAweDEyZWUyMjZjLCAweDNkMjJlNDdjLAotCTB4M2QxZjJiYzUsIDB4MTJmYTIzMWIsIDB4MTMxZTIwYzAsIDB4M2QxM2YzN2UsIDB4M2QxMDMxNWEsIDB4MTMyYTFlN2UsIDB4MTM0ZTEzNDgsIDB4M2QwNGRjZDIsCi0JMHgzZDAxMTE0NSwgMHgxMzVhMGUwZSwgMHgxMzdkZjllNywgMHgzY2Y1YTA4MiwgMHgzY2YxY2I4ZSwgMHgxMzg5ZjFhZiwgMHgxM2FkZDQ4MSwgMHgzY2U2M2U5OCwKLQkweDNjZTI2MDNmLCAweDEzYjljOTQzLCAweDEzZGRhMmY3LCAweDNjZDZiNzFlLCAweDNjZDJjZjYyLCAweDEzZTk5NGFiLCAweDE0MGQ2NTJjLCAweDNjYzcwYTFjLAotCTB4M2NjMzE4ZmYsIDB4MTQxOTUzY2IsIDB4MTQzZDFiMDIsIDB4M2NiNzM3OWMsIDB4M2NiMzNkMjIsIDB4MTQ0OTA2ODUsIDB4MTQ2Y2M0NWMsIDB4M2NhNzNmYTksCi0JMHgzY2EzM2JkMywgMHgxNDc4YWNiYywgMHgxNDljNjExZCwgMHgzYzk3MjI0YywgMHgzYzkzMTUxZCwgMHgxNGE4NDY1MiwgMHgxNGNiZjEyNywgMHgzYzg2ZGY4ZSwKLQkweDNjODJjOTA5LCAweDE0ZDdkMzJhLCAweDE0ZmI3NDVlLCAweDNjNzY3NzdiLCAweDNjNzI1N2EyLCAweDE1MDc1MzI3LCAweDE1MmFlYWEzLCAweDNjNjVlYTFjLAotCTB4M2M2MWMwZjEsIDB4MTUzNmM2MmIsIDB4MTU1YTUzZDksIDB4M2M1NTM3N2IsIDB4M2M1MTA1MDEsIDB4MTU2NjJjMTgsIDB4MTU4OWFmZTMsIDB4M2M0NDVmYTIsCi0JMHgzYzQwMjNkZCwgMHgxNTk1ODRkMywgMHgxNWI4ZmVhNCwgMHgzYzMzNjI5ZCwgMHgzYzJmMWQ4ZSwgMHgxNWM0ZDAzZSwgMHgxNWU4M2ZmZiwgMHgzYzIyNDA3NSwKLQkweDNjMWRmMjFmLCAweDE1ZjQwZTNhLCAweDE2MTc3M2Q2LCAweDNjMTBmOTM1LCAweDNjMGNhMTliLCAweDE2MjMzZWFjLCAweDE2NDY5YTBkLCAweDNiZmY4Y2U4LAotCTB4M2JmYjJjMGMsIDB4MTY1MjYxNzYsIDB4MTY3NWIyODYsIDB4M2JlZGZiOTksIDB4M2JlOTkxN2UsIDB4MTY4MTc2N2MsIDB4MTZhNGJkMjUsIDB4M2JkYzQ1NTIsCi0JMHgzYmQ3ZDFmYSwgMHgxNmIwN2Q5ZiwgMHgxNmQzYjljYywgMHgzYmNhNmExZCwgMHgzYmM1ZWQ4ZCwgMHgxNmRmNzZjMywgMHgxNzAyYTg1ZSwgMHgzYmI4NmEwOCwKLQkweDNiYjNlNDQwLCAweDE3MGU2MWNjLCAweDE3MzE4OGJlLCAweDNiYTY0NTFiLCAweDNiYTFiNjIwLCAweDE3M2QzZTliLCAweDE3NjA1YWQwLCAweDNiOTNmYjYzLAotCTB4M2I4ZjYzMzcsIDB4MTc2YzBkMTUsIDB4MTc4ZjFlNzYsIDB4M2I4MThjZWIsIDB4M2I3Y2ViOTAsIDB4MTc5YWNkMWMsIDB4MTdiZGQzOTQsIDB4M2I2ZWY5YmUsCi0JMHgzYjZhNGYzOCwgMHgxN2M5N2U5MywgMHgxN2VjN2EwZCwgMHgzYjVjNDFlOCwgMHgzYjU3OGUzOSwgMHgxN2Y4MjE1ZSwgMHgxODFiMTFjNCwgMHgzYjQ5NjU3NCwKLQkweDNiNDRhOGEwLCAweDE4MjZiNTYxLCAweDE4NDk5YTlkLCAweDNiMzY2NDZlLCAweDNiMzE5ZTc3LCAweDE4NTUzYTdkLCAweDE4NzgxNDdhLCAweDNiMjMzZWUxLAotCTB4M2IxZTZmY2EsIDB4MTg4M2IwOTcsIDB4MThhNjdmM2YsIDB4M2IwZmY0ZDksIDB4M2IwYjFjYTYsIDB4MThiMjE3OTEsIDB4MThkNGRhZDAsIDB4M2FmYzg2NjMsCi0JMHgzYWY3YTUxNiwgMHgxOGUwNmY1MCwgMHgxOTAzMjcwZiwgMHgzYWU4ZjM4YiwgMHgzYWU0MDkyNiwgMHgxOTBlYjdiNywgMHgxOTMxNjNlMSwgMHgzYWQ1M2M1YiwKLQkweDNhZDA0OGUzLCAweDE5M2NmMGE5LCAweDE5NWY5MTI4LCAweDNhYzE2MGUxLCAweDNhYmM2NDU4LCAweDE5NmIxYTA5LCAweDE5OGRhZWM4LCAweDNhYWQ2MTI5LAotCTB4M2FhODViOTIsIDB4MTk5OTMzYmIsIDB4MTliYmJjYTYsIDB4M2E5OTNkM2UsIDB4M2E5NDJlOWQsIDB4MTljNzNkYTMsIDB4MTllOWJhYTMsIDB4M2E4NGY1MmYsCi0JMHgzYTdmZGQ4NiwgMHgxOWY1MzdhNCwgMHgxYTE3YThhNSwgMHgzYTcwODkwNiwgMHgzYTZiNjg1OSwgMHgxYTIzMjFhMiwgMHgxYTQ1ODY4ZSwgMHgzYTViZjhkMSwKLQkweDNhNTZjZjIzLCAweDFhNTBmYjgxLCAweDFhNzM1NDQyLCAweDNhNDc0NDljLCAweDNhNDIxMWYwLCAweDFhN2VjNTI0LCAweDFhYTExMWE2LCAweDNhMzI2Yzc0LAotCTB4M2EyZDMwY2QsIDB4MWFhYzdlNmYsIDB4MWFjZWJlOWQsIDB4M2ExZDcwNjYsIDB4M2ExODJiYzgsIDB4MWFkYTI3NDYsIDB4MWFmYzViMGEsIDB4M2EwODUwN2YsCi0JMHgzYTAzMDJlZCwgMHgxYjA3YmY4YywgMHgxYjI5ZTZkMiwgMHgzOWYzMGNjYywgMHgzOWVkYjY0OSwgMHgxYjM1NDcyNywgMHgxYjU3NjFkOCwgMHgzOWRkYTU1YSwKLQkweDM5ZDg0NWU5LCAweDFiNjJiZGY4LCAweDFiODRjYzAxLCAweDM5YzgxYTM2LCAweDM5YzJiMWRhLCAweDFiOTAyM2U1LCAweDFiYjIyNTMwLCAweDM5YjI2YjZkLAotCTB4MzlhY2ZhMmIsIDB4MWJiZDc4ZDIsIDB4MWJkZjZkNGEsIDB4Mzk5Yzk5MGQsIDB4Mzk5NzFlZTcsIDB4MWJlYWJjYTEsIDB4MWMwY2E0MzIsIDB4Mzk4NmEzMjQsCi0JMHgzOTgxMjAxZSwgMHgxYzE3ZWYzOSwgMHgxYzM5YzljZCwgMHgzOTcwODliZiwgMHgzOTZhZmRkYywgMHgxYzQ1MTA3YywgMHgxYzY2ZGRmZSwgMHgzOTVhNGNlYiwKLQkweDM5NTRiODJlLCAweDFjNzIyMDRmLCAweDFjOTNlMGFiLCAweDM5NDNlY2I2LCAweDM5M2U0ZjIzLCAweDFjOWYxZTk2LCAweDFjYzBkMWI2LCAweDM5MmQ2OTJmLAotCTB4MzkyN2MyYzksIDB4MWNjYzBiMzUsIDB4MWNlZGIxMDYsIDB4MzkxNmMyNjIsIDB4MzkxMTEzMmQsIDB4MWNmOGU2MTEsIDB4MWQxYTdlN2QsIDB4MzhmZmY4NWUsCi0JMHgzOGZhNDA1ZSwgMHgxZDI1YWYwZCwgMHgxZDQ3M2EwMCwgMHgzOGU5MGIzMSwgMHgzOGUzNGE2OSwgMHgxZDUyNjYwZiwgMHgxZDczZTM3NCwgMHgzOGQxZmFlOSwKLQkweDM4Y2MzMTVkLCAweDFkN2YwYWZiLCAweDFkYTA3YWJjLCAweDM4YmFjNzk1LCAweDM4YjRmNTQ3LCAweDFkYWI5ZGI1LCAweDFkY2NmZmJmLCAweDM4YTM3MTQyLAotCTB4Mzg5ZDk2MzcsIDB4MWRkODFlMjEsIDB4MWRmOTcyNWYsIDB4Mzg4YmY3ZmYsIDB4Mzg4NjE0M2IsIDB4MWUwNDhjMjQsIDB4MWUyNWQyODIsIDB4Mzg3NDViZGIsCi0JMHgzODZlNmY2MCwgMHgxZTMwZTdhNCwgMHgxZTUyMjAwYywgMHgzODVjOWNlMywgMHgzODU2YTdiNiwgMHgxZTVkMzA4NCwgMHgxZTdlNWFlMiwgMHgzODQ0YmIyOCwKLQkweDM4M2ViZDRjLCAweDFlODk2NmE4LCAweDFlYWE4MmU5LCAweDM4MmNiNmI3LCAweDM4MjZiMDMwLCAweDFlYjU4OWY3LCAweDFlZDY5ODA1LCAweDM4MTQ4ZjlmLAotCTB4MzgwZTgwNzEsIDB4MWVlMTlhNTQsIDB4MWYwMjlhMWMsIDB4MzdmYzQ1ZWYsIDB4MzdmNjJlMWQsIDB4MWYwZDk3YTUsIDB4MWYyZTg5MTEsIDB4MzdlM2Q5YjcsCi0JMHgzN2RkYjk0NSwgMHgxZjM5ODFjZSwgMHgxZjVhNjRjYiwgMHgzN2NiNGIwNCwgMHgzN2M1MjFmNiwgMHgxZjY1NThiNSwgMHgxZjg2MmQyZCwgMHgzN2IyOTllNywKLQkweDM3YWM2ODQxLCAweDFmOTExYzNkLCAweDFmYjFlMjFkLCAweDM3OTljNjZmLCAweDM3OTM4YzM0LCAweDFmYmNjYzRkLCAweDFmZGQ4MzgxLCAweDM3ODBkMGFhLAotCTB4Mzc3YThkZGYsIDB4MWZlODY4YzgsIDB4MjAwOTExM2MsIDB4Mzc2N2I4YTksIDB4Mzc2MTZkNTEsIDB4MjAxM2YxOTYsIDB4MjAzNDhiMzUsIDB4Mzc0ZTdlN2IsCi0JMHgzNzQ4MmE5YSwgMHgyMDNmNjY5OSwgMHgyMDVmZjE0ZiwgMHgzNzM1MjIyZiwgMHgzNzJlYzVjOSwgMHgyMDZhYzdiOCwgMHgyMDhiNDM3MiwgMHgzNzFiYTNkNCwKLQkweDM3MTUzZWVlLCAweDIwOTYxNGQ5LCAweDIwYjY4MTgxLCAweDM3MDIwMzdjLCAweDM2ZmI5NjE4LCAweDIwYzE0ZGRmLCAweDIwZTFhYjYzLCAweDM2ZTg0MTM1LAotCTB4MzZlMWNiNTgsIDB4MjBlYzcyYjEsIDB4MjEwY2MwZmMsIDB4MzZjZTVkMTAsIDB4MzZjN2RlYmQsIDB4MjExNzgzMzQsIDB4MjEzN2MyMzIsIDB4MzZiNDU3MWIsCi0JMHgzNmFkZDA1OCwgMHgyMTQyN2Y0ZCwgMHgyMTYyYWVlYSwgMHgzNjlhMmY2OSwgMHgzNjkzYTAzOCwgMHgyMTZkNjZlMiwgMHgyMThkODcwYiwgMHgzNjdmZTYwOCwKLQkweDM2Nzk0ZTZlLCAweDIxOTgzOWQ4LCAweDIxYjg0YTc5LCAweDM2NjU3YjA4LCAweDM2NWVkYjA5LCAweDIxYzJmODE1LCAweDIxZTJmOTFhLCAweDM2NGFlZTdiLAotCTB4MzY0NDQ2MWIsIDB4MjFlZGExN2YsIDB4MjIwZDkyZDQsIDB4MzYzMDQwNzAsIDB4MzYyOThmYjQsIDB4MjIxODM1ZmIsIDB4MjIzODE3OGQsIDB4MzYxNTcwZjgsCi0JMHgzNjBlYjdlMywgMHgyMjQyYjU2ZiwgMHgyMjYyODcyOSwgMHgzNWZhODAyMywgMHgzNWYzYmViYSwgMHgyMjZkMWZjMSwgMHgyMjhjZTE5MSwgMHgzNWRmNmUwMywKLQkweDM1ZDhhNDQ5LCAweDIyOTc3NGQ3LCAweDIyYjcyNmE4LCAweDM1YzQzYWE3LCAweDM1YmQ2OGExLCAweDIyYzFiNDk2LCAweDIyZTE1NjU1LCAweDM1YThlNjIxLAotCTB4MzVhMjBiZDMsIDB4MjJlYmRlZTUsIDB4MjMwYjcwN2UsIDB4MzU4ZDcwODEsIDB4MzU4NjhkZWYsIDB4MjMxNWYzYTgsIDB4MjMzNTc1MDksIDB4MzU3MWQ5ZDksCi0JMHgzNTZhZWYwOCwgMHgyMzNmZjJjOCwgMHgyMzVmNjNkYywgMHgzNTU2MjIzOSwgMHgzNTRmMmYyYywgMHgyMzY5ZGMyOSwgMHgyMzg5M2NkZCwgMHgzNTNhNDliMiwKLQkweDM1MzM0ZTZmLCAweDIzOTNhZmIyLCAweDIzYjJmZmYzLCAweDM1MWU1MDU2LCAweDM1MTc0Y2UwLCAweDIzYmQ2ZDQ4LCAweDIzZGNhZDAzLCAweDM1MDIzNjM2LAotCTB4MzRmYjJhOTIsIDB4MjNlNzE0ZDMsIDB4MjQwNjQzZjQsIDB4MzRlNWZiNjMsIDB4MzRkZWU3OTUsIDB4MjQxMGE2MzksIDB4MjQyZmM0YWQsIDB4MzRjOTlmZWYsCi0JMHgzNGMyODNmYiwgMHgyNDNhMjE1ZiwgMHgyNDU5MmYxMywgMHgzNGFkMjNlYiwgMHgzNGE1ZmZkNSwgMHgyNDYzODYyYywgMHgyNDgyODMwZCwgMHgzNDkwODc2OCwKLQkweDM0ODk1YjM2LCAweDI0OGNkNDg3LCAweDI0YWJjMDgyLCAweDM0NzNjYTc5LCAweDM0NmM5NjJmLCAweDI0YjYwYzU3LCAweDI0ZDRlNzU3LCAweDM0NTZlZDJmLAotCTB4MzQ0ZmIwZDEsIDB4MjRkZjJkODEsIDB4MjRmZGY3NzUsIDB4MzQzOWVmOWMsIDB4MzQzMmFiMmUsIDB4MjUwODM3ZWQsIDB4MjUyNmYwYzEsIDB4MzQxY2QxZDIsCi0JMHgzNDE1ODU1OSwgMHgyNTMxMmI4MSwgMHgyNTRmZDMyMywgMHgzM2ZmOTNlMiwgMHgzM2Y4M2Y2MiwgMHgyNTVhMDgyMywgMHgyNTc4OWU4MCwgMHgzM2UyMzVkZiwKLQkweDMzZGFkOTVlLCAweDI1ODJjZGJjLCAweDI1YTE1MmMwLCAweDMzYzRiN2RiLCAweDMzYmQ1MzVjLCAweDI1YWI3YzMwLCAweDI1YzllZmNhLCAweDMzYTcxOWU4LAotCTB4MzM5ZmFkNzAsIDB4MjVkNDEzNjksIDB4MjVmMjc1ODQsIDB4MzM4OTVjMTgsIDB4MzM4MWU3YWMsIDB4MjVmYzkzNGIsIDB4MjYxYWUzZDYsIDB4MzM2YjdlN2UsCi0JMHgzMzY0MDIyMywgMHgyNjI0ZmJiZiwgMHgyNjQzM2FhNywgMHgzMzRkODEyZCwgMHgzMzQ1ZmNlNiwgMHgyNjRkNGNhYywgMHgyNjZiNzlkZCwgMHgzMzJmNjQzNSwKLQkweDMzMjdkODA4LCAweDI2NzU4NWY4LCAweDI2OTNhMTYxLCAweDMzMTEyN2FiLCAweDMzMDk5MzljLCAweDI2OWRhNzhiLCAweDI2YmJiMTE5LCAweDMyZjJjYmExLAotCTB4MzJlYjJmYjUsIDB4MjZjNWIxNGMsIDB4MjZlM2E4ZWMsIDB4MzJkNDUwMjksIDB4MzJjY2FjNjQsIDB4MjZlZGEzMjIsIDB4MjcwYjg4YzIsIDB4MzJiNWI1NTcsCi0JMHgzMmFlMDliZSwgMHgyNzE1N2NmNSwgMHgyNzMzNTA4MiwgMHgzMjk2ZmIzZCwgMHgzMjhmNDdkNSwgMHgyNzNkM2VhYywgMHgyNzViMDAxNCwgMHgzMjc4MjFlZSwKLQkweDMyNzA2NmJjLCAweDI3NjRlODJmLCAweDI3ODI5NzYwLCAweDMyNTkyOTdkLCAweDMyNTE2Njg2LCAweDI3OGM3OTY1LCAweDI3YWExNjRjLCAweDMyM2ExMWZlLAotCTB4MzIzMjQ3NDYsIDB4MjdiM2YyMzUsIDB4MjdkMTdjYzEsIDB4MzIxYWRiODMsIDB4MzIxMzA5MGYsIDB4MjdkYjUyODgsIDB4MjdmOGNhYTUsIDB4MzFmYjg2MjAsCi0JMHgzMWYzYWJmNSwgMHgyODAyOWE0NSwgMHgyODFmZmZlMiwgMHgzMWRjMTFlOCwgMHgzMWQ0MzAwYiwgMHgyODI5Yzk1NCwgMHgyODQ3MWM1ZSwgMHgzMWJjN2VlZSwKLQkweDMxYjQ5NTY0LCAweDI4NTBkZjlkLCAweDI4NmUyMDAyLCAweDMxOWNjZDQ2LCAweDMxOTRkYzE0LCAweDI4NzdkZDA3LCAweDI4OTUwYWI2LCAweDMxN2NmZDA0LAotCTB4MzE3NTA0MmUsIDB4Mjg5ZWMxN2EsIDB4MjhiYmRjNjEsIDB4MzE1ZDBlM2IsIDB4MzE1NTBkYzYsIDB4MjhjNThjZGYsIDB4MjhlMjk0ZWIsIDB4MzEzZDAwZmYsCi0JMHgzMTM0ZjhmMSwgMHgyOGVjM2YxZSwgMHgyOTA5MzQzZSwgMHgzMTFjZDU2NCwgMHgzMTE0YzVjMCwgMHgyOTEyZDgxZiwgMHgyOTJmYmE0MCwgMHgzMGZjOGI3ZCwKLQkweDMwZjQ3NDQ5LCAweDI5Mzk1N2M5LCAweDI5NTYyNmRhLCAweDMwZGMyMzVlLCAweDMwZDQwNGEwLCAweDI5NWZiZTA2LCAweDI5N2M3OWY1LCAweDMwYmI5ZDFjLAotCTB4MzBiMzc2ZDgsIDB4Mjk4NjBhYmQsIDB4MjlhMmIzNzgsIDB4MzA5YWY4Y2EsIDB4MzA5MmNiMDUsIDB4MjlhYzNkZDcsIDB4MjljOGQzNGQsIDB4MzA3YTM2N2MsCi0JMHgzMDcyMDEzYywgMHgyOWQyNTczYywgMHgyOWVlZDk1YiwgMHgzMDU5NTY0OCwgMHgzMDUxMTk5MSwgMHgyOWY4NTZkNSwgMHgyYTE0YzU4YiwgMHgzMDM4NTg0MCwKLQkweDMwMzAxNDE4LCAweDJhMWUzYzhhLCAweDJhM2E5N2M3LCAweDMwMTczYzdhLCAweDMwMGVmMGU1LCAweDJhNDQwODQ0LCAweDJhNjA0ZmY1LCAweDJmZjYwMzBhLAotCTB4MmZlZGIwMGQsIDB4MmE2OWI5ZWMsIDB4MmE4NWVlMDAsIDB4MmZkNGFjMDQsIDB4MmZjYzUxYTUsIDB4MmE4ZjUxNmIsIDB4MmFhYjcxZDAsIDB4MmZiMzM3N2MsCi0JMHgyZmFhZDVjMSwgMHgyYWI0Y2VhOSwgMHgyYWQwZGI0ZSwgMHgyZjkxYTU4OSwgMHgyZjg5M2M3NSwgMHgyYWRhMzE4ZSwgMHgyYWY2MmE2MywgMHgyZjZmZjYzZCwKLQkweDJmNjc4NWQ3LCAweDJhZmY3YTA1LCAweDJiMWI1ZWY4LCAweDJmNGUyOWFmLCAweDJmNDViMWZiLCAweDJiMjRhN2Y2LCAweDJiNDA3OGY1LCAweDJmMmMzZmYyLAotCTB4MmYyM2MwZjYsIDB4MmI0OWJiNGEsIDB4MmI2NTc4NDQsIDB4MmYwYTM5MWQsIDB4MmYwMWIyZGUsIDB4MmI2ZWIzZWEsIDB4MmI4YTVjY2UsIDB4MmVlODE1NDMsCi0JMHgyZWRmODdjNiwgMHgyYjkzOTFjMCwgMHgyYmFmMjY3ZCwgMHgyZWM1ZDQ3OSwgMHgyZWJkM2ZjNCwgMHgyYmI4NTRiNCwgMHgyYmQzZDUzYSwgMHgyZWEzNzZkNiwKLQkweDJlOWFkYWVlLCAweDJiZGNmY2IwLCAweDJiZjg2OGVkLCAweDJlODBmYzZlLCAweDJlNzg1OTU4LCAweDJjMDE4OTllLCAweDJjMWNlMTgxLCAweDJlNWU2NTU2LAotCTB4MmU1NWJiMTcsIDB4MmMyNWZiNjYsIDB4MmM0MTNlZGYsIDB4MmUzYmIxYTQsIDB4MmUzMzAwNDIsIDB4MmM0YTUxZjMsIDB4MmM2NTgwZjEsIDB4MmUxOGUxNmQsCi0JMHgyZTEwMjhlZCwgMHgyYzZlOGQyZSwgMHgyYzg5YTc5ZiwgMHgyZGY1ZjRjNywgMHgyZGVkMzUyZiwgMHgyYzkyYWQwMSwgMHgyY2FkYjJkNSwgMHgyZGQyZWJjNywKLQkweDJkY2EyNTFjLCAweDJjYjZiMTU1LCAweDJjZDFhMjdiLCAweDJkYWZjNjgzLCAweDJkYTZmOGNhLCAweDJjZGE5YTE0LCAweDJjZjU3NjdjLCAweDJkOGM4NTEwLAotCTB4MmQ4M2IwNGYsIDB4MmNmZTY3MjgsIDB4MmQxOTJlYzEsIDB4MmQ2OTI3ODQsIDB4MmQ2MDRiYzAsIDB4MmQyMjE4N2EsIDB4MmQzY2NiMzQsIDB4MmQ0NWFkZjYKLX07Ci0KLQotY29uc3QgaW50IHR3aWRUYWI1MTJbKDgqNiArIDMyKjYgKyAxMjgqNikvMl0gPSB7Ci0JMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzYjIwMTg3ZCwKLQkweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDJkNDEyZDQxLCAweDNiMjAxODdkLAotCTB4MTg3ZDNiMjAsIDB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIDB4ZjM4NDNlYzUsCi0JMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhlNzgzM2IyMCwKLQkweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGQyYmYyZDQxLCAweDE4N2QzYjIwLAotCTB4YzRlMGU3ODMsIDB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIDB4ZGM3MmNhY2EsCi0KLQkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNmYjEwNjQ1LAotCTB4M2ZlYzAzMjMsIDB4M2Y0ZTA5NjQsIDB4M2VjNTBjN2MsIDB4M2ZiMTA2NDUsCi0JMHgzZDNlMTI5NCwgMHgzZDNlMTI5NCwgMHgzZjRlMDk2NCwgMHgzOWRhMWI1ZCwKLQkweDNiMjAxODdkLCAweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDM4NzExZTJiLAotCTB4M2UxNDBmOGMsIDB4MmY2YjJhZmEsIDB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsCi0JMHgyODk5MzE3OSwgMHgzMTc5Mjg5OSwgMHgzYzQyMTU4ZiwgMHgyMGU3MzZlNSwKLQkweDJkNDEyZDQxLCAweDNiMjAxODdkLCAweDE4N2QzYjIwLCAweDI4OTkzMTc5LAotCTB4MzlkYTFiNWQsIDB4MGY4YzNlMTQsIDB4MjM4ZTM1MzYsIDB4Mzg3MTFlMmIsCi0JMHgwNjQ1M2ZiMSwgMHgxZTJiMzg3MSwgMHgzNmU1MjBlNywgMHhmY2RkM2ZlYywKLQkweDE4N2QzYjIwLCAweDM1MzYyMzhlLCAweGYzODQzZWM1LCAweDEyOTQzZDNlLAotCTB4MzM2NzI2MWYsIDB4ZWE3MTNjNDIsIDB4MGM3YzNlYzUsIDB4MzE3OTI4OTksCi0JMHhlMWQ1Mzg3MSwgMHgwNjQ1M2ZiMSwgMHgyZjZiMmFmYSwgMHhkOWUxMzM2NywKLQkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGY5YmIzZmIxLAotCTB4MmFmYTJmNmIsIDB4Y2M5OTI2MWYsIDB4ZjM4NDNlYzUsIDB4Mjg5OTMxNzksCi0JMHhjNzhmMWUyYiwgMHhlZDZjM2QzZSwgMHgyNjFmMzM2NywgMHhjM2JlMTU4ZiwKLQkweGU3ODMzYjIwLCAweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGUxZDUzODcxLAotCTB4MjBlNzM2ZTUsIDB4YzAxNDAzMjMsIDB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsCi0JMHhjMDRmZjliYiwgMHhkNzY3MzE3OSwgMHgxYjVkMzlkYSwgMHhjMWVjZjA3NCwKLQkweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLCAweGNlODcyODk5LAotCTB4MTU4ZjNjNDIsIDB4YzkxYmRmMTksIDB4Y2FjYTIzOGUsIDB4MTI5NDNkM2UsCi0JMHhjZTg3ZDc2NywgMHhjNzhmMWUyYiwgMHgwZjhjM2UxNCwgMHhkNTA2ZDA5NSwKLQkweGM0ZTAxODdkLCAweDBjN2MzZWM1LCAweGRjNzJjYWNhLCAweGMyYzIxMjk0LAotCTB4MDk2NDNmNGUsIDB4ZTRhM2M2MjYsIDB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsCi0JMHhlZDZjYzJjMiwgMHhjMDRmMDY0NSwgMHgwMzIzM2ZlYywgMHhmNjljYzBiMiwKLQotCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4M2ZmYjAxOTIsCi0JMHgzZmZlMDBjOSwgMHgzZmY0MDI1YiwgMHgzZmVjMDMyMywgMHgzZmZiMDE5MiwKLQkweDNmZDMwNGI1LCAweDNmZDMwNGI1LCAweDNmZjQwMjViLCAweDNmOWMwNzBkLAotCTB4M2ZiMTA2NDUsIDB4M2ZlYzAzMjMsIDB4M2Y0ZTA5NjQsIDB4M2Y4NDA3ZDUsCi0JMHgzZmUxMDNlYywgMHgzZWViMGJiNiwgMHgzZjRlMDk2NCwgMHgzZmQzMDRiNSwKLQkweDNlNzEwZTA1LCAweDNmMGUwYWYxLCAweDNmYzMwNTdkLCAweDNkZTIxMDRmLAotCTB4M2VjNTBjN2MsIDB4M2ZiMTA2NDUsIDB4M2QzZTEyOTQsIDB4M2U3MTBlMDUsCi0JMHgzZjljMDcwZCwgMHgzYzg0MTRkMSwgMHgzZTE0MGY4YywgMHgzZjg0MDdkNSwKLQkweDNiYjYxNzA4LCAweDNkYWUxMTExLCAweDNmNmEwODljLCAweDNhZDIxOTM3LAotCTB4M2QzZTEyOTQsIDB4M2Y0ZTA5NjQsIDB4MzlkYTFiNWQsIDB4M2NjNTE0MTMsCi0JMHgzZjJmMGEyYSwgMHgzOGNmMWQ3OSwgMHgzYzQyMTU4ZiwgMHgzZjBlMGFmMSwKLQkweDM3YWYxZjhiLCAweDNiYjYxNzA4LCAweDNlZWIwYmI2LCAweDM2N2MyMTkyLAotCTB4M2IyMDE4N2QsIDB4M2VjNTBjN2MsIDB4MzUzNjIzOGUsIDB4M2E4MjE5ZWYsCi0JMHgzZTljMGQ0MSwgMHgzM2RlMjU3ZCwgMHgzOWRhMWI1ZCwgMHgzZTcxMGUwNSwKLQkweDMyNzQyNzVmLCAweDM5MmExY2M2LCAweDNlNDQwZWM5LCAweDMwZjgyOTM0LAotCTB4Mzg3MTFlMmIsIDB4M2UxNDBmOGMsIDB4MmY2YjJhZmEsIDB4MzdhZjFmOGIsCi0JMHgzZGUyMTA0ZiwgMHgyZGNlMmNiMiwgMHgzNmU1MjBlNywgMHgzZGFlMTExMSwKLQkweDJjMjEyZTVhLCAweDM2MTIyMjNkLCAweDNkNzcxMWQzLCAweDJhNjUyZmYxLAotCTB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsIDB4Mjg5OTMxNzksIDB4MzQ1MzI0ZGEsCi0JMHgzZDAyMTM1NCwgMHgyNmMwMzJlZSwgMHgzMzY3MjYxZiwgMHgzY2M1MTQxMywKLQkweDI0ZGEzNDUzLCAweDMyNzQyNzVmLCAweDNjODQxNGQxLCAweDIyZTYzNWE1LAotCTB4MzE3OTI4OTksIDB4M2M0MjE1OGYsIDB4MjBlNzM2ZTUsIDB4MzA3NjI5Y2QsCi0JMHgzYmZkMTY0YywgMHgxZWRjMzgxMSwgMHgyZjZiMmFmYSwgMHgzYmI2MTcwOCwKLQkweDFjYzYzOTJhLCAweDJlNWEyYzIxLCAweDNiNmMxN2MzLCAweDFhYTYzYTJmLAotCTB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MmMyMTJlNWEsCi0JMHgzYWQyMTkzNywgMHgxNjRjM2JmZCwgMHgyYWZhMmY2YiwgMHgzYTgyMTllZiwKLQkweDE0MTMzY2M1LCAweDI5Y2QzMDc2LCAweDNhMmYxYWE2LCAweDExZDMzZDc3LAotCTB4Mjg5OTMxNzksIDB4MzlkYTFiNWQsIDB4MGY4YzNlMTQsIDB4Mjc1ZjMyNzQsCi0JMHgzOTgzMWMxMiwgMHgwZDQxM2U5YywgMHgyNjFmMzM2NywgMHgzOTJhMWNjNiwKLQkweDBhZjEzZjBlLCAweDI0ZGEzNDUzLCAweDM4Y2YxZDc5LCAweDA4OWMzZjZhLAotCTB4MjM4ZTM1MzYsIDB4Mzg3MTFlMmIsIDB4MDY0NTNmYjEsIDB4MjIzZDM2MTIsCi0JMHgzODExMWVkYywgMHgwM2VjM2ZlMSwgMHgyMGU3MzZlNSwgMHgzN2FmMWY4YiwKLQkweDAxOTIzZmZiLCAweDFmOGIzN2FmLCAweDM3NGIyMDM5LCAweGZmMzczZmZlLAotCTB4MWUyYjM4NzEsIDB4MzZlNTIwZTcsIDB4ZmNkZDNmZWMsIDB4MWNjNjM5MmEsCi0JMHgzNjdjMjE5MiwgMHhmYTgzM2ZjMywgMHgxYjVkMzlkYSwgMHgzNjEyMjIzZCwKLQkweGY4MmIzZjg0LCAweDE5ZWYzYTgyLCAweDM1YTUyMmU2LCAweGY1ZDYzZjJmLAotCTB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIDB4ZjM4NDNlYzUsIDB4MTcwODNiYjYsCi0JMHgzNGM2MjQzNCwgMHhmMTM3M2U0NCwgMHgxNThmM2M0MiwgMHgzNDUzMjRkYSwKLQkweGVlZWYzZGFlLCAweDE0MTMzY2M1LCAweDMzZGUyNTdkLCAweGVjYWMzZDAyLAotCTB4MTI5NDNkM2UsIDB4MzM2NzI2MWYsIDB4ZWE3MTNjNDIsIDB4MTExMTNkYWUsCi0JMHgzMmVlMjZjMCwgMHhlODNkM2I2YywgMHgwZjhjM2UxNCwgMHgzMjc0Mjc1ZiwKLQkweGU2MTEzYTgyLCAweDBlMDUzZTcxLCAweDMxZjcyN2ZkLCAweGUzZWUzOTgzLAotCTB4MGM3YzNlYzUsIDB4MzE3OTI4OTksIDB4ZTFkNTM4NzEsIDB4MGFmMTNmMGUsCi0JMHgzMGY4MjkzNCwgMHhkZmM3Mzc0YiwgMHgwOTY0M2Y0ZSwgMHgzMDc2MjljZCwKLQkweGRkYzMzNjEyLCAweDA3ZDUzZjg0LCAweDJmZjEyYTY1LCAweGRiY2MzNGM2LAotCTB4MDY0NTNmYjEsIDB4MmY2YjJhZmEsIDB4ZDllMTMzNjcsIDB4MDRiNTNmZDMsCi0JMHgyZWUzMmI4ZSwgMHhkODAzMzFmNywgMHgwMzIzM2ZlYywgMHgyZTVhMmMyMSwKLQkweGQ2MzMzMDc2LCAweDAxOTIzZmZiLCAweDJkY2UyY2IyLCAweGQ0NzIyZWUzLAotCTB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIDB4ZDJiZjJkNDEsIDB4ZmU2ZTNmZmIsCi0JMHgyY2IyMmRjZSwgMHhkMTFkMmI4ZSwgMHhmY2RkM2ZlYywgMHgyYzIxMmU1YSwKLQkweGNmOGEyOWNkLCAweGZiNGIzZmQzLCAweDJiOGUyZWUzLCAweGNlMDkyN2ZkLAotCTB4ZjliYjNmYjEsIDB4MmFmYTJmNmIsIDB4Y2M5OTI2MWYsIDB4ZjgyYjNmODQsCi0JMHgyYTY1MmZmMSwgMHhjYjNhMjQzNCwgMHhmNjljM2Y0ZSwgMHgyOWNkMzA3NiwKLQkweGM5ZWUyMjNkLCAweGY1MGYzZjBlLCAweDI5MzQzMGY4LCAweGM4YjUyMDM5LAotCTB4ZjM4NDNlYzUsIDB4Mjg5OTMxNzksIDB4Yzc4ZjFlMmIsIDB4ZjFmYjNlNzEsCi0JMHgyN2ZkMzFmNywgMHhjNjdkMWMxMiwgMHhmMDc0M2UxNCwgMHgyNzVmMzI3NCwKLQkweGM1N2UxOWVmLCAweGVlZWYzZGFlLCAweDI2YzAzMmVlLCAweGM0OTQxN2MzLAotCTB4ZWQ2YzNkM2UsIDB4MjYxZjMzNjcsIDB4YzNiZTE1OGYsIDB4ZWJlZDNjYzUsCi0JMHgyNTdkMzNkZSwgMHhjMmZlMTM1NCwgMHhlYTcxM2M0MiwgMHgyNGRhMzQ1MywKLQkweGMyNTIxMTExLCAweGU4ZjgzYmI2LCAweDI0MzQzNGM2LCAweGMxYmMwZWM5LAotCTB4ZTc4MzNiMjAsIDB4MjM4ZTM1MzYsIDB4YzEzYjBjN2MsIDB4ZTYxMTNhODIsCi0JMHgyMmU2MzVhNSwgMHhjMGQxMGEyYSwgMHhlNGEzMzlkYSwgMHgyMjNkMzYxMiwKLQkweGMwN2MwN2Q1LCAweGUzM2EzOTJhLCAweDIxOTIzNjdjLCAweGMwM2QwNTdkLAotCTB4ZTFkNTM4NzEsIDB4MjBlNzM2ZTUsIDB4YzAxNDAzMjMsIDB4ZTA3NTM3YWYsCi0JMHgyMDM5Mzc0YiwgMHhjMDAyMDBjOSwgMHhkZjE5MzZlNSwgMHgxZjhiMzdhZiwKLQkweGMwMDVmZTZlLCAweGRkYzMzNjEyLCAweDFlZGMzODExLCAweGMwMWZmYzE0LAotCTB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsIDB4YzA0ZmY5YmIsIDB4ZGIyNjM0NTMsCi0JMHgxZDc5MzhjZiwgMHhjMDk2Zjc2NCwgMHhkOWUxMzM2NywgMHgxY2M2MzkyYSwKLQkweGMwZjJmNTBmLCAweGQ4YTEzMjc0LCAweDFjMTIzOTgzLCAweGMxNjRmMmJmLAotCTB4ZDc2NzMxNzksIDB4MWI1ZDM5ZGEsIDB4YzFlY2YwNzQsIDB4ZDYzMzMwNzYsCi0JMHgxYWE2M2EyZiwgMHhjMjg5ZWUyZCwgMHhkNTA2MmY2YiwgMHgxOWVmM2E4MiwKLQkweGMzM2JlYmVkLCAweGQzZGYyZTVhLCAweDE5MzczYWQyLCAweGM0MDNlOWI0LAotCTB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIDB4YzRlMGU3ODMsIDB4ZDFhNjJjMjEsCi0JMHgxN2MzM2I2YywgMHhjNWQxZTU1YSwgMHhkMDk1MmFmYSwgMHgxNzA4M2JiNiwKLQkweGM2ZDZlMzNhLCAweGNmOGEyOWNkLCAweDE2NGMzYmZkLCAweGM3ZWZlMTI0LAotCTB4Y2U4NzI4OTksIDB4MTU4ZjNjNDIsIDB4YzkxYmRmMTksIDB4Y2Q4YzI3NWYsCi0JMHgxNGQxM2M4NCwgMHhjYTViZGQxYSwgMHhjYzk5MjYxZiwgMHgxNDEzM2NjNSwKLQkweGNiYWRkYjI2LCAweGNiYWQyNGRhLCAweDEzNTQzZDAyLCAweGNkMTJkOTQwLAotCTB4Y2FjYTIzOGUsIDB4MTI5NDNkM2UsIDB4Y2U4N2Q3NjcsIDB4YzllZTIyM2QsCi0JMHgxMWQzM2Q3NywgMHhkMDBmZDU5YiwgMHhjOTFiMjBlNywgMHgxMTExM2RhZSwKLQkweGQxYTZkM2RmLCAweGM4NTExZjhiLCAweDEwNGYzZGUyLCAweGQzNGVkMjMyLAotCTB4Yzc4ZjFlMmIsIDB4MGY4YzNlMTQsIDB4ZDUwNmQwOTUsIDB4YzZkNjFjYzYsCi0JMHgwZWM5M2U0NCwgMHhkNmNjY2YwOCwgMHhjNjI2MWI1ZCwgMHgwZTA1M2U3MSwKLQkweGQ4YTFjZDhjLCAweGM1N2UxOWVmLCAweDBkNDEzZTljLCAweGRhODNjYzIyLAotCTB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIDB4ZGM3MmNhY2EsIDB4YzQ0YTE3MDgsCi0JMHgwYmI2M2VlYiwgMHhkZTZlYzk4NCwgMHhjM2JlMTU4ZiwgMHgwYWYxM2YwZSwKLQkweGUwNzVjODUxLCAweGMzM2IxNDEzLCAweDBhMmEzZjJmLCAweGUyODdjNzMxLAotCTB4YzJjMjEyOTQsIDB4MDk2NDNmNGUsIDB4ZTRhM2M2MjYsIDB4YzI1MjExMTEsCi0JMHgwODljM2Y2YSwgMHhlNmM5YzUyZSwgMHhjMWVjMGY4YywgMHgwN2Q1M2Y4NCwKLQkweGU4ZjhjNDRhLCAweGMxOGYwZTA1LCAweDA3MGQzZjljLCAweGViMmZjMzdjLAotCTB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsIDB4ZWQ2Y2MyYzIsIDB4YzBmMjBhZjEsCi0JMHgwNTdkM2ZjMywgMHhlZmIxYzIxZSwgMHhjMGIyMDk2NCwgMHgwNGI1M2ZkMywKLQkweGYxZmJjMThmLCAweGMwN2MwN2Q1LCAweDAzZWMzZmUxLCAweGY0NGFjMTE1LAotCTB4YzA0ZjA2NDUsIDB4MDMyMzNmZWMsIDB4ZjY5Y2MwYjIsIDB4YzAyZDA0YjUsCi0JMHgwMjViM2ZmNCwgMHhmOGYzYzA2NCwgMHhjMDE0MDMyMywgMHgwMTkyM2ZmYiwKLQkweGZiNGJjMDJkLCAweGMwMDUwMTkyLCAweDAwYzkzZmZlLCAweGZkYTVjMDBjCi19OwotCi1jb25zdCBpbnQgdHdpZFRhYjY0Wyg0KjYgKyAxNio2KS8yXSA9IHsKLQkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEyZDQxLAotCTB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsCi0JMHhkMmJmMmQ0MSwgMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywKLQotCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4M2VjNTBjN2MsCi0JMHgzZmIxMDY0NSwgMHgzZDNlMTI5NCwgMHgzYjIwMTg3ZCwgMHgzZWM1MGM3YywKLQkweDM1MzYyMzhlLCAweDM1MzYyMzhlLCAweDNkM2UxMjk0LCAweDI4OTkzMTc5LAotCTB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MjM4ZTM1MzYsCi0JMHgzODcxMWUyYiwgMHgwNjQ1M2ZiMSwgMHgxODdkM2IyMCwgMHgzNTM2MjM4ZSwKLQkweGYzODQzZWM1LCAweDBjN2MzZWM1LCAweDMxNzkyODk5LCAweGUxZDUzODcxLAotCTB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIDB4ZDJiZjJkNDEsIDB4ZjM4NDNlYzUsCi0JMHgyODk5MzE3OSwgMHhjNzhmMWUyYiwgMHhlNzgzM2IyMCwgMHgyMzhlMzUzNiwKLQkweGMxM2IwYzdjLCAweGRjNzIzNTM2LCAweDFlMmIzODcxLCAweGMwNGZmOWJiLAotCTB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIDB4YzRlMGU3ODMsIDB4Y2FjYTIzOGUsCi0JMHgxMjk0M2QzZSwgMHhjZTg3ZDc2NywgMHhjNGUwMTg3ZCwgMHgwYzdjM2VjNSwKLQkweGRjNzJjYWNhLCAweGMxM2IwYzdjLCAweDA2NDUzZmIxLCAweGVkNmNjMmMyCi19OwotCi0jZWxpZiBkZWZpbmVkIEFSTVY3TmVvbgotLyoKLSAqICBRMjkgZm9yIDEyOCBhbmQgMTAyNAotICoKLSAqIGZvciAoaSA9IDA7IGkgPCBudW0vNDsgaSsrKSB7Ci0gKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwotICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDI5KTsKLSAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAyOSk7Ci0gKgotICogICBhbmdsZSA9IChudW0vMiAtIDEgLSBpICsgMC4xMjUpICogTV9QSSAvIG51bTsKLSAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAyOSk7Ci0gKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMjkpOwotICogfQotICovCi1jb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdID0gewotCS8qIDEyOCAqLwotCTB4MWZmZmY2MjEsIDB4MDAxOTIxZjksIDB4MDBhZmVhNjksIDB4MWZmZTFjNjgsIDB4MWZmY2UwOWQsIDB4MDBlMjJhN2EsIDB4MDE3OGRiYWEsIDB4MWZmNzUzYmIsCi0JMHgxZmY0ZGM1NSwgMHgwMWFiMTAxYywgMHgwMjQxOTJjZiwgMHgxZmViOWQyNSwgMHgxZmU3ZWE4NSwgMHgwMjczYjNlMiwgMHgwMzA5ZjBlMiwgMHgxZmRhZmE3NSwKLQkweDFmZDYwZDJlLCAweDAzM2JmNmRkLCAweDAzZDFkNzAwLCAweDFmYzU2ZTNiLCAweDFmYmY0NzBmLCAweDA0MDNiYTJiLCAweDA0OTkyNjUzLCAweDFmYWFmYmNiLAotCTB4MWZhMzliYWMsIDB4MDRjYWRlZmUsIDB4MDU1ZmMwMjIsIDB4MWY4YmE3MzgsIDB4MWY4MzBmNGEsIDB4MDU5MTQ2YTEsIDB4MDYyNTg1Y2EsIDB4MWY2Nzc1NTcsCi0JMHgxZjVkYTZlZCwgMHgwNjU2ZDI3YSwgMHgwNmVhNThjZCwgMHgxZjNlNmJiYywgMHgxZjMzNjg1YSwgMHgwNzFiNjQxNSwgMHgwN2FlMWFkMiwgMHgxZjEwOTBiZCwKLQkweDFmMDQ1YTE1LCAweDA3ZGVkZDIwLCAweDA4NzBhZGE3LCAweDFlZGRlYjZhLCAweDFlZDA4MzVmLCAweDA4YTExZjc4LCAweDA5MzFmMzRkLCAweDFlYTY4Mzk0LAotCTB4MWU5N2VjMzYsIDB4MDk2MjBkMjcsIDB4MDlmMWNkZjUsIDB4MWU2YTYxYzUsIDB4MWU1YTlkNTUsIDB4MGEyMTg4NmUsIDB4MGFiMDIwMDksIDB4MWUyOThmNDQsCi0JMHgxZTE4YTAzMCwgMHgwYWRmNzNjNiwgMHgwYjZjY2MzMiwgMHgxZGU0MTYwZiwgMHgxZGQxZmVmNCwgMHgwYjliYjFlNSwgMHgwYzI3YjU1NSwgMHgxZDlhMDBkZSwKLQkweDFkODZjNDg0LCAweDBjNTYyNWMzLCAweDBjZTBiZWEyLCAweDFkNGI1YjFiLCAweDFkMzZmYzdjLCAweDBkMGViMmEyLCAweDBkOTdjYjhmLCAweDFjZjgzMGU5LAotCTB4MWNlMmIzMjgsIDB4MGRjNTNjMGEsIDB4MGU0Y2JmZTIsIDB4MWNhMDhmMWEsIDB4MWM4OWY1ODcsIDB4MGU3OWE1ZDcsIDB4MGVmZjdmYjMsIDB4MWM0NDgzMzEsCi0JMHgxYzJjZDE0OSwgMHgwZjJiZDQzNywgMHgwZmFmZWY3MywgMHgxYmU0MWI2MSwgMHgxYmNiNTRjYiwgMHgwZmRiYWJhZSwgMHgxMDVkZjNlYywgMHgxYjdmNjY4NywKLQkweDFiNjU4ZjE1LCAweDEwODkxMTIwLCAweDExMDk3MjQ5LCAweDFiMTY3NDJhLCAweDFhZmI4ZmQ5LCAweDExMzNlOWQwLCAweDExYjI1MDE3LCAweDFhYTk1NDdhLAotCTB4MWE4ZDY3NmUsIDB4MTFkYzFiNjUsIDB4MTI1ODczNGQsIDB4MWEzODE4NGEsIDB4MWExYjI2ZDMsIDB4MTI4MThiZWYsIDB4MTJmYmMyNGIsIDB4MTljMmQxMTEsCi0JMHgxOWE0ZGZhNCwgMHgxMzI0MjFlYywgMHgxMzljMjNlNCwgMHgxOTQ5OTBlNCwgMHgxOTJhYTQyMCwgMHgxM2MzYzQ0YSwgMHgxNDM5N2Y1YiwgMHgxOGNjNmE3NSwKLQkweDE4YWM4NzFmLCAweDE0NjA1YTY5LCAweDE0ZDNiYzZkLCAweDE4NGI3MTEyLCAweDE4MmE5YzE0LCAweDE0ZjljYzI2LCAweDE1NmFjMzUyLCAweDE3YzZiODlkLAotCTB4MTdhNGY3MDgsIDB4MTU5MDAxZDYsIDB4MTVmZTdjYmUsIDB4MTczZTU1OGUsIDB4MTcxYmFjOTYsIDB4MTYyMmU0NTAsIDB4MTY4ZWQxZWIsIDB4MTZiMjVjZWQsCi0JLyogMTAyNCAqLwotCTB4MWZmZmZmZDksIDB4MDAwMzI0M2YsIDB4MDAxNWZkYmEsIDB4MWZmZmY4NzIsIDB4MWZmZmYzODIsIDB4MDAxYzQ2MzcsIDB4MDAyZjFmYTYsIDB4MWZmZmRkNGQsCi0JMHgxZmZmZDM2ZiwgMHgwMDM1NjgxZCwgMHgwMDQ4NDE3NSwgMHgxZmZmYWU2YywgMHgxZmZmOWY5ZSwgMHgwMDRlODllMywgMHgwMDYxNjMxOCwgMHgxZmZmNmJjZSwKLQkweDFmZmY1ODExLCAweDAwNjdhYjc3LCAweDAwN2E4NDdlLCAweDFmZmYxNTcyLCAweDFmZmVmY2M2LCAweDAwODBjY2NjLCAweDAwOTNhNTk5LCAweDFmZmVhYjViLAotCTB4MWZmZThkYmYsIDB4MDA5OWVkZDIsIDB4MDBhY2M2NTgsIDB4MWZmZTJkODYsIDB4MWZmZTBhZmMsIDB4MDBiMzBlNzgsIDB4MDBjNWU2YWQsIDB4MWZmZDliZjYsCi0JMHgxZmZkNzQ3YywgMHgwMGNjMmViMCwgMHgwMGRmMDY4OCwgMHgxZmZjZjZhYSwgMHgxZmZjY2E0MSwgMHgwMGU1NGU2YSwgMHgwMGY4MjVkYSwgMHgxZmZjM2RhMiwKLQkweDFmZmMwYzRiLCAweDAwZmU2ZDk3LCAweDAxMTE0NDkyLCAweDFmZmI3MGUwLCAweDFmZmIzYTlhLCAweDAxMTc4YzI3LCAweDAxMmE2MmEyLCAweDFmZmE5MDYzLAotCTB4MWZmYTU1MmUsIDB4MDEzMGFhMGEsIDB4MDE0MzdmZmEsIDB4MWZmOTljMmMsIDB4MWZmOTVjMDksIDB4MDE0OWM3MzEsIDB4MDE1YzljOGEsIDB4MWZmODk0M2MsCi0JMHgxZmY4NGYyYiwgMHgwMTYyZTM4ZCwgMHgwMTc1Yjg0MywgMHgxZmY3Nzg5MywgMHgxZmY3MmU5NCwgMHgwMTdiZmYwZSwgMHgwMThlZDMxNiwgMHgxZmY2NDkzMiwKLQkweDFmZjVmYTQ2LCAweDAxOTUxOWE1LCAweDAxYTdlY2YyLCAweDFmZjUwNjFiLCAweDFmZjRiMjQwLCAweDAxYWUzMzQxLCAweDAxYzEwNWM5LCAweDFmZjNhZjRjLAotCTB4MWZmMzU2ODQsIDB4MDFjNzRiZDUsIDB4MDFkYTFkOGMsIDB4MWZmMjQ0YzgsIDB4MWZmMWU3MTMsIDB4MDFlMDYzNGYsIDB4MDFmMzM0MjksIDB4MWZmMGM2OGYsCi0JMHgxZmYwNjNlZCwgMHgwMWY5NzlhMSwgMHgwMjBjNDk5MywgMHgxZmVmMzRhMywgMHgxZmVlY2QxNCwgMHgwMjEyOGViYiwgMHgwMjI1NWRiOSwgMHgxZmVkOGYwMywKLQkweDFmZWQyMjg3LCAweDAyMmJhMjhmLCAweDAyM2U3MDhkLCAweDFmZWJkNWIyLCAweDFmZWI2NDRhLCAweDAyNDRiNTBiLCAweDAyNTc4MWZlLCAweDFmZWEwOGIwLAotCTB4MWZlOTkyNWMsIDB4MDI1ZGM2MjEsIDB4MDI3MDkxZmQsIDB4MWZlODI3ZmUsIDB4MWZlN2FjYmUsIDB4MDI3NmQ1YzEsIDB4MDI4OWEwN2IsIDB4MWZlNjMzOWQsCi0JMHgxZmU1YjM3MiwgMHgwMjhmZTNkZCwgMHgwMmEyYWQ2OSwgMHgxZmU0MmI5MCwgMHgxZmUzYTY3OSwgMHgwMmE4ZjA2MywgMHgwMmJiYjhiNiwgMHgxZmUyMGZkNiwKLQkweDFmZTE4NWQ1LCAweDAyYzFmYjQ2LCAweDAyZDRjMjUzLCAweDFmZGZlMDcxLCAweDFmZGY1MTg2LCAweDAyZGIwNDc1LCAweDAyZWRjYTMyLCAweDFmZGQ5ZDY0LAotCTB4MWZkZDA5OGUsIDB4MDJmNDBiZTIsIDB4MDMwNmQwNDIsIDB4MWZkYjQ2YWUsIDB4MWZkYWFkZWUsIDB4MDMwZDExN2MsIDB4MDMxZmQ0NzQsIDB4MWZkOGRjNTEsCi0JMHgxZmQ4M2VhOCwgMHgwMzI2MTUzNCwgMHgwMzM4ZDZiOCwgMHgxZmQ2NWU0ZiwgMHgxZmQ1YmJiZCwgMHgwMzNmMTZmYiwgMHgwMzUxZDcwMCwgMHgxZmQzY2NhYSwKLQkweDFmZDMyNTMwLCAweDAzNTgxNmMxLCAweDAzNmFkNTNjLCAweDFmZDEyNzYzLCAweDFmZDA3YjAwLCAweDAzNzExNDc3LCAweDAzODNkMTVjLCAweDFmY2U2ZTdjLAotCTB4MWZjZGJkMzEsIDB4MDM4YTEwMGUsIDB4MDM5Y2NiNTEsIDB4MWZjYmExZjUsIDB4MWZjYWViYzMsIDB4MDNhMzA5NzUsIDB4MDNiNWMzMGIsIDB4MWZjOGMxZDIsCi0JMHgxZmM4MDZiOSwgMHgwM2JjMDA5ZiwgMHgwM2NlYjg3YywgMHgxZmM1Y2UxNCwgMHgxZmM1MGUxNCwgMHgwM2Q0ZjU3YSwgMHgwM2U3YWI5MywgMHgxZmMyYzZiZCwKLQkweDFmYzIwMWQ3LCAweDAzZWRlN2Y5LCAweDA0MDA5YzQyLCAweDFmYmZhYmNkLCAweDFmYmVlMjAyLCAweDA0MDZkODBiLCAweDA0MTk4YTc4LCAweDFmYmM3ZDQ5LAotCTB4MWZiYmFlOTksIDB4MDQxZmM1YTEsIDB4MDQzMjc2MjgsIDB4MWZiOTNiMzEsIDB4MWZiODY3OWMsIDB4MDQzOGIwYWMsIDB4MDQ0YjVmNDAsIDB4MWZiNWU1ODcsCi0JMHgxZmI1MGQwZSwgMHgwNDUxOTkxZCwgMHgwNDY0NDViMiwgMHgxZmIyN2M0ZSwgMHgxZmIxOWVmMSwgMHgwNDZhN2VlMywgMHgwNDdkMjk2ZiwgMHgxZmFlZmY4NywKLQkweDFmYWUxZDQ3LCAweDA0ODM2MWYwLCAweDA0OTYwYTY3LCAweDFmYWI2ZjM1LCAweDFmYWE4ODEzLCAweDA0OWM0MjM1LCAweDA0YWVlODhiLCAweDFmYTdjYjVhLAotCTB4MWZhNmRmNTYsIDB4MDRiNTFmYTEsIDB4MDRjN2MzY2IsIDB4MWZhNDEzZjgsIDB4MWZhMzIzMTMsIDB4MDRjZGZhMjYsIDB4MDRlMDljMTgsIDB4MWZhMDQ5MTIsCi0JMHgxZjlmNTM0YywgMHgwNGU2ZDFiNCwgMHgwNGY5NzE2MywgMHgxZjljNmFhOSwgMHgxZjliNzAwMywgMHgwNGZmYTYzYywgMHgwNTEyNDM5ZCwgMHgxZjk4NzhjMSwKLQkweDFmOTc3OTNiLCAweDA1MTg3N2FmLCAweDA1MmIxMmI2LCAweDFmOTQ3MzViLCAweDFmOTM2ZWY2LCAweDA1MzE0NWZkLCAweDA1NDNkZTllLCAweDFmOTA1YTdhLAotCTB4MWY4ZjUxMzcsIDB4MDU0YTExMTcsIDB4MDU1Y2E3NDgsIDB4MWY4YzJlMjEsIDB4MWY4YjIwMDAsIDB4MDU2MmQ4ZWUsIDB4MDU3NTZjYTIsIDB4MWY4N2VlNTIsCi0JMHgxZjg2ZGI1NSwgMHgwNTdiOWQ3MywgMHgwNThlMmU5ZiwgMHgxZjgzOWIxMCwgMHgxZjgyODMzNiwgMHgwNTk0NWU5NSwgMHgwNWE2ZWQyZSwgMHgxZjdmMzQ1ZSwKLQkweDFmN2UxN2E4LCAweDA1YWQxYzQ3LCAweDA1YmZhODQwLCAweDFmN2FiYTNlLCAweDFmNzk5OGFkLCAweDA1YzVkNjc4LCAweDA1ZDg1ZmM3LCAweDFmNzYyY2IyLAotCTB4MWY3NTA2NDcsIDB4MDVkZThkMTksIDB4MDVmMTEzYjMsIDB4MWY3MThiYmYsIDB4MWY3MDYwN2EsIDB4MDVmNzQwMWMsIDB4MDYwOWMzZjUsIDB4MWY2Y2Q3NjYsCi0JMHgxZjZiYTc0OCwgMHgwNjBmZWY3MSwgMHgwNjIyNzA3ZCwgMHgxZjY4MGZhYiwgMHgxZjY2ZGFiNSwgMHgwNjI4OWIwOCwgMHgwNjNiMTkzYywgMHgxZjYzMzQ5MCwKLQkweDFmNjFmYWMzLCAweDA2NDE0MmQzLCAweDA2NTNiZTIzLCAweDFmNWU0NjE5LCAweDFmNWQwNzc1LCAweDA2NTllNmMyLCAweDA2NmM1ZjI0LCAweDFmNTk0NDQ4LAotCTB4MWY1ODAwY2UsIDB4MDY3Mjg2YzYsIDB4MDY4NGZjMmUsIDB4MWY1NDJmMjEsIDB4MWY1MmU2ZDIsIDB4MDY4YjIyZDAsIDB4MDY5ZDk1MzIsIDB4MWY0ZjA2YTYsCi0JMHgxZjRkYjk4MywgMHgwNmEzYmFkMCwgMHgwNmI2MmEyMiwgMHgxZjQ5Y2FkYywgMHgxZjQ4NzhlNSwgMHgwNmJjNGViOSwgMHgwNmNlYmFlZSwgMHgxZjQ0N2JjNCwKLQkweDFmNDMyNGZiLCAweDA2ZDRkZTc5LCAweDA2ZTc0Nzg2LCAweDFmM2YxOTYzLCAweDFmM2RiZGM4LCAweDA2ZWQ2YTAzLCAweDA2ZmZjZmRkLCAweDFmMzlhM2JjLAotCTB4MWYzODQzNTAsIDB4MDcwNWYxNDcsIDB4MDcxODUzZTMsIDB4MWYzNDFhZDIsIDB4MWYzMmI1OTUsIDB4MDcxZTc0MzYsIDB4MDczMGQzODgsIDB4MWYyZTdlYTksCi0JMHgxZjJkMTQ5ZCwgMHgwNzM2ZjJjMCwgMHgwNzQ5NGViZCwgMHgxZjI4Y2Y0MywgMHgxZjI3NjA2OSwgMHgwNzRmNmNkNywgMHgwNzYxYzU3NCwgMHgxZjIzMGNhNSwKLQkweDFmMjE5OGZkLCAweDA3NjdlMjZjLCAweDA3N2EzNzlkLCAweDFmMWQzNmQyLCAweDFmMWJiZTVkLCAweDA3ODA1MzcwLCAweDA3OTJhNTJhLCAweDFmMTc0ZGNlLAotCTB4MWYxNWQwOGQsIDB4MDc5OGJmZDMsIDB4MDdhYjBlMGEsIDB4MWYxMTUxOWMsIDB4MWYwZmNmOTEsIDB4MDdiMTI3ODYsIDB4MDdjMzcyMzAsIDB4MWYwYjQyNDAsCi0JMHgxZjA5YmI2YiwgMHgwN2M5OGE3YSwgMHgwN2RiZDE4YywgMHgxZjA1MWZiZSwgMHgxZjAzOTQxZiwgMHgwN2UxZThhMSwgMHgwN2Y0MmMwZSwgMHgxZWZlZWExOSwKLQkweDFlZmQ1OWIzLCAweDA3ZmE0MWViLCAweDA4MGM4MWE5LCAweDFlZjhhMTU1LCAweDFlZjcwYzI4LCAweDA4MTI5NjRhLCAweDA4MjRkMjRkLCAweDFlZjI0NTc3LAotCTB4MWVmMGFiODQsIDB4MDgyYWU1YWQsIDB4MDgzZDFkZWEsIDB4MWVlYmQ2ODIsIDB4MWVlYTM3Y2EsIDB4MDg0MzMwMDcsIDB4MDg1NTY0NzMsIDB4MWVlNTU0N2EsCi0JMHgxZWUzYjBmZSwgMHgwODViNzU0OCwgMHgwODZkYTVkOCwgMHgxZWRlYmY2NCwgMHgxZWRkMTcyNCwgMHgwODczYjU2MiwgMHgwODg1ZTIwOSwgMHgxZWQ4MTc0MiwKLQkweDFlZDY2YTQxLCAweDA4OGJmMDQ0LCAweDA4OWUxOGY5LCAweDFlZDE1YzFhLCAweDFlY2ZhYTU3LCAweDA4YTQyNWUxLCAweDA4YjY0YTk4LCAweDFlY2E4ZGVmLAotCTB4MWVjOGQ3NmMsIDB4MDhiYzU2MmEsIDB4MDhjZTc2ZDgsIDB4MWVjM2FjYzYsIDB4MWVjMWYxODQsIDB4MDhkNDgxMGYsIDB4MDhlNjlkYTgsIDB4MWViY2I4YTMsCi0JMHgxZWJhZjhhMywgMHgwOGVjYTY4MSwgMHgwOGZlYmVmYiwgMHgxZWI1YjE4YSwgMHgxZWIzZWNjZCwgMHgwOTA0YzY3MywgMHgwOTE2ZGFjMiwgMHgxZWFlOTc3ZiwKLQkweDFlYWNjZTA3LCAweDA5MWNlMGQ0LCAweDA5MmVmMGVkLCAweDFlYTc2YTg3LCAweDFlYTU5YzU1LCAweDA5MzRmNTk2LCAweDA5NDcwMTZlLCAweDFlYTAyYWE3LAotCTB4MWU5ZTU3YmIsIDB4MDk0ZDA0YWEsIDB4MDk1ZjBjMzYsIDB4MWU5OGQ3ZTIsIDB4MWU5NzAwM2UsIDB4MDk2NTBlMDEsIDB4MDk3NzExMzYsIDB4MWU5MTcyM2UsCi0JMHgxZThmOTVlMywgMHgwOTdkMTE4ZCwgMHgwOThmMTA2MCwgMHgxZTg5ZjliZiwgMHgxZTg4MThhZCwgMHgwOTk1MGYzZiwgMHgwOWE3MDlhNCwgMHgxZTgyNmU2OSwKLQkweDFlODA4OGEyLCAweDA5YWQwNzA3LCAweDA5YmVmY2Y0LCAweDFlN2FkMDQxLCAweDFlNzhlNWM3LCAweDA5YzRmOGQ4LCAweDA5ZDZlYTQwLCAweDFlNzMxZjRjLAotCTB4MWU3MTMwMWYsIDB4MDlkY2U0YTEsIDB4MDllZWQxN2IsIDB4MWU2YjViOGYsIDB4MWU2OTY3YjEsIDB4MDlmNGNhNTYsIDB4MGEwNmIyOTYsIDB4MWU2Mzg1MGUsCi0JMHgxZTYxOGM4MCwgMHgwYTBjYTllNiwgMHgwYTFlOGQ4MSwgMHgxZTViOWJjZSwgMHgxZTU5OWU5MSwgMHgwYTI0ODM0MywgMHgwYTM2NjIyZSwgMHgxZTUzOWZkNCwKLQkweDFlNTE5ZGVhLCAweDBhM2M1NjVlLCAweDBhNGUzMDhmLCAweDFlNGI5MTI2LCAweDFlNDk4YThlLCAweDBhNTQyMzI5LCAweDBhNjVmODk0LCAweDFlNDM2ZmM3LAotCTB4MWU0MTY0ODUsIDB4MGE2YmU5OTUsIDB4MGE3ZGJhMmYsIDB4MWUzYjNiYmQsIDB4MWUzOTJiZDEsIDB4MGE4M2E5OTMsIDB4MGE5NTc1NTEsIDB4MWUzMmY1MGUsCi0JMHgxZTMwZTA3OSwgMHgwYTliNjMxNSwgMHgwYWFkMjllYywgMHgxZTJhOWJiZCwgMHgxZTI4ODI4MSwgMHgwYWIzMTYwYywgMHgwYWM0ZDdmMSwgMHgxZTIyMmZkMSwKLQkweDFlMjAxMWVlLCAweDBhY2FjMjZhLCAweDBhZGM3ZjUyLCAweDFlMTliMTRmLCAweDFlMTc4ZWM3LCAweDBhZTI2ODFmLCAweDBhZjQxZmZmLCAweDFlMTEyMDNiLAotCTB4MWUwZWY5MTAsIDB4MGFmYTA3MWQsIDB4MGIwYmI5ZWIsIDB4MWUwODdjOWIsIDB4MWUwNjUwY2UsIDB4MGIxMTlmNTYsIDB4MGIyMzRkMDcsIDB4MWRmZmM2NzQsCi0JMHgxZGZkOTYwNiwgMHgwYjI5MzBiYiwgMHgwYjNhZDk0MywgMHgxZGY2ZmRjYywgMHgxZGY0YzhiZiwgMHgwYjQwYmIzZSwgMHgwYjUyNWU5MiwgMHgxZGVlMjJhOSwKLQkweDFkZWJlOGZkLCAweDBiNTgzZWNmLCAweDBiNjlkY2U2LCAweDFkZTUzNTBmLCAweDFkZTJmNmM2LCAweDBiNmZiYjYyLCAweDBiODE1NDJmLCAweDFkZGMzNTA0LAotCTB4MWRkOWYyMjAsIDB4MGI4NzMwZTYsIDB4MGI5OGM0NWYsIDB4MWRkMzIyOGUsIDB4MWRkMGRiMTAsIDB4MGI5ZTlmNGQsIDB4MGJiMDJkNjgsIDB4MWRjOWZkYjIsCi0JMHgxZGM3YjE5YiwgMHgwYmI2MDY4YSwgMHgwYmM3OGYzYiwgMHgxZGMwYzY3NiwgMHgxZGJlNzVjOCwgMHgwYmNkNjY4ZSwgMHgwYmRlZTljYSwgMHgxZGI3N2NkZiwKLQkweDFkYjUyNzljLCAweDBiZTRiZjRhLCAweDBiZjYzZDA3LCAweDFkYWUyMGY0LCAweDFkYWJjNzFkLCAweDBiZmMxMGFmLCAweDBjMGQ4OGUyLCAweDFkYTRiMmJhLAotCTB4MWRhMjU0NTAsIDB4MGMxMzVhYjAsIDB4MGMyNGNkNGUsIDB4MWQ5YjMyMzcsIDB4MWQ5OGNmM2IsIDB4MGMyYTlkM2UsIDB4MGMzYzBhM2QsIDB4MWQ5MTlmNzAsCi0JMHgxZDhmMzdlNSwgMHgwYzQxZDg0YiwgMHgwYzUzM2ZhMCwgMHgxZDg3ZmE2ZCwgMHgxZDg1OGU1MywgMHgwYzU5MGJjOSwgMHgwYzZhNmQ2OCwgMHgxZDdlNDMzMiwKLQkweDFkN2JkMjhiLCAweDBjNzAzN2E4LCAweDBjODE5Mzg4LCAweDFkNzQ3OWM1LCAweDFkNzIwNDkzLCAweDBjODc1YmRiLCAweDBjOThiMWYwLCAweDFkNmE5ZTJlLAotCTB4MWQ2ODI0NzIsIDB4MGM5ZTc4NTQsIDB4MGNhZmM4OTQsIDB4MWQ2MGIwNzAsIDB4MWQ1ZTMyMmMsIDB4MGNiNThkMDQsIDB4MGNjNmQ3NjQsIDB4MWQ1NmIwOTQsCi0JMHgxZDU0MmRjOSwgMHgwY2NjOTlkZSwgMHgwY2RkZGU1MywgMHgxZDRjOWU5ZiwgMHgxZDRhMTc0ZiwgMHgwY2UzOWVkMiwgMHgwY2Y0ZGQ1MiwgMHgxZDQyN2E5NywKLQkweDFkM2ZlZWMzLCAweDBjZmE5YmQyLCAweDBkMGJkNDUyLCAweDFkMzg0NDgzLCAweDFkMzViNDJkLCAweDBkMTE5MGQxLCAweDBkMjJjMzQ3LCAweDFkMmRmYzY4LAotCTB4MWQyYjY3OTEsIDB4MGQyODdkYzEsIDB4MGQzOWFhMjEsIDB4MWQyM2EyNGUsIDB4MWQyMTA4ZjgsIDB4MGQzZjYyOTIsIDB4MGQ1MDg4ZDMsIDB4MWQxOTM2M2EsCi0JMHgxZDE2OTg2NywgMHgwZDU2M2YzOCwgMHgwZDY3NWY0ZSwgMHgxZDBlYjgzMywgMHgxZDBjMTVlNCwgMHgwZDZkMTNhMywgMHgwZDdlMmQ4NSwgMHgxZDA0MjgzZiwKLQkweDFkMDE4MTc2LCAweDBkODNkZmM2LCAweDBkOTRmMzY5LCAweDFjZjk4NjY2LCAweDFjZjZkYjI0LCAweDBkOWFhMzkzLCAweDBkYWJiMGVjLCAweDFjZWVkMmFkLAotCTB4MWNlYzIyZjQsIDB4MGRiMTVlZmMsIDB4MGRjMjY2MDAsIDB4MWNlNDBkMWIsIDB4MWNlMTU4ZWQsIDB4MGRjODExZjMsIDB4MGRkOTEyOTgsIDB4MWNkOTM1YjcsCi0JMHgxY2Q2N2QxNSwgMHgwZGRlYmM2OSwgMHgwZGVmYjZhNSwgMHgxY2NlNGM4NywgMHgxY2NiOGY3NCwgMHgwZGY1NWU1MSwgMHgwZTA2NTIxOSwgMHgxY2MzNTE5MiwKLQkweDFjYzA5MDBmLCAweDBlMGJmNzljLCAweDBlMWNlNGU2LCAweDFjYjg0NGRmLCAweDFjYjU3ZWVlLCAweDBlMjI4ODNlLCAweDBlMzM2ZWZmLCAweDFjYWQyNjc1LAotCTB4MWNhYTVjMTcsIDB4MGUzOTEwMjcsIDB4MGU0OWYwNTUsIDB4MWNhMWY2NWIsIDB4MWM5ZjI3OTIsIDB4MGU0ZjhmNGIsIDB4MGU2MDY4ZGIsIDB4MWM5NmI0OTcsCi0JMHgxYzkzZTE2NSwgMHgwZTY2MDU5YSwgMHgwZTc2ZDg4MywgMHgxYzhiNjEzMSwgMHgxYzg4ODk5NywgMHgwZTdjNzMwOCwgMHgwZThkM2YzZSwgMHgxYzdmZmMyZiwKLQkweDFjN2QyMDJmLCAweDBlOTJkNzg3LCAweDBlYTM5ZDAwLCAweDFjNzQ4NTk5LCAweDFjNzFhNTM1LCAweDBlYTkzMzA4LCAweDBlYjlmMWJhLCAweDFjNjhmZDc1LAotCTB4MWM2NjE4YWUsIDB4MGViZjg1N2QsIDB4MGVkMDNkNWUsIDB4MWM1ZDYzY2EsIDB4MWM1YTdhYTQsIDB4MGVkNWNlZGEsIDB4MGVlNjdmZGYsIDB4MWM1MWI4YTEsCi0JMHgxYzRlY2IxYywgMHgwZWVjMGYxMCwgMHgwZWZjYjkyZiwgMHgxYzQ1ZmMwMCwgMHgxYzQzMGExZCwgMHgwZjAyNDYxMiwgMHgwZjEyZTk0MSwgMHgxYzNhMmRlZCwKLQkweDFjMzczN2IwLCAweDBmMTg3M2QyLCAweDBmMjkxMDA2LCAweDFjMmU0ZTcyLCAweDFjMmI1M2RiLCAweDBmMmU5ODQyLCAweDBmM2YyZDcxLCAweDFjMjI1ZDk0LAotCTB4MWMxZjVlYTYsIDB4MGY0NGIzNTQsIDB4MGY1NTQxNzUsIDB4MWMxNjViNWIsIDB4MWMxMzU4MTgsIDB4MGY1YWM0ZmMsIDB4MGY2YjRjMDMsIDB4MWMwYTQ3Y2YsCi0JMHgxYzA3NDAzOCwgMHgwZjcwY2QyYSwgMHgwZjgxNGQwZSwgMHgxYmZlMjJmOCwgMHgxYmZiMTcwZiwgMHgwZjg2Y2JkMywgMHgwZjk3NDQ4OSwgMHgxYmYxZWNkYiwKLQkweDFiZWVkY2EyLCAweDBmOWNjMGU3LCAweDBmYWQzMjY1LCAweDFiZTVhNTgyLCAweDFiZTI5MGZiLCAweDBmYjJhYzVhLCAweDBmYzMxNjk3LCAweDFiZDk0Y2Y0LAotCTB4MWJkNjM0MjEsIDB4MGZjODhlMWUsIDB4MGZkOGYxMGYsIDB4MWJjY2UzMzcsIDB4MWJjOWM2MWEsIDB4MGZkZTY2MjYsIDB4MGZlZWMxYzAsIDB4MWJjMDY4NTUsCi0JMHgxYmJkNDZmMCwgMHgwZmY0MzQ2NCwgMHgxMDA0ODg5ZSwgMHgxYmIzZGM1NSwgMHgxYmIwYjZhOSwgMHgxMDA5ZjhjYiwgMHgxMDFhNDU5YSwgMHgxYmE3M2YzZCwKLQkweDFiYTQxNTRkLCAweDEwMWZiMzRkLCAweDEwMmZmOGE4LCAweDFiOWE5MTE3LCAweDFiOTc2MmU0LCAweDEwMzU2M2RjLCAweDEwNDVhMWI5LCAweDFiOGRkMWVhLAotCTB4MWI4YTlmNzcsIDB4MTA0YjBhNmMsIDB4MTA1YjQwYzEsIDB4MWI4MTAxYmUsIDB4MWI3ZGNiMGMsIDB4MTA2MGE2ZWYsIDB4MTA3MGQ1YjEsIDB4MWI3NDIwOWIsCi0JMHgxYjcwZTVhYywgMHgxMDc2Mzk1OCwgMHgxMDg2NjA3ZSwgMHgxYjY3MmU4OCwgMHgxYjYzZWY1ZiwgMHgxMDhiYzE5YSwgMHgxMDliZTExOSwgMHgxYjVhMmI4ZSwKLQkweDFiNTZlODJjLCAweDEwYTEzZmE2LCAweDEwYjE1Nzc1LCAweDFiNGQxN2I0LCAweDFiNDlkMDFjLCAweDEwYjZiMzcxLCAweDEwYzZjMzg1LCAweDFiM2ZmMzA0LAotCTB4MWIzY2E3MzcsIDB4MTBjYzFjZWMsIDB4MTBkYzI1M2MsIDB4MWIzMmJkODQsIDB4MWIyZjZkODUsIDB4MTBlMTdjMGIsIDB4MTBmMTdjOGQsIDB4MWIyNTc3M2QsCi0JMHgxYjIyMjMwZSwgMHgxMGY2ZDBjMCwgMHgxMTA2Yzk2YSwgMHgxYjE4MjAzOCwgMHgxYjE0YzdkYSwgMHgxMTBjMWFmZSwgMHgxMTFjMGJjNiwgMHgxYjBhYjg3YywKLQkweDFiMDc1YmYxLCAweDExMjE1YWI4LCAweDExMzE0Mzk1LCAweDFhZmQ0MDEyLCAweDFhZjlkZjVkLCAweDExMzY4ZmUxLCAweDExNDY3MGM4LCAweDFhZWZiNzAyLAotCTB4MWFlYzUyMjUsIDB4MTE0YmJhNmIsIDB4MTE1YjkzNTQsIDB4MWFlMjFkNTQsIDB4MWFkZWI0NTEsIDB4MTE2MGRhNGIsIDB4MTE3MGFiMmEsIDB4MWFkNDczMTEsCi0JMHgxYWQxMDVlOSwgMHgxMTc1ZWY3MiwgMHgxMTg1YjgzZiwgMHgxYWM2Yjg0MSwgMHgxYWMzNDZmOCwgMHgxMThhZjlkNCwgMHgxMTlhYmE4NCwgMHgxYWI4ZWNlYywKLQkweDFhYjU3Nzg0LCAweDExOWZmOTY0LCAweDExYWZiMWVlLCAweDFhYWIxMTFjLCAweDFhYTc5Nzk2LCAweDExYjRlZTE0LCAweDExYzQ5ZTZmLCAweDFhOWQyNGQ5LAotCTB4MWE5OWE3MzcsIDB4MTFjOWQ3ZDksIDB4MTFkOTdmZjksIDB4MWE4ZjI4MmIsIDB4MWE4YmE2NzAsIDB4MTFkZWI2YTQsIDB4MTFlZTU2ODIsIDB4MWE4MTFiMWIsCi0JMHgxYTdkOTU0OSwgMHgxMWYzOGE2YSwgMHgxMjAzMjFmYSwgMHgxYTcyZmRiMiwgMHgxYTZmNzNjYSwgMHgxMjA4NTMxYywgMHgxMjE3ZTI1NiwgMHgxYTY0Y2ZmOCwKLQkweDFhNjE0MWZkLCAweDEyMWQxMGFmLCAweDEyMmM5Nzg5LCAweDFhNTY5MWY1LCAweDFhNTJmZmViLCAweDEyMzFjMzE2LCAweDEyNDE0MTg2LCAweDFhNDg0M2I0LAotCTB4MWE0NGFkOWIsIDB4MTI0NjZhNDQsIDB4MTI1NWUwNDEsIDB4MWEzOWU1M2QsIDB4MWEzNjRiMTcsIDB4MTI1YjA2MmIsIDB4MTI2YTczYWMsIDB4MWEyYjc2OTgsCi0JMHgxYTI3ZDg2OCwgMHgxMjZmOTZjMSwgMHgxMjdlZmJiYiwgMHgxYTFjZjdjZSwgMHgxYTE5NTU5NywgMHgxMjg0MWJmNiwgMHgxMjkzNzg2MSwgMHgxYTBlNjhlOSwKLQkweDFhMGFjMmFjLCAweDEyOTg5NWMwLCAweDEyYTdlOTkxLCAweDE5ZmZjOWYxLCAweDE5ZmMxZmIxLCAweDEyYWQwNDEyLCAweDEyYmM0ZjQwLCAweDE5ZjExYWYwLAotCTB4MTllZDZjYWYsIDB4MTJjMTY2ZGUsIDB4MTJkMGE5NjAsIDB4MTllMjViZWUsIDB4MTlkZWE5YWUsIDB4MTJkNWJlMTgsIDB4MTJlNGY3ZTUsIDB4MTlkMzhjZjQsCi0JMHgxOWNmZDZiOCwgMHgxMmVhMDliNCwgMHgxMmY5M2FjMiwgMHgxOWM0YWUwYywgMHgxOWMwZjNkNiwgMHgxMmZlNDlhNiwgMHgxMzBkNzFlYiwgMHgxOWI1YmYzZiwKLQkweDE5YjIwMTExLCAweDEzMTI3ZGUwLCAweDEzMjE5ZDUzLCAweDE5YTZjMDk2LCAweDE5YTJmZTczLCAweDEzMjZhNjU2LCAweDEzMzViY2VmLCAweDE5OTdiMjFiLAotCTB4MTk5M2VjMDQsIDB4MTMzYWMyZmMsIDB4MTM0OWQwYjAsIDB4MTk4ODkzZDYsIDB4MTk4NGM5Y2UsIDB4MTM0ZWQzYzUsIDB4MTM1ZGQ4OGMsIDB4MTk3OTY1ZDAsCi0JMHgxOTc1OTdkYSwgMHgxMzYyZDhhNiwgMHgxMzcxZDQ3NiwgMHgxOTZhMjgxNSwgMHgxOTY2NTYzMiwgMHgxMzc2ZDE5MSwgMHgxMzg1YzQ2MSwgMHgxOTVhZGFhYiwKLQkweDE5NTcwNGRmLCAweDEzOGFiZTdiLCAweDEzOTlhODQxLCAweDE5NGI3ZDllLCAweDE5NDdhM2ViLCAweDEzOWU5ZjU2LCAweDEzYWQ4MDBhLCAweDE5M2MxMGY3LAotCTB4MTkzODMzNWUsIDB4MTNiMjc0MTcsIDB4MTNjMTRiYjAsIDB4MTkyYzk0YmYsIDB4MTkyOGIzNDMsIDB4MTNjNjNjYjIsIDB4MTNkNTBiMjYsIDB4MTkxZDA4ZmYsCi0JMHgxOTE5MjNhMywgMHgxM2Q5ZjkxYiwgMHgxM2U4YmU2MCwgMHgxOTBkNmRjMSwgMHgxOTA5ODQ4OCwgMHgxM2VkYTk0NCwgMHgxM2ZjNjU1MywgMHgxOGZkYzMxMCwKLQkweDE4ZjlkNWZhLCAweDE0MDE0ZDIzLCAweDE0MGZmZmYxLCAweDE4ZWUwOGY0LCAweDE4ZWExODA1LCAweDE0MTRlNGFhLCAweDE0MjM4ZTJmLCAweDE4ZGUzZjc3LAotCTB4MThkYTRhYjIsIDB4MTQyODZmY2UsIDB4MTQzNzEwMDEsIDB4MThjZTY2YTMsIDB4MThjYTZlMGEsIDB4MTQzYmVlODMsIDB4MTQ0YTg1NWIsIDB4MThiZTdlODIsCi0JMHgxOGJhODIxNywgMHgxNDRmNjBiZCwgMHgxNDVkZWUzMCwgMHgxOGFlODcxZSwgMHgxOGFhODZlMywgMHgxNDYyYzY3MCwgMHgxNDcxNGE3NiwgMHgxODllODA4MCwKLQkweDE4OWE3Yzc4LCAweDE0NzYxZjhmLCAweDE0ODQ5YTFmLCAweDE4OGU2YWIyLCAweDE4OGE2MmUwLCAweDE0ODk2YzBmLCAweDE0OTdkZDIwLCAweDE4N2U0NWJlLAotCTB4MTg3YTNhMjUsIDB4MTQ5Y2FiZTQsIDB4MTRhYjEzNmQsIDB4MTg2ZTExYWYsIDB4MTg2YTAyNTAsIDB4MTRhZmRmMDMsIDB4MTRiZTNjZmEsIDB4MTg1ZGNlOGUsCi0JMHgxODU5YmI2YywgMHgxNGMzMDU1ZSwgMHgxNGQxNTliYywgMHgxODRkN2M2NSwgMHgxODQ5NjU4MywgMHgxNGQ2MWVlYiwgMHgxNGU0NjlhNiwgMHgxODNkMWIzZSwKLQkweDE4MzkwMDllLCAweDE0ZTkyYjllLCAweDE0Zjc2Y2FkLCAweDE4MmNhYjI0LCAweDE4Mjg4Y2M4LCAweDE0ZmMyYjZhLCAweDE1MGE2MmM2LCAweDE4MWMyYzIwLAotCTB4MTgxODBhMGMsIDB4MTUwZjFlNDUsIDB4MTUxZDRiZTMsIDB4MTgwYjllM2QsIDB4MTgwNzc4NzMsIDB4MTUyMjA0MjIsIDB4MTUzMDI3ZmIsIDB4MTdmYjAxODUsCi0JMHgxN2Y2ZDgwNywgMHgxNTM0ZGNmNiwgMHgxNTQyZjcwMCwgMHgxN2VhNTYwMiwgMHgxN2U2MjhkMywgMHgxNTQ3YThiNSwgMHgxNTU1YjhlOCwgMHgxN2Q5OWJiZSwKLQkweDE3ZDU2YWUwLCAweDE1NWE2NzU0LCAweDE1Njg2ZGE3LCAweDE3YzhkMmM0LCAweDE3YzQ5ZTNiLCAweDE1NmQxOGM3LCAweDE1N2IxNTMyLCAweDE3YjdmYjFmLAotCTB4MTdiM2MyZWMsIDB4MTU3ZmJkMDMsIDB4MTU4ZGFmN2MsIDB4MTdhNzE0ZDcsIDB4MTdhMmQ4ZmUsIDB4MTU5MjUzZmIsIDB4MTVhMDNjN2EsIDB4MTc5NjFmZjksCi0JMHgxNzkxZTA3YiwgMHgxNWE0ZGRhNSwgMHgxNWIyYmMyMiwgMHgxNzg1MWM4ZSwgMHgxNzgwZDk2ZiwgMHgxNWI3NTlmNSwgMHgxNWM1MmU2NywgMHgxNzc0MGFhMSwKLQkweDE3NmZjM2UzLCAweDE1YzljOGUwLCAweDE1ZDc5MzNmLCAweDE3NjJlYTNkLCAweDE3NWU5ZmUyLCAweDE1ZGMyYTVhLCAweDE1ZTllYTlkLCAweDE3NTFiYjZiLAotCTB4MTc0ZDZkNzcsIDB4MTVlZTdlNTgsIDB4MTVmYzM0NzcsIDB4MTc0MDdlMzcsIDB4MTczYzJjYWMsIDB4MTYwMGM0Y2YsIDB4MTYwZTcwYzEsIDB4MTcyZjMyYWIsCi0JMHgxNzJhZGQ4YywgMHgxNjEyZmRiMywgMHgxNjIwOWY3MCwgMHgxNzFkZDhkMiwgMHgxNzE5ODAyMSwgMHgxNjI1MjhmYSwgMHgxNjMyYzA3OCwgMHgxNzBjNzBiNywKLQkweDE3MDgxNDc3LCAweDE2Mzc0Njk3LCAweDE2NDRkM2QwLCAweDE2ZmFmYTY0LCAweDE2ZjY5YTk3LCAweDE2NDk1NjgwLCAweDE2NTZkOTZhLCAweDE2ZTk3NWU0LAotCTB4MTZlNTEyOGUsIDB4MTY1YjU4YWEsIDB4MTY2OGQxM2UsIDB4MTZkN2UzNDEsIDB4MTZkMzdjNjUsIDB4MTY2ZDRkMGEsIDB4MTY3YWJiM2UsIDB4MTZjNjQyODgsCi0JMHgxNmMxZDgyNywgMHgxNjdmMzM5NCwgMHgxNjhjOTc2MCwgMHgxNmI0OTNjMiwgMHgxNmIwMjVlMCwgMHgxNjkxMGMzZCwgMHgxNjllNjU5YSwgMHgxNmEyZDZmYgotfTsKLQotY29uc3QgaW50IHR3aWRUYWI1MTJbOCo2ICsgMzIqNiArIDEyOCo2XSA9IHsKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwKLQkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUyNmY5NDMxLCAweDBjM2VmMTUzLAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywKLQotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmY2MjFlMywgMHgwMTkxZjY1ZiwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LAotCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsCi0JMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZjBhN2VmYywgMHgwN2M2N2U1ZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTIxMjEwNSwgMHgwYWM3Y2QzYiwKLQkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsCi0JMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYjcyODM0NSwgMHgxMDczODc5OSwKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweGZlNmUwOWExLCAweDFmZjYyMWUzLAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsCi0JMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOWIzZTA0OCwgMHgxMzBmZjdmZCwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwKLQkweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGY1MzgzMmM1LCAweDFlMjEyMTA1LCAweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAweGVjZjAwODAzLCAweDE5YjNlMDQ4LAotCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZmNkZDBiMjgsIDB4MWZkODhkYTQsIDB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjZiNWZjZTksIDB4MWU5ZjQxNTcsCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNTdkNjkzNSwgMHgxN2I1ZGYyMiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMzBmZjdmZCwgMHgxOWIzZTA0OCwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU2NGMxZmI4LCAweDEzMGZmN2ZkLCAweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUxZGVkZWZiLCAweDBhYzdjZDNiLAotCTB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIDB4ZWUzOGM0YzYsIDB4MWE5YjY2MjksIDB4ZWJiMzBjZGIsIDB4MThiYzgwNmIsCi0JMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgMHgwZGFlODgwNSwgMHgxY2VkN2FmNCwKLQkweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwMDlkZTFkLCAweDAxOTFmNjVmLCAweGUwMjc3MjVjLCAweGZjZGQwYjI4LCAweGUwZjU4MTA0LCAweGY4Mzk4MWExLAotCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTc0MzdmOTUsIDB4MTQ0Y2YzMjUsIDB4ZTU2NDk5ZDcsIDB4MTFjNzNiM2EsIDB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYWM3Y2QzYiwgMHgxZTIxMjEwNSwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywKLQkweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAweGU0OGQ3Y2JiLCAweGVmOGM3ODY3LCAweGU3NDM3Zjk1LCAweGViYjMwY2RiLCAweGVhODI5NmNiLCAweGU4NGEyMGRlLAotCTB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsIDB4ZTE2MGJlYTksIDB4MDk0YTAzMTcsIDB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTAyNzcyNWMsIDB4MDMyMmY0ZDgsCi0JMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwNGIyMDQxYywgMHgxZmE3NTU3ZiwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMTkxZjY1ZiwgMHgxZmY2MjFlMywKLQkweGVlMzhjNGM2LCAweGU1NjQ5OWQ3LCAweGYyNTE3N2ZiLCAweGUzMTI4NTBjLCAweGY2YjVmY2U5LCAweGUxNjBiZWE5LCAweGZiNGRmYmU0LCAweGUwNThhYTgxLAotCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmZkODg2MSwgMHgwMGM5MGFiMCwgMHgxZmY2MjFlMywgMHgwMTkxZjY1ZiwgMHgxZmU5Y2RhZCwgMHgwMjVhYTQxMiwKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZmY2MjE3LCAweDAwNjQ4NzQ4LCAweDFmZmQ4ODYxLCAweDAwYzkwYWIwLCAweDFmZmE3MmYwLCAweDAxMmQ4NjU3LAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZmYTcyZjAsIDB4MDEyZDg2NTcsIDB4MWZlOWNkYWQsIDB4MDI1YWE0MTIsIDB4MWZjZTE1ZmQsIDB4MDM4NmYwYjksCi0JMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZmMyNjQ3MSwgMHgwM2VhYzljYiwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZjg3NjRmYSwgMHgwNTc4ODUxMSwKLQkweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZjA5NTY2LCAweDAxZjY1NmU4LCAweDFmZTljZGFkLCAweDAyNWFhNDEyLCAweDFmZTFjYWZkLCAweDAyYmVkYTAxLAotCTB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWY3NTk5YTQsIDB4MDVkYjc2NzgsIDB4MWYzOGYzYWMsIDB4MDcwMmUwOWIsIDB4MWVmMTc4YTQsIDB4MDgyN2RjMDcsCi0JMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZjM4ZjNhYywgMHgwNzAyZTA5YiwgMHgxZjBhN2VmYywgMHgwN2M2N2U1ZiwgMHgxZWQ3NDBlNywgMHgwODg4ZTkzMSwKLQkweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmY2UxNWZkLCAweDAzODZmMGI5LCAweDFmYzI2NDcxLCAweDAzZWFjOWNiLCAweDFmYjU3OTcyLCAweDA0NGU3YzM0LAotCTB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWU0MjZhNGIsIDB4MGE2OGYxMjEsIDB4MWRkYjEzYjcsIDB4MGI4NDQyOTgsIDB4MWQ2OTYxNzQsIDB4MGM5Yjk1MzIsCi0JMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTYyODhlYywgMHgwYTA5YWU0YSwgMHgxZTIxMjEwNSwgMHgwYWM3Y2QzYiwgMHgxZGRiMTNiNywgMHgwYjg0NDI5OCwKLQkweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFmOTdmOTI1LCAweDA1MTU1ZGFjLCAweDFmODc2NGZhLCAweDA1Nzg4NTExLCAweDFmNzU5OWE0LCAweDA1ZGI3Njc4LAotCTB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsIDB4MWM2NzhiMzUsIDB4MGViY2JiYWUsIDB4MWJkN2MwYWMsIDB4MGZjNWQyNmUsIDB4MWIzZTRkM2YsIDB4MTBjOTcwNGQsCi0JMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxZDQxMzRkMSwgMHgwY2Y3YmNhMiwgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzk1NGIyMSwgMHgwZTYzMzc0ZCwKLQkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmNGU2MDNiLCAweDA2YTBhODA5LCAweDFmMzhmM2FjLCAweDA3MDJlMDliLCAweDFmMjI1MmY3LCAweDA3NjRkM2Y5LAotCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MTllZjQzZWYsIDB4MTJiZWRiMjYsIDB4MTkzYTIyNGEsIDB4MTNhZmZhMjksIDB4MTg3YzQwMTAsIDB4MTQ5YTQ0OWMsCi0JMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYmQ3YzBhYywgMHgwZmM1ZDI2ZSwgMHgxYjcyODM0NSwgMHgxMDczODc5OSwgMHgxYjA5MGE1OCwgMHgxMTFlYjM1NCwKLQkweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlZjE3OGE0LCAweDA4MjdkYzA3LCAweDFlZDc0MGU3LCAweDA4ODhlOTMxLCAweDFlYmJkOGM5LCAweDA4ZTlhMjIwLAotCTB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTZlNzQ0NTUsIDB4MTY1OTE5MjYsIDB4MTYxMGI3NTUsIDB4MTcyZDA4MzgsIDB4MTUzMjgyOTMsIDB4MTdmOGVjZTMsCi0JMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxYTI5YTdhMCwgMHgxMjZkMDU0ZCwgMHgxOWIzZTA0OCwgMHgxMzBmZjdmZCwgMHgxOTNhMjI0YSwgMHgxM2FmZmEyOSwKLQkweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlODE3YmFiLCAweDA5YWEwODYxLCAweDFlNjI4OGVjLCAweDBhMDlhZTRhLCAweDFlNDI2YTRiLCAweDBhNjhmMTIxLAotCTB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTM2MDU4YjEsIDB4MTk3NzdlZjUsIDB4MTI2ZDA1NGQsIDB4MWEyOWE3YTAsIDB4MTE3MzRkNjQsIDB4MWFkMmJjOWUsCi0JMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgMHgxODNiMGUwYywgMHgxNGU2Y2FiYywgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNzJkMDgzOCwgMHgxNjEwYjc1NSwKLQkweDFlMjEyMTA1LCAweDBhYzdjZDNiLCAweDFkZmVhZTYyLCAweDBiMjYzZWVmLCAweDFkZGIxM2I3LCAweDBiODQ0Mjk4LCAweDFkYjY1MjYyLCAweDBiZTFkNDk5LAotCTB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsIDB4MGY2ZTBjYTksIDB4MWMwOGM0MjYsIDB4MGU2MzM3NGQsIDB4MWM5NTRiMjEsIDB4MGQ1MzY0MTYsIDB4MWQxN2U3NzQsCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNjEwYjc1NSwgMHgxNzJkMDgzOCwgMHgxNTdkNjkzNSwgMHgxN2I1ZGYyMiwgMHgxNGU2Y2FiYywgMHgxODNiMGUwYywKLQkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFkNjk2MTc0LCAweDBjOWI5NTMyLCAweDFkNDEzNGQxLCAweDBjZjdiY2EyLCAweDFkMTdlNzc0LCAweDBkNTM2NDE2LAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MGIyNjNlZWYsIDB4MWRmZWFlNjIsIDB4MGEwOWFlNGEsIDB4MWU2Mjg4ZWMsIDB4MDhlOWEyMjAsIDB4MWViYmQ4YzksCi0JMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxM2FmZmEyOSwgMHgxOTNhMjI0YSwgMHgxMzBmZjdmZCwgMHgxOWIzZTA0OCwgMHgxMjZkMDU0ZCwgMHgxYTI5YTdhMCwKLQkweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjYzFmMGY0LCAweDBlMDkyNGVjLCAweDFjOTU0YjIxLCAweDBlNjMzNzRkLCAweDFjNjc4YjM1LCAweDBlYmNiYmFlLAotCTB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDZhMGE4MDksIDB4MWY0ZTYwM2IsIDB4MDU3ODg1MTEsIDB4MWY4NzY0ZmEsIDB4MDQ0ZTdjMzQsIDB4MWZiNTc5NzIsCi0JMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgxMTFlYjM1NCwgMHgxYjA5MGE1OCwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZmM1ZDI2ZSwgMHgxYmQ3YzBhYywKLQkweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFjMDhjNDI2LCAweDBmNmUwY2E5LCAweDFiZDdjMGFjLCAweDBmYzVkMjZlLCAweDFiYTVhYTY3LCAweDEwMWNmYzg3LAotCTB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4MDFmNjU2ZTgsIDB4MWZmMDk1NjYsIDB4MDBjOTBhYjAsIDB4MWZmZDg4NjEsIDB4ZmY5Yjc4YjgsIDB4MWZmZjYyMTcsCi0JMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgMHgwZTYzMzc0ZCwgMHgxYzk1NGIyMSwgMHgwZGFlODgwNSwgMHgxY2VkN2FmNCwgMHgwY2Y3YmNhMiwgMHgxZDQxMzRkMSwKLQkweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LCAweDFiM2U0ZDNmLCAweDEwYzk3MDRkLCAweDFiMDkwYTU4LCAweDExMWViMzU0LCAweDFhZDJiYzllLCAweDExNzM0ZDY0LAotCTB4ZmU2ZTA5YTEsIDB4MWZmNjIxZTMsIDB4ZmQ0MTI1ZmYsIDB4MWZlMWNhZmQsIDB4ZmMxNTM2MzUsIDB4MWZjMjY0NzEsIDB4ZmFlYWEyNTQsIDB4MWY5N2Y5MjUsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYjg0NDI5OCwgMHgxZGRiMTNiNywgMHgwYWM3Y2QzYiwgMHgxZTIxMjEwNSwgMHgwYTA5YWU0YSwgMHgxZTYyODhlYywKLQkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDFhNjMwOTFiLCAweDEyMWE3OTk5LCAweDFhMjlhN2EwLCAweDEyNmQwNTRkLCAweDE5ZWY0M2VmLCAweDEyYmVkYjI2LAotCTB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4Zjg5YjJjMDcsIDB4MWYyMjUyZjcsIDB4Zjc3NzE2Y2YsIDB4MWVkNzQwZTcsIDB4ZjY1NWY3OWYsIDB4MWU4MTdiYWIsCi0JMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwODg4ZTkzMSwgMHgxZWQ3NDBlNywgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwNzAyZTA5YiwgMHgxZjM4ZjNhYywKLQkweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE5Nzc3ZWY1LCAweDEzNjA1OGIxLCAweDE5M2EyMjRhLCAweDEzYWZmYTI5LCAweDE4ZmJjY2E0LCAweDEzZmVkOTUzLAotCTB4ZjUzODMyYzUsIDB4MWUyMTIxMDUsIDB4ZjQxZTJiNjcsIDB4MWRiNjUyNjIsIDB4ZjMwODQzNWUsIDB4MWQ0MTM0ZDEsIDB4ZjFmNmRiMTQsIDB4MWNjMWYwZjQsCi0JMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwNTc4ODUxMSwgMHgxZjg3NjRmYSwgMHgwNGIyMDQxYywgMHgxZmE3NTU3ZiwgMHgwM2VhYzljYiwgMHgxZmMyNjQ3MSwKLQkweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE4N2M0MDEwLCAweDE0OWE0NDljLCAweDE4M2IwZTBjLCAweDE0ZTZjYWJjLCAweDE3ZjhlY2UzLCAweDE1MzI4MjkzLAotCTB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIDB4ZWZlMzAzNzksIDB4MWJhNWFhNjcsIDB4ZWVlMTRjYWMsIDB4MWIwOTBhNTgsIDB4ZWRlNTg2NjcsIDB4MWE2MzA5MWIsCi0JMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMjVhYTQxMiwgMHgxZmU5Y2RhZCwgMHgwMTkxZjY1ZiwgMHgxZmY2MjFlMywgMHgwMGM5MGFiMCwgMHgxZmZkODg2MSwKLQkweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE3NzFlNzVmLCAweDE1Yzc3YmJlLCAweDE3MmQwODM4LCAweDE2MTBiNzU1LCAweDE2ZTc0NDU1LCAweDE2NTkxOTI2LAotCTB4ZWNmMDA4MDMsIDB4MTliM2UwNDgsIDB4ZWMwMTI2YWQsIDB4MThmYmNjYTQsIDB4ZWIxOTM1NDQsIDB4MTgzYjBlMGMsIDB4ZWEzODg0NDIsIDB4MTc3MWU3NWYsCi0JMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmZjM2ZjU1MCwgMHgxZmZkODg2MSwgMHhmZTZlMDlhMSwgMHgxZmY2MjFlMywgMHhmZGE1NWJlZSwgMHgxZmU5Y2RhZCwKLQkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE2NTkxOTI2LCAweDE2ZTc0NDU1LCAweDE2MTBiNzU1LCAweDE3MmQwODM4LCAweDE1Yzc3YmJlLCAweDE3NzFlNzVmLAotCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTg4ZTE4YTEsIDB4MTVjNzdiYmUsIDB4ZTdjNGYxZjQsIDB4MTRlNmNhYmMsIDB4ZTcwNDMzNWMsIDB4MTNmZWQ5NTMsCi0JMHhmY2RkMGIyOCwgMHgxZmQ4OGRhNCwgMHhmYzE1MzYzNSwgMHgxZmMyNjQ3MSwgMHhmYjRkZmJlNCwgMHgxZmE3NTU3ZiwgMHhmYTg3N2FlZiwgMHgxZjg3NjRmYSwKLQkweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE1MzI4MjkzLCAweDE3ZjhlY2UzLCAweDE0ZTZjYWJjLCAweDE4M2IwZTBjLCAweDE0OWE0NDljLCAweDE4N2M0MDEwLAotCTB4ZTY0YzFmYjgsIDB4MTMwZmY3ZmQsIDB4ZTU5Y2Y2ZTUsIDB4MTIxYTc5OTksIDB4ZTRmNmY1YTgsIDB4MTExZWIzNTQsIDB4ZTQ1YTU1OTksIDB4MTAxY2ZjODcsCi0JMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmOGZkMWY2NSwgMHgxZjM4ZjNhYywgMHhmODM5ODFhMSwgMHgxZjBhN2VmYywgMHhmNzc3MTZjZiwgMHgxZWQ3NDBlNywKLQkweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzZmVkOTUzLCAweDE4ZmJjY2E0LCAweDEzYWZmYTI5LCAweDE5M2EyMjRhLCAweDEzNjA1OGIxLCAweDE5Nzc3ZWY1LAotCTB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsIDB4ZTMzZTBmMGMsIDB4MGUwOTI0ZWMsIDB4ZTJiZWNiMmYsIDB4MGNmN2JjYTIsIDB4ZTI0OWFkOWUsIDB4MGJlMWQ0OTksCi0JMHhmNmI1ZmNlOSwgMHgxZTlmNDE1NywgMHhmNWY2NTFiNiwgMHgxZTYyODhlYywgMHhmNTM4MzJjNSwgMHgxZTIxMjEwNSwgMHhmNDdiYmQ2OCwgMHgxZGRiMTNiNywKLQkweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LCAweDEyYmVkYjI2LCAweDE5ZWY0M2VmLCAweDEyNmQwNTRkLCAweDFhMjlhN2EwLCAweDEyMWE3OTk5LCAweDFhNjMwOTFiLAotCTB4ZTFkZWRlZmIsIDB4MGFjN2NkM2IsIDB4ZTE3ZTg0NTUsIDB4MDlhYTA4NjEsIDB4ZTEyOGJmMTksIDB4MDg4OGU5MzEsIDB4ZTBkZGFkMDksIDB4MDc2NGQzZjksCi0JMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhmMzA4NDM1ZSwgMHgxZDQxMzRkMSwgMHhmMjUxNzdmYiwgMHgxY2VkN2FmNCwgMHhmMTljYzhiMywgMHgxYzk1NGIyMSwKLQkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDExNzM0ZDY0LCAweDFhZDJiYzllLCAweDExMWViMzU0LCAweDFiMDkwYTU4LCAweDEwYzk3MDRkLCAweDFiM2U0ZDNmLAotCTB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTA2ODA2ZGIsIDB4MDUxNTVkYWMsIDB4ZTAzZDliOGYsIDB4MDNlYWM5Y2IsIDB4ZTAxZTM1MDMsIDB4MDJiZWRhMDEsCi0JMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhmMDNhMmQ5MiwgMHgxYmQ3YzBhYywgMHhlZjhjNzg2NywgMHgxYjcyODM0NSwgMHhlZWUxNGNhYywgMHgxYjA5MGE1OCwKLQkweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDEwMWNmYzg3LCAweDFiYTVhYTY3LCAweDBmYzVkMjZlLCAweDFiZDdjMGFjLCAweDBmNmUwY2E5LCAweDFjMDhjNDI2LAotCTB4ZTAwOWRlMWQsIDB4MDE5MWY2NWYsIDB4ZTAwMDlkZTksIDB4MDA2NDg3NDgsIDB4ZTAwMjc3OWYsIDB4ZmYzNmY1NTAsIDB4ZTAwZjZhOWEsIDB4ZmUwOWE5MTgsCi0JMHhlZTM4YzRjNiwgMHgxYTliNjYyOSwgMHhlZDkyZmFiMywgMHgxYTI5YTdhMCwgMHhlY2YwMDgwMywgMHgxOWIzZTA0OCwgMHhlYzUwMDVkNywgMHgxOTNhMjI0YSwKLQkweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBlYmNiYmFlLCAweDFjNjc4YjM1LCAweDBlNjMzNzRkLCAweDFjOTU0YjIxLCAweDBlMDkyNGVjLCAweDFjYzFmMGY0LAotCTB4ZTAyNzcyNWMsIDB4ZmNkZDBiMjgsIDB4ZTA0YTg2OGUsIDB4ZmJiMTgzY2MsIDB4ZTA3ODliMDYsIDB4ZmE4NzdhZWYsIDB4ZTBiMTlmYzUsIDB4Zjk1ZjU3ZjcsCi0JMHhlYmIzMGNkYiwgMHgxOGJjODA2YiwgMHhlYjE5MzU0NCwgMHgxODNiMGUwYywgMHhlYTgyOTZjYiwgMHgxN2I1ZGYyMiwgMHhlOWVmNDhhYiwgMHgxNzJkMDgzOCwKLQkweDBkYWU4ODA1LCAweDFjZWQ3YWY0LCAweDBkNTM2NDE2LCAweDFkMTdlNzc0LCAweDBjZjdiY2EyLCAweDFkNDEzNGQxLCAweDBjOWI5NTMyLCAweDFkNjk2MTc0LAotCTB4ZTBmNTgxMDQsIDB4ZjgzOTgxYTEsIDB4ZTE0NDI3MzcsIDB4ZjcxNjVkZTAsIDB4ZTE5ZDc3MTQsIDB4ZjVmNjUxYjYsIDB4ZTIwMTUxOWUsIDB4ZjRkOWMxMTEsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlOGQyZjdjOCwgMHgxNjEwYjc1NSwgMHhlODRhMjBkZSwgMHgxNTdkNjkzNSwgMHhlN2M0ZjFmNCwgMHgxNGU2Y2FiYywKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBiZTFkNDk5LCAweDFkYjY1MjYyLCAweDBiODQ0Mjk4LCAweDFkZGIxM2I3LCAweDBiMjYzZWVmLCAweDFkZmVhZTYyLAotCTB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIDB4ZTJlODE4OGMsIDB4ZjJhYzliZWEsIDB4ZTM2YWI0ZGYsIDB4ZjE5Y2M4YjMsIDB4ZTNmNzNiZGEsIDB4ZjA5MWYzNTcsCi0JMHhlNzQzN2Y5NSwgMHgxNDRjZjMyNSwgMHhlNmM1ZGRiNiwgMHgxM2FmZmEyOSwgMHhlNjRjMWZiOCwgMHgxMzBmZjdmZCwgMHhlNWQ2NTg2MCwgMHgxMjZkMDU0ZCwKLQkweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDBhNjhmMTIxLCAweDFlNDI2YTRiLCAweDBhMDlhZTRhLCAweDFlNjI4OGVjLCAweDA5YWEwODYxLCAweDFlODE3YmFiLAotCTB4ZTQ4ZDdjYmIsIDB4ZWY4Yzc4NjcsIDB4ZTUyZDQzNjIsIDB4ZWU4Y2IyOWMsIDB4ZTVkNjU4NjAsIDB4ZWQ5MmZhYjMsIDB4ZTY4ODgxMGIsIDB4ZWM5ZmE3NGYsCi0JMHhlNTY0OTlkNywgMHgxMWM3M2IzYSwgMHhlNGY2ZjVhOCwgMHgxMTFlYjM1NCwgMHhlNDhkN2NiYiwgMHgxMDczODc5OSwgMHhlNDI4M2Y1NCwgMHgwZmM1ZDI2ZSwKLQkweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA4ZTlhMjIwLCAweDFlYmJkOGM5LCAweDA4ODhlOTMxLCAweDFlZDc0MGU3LCAweDA4MjdkYzA3LCAweDFlZjE3OGE0LAotCTB4ZTc0MzdmOTUsIDB4ZWJiMzBjZGIsIDB4ZTgwNzEzMWQsIDB4ZWFjZDdkNmQsIDB4ZThkMmY3YzgsIDB4ZTllZjQ4YWIsIDB4ZTlhNmU2ZGEsIDB4ZTkxOGJiYWIsCi0JMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMzZhYjRkZiwgMHgwZTYzMzc0ZCwgMHhlMzEyODUwYywgMHgwZGFlODgwNSwgMHhlMmJlY2IyZiwgMHgwY2Y3YmNhMiwKLQkweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDA3NjRkM2Y5LCAweDFmMjI1MmY3LCAweDA3MDJlMDliLCAweDFmMzhmM2FjLCAweDA2YTBhODA5LCAweDFmNGU2MDNiLAotCTB4ZWE4Mjk2Y2IsIDB4ZTg0YTIwZGUsIDB4ZWI2NWJiNjQsIDB4ZTc4M2JmZjAsIDB4ZWM1MDA1ZDcsIDB4ZTZjNWRkYjYsIDB4ZWQ0MTI0ZGEsIDB4ZTYxMGJjMTEsCi0JMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgMHhlMjI0ZWM0OSwgMHgwYjg0NDI5OCwgMHhlMWRlZGVmYiwgMHgwYWM3Y2QzYiwgMHhlMTlkNzcxNCwgMHgwYTA5YWU0YSwKLQkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA1ZGI3Njc4LCAweDFmNzU5OWE0LCAweDA1Nzg4NTExLCAweDFmODc2NGZhLCAweDA1MTU1ZGFjLCAweDFmOTdmOTI1LAotCTB4ZWUzOGM0YzYsIDB4ZTU2NDk5ZDcsIDB4ZWYzNjhmYjMsIDB4ZTRjMWIyYzEsIDB4ZjAzYTJkOTIsIDB4ZTQyODNmNTQsIDB4ZjE0MzQ0NTIsIDB4ZTM5ODc0Y2IsCi0JMHhlMTYwYmVhOSwgMHgwOTRhMDMxNywgMHhlMTI4YmYxOSwgMHgwODg4ZTkzMSwgMHhlMGY1ODEwNCwgMHgwN2M2N2U1ZiwgMHhlMGM3MGM1NCwgMHgwNzAyZTA5YiwKLQkweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDA0NGU3YzM0LCAweDFmYjU3OTcyLCAweDAzZWFjOWNiLCAweDFmYzI2NDcxLCAweDAzODZmMGI5LCAweDFmY2UxNWZkLAotCTB4ZjI1MTc3ZmIsIDB4ZTMxMjg1MGMsIDB4ZjM2NDZhY2UsIDB4ZTI5NjllOGMsIDB4ZjQ3YmJkNjgsIDB4ZTIyNGVjNDksIDB4ZjU5NzBlZGYsIDB4ZTFiZDk1YjUsCi0JMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDc4OWIwNiwgMHgwNTc4ODUxMSwgMHhlMDU4YWE4MSwgMHgwNGIyMDQxYywgMHhlMDNkOWI4ZiwgMHgwM2VhYzljYiwKLQkweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAyYmVkYTAxLCAweDFmZTFjYWZkLCAweDAyNWFhNDEyLCAweDFmZTljZGFkLCAweDAxZjY1NmU4LCAweDFmZjA5NTY2LAotCTB4ZjZiNWZjZTksIDB4ZTE2MGJlYTksIDB4ZjdkODIzZjksIDB4ZTEwZTg3NWMsIDB4ZjhmZDFmNjUsIDB4ZTBjNzBjNTQsIDB4ZmEyNDg5ODgsIDB4ZTA4YTY2NWMsCi0JMHhlMDI3NzI1YywgMHgwMzIyZjRkOCwgMHhlMDE2MzI1MywgMHgwMjVhYTQxMiwgMHhlMDA5ZGUxZCwgMHgwMTkxZjY1ZiwgMHhlMDAyNzc5ZiwgMHgwMGM5MGFiMCwKLQkweDAxOTFmNjVmLCAweDFmZjYyMWUzLCAweDAxMmQ4NjU3LCAweDFmZmE3MmYwLCAweDAwYzkwYWIwLCAweDFmZmQ4ODYxLCAweDAwNjQ4NzQ4LCAweDFmZmY2MjE3LAotCTB4ZmI0ZGZiZTQsIDB4ZTA1OGFhODEsIDB4ZmM3OTBmNDcsIDB4ZTAzMWVhMDMsIDB4ZmRhNTViZWUsIDB4ZTAxNjMyNTMsIDB4ZmVkMjc5YTksIDB4ZTAwNThkMTAKLX07Ci0KLWNvbnN0IGludCB0d2lkVGFiNjRbNCo2ICsgMTYqNl0gPSB7Ci0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsCi0KLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFhOWI2NjI5LCAweDExYzczYjNhLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwKLQkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDA2M2UyZTBmLCAweDFmNjI5N2QwLAotCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwKLQkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGVlMzhjNGM2LCAweDFhOWI2NjI5LAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDI3NzI1YywgMHhmY2RkMGIyOCwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU1NjQ5OWQ3LCAweDExYzczYjNhLCAweGUyNmY5NDMxLCAweDBjM2VmMTUzLCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsCi0JMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlNzQzN2Y5NSwgMHhlYmIzMGNkYiwgMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgMHhmNmI1ZmNlOSwgMHhlMTYwYmVhOQotfTsKLQotI2Vsc2UKLQotLyoKLSAqICBRMzAgZm9yIDEyOCBhbmQgMTAyNAotICoKLSAqIGZvciAoaSA9IDA7IGkgPCBudW0vNDsgaSsrKSB7Ci0gKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwotICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDMwKTsKLSAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKgotICogICBhbmdsZSA9IChudW0vMiAtIDEgLSBpICsgMC4xMjUpICogTV9QSSAvIG51bTsKLSAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwotICogfQotICovCi1jb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdID0gewotCS8qIDEyOCAqLwotCTB4M2ZmZmVjNDMsIDB4MDAzMjQzZjEsIDB4MDE1ZmQ0ZDIsIDB4M2ZmYzM4ZDEsIDB4M2ZmOWMxM2EsIDB4MDFjNDU0ZjUsIDB4MDJmMWI3NTUsIDB4M2ZlZWE3NzYsCi0JMHgzZmU5YjhhOSwgMHgwMzU2MjAzOCwgMHgwNDgzMjU5ZCwgMHgzZmQ3M2E0YSwgMHgzZmNmZDUwYiwgMHgwNGU3NjdjNSwgMHgwNjEzZTFjNSwgMHgzZmI1ZjRlYSwKLQkweDNmYWMxYTViLCAweDA2NzdlZGJiLCAweDA3YTNhZGZmLCAweDNmOGFkYzc3LCAweDNmN2U4ZTFlLCAweDA4MDc3NDU3LCAweDA5MzI0Y2E3LCAweDNmNTVmNzk2LAotCTB4M2Y0NzM3NTksIDB4MDk5NWJkZmQsIDB4MGFiZjgwNDMsIDB4M2YxNzRlNzAsIDB4M2YwNjFlOTUsIDB4MGIyMjhkNDIsIDB4MGM0YjBiOTQsIDB4M2VjZWVhYWQsCi0JMHgzZWJiNGRkYiwgMHgwY2FkYTRmNSwgMHgwZGQ0YjE5YSwgMHgzZTdjZDc3OCwgMHgzZTY2ZDBiNCwgMHgwZTM2YzgyYSwgMHgwZjVjMzVhMywgMHgzZTIxMjE3OSwKLQkweDNlMDhiNDJhLCAweDBmYmRiYTQwLCAweDEwZTE1YjRlLCAweDNkYmJkNmQ0LCAweDNkYTEwNmJkLCAweDExNDIzZWYwLCAweDEyNjNlNjk5LCAweDNkNGQwNzI4LAotCTB4M2QyZmQ4NmMsIDB4MTJjNDFhNGYsIDB4MTNlMzliZTksIDB4M2NkNGMzOGIsIDB4M2NiNTNhYWEsIDB4MTQ0MzEwZGQsIDB4MTU2MDQwMTMsIDB4M2M1MzFlODgsCi0JMHgzYzMxNDA2MCwgMHgxNWJlZTc4YywgMHgxNmQ5OTg2NCwgMHgzYmM4MmMxZiwgMHgzYmEzZmRlNywgMHgxNzM3NjNjOSwgMHgxODRmNmFhYiwgMHgzYjM0MDFiYiwKLQkweDNiMGQ4OTA5LCAweDE4YWM0Yjg3LCAweDE5YzE3ZDQ0LCAweDNhOTZiNjM2LCAweDNhNmRmOGY4LCAweDFhMWQ2NTQ0LCAweDFiMmY5NzFlLCAweDM5ZjA2MWQyLAotCTB4MzljNTY2NGYsIDB4MWI4YTc4MTUsIDB4MWM5OTdmYzQsIDB4Mzk0MTFlMzMsIDB4MzkxM2ViMGUsIDB4MWNmMzRiYWYsIDB4MWRmZWZmNjcsIDB4Mzg4OTA2NjMsCi0JMHgzODU5YTI5MiwgMHgxZTU3YTg2ZCwgMHgxZjVmZGVlNiwgMHgzN2M4MzZjMiwgMHgzNzk2YTk5NiwgMHgxZmI3NTc1YywgMHgyMGJiZTdkOCwgMHgzNmZlY2QwZSwKLQkweDM2Y2IxZTJhLCAweDIxMTIyMjQwLCAweDIyMTJlNDkyLCAweDM2MmNlODU1LCAweDM1ZjcxZmIxLCAweDIyNjdkM2EwLCAweDIzNjRhMDJlLCAweDM1NTJhOGY0LAotCTB4MzUxYWNlZGQsIDB4MjNiODM2Y2EsIDB4MjRiMGU2OTksIDB4MzQ3MDMwOTUsIDB4MzQzNjRkYTYsIDB4MjUwMzE3ZGYsIDB4MjVmNzg0OTcsIDB4MzM4NWEyMjIsCi0JMHgzMzQ5YmY0OCwgMHgyNjQ4NDNkOSwgMHgyNzM4NDdjOCwgMHgzMjkzMjFjNywgMHgzMjU1NDg0MCwgMHgyNzg3ODg5MywgMHgyODcyZmViNiwgMHgzMTk4ZDRlYSwKLQkweDMxNTkwZTNlLCAweDI4YzBiNGQyLCAweDI5YTc3OGRiLCAweDMwOTZlMjIzLCAweDMwNTUzODI4LCAweDI5ZjM5ODRjLCAweDJhZDU4NmEzLCAweDJmOGQ3MTNhLAotCTB4MmY0OWVlMGYsIDB4MmIyMDAzYWMsIDB4MmJmY2Y5N2MsIDB4MmU3Y2FiMWMsIDB4MmUzNzU5MmMsIDB4MmM0NWM4YTAsIDB4MmQxZGEzZDUsIDB4MmQ2NGI5ZGEsCi0JLyogMTAyNCAqLwotCTB4M2ZmZmZmYjEsIDB4MDAwNjQ4N2YsIDB4MDAyYmZiNzQsIDB4M2ZmZmYwZTMsIDB4M2ZmZmU3MDUsIDB4MDAzODhjNmUsIDB4MDA1ZTNmNGMsIDB4M2ZmZmJhOWIsCi0JMHgzZmZmYTZkZSwgMHgwMDZhZDAzYiwgMHgwMDkwODJlYSwgMHgzZmZmNWNkOCwgMHgzZmZmM2YzYywgMHgwMDlkMTNjNSwgMHgwMGMyYzYyZiwgMHgzZmZlZDc5YiwKLQkweDNmZmViMDIxLCAweDAwY2Y1NmVmLCAweDAwZjUwOGZjLCAweDNmZmUyYWU1LCAweDNmZmRmOThjLCAweDAxMDE5OTk4LCAweDAxMjc0YjMxLCAweDNmZmQ1NmI1LAotCTB4M2ZmZDFiN2UsIDB4MDEzM2RiYTMsIDB4MDE1OThjYjEsIDB4M2ZmYzViMGMsIDB4M2ZmYzE1ZjcsIDB4MDE2NjFjZjAsIDB4MDE4YmNkNWIsIDB4M2ZmYjM3ZWMsCi0JMHgzZmZhZThmOSwgMHgwMTk4NWQ2MCwgMHgwMWJlMGQxMSwgMHgzZmY5ZWQ1MywgMHgzZmY5OTQ4MywgMHgwMWNhOWNkNCwgMHgwMWYwNGJiNCwgMHgzZmY4N2I0NCwKLQkweDNmZjgxODk2LCAweDAxZmNkYjJlLCAweDAyMjI4OTI0LCAweDNmZjZlMWJmLCAweDNmZjY3NTM0LCAweDAyMmYxODRkLCAweDAyNTRjNTQ0LCAweDNmZjUyMGM1LAotCTB4M2ZmNGFhNWQsIDB4MDI2MTU0MTQsIDB4MDI4NmZmZjMsIDB4M2ZmMzM4NTgsIDB4M2ZmMmI4MTMsIDB4MDI5MzhlNjIsIDB4MDJiOTM5MTQsIDB4M2ZmMTI4NzgsCi0JMHgzZmYwOWU1NiwgMHgwMmM1YzcxYSwgMHgwMmViNzA4NiwgMHgzZmVlZjEyNiwgMHgzZmVlNWQyOCwgMHgwMmY3ZmUxYywgMHgwMzFkYTYyYiwgMHgzZmVjOTI2NSwKLQkweDNmZWJmNDhiLCAweDAzMmEzMzQ5LCAweDAzNGZkOWU1LCAweDNmZWEwYzM1LCAweDNmZTk2NDgwLCAweDAzNWM2NjgyLCAweDAzODIwYjkzLCAweDNmZTc1ZTk4LAotCTB4M2ZlNmFkMDgsIDB4MDM4ZTk3YTksIDB4MDNiNDNiMTcsIDB4M2ZlNDg5OTAsIDB4M2ZlM2NlMjYsIDB4MDNjMGM2OWUsIDB4MDNlNjY4NTIsIDB4M2ZlMThkMWYsCi0JMHgzZmUwYzdkYSwgMHgwM2YyZjM0MiwgMHgwNDE4OTMyNiwgMHgzZmRlNjk0NSwgMHgzZmRkOWEyNywgMHgwNDI1MWQ3NywgMHgwNDRhYmI3MywgMHgzZmRiMWUwNiwKLQkweDNmZGE0NTBmLCAweDA0NTc0NTFkLCAweDA0N2NlMTFhLCAweDNmZDdhYjY0LCAweDNmZDZjODk0LCAweDA0ODk2YTE2LCAweDA0YWYwM2ZjLCAweDNmZDQxMTVmLAotCTB4M2ZkMzI0YjcsIDB4MDRiYjhjNDIsIDB4MDRlMTIzZmEsIDB4M2ZkMDRmZmMsIDB4M2ZjZjU5N2MsIDB4MDRlZGFiODMsIDB4MDUxMzQwZjYsIDB4M2ZjYzY3M2IsCi0JMHgzZmNiNjZlNCwgMHgwNTFmYzdiOSwgMHgwNTQ1NWFkMSwgMHgzZmM4NTcxZiwgMHgzZmM3NGNmMywgMHgwNTUxZTBjNywgMHgwNTc3NzE2YiwgMHgzZmM0MWZhYywKLQkweDNmYzMwYmFhLCAweDA1ODNmNjhjLCAweDA1YTk4NGE2LCAweDNmYmZjMGUzLCAweDNmYmVhMzBjLCAweDA1YjYwOGViLCAweDA1ZGI5NDYzLCAweDNmYmIzYWM3LAotCTB4M2ZiYTEzMWIsIDB4MDVlODE3YzMsIDB4MDYwZGEwODMsIDB4M2ZiNjhkNWIsIDB4M2ZiNTViZGMsIDB4MDYxYTIyZjcsIDB4MDYzZmE4ZTcsIDB4M2ZiMWI4YTIsCi0JMHgzZmIwN2Q1MCwgMHgwNjRjMmE2NywgMHgwNjcxYWQ3MSwgMHgzZmFjYmM5ZiwgMHgzZmFiNzc3YiwgMHgwNjdlMmRmNSwgMHgwNmEzYWUwMCwgMHgzZmE3OTk1NCwKLQkweDNmYTY0YTVmLCAweDA2YjAyZDgxLCAweDA2ZDVhYTc3LCAweDNmYTI0ZWM2LCAweDNmYTBmNjAwLCAweDA2ZTIyOGVlLCAweDA3MDdhMmI3LCAweDNmOWNkY2Y3LAotCTB4M2Y5YjdhNjIsIDB4MDcxNDIwMWIsIDB4MDczOTk2YTEsIDB4M2Y5NzQzZWIsIDB4M2Y5NWQ3ODcsIDB4MDc0NjEyZWIsIDB4MDc2Yjg2MTYsIDB4M2Y5MTgzYTUsCi0JMHgzZjkwMGQ3MiwgMHgwNzc4MDEzZCwgMHgwNzlkNzBmNywgMHgzZjhiOWMyOCwgMHgzZjhhMWMyOSwgMHgwN2E5ZWFmNSwgMHgwN2NmNTcyNiwgMHgzZjg1OGQ3OSwKLQkweDNmODQwM2FlLCAweDA3ZGJjZmYyLCAweDA4MDEzODgzLCAweDNmN2Y1NzliLCAweDNmN2RjNDA1LCAweDA4MGRiMDE2LCAweDA4MzMxNGYxLCAweDNmNzhmYTkyLAotCTB4M2Y3NzVkMzEsIDB4MDgzZjhiNDMsIDB4MDg2NGVjNGYsIDB4M2Y3Mjc2NjEsIDB4M2Y3MGNmMzgsIDB4MDg3MTYxNTksIDB4MDg5NmJlODAsIDB4M2Y2YmNiMGUsCi0JMHgzZjZhMWExYywgMHgwOGEzMzIzYSwgMHgwOGM4OGI2NSwgMHgzZjY0Zjg5YiwgMHgzZjYzM2RlMiwgMHgwOGQ0ZmRjNiwgMHgwOGZhNTJkZSwgMHgzZjVkZmYwZSwKLQkweDNmNWMzYThmLCAweDA5MDZjM2UwLCAweDA5MmMxNGNlLCAweDNmNTZkZTZhLCAweDNmNTUxMDI2LCAweDA5Mzg4NDY5LCAweDA5NWRkMTE2LCAweDNmNGY5NmI0LAotCTB4M2Y0ZGJlYWMsIDB4MDk2YTNmNDIsIDB4MDk4Zjg3OTYsIDB4M2Y0ODI3ZjAsIDB4M2Y0NjQ2MjYsIDB4MDk5YmY0NGMsIDB4MDljMTM4MzEsIDB4M2Y0MDkyMjMsCi0JMHgzZjNlYTY5NywgMHgwOWNkYTM2OCwgMHgwOWYyZTJjNywgMHgzZjM4ZDU1MiwgMHgzZjM2ZTAwNiwgMHgwOWZmNGM3OCwgMHgwYTI0ODczYSwgMHgzZjMwZjE4MSwKLQkweDNmMmVmMjc2LCAweDBhMzBlZjVlLCAweDBhNTYyNTZjLCAweDNmMjhlNmI2LCAweDNmMjZkZGVjLCAweDBhNjI4YmZhLCAweDBhODdiZDNkLCAweDNmMjBiNGY1LAotCTB4M2YxZWEyNmUsIDB4MGE5NDIyMmYsIDB4MGFiOTRlOGYsIDB4M2YxODVjNDMsIDB4M2YxNjQwMDEsIDB4MGFjNWIxZGMsIDB4MGFlYWQ5NDQsIDB4M2YwZmRjYTUsCi0JMHgzZjBkYjZhOSwgMHgwYWY3M2FlNSwgMHgwYjFjNWQzZCwgMHgzZjA3MzYyMSwgMHgzZjA1MDY2ZCwgMHgwYjI4YmQyYSwgMHgwYjRkZGE1YywgMHgzZWZlNjhiYywKLQkweDNlZmMyZjUwLCAweDBiNWEzODhkLCAweDBiN2Y1MDgxLCAweDNlZjU3NDdiLCAweDNlZjMzMTVhLCAweDBiOGJhY2YwLCAweDBiYjBiZjhmLCAweDNlZWM1OTY1LAotCTB4M2VlYTBjOGUsIDB4MGJiZDFhMzMsIDB4MGJlMjI3NjYsIDB4M2VlMzE3N2UsIDB4M2VlMGMwZjQsIDB4MGJlZTgwMzgsIDB4MGMxMzg3ZTksIDB4M2VkOWFlY2MsCi0JMHgzZWQ3NGU5MSwgMHgwYzFmZGVlMSwgMHgwYzQ0ZTBmOSwgMHgzZWQwMWY1NSwgMHgzZWNkYjU2YSwgMHgwYzUxMzYxMCwgMHgwYzc2MzI3OCwgMHgzZWM2NjkyMCwKLQkweDNlYzNmNTg1LCAweDBjODI4NWE1LCAweDBjYTc3YzQ3LCAweDNlYmM4YzMxLCAweDNlYmEwZWU5LCAweDBjYjNjZDg0LCAweDBjZDhiZTQ3LCAweDNlYjI4ODhmLAotCTB4M2ViMDAxOWMsIDB4MGNlNTBkOGMsIDB4MGQwOWY4NWIsIDB4M2VhODVlNDEsIDB4M2VhNWNkYTMsIDB4MGQxNjQ1YTAsIDB4MGQzYjJhNjQsIDB4M2U5ZTBkNGMsCi0JMHgzZTliNzMwNiwgMHgwZDQ3NzVhMSwgMHgwZDZjNTQ0MywgMHgzZTkzOTViNywgMHgzZTkwZjFjYSwgMHgwZDc4OWQ3MSwgMHgwZDlkNzVkYiwgMHgzZTg4Zjc4OCwKLQkweDNlODY0OWY1LCAweDBkYTliY2YyLCAweDBkY2U4ZjBkLCAweDNlN2UzMmM2LCAweDNlN2I3YjkwLCAweDBkZGFkNDA2LCAweDBkZmY5ZmJhLCAweDNlNzM0Nzc4LAotCTB4M2U3MDg2OWYsIDB4MGUwYmUyOGUsIDB4MGUzMGE3YzUsIDB4M2U2ODM1YTQsIDB4M2U2NTZiMmIsIDB4MGUzY2U4NmIsIDB4MGU2MWE3MGYsIDB4M2U1Y2ZkNTEsCi0JMHgzZTVhMjkzOSwgMHgwZTZkZTU4MCwgMHgwZTkyOWQ3YSwgMHgzZTUxOWU4NiwgMHgzZTRlYzBkMSwgMHgwZTllZDlhZiwgMHgwZWMzOGFlOCwgMHgzZTQ2MTk0YSwKLQkweDNlNDMzMWZhLCAweDBlY2ZjNGQ5LCAweDBlZjQ2ZjNiLCAweDNlM2E2ZGE0LCAweDNlMzc3Y2JiLCAweDBmMDBhNmRmLCAweDBmMjU0YTUzLCAweDNlMmU5YjljLAotCTB4M2UyYmExMWIsIDB4MGYzMTdmYTUsIDB4MGY1NjFjMTUsIDB4M2UyMmEzMzgsIDB4M2UxZjlmMjEsIDB4MGY2MjRmMGMsIDB4MGY4NmU0NjAsIDB4M2UxNjg0ODAsCi0JMHgzZTEzNzZkNSwgMHgwZjkzMTRmNSwgMHgwZmI3YTMxNywgMHgzZTBhM2Y3YiwgMHgzZTA3MjgzZiwgMHgwZmMzZDE0MywgMHgwZmU4NTgxZCwgMHgzZGZkZDQzMiwKLQkweDNkZmFiMzY1LCAweDBmZjQ4M2Q3LCAweDEwMTkwMzUyLCAweDNkZjE0MmFiLCAweDNkZWUxODUxLCAweDEwMjUyYzk0LCAweDEwNDlhNDlhLCAweDNkZTQ4YWVmLAotCTB4M2RlMTU3MDgsIDB4MTA1NWNiNWIsIDB4MTA3YTNiZDUsIDB4M2RkN2FkMDUsIDB4M2RkNDZmOTQsIDB4MTA4NjYwMGUsIDB4MTBhYWM4ZTYsIDB4M2RjYWE4ZjUsCi0JMHgzZGM3NjFmYywgMHgxMGI2ZWE5MCwgMHgxMGRiNGJhZiwgMHgzZGJkN2VjNywgMHgzZGJhMmU0OCwgMHgxMGU3NmFjMywgMHgxMTBiYzQxMywgMHgzZGIwMmU4NCwKLQkweDNkYWNkNDgxLCAweDExMTdlMDg4LCAweDExM2MzMWYzLCAweDNkYTJiODM0LCAweDNkOWY1NGFmLCAweDExNDg0YmMyLCAweDExNmM5NTMxLCAweDNkOTUxYmRlLAotCTB4M2Q5MWFlZDksIDB4MTE3OGFjNTMsIDB4MTE5Y2VkYWYsIDB4M2Q4NzU5OGMsIDB4M2Q4M2UzMDksIDB4MTFhOTAyMWQsIDB4MTFjZDNiNTAsIDB4M2Q3OTcxNDUsCi0JMHgzZDc1ZjE0NywgMHgxMWQ5NGQwMiwgMHgxMWZkN2RmNiwgMHgzZDZiNjMxMywgMHgzZDY3ZDk5YiwgMHgxMjA5OGNlNSwgMHgxMjJkYjU4MywgMHgzZDVkMmVmZSwKLQkweDNkNTk5YzBlLCAweDEyMzljMWE3LCAweDEyNWRlMWRhLCAweDNkNGVkNTBmLCAweDNkNGIzOGFhLCAweDEyNjllYjJiLCAweDEyOGUwMmRjLCAweDNkNDA1NTRlLAotCTB4M2QzY2FmNzYsIDB4MTI5YTA5NTQsIDB4MTJiZTE4NmMsIDB4M2QzMWFmYzUsIDB4M2QyZTAwN2MsIDB4MTJjYTFjMDMsIDB4MTJlZTIyNmMsIDB4M2QyMmU0N2MsCi0JMHgzZDFmMmJjNSwgMHgxMmZhMjMxYiwgMHgxMzFlMjBjMCwgMHgzZDEzZjM3ZSwgMHgzZDEwMzE1YSwgMHgxMzJhMWU3ZSwgMHgxMzRlMTM0OCwgMHgzZDA0ZGNkMiwKLQkweDNkMDExMTQ1LCAweDEzNWEwZTBlLCAweDEzN2RmOWU3LCAweDNjZjVhMDgyLCAweDNjZjFjYjhlLCAweDEzODlmMWFmLCAweDEzYWRkNDgxLCAweDNjZTYzZTk4LAotCTB4M2NlMjYwM2YsIDB4MTNiOWM5NDMsIDB4MTNkZGEyZjcsIDB4M2NkNmI3MWUsIDB4M2NkMmNmNjIsIDB4MTNlOTk0YWIsIDB4MTQwZDY1MmMsIDB4M2NjNzBhMWMsCi0JMHgzY2MzMThmZiwgMHgxNDE5NTNjYiwgMHgxNDNkMWIwMiwgMHgzY2I3Mzc5YywgMHgzY2IzM2QyMiwgMHgxNDQ5MDY4NSwgMHgxNDZjYzQ1YywgMHgzY2E3M2ZhOSwKLQkweDNjYTMzYmQzLCAweDE0NzhhY2JjLCAweDE0OWM2MTFkLCAweDNjOTcyMjRjLCAweDNjOTMxNTFkLCAweDE0YTg0NjUyLCAweDE0Y2JmMTI3LCAweDNjODZkZjhlLAotCTB4M2M4MmM5MDksIDB4MTRkN2QzMmEsIDB4MTRmYjc0NWUsIDB4M2M3Njc3N2IsIDB4M2M3MjU3YTIsIDB4MTUwNzUzMjcsIDB4MTUyYWVhYTMsIDB4M2M2NWVhMWMsCi0JMHgzYzYxYzBmMSwgMHgxNTM2YzYyYiwgMHgxNTVhNTNkOSwgMHgzYzU1Mzc3YiwgMHgzYzUxMDUwMSwgMHgxNTY2MmMxOCwgMHgxNTg5YWZlMywgMHgzYzQ0NWZhMiwKLQkweDNjNDAyM2RkLCAweDE1OTU4NGQzLCAweDE1YjhmZWE0LCAweDNjMzM2MjlkLCAweDNjMmYxZDhlLCAweDE1YzRkMDNlLCAweDE1ZTgzZmZmLCAweDNjMjI0MDc1LAotCTB4M2MxZGYyMWYsIDB4MTVmNDBlM2EsIDB4MTYxNzczZDYsIDB4M2MxMGY5MzUsIDB4M2MwY2ExOWIsIDB4MTYyMzNlYWMsIDB4MTY0NjlhMGQsIDB4M2JmZjhjZTgsCi0JMHgzYmZiMmMwYywgMHgxNjUyNjE3NiwgMHgxNjc1YjI4NiwgMHgzYmVkZmI5OSwgMHgzYmU5OTE3ZSwgMHgxNjgxNzY3YywgMHgxNmE0YmQyNSwgMHgzYmRjNDU1MiwKLQkweDNiZDdkMWZhLCAweDE2YjA3ZDlmLCAweDE2ZDNiOWNjLCAweDNiY2E2YTFkLCAweDNiYzVlZDhkLCAweDE2ZGY3NmMzLCAweDE3MDJhODVlLCAweDNiYjg2YTA4LAotCTB4M2JiM2U0NDAsIDB4MTcwZTYxY2MsIDB4MTczMTg4YmUsIDB4M2JhNjQ1MWIsIDB4M2JhMWI2MjAsIDB4MTczZDNlOWIsIDB4MTc2MDVhZDAsIDB4M2I5M2ZiNjMsCi0JMHgzYjhmNjMzNywgMHgxNzZjMGQxNSwgMHgxNzhmMWU3NiwgMHgzYjgxOGNlYiwgMHgzYjdjZWI5MCwgMHgxNzlhY2QxYywgMHgxN2JkZDM5NCwgMHgzYjZlZjliZSwKLQkweDNiNmE0ZjM4LCAweDE3Yzk3ZTkzLCAweDE3ZWM3YTBkLCAweDNiNWM0MWU4LCAweDNiNTc4ZTM5LCAweDE3ZjgyMTVlLCAweDE4MWIxMWM0LCAweDNiNDk2NTc0LAotCTB4M2I0NGE4YTAsIDB4MTgyNmI1NjEsIDB4MTg0OTlhOWQsIDB4M2IzNjY0NmUsIDB4M2IzMTllNzcsIDB4MTg1NTNhN2QsIDB4MTg3ODE0N2EsIDB4M2IyMzNlZTEsCi0JMHgzYjFlNmZjYSwgMHgxODgzYjA5NywgMHgxOGE2N2YzZiwgMHgzYjBmZjRkOSwgMHgzYjBiMWNhNiwgMHgxOGIyMTc5MSwgMHgxOGQ0ZGFkMCwgMHgzYWZjODY2MywKLQkweDNhZjdhNTE2LCAweDE4ZTA2ZjUwLCAweDE5MDMyNzBmLCAweDNhZThmMzhiLCAweDNhZTQwOTI2LCAweDE5MGViN2I3LCAweDE5MzE2M2UxLCAweDNhZDUzYzViLAotCTB4M2FkMDQ4ZTMsIDB4MTkzY2YwYTksIDB4MTk1ZjkxMjgsIDB4M2FjMTYwZTEsIDB4M2FiYzY0NTgsIDB4MTk2YjFhMDksIDB4MTk4ZGFlYzgsIDB4M2FhZDYxMjksCi0JMHgzYWE4NWI5MiwgMHgxOTk5MzNiYiwgMHgxOWJiYmNhNiwgMHgzYTk5M2QzZSwgMHgzYTk0MmU5ZCwgMHgxOWM3M2RhMywgMHgxOWU5YmFhMywgMHgzYTg0ZjUyZiwKLQkweDNhN2ZkZDg2LCAweDE5ZjUzN2E0LCAweDFhMTdhOGE1LCAweDNhNzA4OTA2LCAweDNhNmI2ODU5LCAweDFhMjMyMWEyLCAweDFhNDU4NjhlLCAweDNhNWJmOGQxLAotCTB4M2E1NmNmMjMsIDB4MWE1MGZiODEsIDB4MWE3MzU0NDIsIDB4M2E0NzQ0OWMsIDB4M2E0MjExZjAsIDB4MWE3ZWM1MjQsIDB4MWFhMTExYTYsIDB4M2EzMjZjNzQsCi0JMHgzYTJkMzBjZCwgMHgxYWFjN2U2ZiwgMHgxYWNlYmU5ZCwgMHgzYTFkNzA2NiwgMHgzYTE4MmJjOCwgMHgxYWRhMjc0NiwgMHgxYWZjNWIwYSwgMHgzYTA4NTA3ZiwKLQkweDNhMDMwMmVkLCAweDFiMDdiZjhjLCAweDFiMjllNmQyLCAweDM5ZjMwY2NjLCAweDM5ZWRiNjQ5LCAweDFiMzU0NzI3LCAweDFiNTc2MWQ4LCAweDM5ZGRhNTVhLAotCTB4MzlkODQ1ZTksIDB4MWI2MmJkZjgsIDB4MWI4NGNjMDEsIDB4MzljODFhMzYsIDB4MzljMmIxZGEsIDB4MWI5MDIzZTUsIDB4MWJiMjI1MzAsIDB4MzliMjZiNmQsCi0JMHgzOWFjZmEyYiwgMHgxYmJkNzhkMiwgMHgxYmRmNmQ0YSwgMHgzOTljOTkwZCwgMHgzOTk3MWVlNywgMHgxYmVhYmNhMSwgMHgxYzBjYTQzMiwgMHgzOTg2YTMyNCwKLQkweDM5ODEyMDFlLCAweDFjMTdlZjM5LCAweDFjMzljOWNkLCAweDM5NzA4OWJmLCAweDM5NmFmZGRjLCAweDFjNDUxMDdjLCAweDFjNjZkZGZlLCAweDM5NWE0Y2ViLAotCTB4Mzk1NGI4MmUsIDB4MWM3MjIwNGYsIDB4MWM5M2UwYWIsIDB4Mzk0M2VjYjYsIDB4MzkzZTRmMjMsIDB4MWM5ZjFlOTYsIDB4MWNjMGQxYjYsIDB4MzkyZDY5MmYsCi0JMHgzOTI3YzJjOSwgMHgxY2NjMGIzNSwgMHgxY2VkYjEwNiwgMHgzOTE2YzI2MiwgMHgzOTExMTMyZCwgMHgxY2Y4ZTYxMSwgMHgxZDFhN2U3ZCwgMHgzOGZmZjg1ZSwKLQkweDM4ZmE0MDVlLCAweDFkMjVhZjBkLCAweDFkNDczYTAwLCAweDM4ZTkwYjMxLCAweDM4ZTM0YTY5LCAweDFkNTI2NjBmLCAweDFkNzNlMzc0LCAweDM4ZDFmYWU5LAotCTB4MzhjYzMxNWQsIDB4MWQ3ZjBhZmIsIDB4MWRhMDdhYmMsIDB4MzhiYWM3OTUsIDB4MzhiNGY1NDcsIDB4MWRhYjlkYjUsIDB4MWRjY2ZmYmYsIDB4MzhhMzcxNDIsCi0JMHgzODlkOTYzNywgMHgxZGQ4MWUyMSwgMHgxZGY5NzI1ZiwgMHgzODhiZjdmZiwgMHgzODg2MTQzYiwgMHgxZTA0OGMyNCwgMHgxZTI1ZDI4MiwgMHgzODc0NWJkYiwKLQkweDM4NmU2ZjYwLCAweDFlMzBlN2E0LCAweDFlNTIyMDBjLCAweDM4NWM5Y2UzLCAweDM4NTZhN2I2LCAweDFlNWQzMDg0LCAweDFlN2U1YWUyLCAweDM4NDRiYjI4LAotCTB4MzgzZWJkNGMsIDB4MWU4OTY2YTgsIDB4MWVhYTgyZTksIDB4MzgyY2I2YjcsIDB4MzgyNmIwMzAsIDB4MWViNTg5ZjcsIDB4MWVkNjk4MDUsIDB4MzgxNDhmOWYsCi0JMHgzODBlODA3MSwgMHgxZWUxOWE1NCwgMHgxZjAyOWExYywgMHgzN2ZjNDVlZiwgMHgzN2Y2MmUxZCwgMHgxZjBkOTdhNSwgMHgxZjJlODkxMSwgMHgzN2UzZDliNywKLQkweDM3ZGRiOTQ1LCAweDFmMzk4MWNlLCAweDFmNWE2NGNiLCAweDM3Y2I0YjA0LCAweDM3YzUyMWY2LCAweDFmNjU1OGI1LCAweDFmODYyZDJkLCAweDM3YjI5OWU3LAotCTB4MzdhYzY4NDEsIDB4MWY5MTFjM2QsIDB4MWZiMWUyMWQsIDB4Mzc5OWM2NmYsIDB4Mzc5MzhjMzQsIDB4MWZiY2NjNGQsIDB4MWZkZDgzODEsIDB4Mzc4MGQwYWEsCi0JMHgzNzdhOGRkZiwgMHgxZmU4NjhjOCwgMHgyMDA5MTEzYywgMHgzNzY3YjhhOSwgMHgzNzYxNmQ1MSwgMHgyMDEzZjE5NiwgMHgyMDM0OGIzNSwgMHgzNzRlN2U3YiwKLQkweDM3NDgyYTlhLCAweDIwM2Y2Njk5LCAweDIwNWZmMTRmLCAweDM3MzUyMjJmLCAweDM3MmVjNWM5LCAweDIwNmFjN2I4LCAweDIwOGI0MzcyLCAweDM3MWJhM2Q0LAotCTB4MzcxNTNlZWUsIDB4MjA5NjE0ZDksIDB4MjBiNjgxODEsIDB4MzcwMjAzN2MsIDB4MzZmYjk2MTgsIDB4MjBjMTRkZGYsIDB4MjBlMWFiNjMsIDB4MzZlODQxMzUsCi0JMHgzNmUxY2I1OCwgMHgyMGVjNzJiMSwgMHgyMTBjYzBmYywgMHgzNmNlNWQxMCwgMHgzNmM3ZGViZCwgMHgyMTE3ODMzNCwgMHgyMTM3YzIzMiwgMHgzNmI0NTcxYiwKLQkweDM2YWRkMDU4LCAweDIxNDI3ZjRkLCAweDIxNjJhZWVhLCAweDM2OWEyZjY5LCAweDM2OTNhMDM4LCAweDIxNmQ2NmUyLCAweDIxOGQ4NzBiLCAweDM2N2ZlNjA4LAotCTB4MzY3OTRlNmUsIDB4MjE5ODM5ZDgsIDB4MjFiODRhNzksIDB4MzY2NTdiMDgsIDB4MzY1ZWRiMDksIDB4MjFjMmY4MTUsIDB4MjFlMmY5MWEsIDB4MzY0YWVlN2IsCi0JMHgzNjQ0NDYxYiwgMHgyMWVkYTE3ZiwgMHgyMjBkOTJkNCwgMHgzNjMwNDA3MCwgMHgzNjI5OGZiNCwgMHgyMjE4MzVmYiwgMHgyMjM4MTc4ZCwgMHgzNjE1NzBmOCwKLQkweDM2MGViN2UzLCAweDIyNDJiNTZmLCAweDIyNjI4NzI5LCAweDM1ZmE4MDIzLCAweDM1ZjNiZWJhLCAweDIyNmQxZmMxLCAweDIyOGNlMTkxLCAweDM1ZGY2ZTAzLAotCTB4MzVkOGE0NDksIDB4MjI5Nzc0ZDcsIDB4MjJiNzI2YTgsIDB4MzVjNDNhYTcsIDB4MzViZDY4YTEsIDB4MjJjMWI0OTYsIDB4MjJlMTU2NTUsIDB4MzVhOGU2MjEsCi0JMHgzNWEyMGJkMywgMHgyMmViZGVlNSwgMHgyMzBiNzA3ZSwgMHgzNThkNzA4MSwgMHgzNTg2OGRlZiwgMHgyMzE1ZjNhOCwgMHgyMzM1NzUwOSwgMHgzNTcxZDlkOSwKLQkweDM1NmFlZjA4LCAweDIzM2ZmMmM4LCAweDIzNWY2M2RjLCAweDM1NTYyMjM5LCAweDM1NGYyZjJjLCAweDIzNjlkYzI5LCAweDIzODkzY2RkLCAweDM1M2E0OWIyLAotCTB4MzUzMzRlNmYsIDB4MjM5M2FmYjIsIDB4MjNiMmZmZjMsIDB4MzUxZTUwNTYsIDB4MzUxNzRjZTAsIDB4MjNiZDZkNDgsIDB4MjNkY2FkMDMsIDB4MzUwMjM2MzYsCi0JMHgzNGZiMmE5MiwgMHgyM2U3MTRkMywgMHgyNDA2NDNmNCwgMHgzNGU1ZmI2MywgMHgzNGRlZTc5NSwgMHgyNDEwYTYzOSwgMHgyNDJmYzRhZCwgMHgzNGM5OWZlZiwKLQkweDM0YzI4M2ZiLCAweDI0M2EyMTVmLCAweDI0NTkyZjEzLCAweDM0YWQyM2ViLCAweDM0YTVmZmQ1LCAweDI0NjM4NjJjLCAweDI0ODI4MzBkLCAweDM0OTA4NzY4LAotCTB4MzQ4OTViMzYsIDB4MjQ4Y2Q0ODcsIDB4MjRhYmMwODIsIDB4MzQ3M2NhNzksIDB4MzQ2Yzk2MmYsIDB4MjRiNjBjNTcsIDB4MjRkNGU3NTcsIDB4MzQ1NmVkMmYsCi0JMHgzNDRmYjBkMSwgMHgyNGRmMmQ4MSwgMHgyNGZkZjc3NSwgMHgzNDM5ZWY5YywgMHgzNDMyYWIyZSwgMHgyNTA4MzdlZCwgMHgyNTI2ZjBjMSwgMHgzNDFjZDFkMiwKLQkweDM0MTU4NTU5LCAweDI1MzEyYjgxLCAweDI1NGZkMzIzLCAweDMzZmY5M2UyLCAweDMzZjgzZjYyLCAweDI1NWEwODIzLCAweDI1Nzg5ZTgwLCAweDMzZTIzNWRmLAotCTB4MzNkYWQ5NWUsIDB4MjU4MmNkYmMsIDB4MjVhMTUyYzAsIDB4MzNjNGI3ZGIsIDB4MzNiZDUzNWMsIDB4MjVhYjdjMzAsIDB4MjVjOWVmY2EsIDB4MzNhNzE5ZTgsCi0JMHgzMzlmYWQ3MCwgMHgyNWQ0MTM2OSwgMHgyNWYyNzU4NCwgMHgzMzg5NWMxOCwgMHgzMzgxZTdhYywgMHgyNWZjOTM0YiwgMHgyNjFhZTNkNiwgMHgzMzZiN2U3ZSwKLQkweDMzNjQwMjIzLCAweDI2MjRmYmJmLCAweDI2NDMzYWE3LCAweDMzNGQ4MTJkLCAweDMzNDVmY2U2LCAweDI2NGQ0Y2FjLCAweDI2NmI3OWRkLCAweDMzMmY2NDM1LAotCTB4MzMyN2Q4MDgsIDB4MjY3NTg1ZjgsIDB4MjY5M2ExNjEsIDB4MzMxMTI3YWIsIDB4MzMwOTkzOWMsIDB4MjY5ZGE3OGIsIDB4MjZiYmIxMTksIDB4MzJmMmNiYTEsCi0JMHgzMmViMmZiNSwgMHgyNmM1YjE0YywgMHgyNmUzYThlYywgMHgzMmQ0NTAyOSwgMHgzMmNjYWM2NCwgMHgyNmVkYTMyMiwgMHgyNzBiODhjMiwgMHgzMmI1YjU1NywKLQkweDMyYWUwOWJlLCAweDI3MTU3Y2Y1LCAweDI3MzM1MDgyLCAweDMyOTZmYjNkLCAweDMyOGY0N2Q1LCAweDI3M2QzZWFjLCAweDI3NWIwMDE0LCAweDMyNzgyMWVlLAotCTB4MzI3MDY2YmMsIDB4Mjc2NGU4MmYsIDB4Mjc4Mjk3NjAsIDB4MzI1OTI5N2QsIDB4MzI1MTY2ODYsIDB4Mjc4Yzc5NjUsIDB4MjdhYTE2NGMsIDB4MzIzYTExZmUsCi0JMHgzMjMyNDc0NiwgMHgyN2IzZjIzNSwgMHgyN2QxN2NjMSwgMHgzMjFhZGI4MywgMHgzMjEzMDkwZiwgMHgyN2RiNTI4OCwgMHgyN2Y4Y2FhNSwgMHgzMWZiODYyMCwKLQkweDMxZjNhYmY1LCAweDI4MDI5YTQ1LCAweDI4MWZmZmUyLCAweDMxZGMxMWU4LCAweDMxZDQzMDBiLCAweDI4MjljOTU0LCAweDI4NDcxYzVlLCAweDMxYmM3ZWVlLAotCTB4MzFiNDk1NjQsIDB4Mjg1MGRmOWQsIDB4Mjg2ZTIwMDIsIDB4MzE5Y2NkNDYsIDB4MzE5NGRjMTQsIDB4Mjg3N2RkMDcsIDB4Mjg5NTBhYjYsIDB4MzE3Y2ZkMDQsCi0JMHgzMTc1MDQyZSwgMHgyODllYzE3YSwgMHgyOGJiZGM2MSwgMHgzMTVkMGUzYiwgMHgzMTU1MGRjNiwgMHgyOGM1OGNkZiwgMHgyOGUyOTRlYiwgMHgzMTNkMDBmZiwKLQkweDMxMzRmOGYxLCAweDI4ZWMzZjFlLCAweDI5MDkzNDNlLCAweDMxMWNkNTY0LCAweDMxMTRjNWMwLCAweDI5MTJkODFmLCAweDI5MmZiYTQwLCAweDMwZmM4YjdkLAotCTB4MzBmNDc0NDksIDB4MjkzOTU3YzksIDB4Mjk1NjI2ZGEsIDB4MzBkYzIzNWUsIDB4MzBkNDA0YTAsIDB4Mjk1ZmJlMDYsIDB4Mjk3Yzc5ZjUsIDB4MzBiYjlkMWMsCi0JMHgzMGIzNzZkOCwgMHgyOTg2MGFiZCwgMHgyOWEyYjM3OCwgMHgzMDlhZjhjYSwgMHgzMDkyY2IwNSwgMHgyOWFjM2RkNywgMHgyOWM4ZDM0ZCwgMHgzMDdhMzY3YywKLQkweDMwNzIwMTNjLCAweDI5ZDI1NzNjLCAweDI5ZWVkOTViLCAweDMwNTk1NjQ4LCAweDMwNTExOTkxLCAweDI5Zjg1NmQ1LCAweDJhMTRjNThiLCAweDMwMzg1ODQwLAotCTB4MzAzMDE0MTgsIDB4MmExZTNjOGEsIDB4MmEzYTk3YzcsIDB4MzAxNzNjN2EsIDB4MzAwZWYwZTUsIDB4MmE0NDA4NDQsIDB4MmE2MDRmZjUsIDB4MmZmNjAzMGEsCi0JMHgyZmVkYjAwZCwgMHgyYTY5YjllYywgMHgyYTg1ZWUwMCwgMHgyZmQ0YWMwNCwgMHgyZmNjNTFhNSwgMHgyYThmNTE2YiwgMHgyYWFiNzFkMCwgMHgyZmIzMzc3YywKLQkweDJmYWFkNWMxLCAweDJhYjRjZWE5LCAweDJhZDBkYjRlLCAweDJmOTFhNTg5LCAweDJmODkzYzc1LCAweDJhZGEzMThlLCAweDJhZjYyYTYzLCAweDJmNmZmNjNkLAotCTB4MmY2Nzg1ZDcsIDB4MmFmZjdhMDUsIDB4MmIxYjVlZjgsIDB4MmY0ZTI5YWYsIDB4MmY0NWIxZmIsIDB4MmIyNGE3ZjYsIDB4MmI0MDc4ZjUsIDB4MmYyYzNmZjIsCi0JMHgyZjIzYzBmNiwgMHgyYjQ5YmI0YSwgMHgyYjY1Nzg0NCwgMHgyZjBhMzkxZCwgMHgyZjAxYjJkZSwgMHgyYjZlYjNlYSwgMHgyYjhhNWNjZSwgMHgyZWU4MTU0MywKLQkweDJlZGY4N2M2LCAweDJiOTM5MWMwLCAweDJiYWYyNjdkLCAweDJlYzVkNDc5LCAweDJlYmQzZmM0LCAweDJiYjg1NGI0LCAweDJiZDNkNTNhLCAweDJlYTM3NmQ2LAotCTB4MmU5YWRhZWUsIDB4MmJkY2ZjYjAsIDB4MmJmODY4ZWQsIDB4MmU4MGZjNmUsIDB4MmU3ODU5NTgsIDB4MmMwMTg5OWUsIDB4MmMxY2UxODEsIDB4MmU1ZTY1NTYsCi0JMHgyZTU1YmIxNywgMHgyYzI1ZmI2NiwgMHgyYzQxM2VkZiwgMHgyZTNiYjFhNCwgMHgyZTMzMDA0MiwgMHgyYzRhNTFmMywgMHgyYzY1ODBmMSwgMHgyZTE4ZTE2ZCwKLQkweDJlMTAyOGVkLCAweDJjNmU4ZDJlLCAweDJjODlhNzlmLCAweDJkZjVmNGM3LCAweDJkZWQzNTJmLCAweDJjOTJhZDAxLCAweDJjYWRiMmQ1LCAweDJkZDJlYmM3LAotCTB4MmRjYTI1MWMsIDB4MmNiNmIxNTUsIDB4MmNkMWEyN2IsIDB4MmRhZmM2ODMsIDB4MmRhNmY4Y2EsIDB4MmNkYTlhMTQsIDB4MmNmNTc2N2MsIDB4MmQ4Yzg1MTAsCi0JMHgyZDgzYjA0ZiwgMHgyY2ZlNjcyOCwgMHgyZDE5MmVjMSwgMHgyZDY5Mjc4NCwgMHgyZDYwNGJjMCwgMHgyZDIyMTg3YSwgMHgyZDNjY2IzNCwgMHgyZDQ1YWRmNgotfTsKLQotY29uc3QgaW50IHR3aWRUYWI1MTJbOCo2ICsgMzIqNiArIDEyOCo2XSA9IHsKLQkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LAotCTB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsCi0JMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwKLQkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGU3ODIxZDVhLCAweDNiMjBkNzllLAotCTB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsCi0JMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwKLQotCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsCi0JMHgzZmVjNDNjNiwgMHgwMzIzZWNiZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwKLQkweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LAotCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsCi0JMHgzZTE0ZmRmNywgMHgwZjhjZmNiZCwgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwKLQkweDI4OTllNjRhLCAweDMxNzkwMGQ2LCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLAotCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsCi0JMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwKLQkweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LAotCTB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsCi0JMHgzMzY3YzA4ZiwgMHgyNjFmZWZmOSwgMHhlYTcwNjU4YiwgMHgzYzQyNDIwOSwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwKLQkweGUxZDRhMmM4LCAweDM4NzE2NWUzLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLAotCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZjliYTE2NTEsIDB4M2ZiMTFiNDcsCi0JMHgyYWZhZDI2OSwgMHgyZjZiYmU0NCwgMHhjYzk4M2Y3MSwgMHgyNjFmZWZmOSwgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwKLQkweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweGVkNmJmOWQyLCAweDNkM2U4MmFkLCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LAotCTB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsCi0JMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHhjMDEzYmMzYSwgMHgwMzIzZWNiZSwgMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywKLQkweGMwNGVlNGI5LCAweGY5YmExNjUxLCAweGQ3NjYxOWI2LCAweDMxNzkwMGQ2LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweGMxZWIwMjA5LCAweGYwNzMwMzQzLAotCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4Y2U4NmZmMmEsIDB4Mjg5OWU2NGEsCi0JMHgxNThmOWE3NSwgMHgzYzQyNDIwOSwgMHhjOTFhZjk3NiwgMHhkZjE4ZjBjZSwgMHhjYWM5MzNhZSwgMHgyMzhlNzY3MywgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwKLQkweGNlODZmZjJhLCAweGQ3NjYxOWI2LCAweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweGQ1MDUyZDk3LCAweGQwOTQ0MWJjLAotCTB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzJjMTdkNTMsIDB4MTI5NDA2MmUsCi0JMHgwOTY0MDgzNywgMHgzZjRlYWFmZSwgMHhlNGEyZWZmNywgMHhjNjI1MGExOCwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywKLQkweGVkNmJmOWQyLCAweGMyYzE3ZDUzLCAweGMwNGVlNGI5LCAweDA2NDVlOWFmLCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweGY2OWJmN2M5LCAweGMwYjE1NTAyLAotCi0JMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZmZiMTBjMSwgMHgwMTkyMTU1ZiwKLQkweDNmZmVjNDJkLCAweDAwYzkwZThmLCAweDNmZjRlNWRmLCAweDAyNWIwY2FlLCAweDNmZWM0M2M2LCAweDAzMjNlY2JlLCAweDNmZmIxMGMxLCAweDAxOTIxNTVmLAotCTB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIDB4M2ZmNGU1ZGYsIDB4MDI1YjBjYWUsIDB4M2Y5YzJiZmEsIDB4MDcwZGUxNzEsCi0JMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZmVjNDNjNiwgMHgwMzIzZWNiZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzZjg0YzhlMSwgMHgwN2Q1OTM5NSwKLQkweDNmZTEyYWNiLCAweDAzZWNhZGNmLCAweDNlZWIzMzQ3LCAweDBiYjZlY2VmLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDNmZDM5YjVhLCAweDA0YjU0ODI0LAotCTB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsIDB4M2YwZWM5ZjQsIDB4MGFmMTBhMjIsIDB4M2ZjMzk1ZjksIDB4MDU3ZGI0MDIsIDB4M2RlMmYxNDcsIDB4MTA0ZmI4MGUsCi0JMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZTcxZTc1OCwgMHgwZTA1YzEzNSwKLQkweDNmOWMyYmZhLCAweDA3MGRlMTcxLCAweDNjODRkNDk2LCAweDE0ZDFlMjQyLCAweDNlMTRmZGY3LCAweDBmOGNmY2JkLCAweDNmODRjOGUxLCAweDA3ZDU5Mzk1LAotCTB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIDB4M2RhZTgxY2UsIDB4MTExMWQyNjIsIDB4M2Y2YWYyZTMsIDB4MDg5Y2Y4NjcsIDB4M2FkMmMyZTcsIDB4MTkzNzJhNjMsCi0JMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgzY2M1MTFkOCwgMHgxNDEzNWM5NCwKLQkweDNmMmZmMjQ5LCAweDBhMmFiYjU4LCAweDM4Y2YxNjY5LCAweDFkNzk3NzViLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDNmMGVjOWY0LCAweDBhZjEwYTIyLAotCTB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsIDB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIDB4M2VlYjMzNDcsIDB4MGJiNmVjZWYsIDB4MzY3YzlhN2QsIDB4MjE5MmUwOWEsCi0JMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzYTgyNjlhMiwgMHgxOWVmNzk0MywKLQkweDNlOWNjMDc2LCAweDBkNDE1MDEyLCAweDMzZGU4N2RlLCAweDI1N2RiNjRiLCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCAweDNlNzFlNzU4LCAweDBlMDVjMTM1LAotCTB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIDB4MzkyYTk2NDIsIDB4MWNjNjZlOTksIDB4M2U0NGE1ZWUsIDB4MGVjOWE3ZjIsIDB4MzBmODgwMWYsIDB4MjkzNDg5MzcsCi0JMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgzZTE0ZmRmNywgMHgwZjhjZmNiZCwgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHgzN2FmODE1OCwgMHgxZjhiYTRkYiwKLQkweDNkZTJmMTQ3LCAweDEwNGZiODBlLCAweDJkY2U4OGE5LCAweDJjYjIzMjRiLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweDNkYWU4MWNlLCAweDExMTFkMjYyLAotCTB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsIDB4MzYxMjE0YjAsIDB4MjIzZDY2YTgsIDB4M2Q3N2IxOTEsIDB4MTFkMzQ0M2YsIDB4MmE2NTA1MjUsIDB4MmZmMWQ5YzYsCi0JMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzNDUzNGY0MCwgMHgyNGRhMGE5OSwKLQkweDNkMDJmNzU2LCAweDEzNTQxMGMyLCAweDI2YzBiMTYyLCAweDMyZWVmZGU5LCAweDMzNjdjMDhmLCAweDI2MWZlZmY5LCAweDNjYzUxMWQ4LCAweDE0MTM1Yzk0LAotCTB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIDB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIDB4M2M4NGQ0OTYsIDB4MTRkMWUyNDIsIDB4MjJlNjlhYzcsIDB4MzVhNTc5M2MsCi0JMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHgzYzQyNDIwOSwgMHgxNThmOWE3NSwgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHgzMDc2MWMxNywgMHgyOWNkOTU3NywKLQkweDNiZmQ1Y2M0LCAweDE2NGM3ZGRkLCAweDFlZGMxOTUyLCAweDM4MTE4ODRjLCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweDNiYjYyNzZkLCAweDE3MDg4NTMwLAotCTB4MWNjNjZlOTksIDB4MzkyYTk2NDIsIDB4MmU1YTEwNmYsIDB4MmMyMTZlYWEsIDB4M2I2Y2E0YzQsIDB4MTdjM2E5MzEsIDB4MWFhNmM4MmIsIDB4M2EyZmNlZTgsCi0JMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgyYzIxNmVhYSwgMHgyZTVhMTA2ZiwKLQkweDNhZDJjMmU3LCAweDE5MzcyYTYzLCAweDE2NGM3ZGRkLCAweDNiZmQ1Y2M0LCAweDJhZmFkMjY5LCAweDJmNmJiZTQ0LCAweDNhODI2OWEyLCAweDE5ZWY3OTQzLAotCTB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIDB4MjljZDk1NzcsIDB4MzA3NjFjMTcsIDB4M2EyZmNlZTgsIDB4MWFhNmM4MmIsIDB4MTFkMzQ0M2YsIDB4M2Q3N2IxOTEsCi0JMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHgyNzVmZjQ1MiwgMHgzMjc0NDQ5MywKLQkweDM5ODNlMWU3LCAweDFjMTI0OWQ4LCAweDBkNDE1MDEyLCAweDNlOWNjMDc2LCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweDM5MmE5NjQyLCAweDFjYzY2ZTk5LAotCTB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsIDB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIDB4MzhjZjE2NjksIDB4MWQ3OTc3NWIsIDB4MDg5Y2Y4NjcsIDB4M2Y2YWYyZTMsCi0JMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyMjNkNjZhOCwgMHgzNjEyMTRiMCwKLQkweDM4MTE4ODRjLCAweDFlZGMxOTUyLCAweDAzZWNhZGNmLCAweDNmZTEyYWNiLCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCAweDM3YWY4MTU4LCAweDFmOGJhNGRiLAotCTB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIDB4MWY4YmE0ZGIsIDB4MzdhZjgxNTgsIDB4Mzc0YjU0Y2UsIDB4MjAzOWY5MGUsIDB4ZmYzNmYxNzEsIDB4M2ZmZWM0MmQsCi0JMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHgzNmU1MDY4YSwgMHgyMGU3MGYzMiwgMHhmY2RjMTM0MiwgMHgzZmVjNDNjNiwgMHgxY2M2NmU5OSwgMHgzOTJhOTY0MiwKLQkweDM2N2M5YTdkLCAweDIxOTJlMDlhLCAweGZhODI0YmZlLCAweDNmYzM5NWY5LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweDM2MTIxNGIwLCAweDIyM2Q2NmE4LAotCTB4ZjgyYTZjNmIsIDB4M2Y4NGM4ZTEsIDB4MTllZjc5NDMsIDB4M2E4MjY5YTIsIDB4MzVhNTc5M2MsIDB4MjJlNjlhYzcsIDB4ZjVkNTQ0YTgsIDB4M2YyZmYyNDksCi0JMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgxNzA4ODUzMCwgMHgzYmI2Mjc2ZCwKLQkweDM0YzYxMjM2LCAweDI0MzRmMzMyLCAweGYxMzY1ODBlLCAweDNlNDRhNWVlLCAweDE1OGY5YTc1LCAweDNjNDI0MjA5LCAweDM0NTM0ZjQwLCAweDI0ZGEwYTk5LAotCTB4ZWVlZTJkOWUsIDB4M2RhZTgxY2UsIDB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIDB4MzNkZTg3ZGUsIDB4MjU3ZGI2NGIsIDB4ZWNhYmVmM2UsIDB4M2QwMmY3NTYsCi0JMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHgzMzY3YzA4ZiwgMHgyNjFmZWZmOSwgMHhlYTcwNjU4YiwgMHgzYzQyNDIwOSwgMHgxMTExZDI2MiwgMHgzZGFlODFjZSwKLQkweDMyZWVmZGU5LCAweDI2YzBiMTYyLCAweGU4M2M1NmNmLCAweDNiNmNhNGM0LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweDMyNzQ0NDkzLCAweDI3NWZmNDUyLAotCTB4ZTYxMDg2YmQsIDB4M2E4MjY5YTIsIDB4MGUwNWMxMzUsIDB4M2U3MWU3NTgsIDB4MzFmNzk5NDcsIDB4MjdmZGIyYTYsIDB4ZTNlZGI2MjgsIDB4Mzk4M2UxZTcsCi0JMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgwYWYxMGEyMiwgMHgzZjBlYzlmNCwKLQkweDMwZjg4MDFmLCAweDI5MzQ4OTM3LCAweGRmYzYwNmYyLCAweDM3NGI1NGNlLCAweDA5NjQwODM3LCAweDNmNGVhYWZlLCAweDMwNzYxYzE3LCAweDI5Y2Q5NTc3LAotCTB4ZGRjMjk5NTgsIDB4MzYxMjE0YjAsIDB4MDdkNTkzOTUsIDB4M2Y4NGM4ZTEsIDB4MmZmMWQ5YzYsIDB4MmE2NTA1MjUsIDB4ZGJjYjBjY2UsIDB4MzRjNjEyMzYsCi0JMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHhkOWUwMTAwNywgMHgzMzY3YzA4ZiwgMHgwNGI1NDgyNCwgMHgzZmQzOWI1YSwKLQkweDJlZTNjZWJlLCAweDJiOGVmNzdjLCAweGQ4MDI0ZDVhLCAweDMxZjc5OTQ3LCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweDJlNWExMDZmLCAweDJjMjE2ZWFhLAotCTB4ZDYzMjZhODksIDB4MzA3NjFjMTcsIDB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIDB4MmRjZTg4YTksIDB4MmNiMjMyNGIsIDB4ZDQ3MTA4ODQsIDB4MmVlM2NlYmUsCi0JMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhmZTZkZWFhMSwgMHgzZmZiMTBjMSwKLQkweDJjYjIzMjRiLCAweDJkY2U4OGE5LCAweGQxMWMzMTQyLCAweDJiOGVmNzdjLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LCAweDJjMjE2ZWFhLCAweDJlNWExMDZmLAotCTB4Y2Y4OWUzZTksIDB4MjljZDk1NzcsIDB4ZmI0YWI3ZGMsIDB4M2ZkMzliNWEsIDB4MmI4ZWY3N2MsIDB4MmVlM2NlYmUsIDB4Y2UwODY2YjksIDB4MjdmZGIyYTYsCi0JMHhmOWJhMTY1MSwgMHgzZmIxMWI0NywgMHgyYWZhZDI2OSwgMHgyZjZiYmU0NCwgMHhjYzk4M2Y3MSwgMHgyNjFmZWZmOSwgMHhmODJhNmM2YiwgMHgzZjg0YzhlMSwKLQkweDJhNjUwNTI1LCAweDJmZjFkOWM2LCAweGNiMzllZGNhLCAweDI0MzRmMzMyLCAweGY2OWJmN2M5LCAweDNmNGVhYWZlLCAweDI5Y2Q5NTc3LCAweDMwNzYxYzE3LAotCTB4YzllZGViNTAsIDB4MjIzZDY2YTgsIDB4ZjUwZWY1ZGUsIDB4M2YwZWM5ZjQsIDB4MjkzNDg5MzcsIDB4MzBmODgwMWYsIDB4YzhiNGFiMzIsIDB4MjAzOWY5MGUsCi0JMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHhmMWZhM2VjYiwgMHgzZTcxZTc1OCwKLQkweDI3ZmRiMmE2LCAweDMxZjc5OTQ3LCAweGM2N2MxZTE5LCAweDFjMTI0OWQ4LCAweGYwNzMwMzQzLCAweDNlMTRmZGY3LCAweDI3NWZmNDUyLCAweDMyNzQ0NDkzLAotCTB4YzU3ZDk2NWUsIDB4MTllZjc5NDMsIDB4ZWVlZTJkOWUsIDB4M2RhZTgxY2UsIDB4MjZjMGIxNjIsIDB4MzJlZWZkZTksIDB4YzQ5MzViM2MsIDB4MTdjM2E5MzEsCi0JMHhlZDZiZjlkMiwgMHgzZDNlODJhZCwgMHgyNjFmZWZmOSwgMHgzMzY3YzA4ZiwgMHhjM2JkYmRmNywgMHgxNThmOWE3NSwgMHhlYmVjYTM2YywgMHgzY2M1MTFkOCwKLQkweDI1N2RiNjRiLCAweDMzZGU4N2RlLCAweGMyZmQwOGFhLCAweDEzNTQxMGMyLCAweGVhNzA2NThiLCAweDNjNDI0MjA5LCAweDI0ZGEwYTk5LCAweDM0NTM0ZjQwLAotCTB4YzI1MTdlMzIsIDB4MTExMWQyNjIsIDB4ZThmNzdhZDAsIDB4M2JiNjI3NmQsIDB4MjQzNGYzMzIsIDB4MzRjNjEyMzYsIDB4YzFiYjVhMTIsIDB4MGVjOWE3ZjIsCi0JMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhlNjEwODZiZCwgMHgzYTgyNjlhMiwKLQkweDIyZTY5YWM3LCAweDM1YTU3OTNjLCAweGMwZDAwZGI3LCAweDBhMmFiYjU4LCAweGU0YTJlZmY3LCAweDM5ZGFmNWU4LCAweDIyM2Q2NmE4LCAweDM2MTIxNGIwLAotCTB4YzA3YjM3MWYsIDB4MDdkNTkzOTUsIDB4ZTMzOTkxNjcsIDB4MzkyYTk2NDIsIDB4MjE5MmUwOWEsIDB4MzY3YzlhN2QsIDB4YzAzYzZhMDcsIDB4MDU3ZGI0MDIsCi0JMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHhjMDEzYmMzYSwgMHgwMzIzZWNiZSwgMHhlMDc0NWIyNSwgMHgzN2FmODE1OCwKLQkweDIwMzlmOTBlLCAweDM3NGI1NGNlLCAweGMwMDEzYmQzLCAweDAwYzkwZThmLCAweGRmMThmMGNlLCAweDM2ZTUwNjhhLCAweDFmOGJhNGRiLCAweDM3YWY4MTU4LAotCTB4YzAwNGVmM2YsIDB4ZmU2ZGVhYTEsIDB4ZGRjMjk5NTgsIDB4MzYxMjE0YjAsIDB4MWVkYzE5NTIsIDB4MzgxMTg4NGMsIDB4YzAxZWQ1MzUsIDB4ZmMxMzUyMzEsCi0JMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHhjMDRlZTRiOSwgMHhmOWJhMTY1MSwgMHhkYjI1ZjU2NywgMHgzNDUzNGY0MCwKLQkweDFkNzk3NzViLCAweDM4Y2YxNjY5LCAweGMwOTUwZDFkLCAweGY3NjMwNzk5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLCAweDFjYzY2ZTk5LCAweDM5MmE5NjQyLAotCTB4YzBmMTM2MGMsIDB4ZjUwZWY1ZGUsIDB4ZDhhMDBiYWUsIDB4MzI3NDQ0OTMsIDB4MWMxMjQ5ZDgsIDB4Mzk4M2UxZTcsIDB4YzE2MzNmOGEsIDB4ZjJiZWFmZWUsCi0JMHhkNzY2MTliNiwgMHgzMTc5MDBkNiwgMHgxYjVkMTAwOSwgMHgzOWRhZjVlOCwgMHhjMWViMDIwOSwgMHhmMDczMDM0MywgMHhkNjMyNmE4OSwgMHgzMDc2MWMxNywKLQkweDFhYTZjODJiLCAweDNhMmZjZWU4LCAweGMyODg0ZTZmLCAweGVlMmNiYmMxLCAweGQ1MDUyZDk3LCAweDJmNmJiZTQ0LCAweDE5ZWY3OTQzLCAweDNhODI2OWEyLAotCTB4YzMzYWVlMjgsIDB4ZWJlY2EzNmMsIDB4ZDNkZTkxNTYsIDB4MmU1YTEwNmYsIDB4MTkzNzJhNjMsIDB4M2FkMmMyZTcsIDB4YzQwMmEzM2MsIDB4ZTliMzgyMjMsCi0JMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhkMWE1ZWY5MSwgMHgyYzIxNmVhYSwKLQkweDE3YzNhOTMxLCAweDNiNmNhNGM0LCAweGM1ZDAzMTE4LCAweGU1NTkzN2Q1LCAweGQwOTQ0MWJjLCAweDJhZmFkMjY5LCAweDE3MDg4NTMwLCAweDNiYjYyNzZkLAotCTB4YzZkNTY5YmUsIDB4ZTMzOTkxNjcsIDB4Y2Y4OWUzZTksIDB4MjljZDk1NzcsIDB4MTY0YzdkZGQsIDB4M2JmZDVjYzQsIDB4YzdlZTc3YjQsIDB4ZTEyM2U2YWUsCi0JMHhjZTg2ZmYyYSwgMHgyODk5ZTY0YSwgMHgxNThmOWE3NSwgMHgzYzQyNDIwOSwgMHhjOTFhZjk3NiwgMHhkZjE4ZjBjZSwgMHhjZDhiYmI2ZCwgMHgyNzVmZjQ1MiwKLQkweDE0ZDFlMjQyLCAweDNjODRkNDk2LCAweGNhNWE4NmM0LCAweGRkMTk2NTM5LCAweGNjOTgzZjcxLCAweDI2MWZlZmY5LCAweDE0MTM1Yzk0LCAweDNjYzUxMWQ4LAotCTB4Y2JhY2IwYzAsIDB4ZGIyNWY1NjcsIDB4Y2JhY2IwYzAsIDB4MjRkYTBhOTksIDB4MTM1NDEwYzIsIDB4M2QwMmY3NTYsIDB4Y2QxMTAyMTcsIDB4ZDkzZjRlOWUsCi0JMHhjYWM5MzNhZSwgMHgyMzhlNzY3MywgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHhjZTg2ZmYyYSwgMHhkNzY2MTliNiwgMHhjOWVkZWI1MCwgMHgyMjNkNjZhOCwKLQkweDExZDM0NDNmLCAweDNkNzdiMTkxLCAweGQwMGUyNjNhLCAweGQ1OWFmYWRiLCAweGM5MWFmOTc2LCAweDIwZTcwZjMyLCAweDExMTFkMjYyLCAweDNkYWU4MWNlLAotCTB4ZDFhNWVmOTEsIDB4ZDNkZTkxNTYsIDB4Yzg1MDdlYTgsIDB4MWY4YmE0ZGIsIDB4MTA0ZmI4MGUsIDB4M2RlMmYxNDcsIDB4ZDM0ZGNkYjUsIDB4ZDIzMTc3NTcsCi0JMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHhkNTA1MmQ5NywgMHhkMDk0NDFiYywgMHhjNmQ1NjliZSwgMHgxY2M2NmU5OSwKLQkweDBlYzlhN2YyLCAweDNlNDRhNWVlLCAweGQ2Y2I3NmM5LCAweGNmMDc3ZmUxLCAweGM2MjUwYTE4LCAweDFiNWQxMDA5LCAweDBlMDVjMTM1LCAweDNlNzFlNzU4LAotCTB4ZDhhMDBiYWUsIDB4Y2Q4YmJiNmQsIDB4YzU3ZDk2NWUsIDB4MTllZjc5NDMsIDB4MGQ0MTUwMTIsIDB4M2U5Y2MwNzYsIDB4ZGE4MjQ5YjUsIDB4Y2MyMTc4MjIsCi0JMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjNDQ5ZDg5MywgMHgxNzA4ODUzMCwKLQkweDBiYjZlY2VmLCAweDNlZWIzMzQ3LCAweGRlNmQxZjY2LCAweGM5ODM2NTgzLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LCAweDBhZjEwYTIyLCAweDNmMGVjOWY0LAotCTB4ZTA3NDViMjUsIDB4Yzg1MDdlYTgsIDB4YzMzYWVlMjgsIDB4MTQxMzVjOTQsIDB4MGEyYWJiNTgsIDB4M2YyZmYyNDksIDB4ZTI4Njg4YTUsIDB4YzczMGU5OTcsCi0JMHhjMmMxN2Q1MywgMHgxMjk0MDYyZSwgMHgwOTY0MDgzNywgMHgzZjRlYWFmZSwgMHhlNGEyZWZmNywgMHhjNjI1MGExOCwgMHhjMjUxN2UzMiwgMHgxMTExZDI2MiwKLQkweDA4OWNmODY3LCAweDNmNmFmMmUzLCAweGU2YzhkNTlkLCAweGM1MmQzZDE5LCAweGMxZWIwMjA5LCAweDBmOGNmY2JkLCAweDA3ZDU5Mzk1LCAweDNmODRjOGUxLAotCTB4ZThmNzdhZDAsIDB4YzQ0OWQ4OTMsIDB4YzE4ZTE4YTgsIDB4MGUwNWMxMzUsIDB4MDcwZGUxNzEsIDB4M2Y5YzJiZmEsIDB4ZWIyZTFkYmUsIDB4YzM3YjJiNmEsCi0JMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHhlZDZiZjlkMiwgMHhjMmMxN2Q1MywgMHhjMGYxMzYwYywgMHgwYWYxMGEyMiwKLQkweDA1N2RiNDAyLCAweDNmYzM5NWY5LCAweGVmYjA0N2YyLCAweGMyMWQwZWI5LCAweGMwYjE1NTAyLCAweDA5NjQwODM3LCAweDA0YjU0ODI0LCAweDNmZDM5YjVhLAotCTB4ZjFmYTNlY2IsIDB4YzE4ZTE4YTgsIDB4YzA3YjM3MWYsIDB4MDdkNTkzOTUsIDB4MDNlY2FkY2YsIDB4M2ZlMTJhY2IsIDB4ZjQ0OTEzMTEsIDB4YzExNGNjYjksCi0JMHhjMDRlZTRiOSwgMHgwNjQ1ZTlhZiwgMHgwMzIzZWNiZSwgMHgzZmVjNDNjNiwgMHhmNjliZjdjOSwgMHhjMGIxNTUwMiwgMHhjMDJjNjRhNiwgMHgwNGI1NDgyNCwKLQkweDAyNWIwY2FlLCAweDNmZjRlNWRmLCAweGY4ZjIxZThmLCAweGMwNjNkNDA2LCAweGMwMTNiYzNhLCAweDAzMjNlY2JlLCAweDAxOTIxNTVmLCAweDNmZmIxMGMxLAotCTB4ZmI0YWI3ZGMsIDB4YzAyYzY0YTYsIDB4YzAwNGVmM2YsIDB4MDE5MjE1NWYsIDB4MDBjOTBlOGYsIDB4M2ZmZWM0MmQsIDB4ZmRhNGYzNTIsIDB4YzAwYjFhMjEKLX07Ci0KLWNvbnN0IGludCB0d2lkVGFiNjRbNCo2ICsgMTYqNl0gPSB7Ci0JMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywKLQkweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLAotCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsCi0KLQkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLAotCTB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsCi0JMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwKLQkweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDIzOGU3NjczLCAweDM1MzZjYzUyLAotCTB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsCi0JMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywKLQkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGYzODNhM2UyLCAweDNlYzUyZjlmLAotCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsCi0JMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHhjMDRlZTRiOSwgMHhmOWJhMTY1MSwKLQkweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweGM0ZGYyODYyLCAweGU3ODIxZDVhLCAweGNhYzkzM2FlLCAweDIzOGU3NjczLAotCTB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsCi0JMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHhlZDZiZjlkMiwgMHhjMmMxN2Q1MwotfTsKLSNlbmRpZiAgLy9BUk1WNUUKLQotY29uc3QgaW50IFNob3J0V2luZG93U2luZVtGUkFNRV9MRU5fU0hPUlQvMl0gPXsKLQkweDAwYzk3ZmZmLCAweDAyNWI3ZmZhLCAweDAzZWQ3ZmYxLCAweDA1N2Y3ZmUyLCAweDA3MTE3ZmNlLCAweDA4YTI3ZmI1LCAweDBhMzM3Zjk4LCAweDBiYzQ3Zjc1LAotCTB4MGQ1NDdmNGUsIDB4MGVlNDdmMjIsIDB4MTA3MzdlZjAsIDB4MTIwMTdlYmEsIDB4MTM4ZjdlN2YsIDB4MTUxYzdlM2YsIDB4MTZhODdkZmIsIDB4MTgzMzdkYjEsCi0JMHgxOWJlN2Q2MywgMHgxYjQ3N2QwZiwgMHgxY2QwN2NiNywgMHgxZTU3N2M1YSwgMHgxZmRkN2JmOSwgMHgyMTYyN2I5MiwgMHgyMmU1N2IyNywgMHgyNDY3N2FiNywKLQkweDI1ZTg3YTQyLCAweDI3Njg3OWM5LCAweDI4ZTU3OTRhLCAweDJhNjI3OGM4LCAweDJiZGM3ODQwLCAweDJkNTU3N2I0LCAweDJlY2M3NzIzLCAweDMwNDI3NjhlLAotCTB4MzFiNTc1ZjQsIDB4MzMyNzc1NTYsIDB4MzQ5Nzc0YjMsIDB4MzYwNDc0MGIsIDB4Mzc3MDczNWYsIDB4MzhkOTcyYWYsIDB4M2E0MDcxZmEsIDB4M2JhNTcxNDEsCi0JMHgzZDA4NzA4MywgMHgzZTY4NmZjMiwgMHgzZmM2NmVmYiwgMHg0MTIxNmUzMSwgMHg0MjdhNmQ2MiwgMHg0M2QxNmM4ZiwgMHg0NTI0NmJiOCwgMHg0Njc1NmFkZCwKLQkweDQ3YzQ2OWZkLCAweDQ5MGY2OTFhLCAweDRhNTg2ODMyLCAweDRiOWU2NzQ3LCAweDRjZTE2NjU3LCAweDRlMjE2NTY0LCAweDRmNWU2NDZjLCAweDUwOTg2MzcxLAotCTB4NTFjZjYyNzIsIDB4NTMwMzYxNmYsIDB4NTQzMzYwNjgsIDB4NTU2MDVmNWUsIDB4NTY4YTVlNTAsIDB4NTdiMTVkM2UsIDB4NThkNDVjMjksIDB4NTlmNDViMTAKLX07Ci0KLWNvbnN0IGludCBMb25nV2luZG93S0JEW0ZSQU1FX0xFTl9MT05HLzJdPXsKLQkweDAwMGE3ZmZmLCAweDAwMGU3ZmZmLCAweDAwMTI3ZmZmLCAweDAwMTU3ZmZmLCAweDAwMTk3ZmZmLCAweDAwMWM3ZmZmLCAweDAwMjA3ZmZmLCAweDAwMjM3ZmZmLAotCTB4MDAyNjdmZmYsIDB4MDAyYTdmZmYsIDB4MDAyZDdmZmYsIDB4MDAzMDdmZmYsIDB4MDAzNDdmZmYsIDB4MDAzODdmZmYsIDB4MDAzYjdmZmYsIDB4MDAzZjdmZmYsCi0JMHgwMDQzN2ZmZiwgMHgwMDQ3N2ZmZiwgMHgwMDRiN2ZmZiwgMHgwMDRmN2ZmZiwgMHgwMDUzN2ZmZiwgMHgwMDU3N2ZmZiwgMHgwMDViN2ZmZiwgMHgwMDYwN2ZmZiwKLQkweDAwNjQ3ZmZmLCAweDAwNjk3ZmZmLCAweDAwNmQ3ZmZmLCAweDAwNzI3ZmZmLCAweDAwNzc3ZmZmLCAweDAwN2M3ZmZmLCAweDAwODE3ZmZmLCAweDAwODY3ZmZmLAotCTB4MDA4YjdmZmYsIDB4MDA5MTdmZmYsIDB4MDA5NjdmZmYsIDB4MDA5YzdmZmYsIDB4MDBhMTdmZmYsIDB4MDBhNzdmZmYsIDB4MDBhZDdmZmYsIDB4MDBiMzdmZmYsCi0JMHgwMGI5N2ZmZiwgMHgwMGJmN2ZmZiwgMHgwMGM2N2ZmZiwgMHgwMGNjN2ZmZiwgMHgwMGQzN2ZmZiwgMHgwMGRhN2ZmZiwgMHgwMGUwN2ZmZiwgMHgwMGU3N2ZmZiwKLQkweDAwZWU3ZmZmLCAweDAwZjU3ZmZmLCAweDAwZmQ3ZmZmLCAweDAxMDQ3ZmZmLCAweDAxMGM3ZmZmLCAweDAxMTM3ZmZmLCAweDAxMWI3ZmZmLCAweDAxMjM3ZmZmLAotCTB4MDEyYjdmZmYsIDB4MDEzMzdmZmYsIDB4MDEzYzdmZmUsIDB4MDE0NDdmZmUsIDB4MDE0ZDdmZmUsIDB4MDE1NjdmZmUsIDB4MDE1ZjdmZmUsIDB4MDE2ODdmZmUsCi0JMHgwMTcxN2ZmZSwgMHgwMTdhN2ZmZSwgMHgwMTgzN2ZmZSwgMHgwMThkN2ZmZSwgMHgwMTk3N2ZmZCwgMHgwMWExN2ZmZCwgMHgwMWFiN2ZmZCwgMHgwMWI1N2ZmZCwKLQkweDAxYmY3ZmZkLCAweDAxY2E3ZmZkLCAweDAxZDQ3ZmZkLCAweDAxZGY3ZmZjLCAweDAxZWE3ZmZjLCAweDAxZjU3ZmZjLCAweDAyMDA3ZmZjLCAweDAyMGM3ZmZjLAotCTB4MDIxNzdmZmMsIDB4MDIyMzdmZmIsIDB4MDIyZjdmZmIsIDB4MDIzYjdmZmIsIDB4MDI0NzdmZmIsIDB4MDI1MzdmZmIsIDB4MDI2MDdmZmEsIDB4MDI2ZDdmZmEsCi0JMHgwMjdhN2ZmYSwgMHgwMjg3N2ZmYSwgMHgwMjk0N2ZmOSwgMHgwMmExN2ZmOSwgMHgwMmFmN2ZmOSwgMHgwMmJjN2ZmOSwgMHgwMmNhN2ZmOCwgMHgwMmQ4N2ZmOCwKLQkweDAyZTc3ZmY4LCAweDAyZjU3ZmY3LCAweDAzMDQ3ZmY3LCAweDAzMTI3ZmY3LCAweDAzMjE3ZmY2LCAweDAzMzE3ZmY2LCAweDAzNDA3ZmY1LCAweDAzNGY3ZmY1LAotCTB4MDM1ZjdmZjUsIDB4MDM2ZjdmZjQsIDB4MDM3ZjdmZjQsIDB4MDM4ZjdmZjMsIDB4MDNhMDdmZjMsIDB4MDNiMDdmZjIsIDB4MDNjMTdmZjIsIDB4MDNkMjdmZjEsCi0JMHgwM2UzN2ZmMSwgMHgwM2Y1N2ZmMCwgMHgwNDA2N2ZmMCwgMHgwNDE4N2ZlZiwgMHgwNDJhN2ZlZiwgMHgwNDNjN2ZlZSwgMHgwNDRmN2ZlZCwgMHgwNDYxN2ZlZCwKLQkweDA0NzQ3ZmVjLCAweDA0ODc3ZmViLCAweDA0OWE3ZmViLCAweDA0YWU3ZmVhLCAweDA0YzE3ZmU5LCAweDA0ZDU3ZmU5LCAweDA0ZTk3ZmU4LCAweDA0ZmQ3ZmU3LAotCTB4MDUxMjdmZTYsIDB4MDUyNzdmZTUsIDB4MDUzYjdmZTUsIDB4MDU1MDdmZTQsIDB4MDU2NjdmZTMsIDB4MDU3YjdmZTIsIDB4MDU5MTdmZTEsIDB4MDVhNzdmZTAsCi0JMHgwNWJkN2ZkZiwgMHgwNWQzN2ZkZSwgMHgwNWVhN2ZkZCwgMHgwNjAxN2ZkYywgMHgwNjE4N2ZkYiwgMHgwNjJmN2ZkYSwgMHgwNjQ2N2ZkOSwgMHgwNjVlN2ZkNywKLQkweDA2NzY3ZmQ2LCAweDA2OGU3ZmQ1LCAweDA2YTY3ZmQ0LCAweDA2YmY3ZmQyLCAweDA2ZDg3ZmQxLCAweDA2ZjE3ZmQwLCAweDA3MGE3ZmNlLCAweDA3MjM3ZmNkLAotCTB4MDczZDdmY2MsIDB4MDc1NzdmY2EsIDB4MDc3MTdmYzksIDB4MDc4YzdmYzcsIDB4MDdhNjdmYzUsIDB4MDdjMTdmYzQsIDB4MDdkYzdmYzIsIDB4MDdmNzdmYzAsCi0JMHgwODEzN2ZiZiwgMHgwODJmN2ZiZCwgMHgwODRiN2ZiYiwgMHgwODY3N2ZiOSwgMHgwODg0N2ZiNywgMHgwOGEwN2ZiNiwgMHgwOGJkN2ZiNCwgMHgwOGRhN2ZiMiwKLQkweDA4Zjg3ZmFmLCAweDA5MTY3ZmFkLCAweDA5MzQ3ZmFiLCAweDA5NTI3ZmE5LCAweDA5NzA3ZmE3LCAweDA5OGY3ZmE1LCAweDA5YWU3ZmEyLCAweDA5Y2Q3ZmEwLAotCTB4MDllYzdmOWQsIDB4MGEwYzdmOWIsIDB4MGEyYzdmOTgsIDB4MGE0YzdmOTYsIDB4MGE2YzdmOTMsIDB4MGE4ZDdmOTEsIDB4MGFhZTdmOGUsIDB4MGFjZjdmOGIsCi0JMHgwYWYwN2Y4OCwgMHgwYjEyN2Y4NSwgMHgwYjMzN2Y4MiwgMHgwYjU1N2Y3ZiwgMHgwYjc4N2Y3YywgMHgwYjlhN2Y3OSwgMHgwYmJkN2Y3NiwgMHgwYmUwN2Y3MywKLQkweDBjMDQ3ZjZmLCAweDBjMjc3ZjZjLCAweDBjNGI3ZjY5LCAweDBjNmY3ZjY1LCAweDBjOTM3ZjYxLCAweDBjYjg3ZjVlLCAweDBjZGQ3ZjVhLCAweDBkMDI3ZjU2LAotCTB4MGQyNzdmNTMsIDB4MGQ0ZDdmNGYsIDB4MGQ3MzdmNGIsIDB4MGQ5OTdmNDcsIDB4MGRiZjdmNDMsIDB4MGRlNjdmM2UsIDB4MGUwYzdmM2EsIDB4MGUzNDdmMzYsCi0JMHgwZTViN2YzMSwgMHgwZTgzN2YyZCwgMHgwZWFhN2YyOCwgMHgwZWQzN2YyNCwgMHgwZWZiN2YxZiwgMHgwZjIzN2YxYSwgMHgwZjRjN2YxNSwgMHgwZjc1N2YxMCwKLQkweDBmOWY3ZjBiLCAweDBmYzg3ZjA2LCAweDBmZjI3ZjAxLCAweDEwMWM3ZWZiLCAweDEwNDc3ZWY2LCAweDEwNzE3ZWYwLCAweDEwOWM3ZWViLCAweDEwYzg3ZWU1LAotCTB4MTBmMzdlZGYsIDB4MTExZjdlZGEsIDB4MTE0YTdlZDQsIDB4MTE3NzdlY2UsIDB4MTFhMzdlYzcsIDB4MTFkMDdlYzEsIDB4MTFmZDdlYmIsIDB4MTIyYTdlYjQsCi0JMHgxMjU3N2VhZSwgMHgxMjg1N2VhNywgMHgxMmIzN2VhMCwgMHgxMmUxN2U5YSwgMHgxMzBmN2U5MywgMHgxMzNlN2U4YywgMHgxMzZkN2U4NCwgMHgxMzljN2U3ZCwKLQkweDEzY2M3ZTc2LCAweDEzZmI3ZTZlLCAweDE0MmI3ZTY3LCAweDE0NWI3ZTVmLCAweDE0OGM3ZTU3LCAweDE0YmM3ZTRmLCAweDE0ZWQ3ZTQ3LCAweDE1MWU3ZTNmLAotCTB4MTU1MDdlMzcsIDB4MTU4MTdlMmUsIDB4MTViMzdlMjYsIDB4MTVlNTdlMWQsIDB4MTYxODdlMTQsIDB4MTY0YTdlMGIsIDB4MTY3ZDdlMDIsIDB4MTZiMDdkZjksCi0JMHgxNmU0N2RmMCwgMHgxNzE3N2RlNiwgMHgxNzRiN2RkZCwgMHgxNzdmN2RkMywgMHgxN2IzN2RjOSwgMHgxN2U4N2RiZiwgMHgxODFkN2RiNSwgMHgxODUyN2RhYiwKLQkweDE4ODc3ZGExLCAweDE4YmM3ZDk2LCAweDE4ZjI3ZDhjLCAweDE5Mjg3ZDgxLCAweDE5NWU3ZDc2LCAweDE5OTU3ZDZiLCAweDE5Y2I3ZDYwLCAweDFhMDI3ZDU0LAotCTB4MWEzOTdkNDksIDB4MWE3MTdkM2QsIDB4MWFhODdkMzEsIDB4MWFlMDdkMjYsIDB4MWIxODdkMTksIDB4MWI1MDdkMGQsIDB4MWI4OTdkMDEsIDB4MWJjMjdjZjQsCi0JMHgxYmZiN2NlOCwgMHgxYzM0N2NkYiwgMHgxYzZkN2NjZSwgMHgxY2E3N2NjMSwgMHgxY2UxN2NiMywgMHgxZDFiN2NhNiwgMHgxZDU1N2M5OCwgMHgxZDhmN2M4YSwKLQkweDFkY2E3YzdjLCAweDFlMDU3YzZlLCAweDFlNDA3YzYwLCAweDFlN2I3YzUxLCAweDFlYjc3YzQzLCAweDFlZjM3YzM0LCAweDFmMmY3YzI1LCAweDFmNmI3YzE2LAotCTB4MWZhNzdjMDYsIDB4MWZlNDdiZjcsIDB4MjAyMTdiZTcsIDB4MjA1ZTdiZDcsIDB4MjA5YjdiYzcsIDB4MjBkODdiYjcsIDB4MjExNjdiYTYsIDB4MjE1NDdiOTYsCi0JMHgyMTkyN2I4NSwgMHgyMWQwN2I3NCwgMHgyMjBlN2I2MywgMHgyMjRkN2I1MiwgMHgyMjhjN2I0MCwgMHgyMmNiN2IyZSwgMHgyMzBhN2IxYywgMHgyMzQ5N2IwYSwKLQkweDIzODk3YWY4LCAweDIzYzg3YWU2LCAweDI0MDg3YWQzLCAweDI0NDg3YWMwLCAweDI0ODk3YWFkLCAweDI0Yzk3YTlhLCAweDI1MGE3YTg2LCAweDI1NGI3YTczLAotCTB4MjU4YzdhNWYsIDB4MjVjZDdhNGIsIDB4MjYwZTdhMzYsIDB4MjY1MDdhMjIsIDB4MjY5MTdhMGQsIDB4MjZkMzc5ZjgsIDB4MjcxNTc5ZTMsIDB4Mjc1Nzc5Y2UsCi0JMHgyNzlhNzliOCwgMHgyN2RjNzlhMywgMHgyODFmNzk4ZCwgMHgyODYyNzk3NywgMHgyOGE1Nzk2MCwgMHgyOGU4Nzk0YSwgMHgyOTJiNzkzMywgMHgyOTZmNzkxYywKLQkweDI5YjI3OTA1LCAweDI5ZjY3OGVkLCAweDJhM2E3OGQ2LCAweDJhN2U3OGJlLCAweDJhYzI3OGE2LCAweDJiMDc3ODhkLCAweDJiNGI3ODc1LCAweDJiOTA3ODVjLAotCTB4MmJkNDc4NDMsIDB4MmMxOTc4MmEsIDB4MmM1ZTc4MTAsIDB4MmNhNDc3ZjcsIDB4MmNlOTc3ZGQsIDB4MmQyZTc3YzMsIDB4MmQ3NDc3YTgsIDB4MmRiYTc3OGUsCi0JMHgyZGZmNzc3MywgMHgyZTQ1Nzc1OCwgMHgyZThiNzczZCwgMHgyZWQyNzcyMSwgMHgyZjE4NzcwNiwgMHgyZjVlNzZlYSwgMHgyZmE1NzZjZCwgMHgyZmVjNzZiMSwKLQkweDMwMzI3Njk0LCAweDMwNzk3Njc3LCAweDMwYzA3NjVhLCAweDMxMDc3NjNkLCAweDMxNGU3NjFmLCAweDMxOTY3NjAxLCAweDMxZGQ3NWUzLCAweDMyMjU3NWM1LAotCTB4MzI2Yzc1YTYsIDB4MzJiNDc1ODgsIDB4MzJmYzc1NjksIDB4MzM0NDc1NDksIDB4MzM4Yzc1MmEsIDB4MzNkNDc1MGEsIDB4MzQxYzc0ZWEsIDB4MzQ2NDc0Y2EsCi0JMHgzNGFjNzRhOSwgMHgzNGY1NzQ4OCwgMHgzNTNkNzQ2NywgMHgzNTg1NzQ0NiwgMHgzNWNlNzQyNCwgMHgzNjE3NzQwMywgMHgzNjVmNzNlMSwgMHgzNmE4NzNiZSwKLQkweDM2ZjE3MzljLCAweDM3M2E3Mzc5LCAweDM3ODM3MzU2LCAweDM3Y2M3MzMzLCAweDM4MTU3MzBmLCAweDM4NWU3MmVjLCAweDM4YTc3MmM4LCAweDM4ZjE3MmEzLAotCTB4MzkzYTcyN2YsIDB4Mzk4MzcyNWEsIDB4MzljZDcyMzUsIDB4M2ExNjcyMTAsIDB4M2E2MDcxZWEsIDB4M2FhOTcxYzQsIDB4M2FmMzcxOWUsIDB4M2IzYzcxNzgsCi0JMHgzYjg2NzE1MSwgMHgzYmQwNzEyYiwgMHgzYzE5NzEwNCwgMHgzYzYzNzBkYywgMHgzY2FkNzBiNSwgMHgzY2Y3NzA4ZCwgMHgzZDQwNzA2NSwgMHgzZDhhNzAzYywKLQkweDNkZDQ3MDE0LCAweDNlMWU2ZmViLCAweDNlNjg2ZmMyLCAweDNlYjE2Zjk4LCAweDNlZmI2ZjZmLCAweDNmNDU2ZjQ1LCAweDNmOGY2ZjFiLCAweDNmZDk2ZWYwLAotCTB4NDAyMzZlYzYsIDB4NDA2ZDZlOWIsIDB4NDBiNjZlNzAsIDB4NDEwMDZlNDQsIDB4NDE0YTZlMTksIDB4NDE5NDZkZWQsIDB4NDFkZTZkYzEsIDB4NDIyODZkOTQsCi0JMHg0MjcxNmQ2OCwgMHg0MmJiNmQzYiwgMHg0MzA1NmQwZCwgMHg0MzRmNmNlMCwgMHg0Mzk4NmNiMiwgMHg0M2UyNmM4NCwgMHg0NDJjNmM1NiwgMHg0NDc1NmMyOCwKLQkweDQ0YmY2YmY5LCAweDQ1MDg2YmNhLCAweDQ1NTI2YjliLCAweDQ1OWI2YjZiLCAweDQ1ZTU2YjNjLCAweDQ2MmU2YjBjLCAweDQ2Nzg2YWRiLCAweDQ2YzE2YWFiLAotCTB4NDcwYTZhN2EsIDB4NDc1MzZhNDksIDB4NDc5YzZhMTgsIDB4NDdlNTY5ZTcsIDB4NDgyZTY5YjUsIDB4NDg3NzY5ODMsIDB4NDhjMDY5NTEsIDB4NDkwOTY5MWUsCi0JMHg0OTUyNjhlYywgMHg0OTliNjhiOSwgMHg0OWUzNjg4NSwgMHg0YTJjNjg1MiwgMHg0YTc0NjgxZSwgMHg0YWJkNjdlYSwgMHg0YjA1NjdiNiwgMHg0YjRkNjc4MiwKLQkweDRiOTU2NzRkLCAweDRiZGU2NzE4LCAweDRjMjY2NmUzLCAweDRjNmQ2NmFlLCAweDRjYjU2Njc4LCAweDRjZmQ2NjQyLCAweDRkNDU2NjBjLCAweDRkOGM2NWQ2LAotCTB4NGRkNDY1OWYsIDB4NGUxYjY1NjgsIDB4NGU2MjY1MzEsIDB4NGVhOTY0ZmEsIDB4NGVmMDY0YzMsIDB4NGYzNzY0OGIsIDB4NGY3ZTY0NTMsIDB4NGZjNTY0MWIsCi0JMHg1MDBiNjNlMiwgMHg1MDUyNjNhYSwgMHg1MDk4NjM3MSwgMHg1MGRmNjMzOCwgMHg1MTI1NjJmZSwgMHg1MTZiNjJjNSwgMHg1MWIxNjI4YiwgMHg1MWY2NjI1MSwKLQkweDUyM2M2MjE3LCAweDUyODE2MWRjLCAweDUyYzc2MWEyLCAweDUzMGM2MTY3LCAweDUzNTE2MTJjLCAweDUzOTY2MGYxLCAweDUzZGI2MGI1LCAweDU0MjA2MDc5LAotCTB4NTQ2NDYwM2QsIDB4NTRhOTYwMDEsIDB4NTRlZDVmYzUsIDB4NTUzMTVmODgsIDB4NTU3NTVmNGIsIDB4NTViOTVmMGUsIDB4NTVmYzVlZDEsIDB4NTY0MDVlOTQsCi0JMHg1NjgzNWU1NiwgMHg1NmM3NWUxOCwgMHg1NzBhNWRkYSwgMHg1NzRkNWQ5YywgMHg1NzhmNWQ1ZSwgMHg1N2QyNWQxZiwgMHg1ODE0NWNlMCwgMHg1ODU2NWNhMSwKLQkweDU4OTk1YzYyLCAweDU4ZGE1YzIzLCAweDU5MWM1YmUzLCAweDU5NWU1YmE0LCAweDU5OWY1YjY0LCAweDU5ZTA1YjI0LCAweDVhMjE1YWUzLCAweDVhNjI1YWEzCi19OwotCi0KLS8qCi0gIGZvcm0gZmFjdG9yCi0qLwotLyogc3FydCgoKGkrKDE8PChGRl9TUVJUX0JJVFMtMikrMC41KS8yXjMxKSAqLwotY29uc3QgV29yZDMyIGZvcm1mYWNfc3FydHRhYmxlWzk2XSA9IHsKLSAgMHgwMDA0MDdmOCwgMHgwMDA0MTdiOSwgMHgwMDA0MjczZiwgMHgwMDA0MzY4YywgMHgwMDA0NDVhMSwgMHgwMDA0NTQ4MywgMHgwMDA0NjMzMiwgMHgwMDA0NzFiMCwKLSAgMHgwMDA0ODAwMCwgMHgwMDA0OGUyMiwgMHgwMDA0OWMxYSwgMHgwMDA0YTllNywgMHgwMDA0Yjc4YywgMHgwMDA0YzUwYSwgMHgwMDA0ZDI2MywgMHgwMDA0ZGY5NiwKLSAgMHgwMDA0ZWNhNywgMHgwMDA0Zjk5NSwgMHgwMDA1MDY2MiwgMHgwMDA1MTMwZSwgMHgwMDA1MWY5YywgMHgwMDA1MmMwYSwgMHgwMDA1Mzg1YiwgMHgwMDA1NDQ5MCwKLSAgMHgwMDA1NTBhOCwgMHgwMDA1NWNhNSwgMHgwMDA1Njg4OCwgMHgwMDA1NzQ1MCwgMHgwMDA1ODAwMCwgMHgwMDA1OGI5NiwgMHgwMDA1OTcxNSwgMHgwMDA1YTI3YywKLSAgMHgwMDA1YWRjYywgMHgwMDA1YjkwNiwgMHgwMDA1YzQyYiwgMHgwMDA1Y2YzOSwgMHgwMDA1ZGEzMywgMHgwMDA1ZTUxOSwgMHgwMDA1ZWZlYSwgMHgwMDA1ZmFhOCwKLSAgMHgwMDA2MDU1MiwgMHgwMDA2MGZlYSwgMHgwMDA2MWE3MCwgMHgwMDA2MjRlMywgMHgwMDA2MmY0NSwgMHgwMDA2Mzk5NiwgMHgwMDA2NDNkNSwgMHgwMDA2NGUwNCwKLSAgMHgwMDA2NTgyMywgMHgwMDA2NjIzMSwgMHgwMDA2NmMzMCwgMHgwMDA2NzYxZiwgMHgwMDA2ODAwMCwgMHgwMDA2ODlkMSwgMHgwMDA2OTM5MywgMHgwMDA2OWQ0NywKLSAgMHgwMDA2YTZlZCwgMHgwMDA2YjA4NSwgMHgwMDA2YmExMCwgMHgwMDA2YzM4ZCwgMHgwMDA2Y2NmYywgMHgwMDA2ZDY1ZiwgMHgwMDA2ZGZiNSwgMHgwMDA2ZThmZSwKLSAgMHgwMDA2ZjIzYiwgMHgwMDA2ZmI2YywgMHgwMDA3MDQ5MCwgMHgwMDA3MGRhOSwgMHgwMDA3MTZiNiwgMHgwMDA3MWZiOCwgMHgwMDA3MjhhZSwgMHgwMDA3MzE5OSwKLSAgMHgwMDA3M2E3OSwgMHgwMDA3NDM0ZSwgMHgwMDA3NGMxOSwgMHgwMDA3NTRkOSwgMHgwMDA3NWQ4ZSwgMHgwMDA3NjYzYSwgMHgwMDA3NmVkYiwgMHgwMDA3Nzc3MiwKLSAgMHgwMDA3ODAwMCwgMHgwMDA3ODg4MywgMHgwMDA3OTBmZCwgMHgwMDA3OTk2ZSwgMHgwMDA3YTFkNSwgMHgwMDA3YWEzMywgMHgwMDA3YjI4OCwgMHgwMDA3YmFkNCwKLSAgMHgwMDA3YzMxOCwgMHgwMDA3Y2I1MiwgMHgwMDA3ZDM4NCwgMHgwMDA3ZGJhZCwgMHgwMDA3ZTNjZSwgMHgwMDA3ZWJlNiwgMHgwMDA3ZjNmNiwgMHgwMDA3ZmJmZQotfTsKLQotCi0KLS8qIQotICBcbmFtZSAgICBxdWFudGl6ZXIgYW5kIGludmVyc2UgcXVhbnRpemVyIHRhYmxlcwotCi0gIFxicmllZiAgIHRoZXNlIHRhYmxlcyBhcmUgdXNlZCBmb3IgdGhlIG5vbgotICAgICAgICAgICBsaW5lYXIgcXVhbnRpemVyIGFuZCBpbnZlcnNlIHF1YW50aXplcgotCi0qLwotY29uc3QgV29yZDMyIG1UYWJfM180WzUxMl0gPSB7Ci0JMHg0YzFiZjgyOSwgMHg0YzM4ODBkZSwgMHg0YzU1MDYwMywgMHg0YzcxODc5YywKLQkweDRjOGUwNWFhLCAweDRjYWE4MDMwLCAweDRjYzZmNzJmLCAweDRjZTM2YWFiLAotCTB4NGNmZmRhYTQsIDB4NGQxYzQ3MWQsIDB4NGQzOGIwMTksIDB4NGQ1NTE1OWEsCi0JMHg0ZDcxNzdhMSwgMHg0ZDhkZDYzMSwgMHg0ZGFhMzE0YiwgMHg0ZGM2ODhmMywKLQkweDRkZTJkZDJhLCAweDRkZmYyZGYyLCAweDRlMWI3YjRkLCAweDRlMzdjNTNkLAotCTB4NGU1NDBiYzUsIDB4NGU3MDRlZTYsIDB4NGU4YzhlYTMsIDB4NGVhOGNhZmQsCi0JMHg0ZWM1MDNmNywgMHg0ZWUxMzk5MiwgMHg0ZWZkNmJkMCwgMHg0ZjE5OWFiNCwKLQkweDRmMzVjNjQwLCAweDRmNTFlZTc1LCAweDRmNmUxMzU2LCAweDRmOGEzNGU0LAotCTB4NGZhNjUzMjEsIDB4NGZjMjZlMTAsIDB4NGZkZTg1YjIsIDB4NGZmYTlhMGEsCi0JMHg1MDE2YWIxOCwgMHg1MDMyYjhlMCwgMHg1MDRlYzM2MiwgMHg1MDZhY2FhMSwKLQkweDUwODZjZWEwLCAweDUwYTJjZjVlLCAweDUwYmVjY2UwLCAweDUwZGFjNzI1LAotCTB4NTBmNmJlMzEsIDB4NTExMmIyMDUsIDB4NTEyZWEyYTMsIDB4NTE0YTkwMGQsCi0JMHg1MTY2N2E0NSwgMHg1MTgyNjE0YywgMHg1MTllNDUyNCwgMHg1MWJhMjVjZiwKLQkweDUxZDYwMzUwLCAweDUxZjFkZGE3LCAweDUyMGRiNGQ2LCAweDUyMjk4OGUwLAotCTB4NTI0NTU5YzYsIDB4NTI2MTI3ODksIDB4NTI3Y2YyMmQsIDB4NTI5OGI5YjEsCi0JMHg1MmI0N2UxOSwgMHg1MmQwM2Y2NSwgMHg1MmViZmQ5OCwgMHg1MzA3YjhiNCwKLQkweDUzMjM3MGI5LCAweDUzM2YyNWFhLCAweDUzNWFkNzg5LCAweDUzNzY4NjU2LAotCTB4NTM5MjMyMTUsIDB4NTNhZGRhYzYsIDB4NTNjOTgwNmIsIDB4NTNlNTIzMDYsCi0JMHg1NDAwYzI5OCwgMHg1NDFjNWYyNCwgMHg1NDM3ZjhhYiwgMHg1NDUzOGYyZSwKLQkweDU0NmYyMmFmLCAweDU0OGFiMzMwLCAweDU0YTY0MGIzLCAweDU0YzFjYjM4LAotCTB4NTRkZDUyYzIsIDB4NTRmOGQ3NTMsIDB4NTUxNDU4ZWIsIDB4NTUyZmQ3OGQsCi0JMHg1NTRiNTMzOSwgMHg1NTY2Y2JmMywgMHg1NTgyNDFiYiwgMHg1NTlkYjQ5MiwKLQkweDU1YjkyNDdiLCAweDU1ZDQ5MTc3LCAweDU1ZWZmYjg3LCAweDU2MGI2MmFkLAotCTB4NTYyNmM2ZWIsIDB4NTY0MjI4NDIsIDB4NTY1ZDg2YjQsIDB4NTY3OGUyNDIsCi0JMHg1Njk0M2FlZSwgMHg1NmFmOTBiOSwgMHg1NmNhZTNhNCwgMHg1NmU2MzNiMiwKLQkweDU3MDE4MGU0LCAweDU3MWNjYjNiLCAweDU3MzgxMmI4LCAweDU3NTM1NzVlLAotCTB4NTc2ZTk5MmUsIDB4NTc4OWQ4MjksIDB4NTdhNTE0NTAsIDB4NTdjMDRkYTYsCi0JMHg1N2RiODQyYiwgMHg1N2Y2YjdlMSwgMHg1ODExZThjOSwgMHg1ODJkMTZlNiwKLQkweDU4NDg0MjM4LCAweDU4NjM2YWMwLCAweDU4N2U5MDgxLCAweDU4OTliMzdjLAotCTB4NThiNGQzYjEsIDB4NThjZmYxMjMsIDB4NThlYjBiZDMsIDB4NTkwNjIzYzIsCi0JMHg1OTIxMzhmMiwgMHg1OTNjNGI2MywgMHg1OTU3NWIxOSwgMHg1OTcyNjgxMiwKLQkweDU5OGQ3MjUzLCAweDU5YTg3OWRhLCAweDU5YzM3ZWFiLCAweDU5ZGU4MGM2LAotCTB4NTlmOTgwMmQsIDB4NWExNDdjZTAsIDB4NWEyZjc2ZTIsIDB4NWE0YTZlMzQsCi0JMHg1YTY1NjJkNiwgMHg1YTgwNTRjYiwgMHg1YTliNDQxNCwgMHg1YWI2MzBiMiwKLQkweDVhZDExYWE2LCAweDVhZWMwMWYxLCAweDViMDZlNjk2LCAweDViMjFjODk1LAotCTB4NWIzY2E3ZWYsIDB4NWI1Nzg0YTYsIDB4NWI3MjVlYmMsIDB4NWI4ZDM2MzEsCi0JMHg1YmE4MGIwNiwgMHg1YmMyZGQzZSwgMHg1YmRkYWNkOSwgMHg1YmY4NzlkOCwKLQkweDVjMTM0NDNkLCAweDVjMmUwYzA5LCAweDVjNDhkMTNlLCAweDVjNjM5M2RjLAotCTB4NWM3ZTUzZTUsIDB4NWM5OTExNWEsIDB4NWNiM2NjM2MsIDB4NWNjZTg0OGQsCi0JMHg1Y2U5M2E0ZSwgMHg1ZDAzZWQ4MCwgMHg1ZDFlOWUyNCwgMHg1ZDM5NGMzYiwKLQkweDVkNTNmN2M3LCAweDVkNmVhMGM5LCAweDVkODk0NzQyLCAweDVkYTNlYjMzLAotCTB4NWRiZThjOWUsIDB4NWRkOTJiODQsIDB4NWRmM2M3ZTUsIDB4NWUwZTYxYzMsCi0JMHg1ZTI4ZjkyMCwgMHg1ZTQzOGRmYywgMHg1ZTVlMjA1OSwgMHg1ZTc4YjAzNywKLQkweDVlOTMzZDk5LCAweDVlYWRjODdlLCAweDVlYzg1MGU5LCAweDVlZTJkNmRhLAotCTB4NWVmZDVhNTMsIDB4NWYxN2RiNTQsIDB4NWYzMjU5ZTAsIDB4NWY0Y2Q1ZjYsCi0JMHg1ZjY3NGY5OSwgMHg1ZjgxYzZjOCwgMHg1ZjljM2I4NywgMHg1ZmI2YWRkNCwKLQkweDVmZDExZGIzLCAweDVmZWI4YjIzLCAweDYwMDVmNjI2LCAweDYwMjA1ZWJkLAotCTB4NjAzYWM0ZTksIDB4NjA1NTI4YWMsIDB4NjA2ZjhhMDUsIDB4NjA4OWU4ZjcsCi0JMHg2MGE0NDU4MywgMHg2MGJlOWZhOSwgMHg2MGQ4Zjc2YiwgMHg2MGYzNGNjYSwKLQkweDYxMGQ5ZmM3LCAweDYxMjdmMDYyLCAweDYxNDIzZTllLCAweDYxNWM4YTdhLAotCTB4NjE3NmQzZjksIDB4NjE5MTFiMWIsIDB4NjFhYjVmZTEsIDB4NjFjNWEyNGQsCi0JMHg2MWRmZTI1ZiwgMHg2MWZhMjAxOCwgMHg2MjE0NWI3YSwgMHg2MjJlOTQ4NSwKLQkweDYyNDhjYjNiLCAweDYyNjJmZjlkLCAweDYyN2QzMWFiLCAweDYyOTc2MTY3LAotCTB4NjJiMThlZDEsIDB4NjJjYmI5ZWIsIDB4NjJlNWUyYjYsIDB4NjMwMDA5MzMsCi0JMHg2MzFhMmQ2MiwgMHg2MzM0NGY0NSwgMHg2MzRlNmVkZCwgMHg2MzY4OGMyYiwKLQkweDYzODJhNzMwLCAweDYzOWNiZmVjLCAweDYzYjZkNjYxLCAweDYzZDBlYTkwLAotCTB4NjNlYWZjN2EsIDB4NjQwNTBjMWYsIDB4NjQxZjE5ODIsIDB4NjQzOTI0YTIsCi0JMHg2NDUzMmQ4MCwgMHg2NDZkMzQxZiwgMHg2NDg3Mzg3ZSwgMHg2NGExM2E5ZSwKLQkweDY0YmIzYTgxLCAweDY0ZDUzODI4LCAweDY0ZWYzMzkzLCAweDY1MDkyY2M0LAotCTB4NjUyMzIzYmIsIDB4NjUzZDE4NzksIDB4NjU1NzBiMDAsIDB4NjU3MGZiNTAsCi0JMHg2NThhZTk2YiwgMHg2NWE0ZDU1MCwgMHg2NWJlYmYwMSwgMHg2NWQ4YTY4MCwKLQkweDY1ZjI4YmNjLCAweDY2MGM2ZWU4LCAweDY2MjY0ZmQzLCAweDY2NDAyZThmLAotCTB4NjY1YTBiMWMsIDB4NjY3M2U1N2QsIDB4NjY4ZGJkYjAsIDB4NjZhNzkzYjgsCi0JMHg2NmMxNjc5NSwgMHg2NmRiMzk0OSwgMHg2NmY1MDhkNCwgMHg2NzBlZDYzNiwKLQkweDY3MjhhMTcyLCAweDY3NDI2YTg3LCAweDY3NWMzMTc3LCAweDY3NzVmNjQzLAotCTB4Njc4ZmI4ZWIsIDB4NjdhOTc5NzEsIDB4NjdjMzM3ZDUsIDB4NjdkY2Y0MTgsCi0JMHg2N2Y2YWUzYiwgMHg2ODEwNjYzZiwgMHg2ODJhMWMyNSwgMHg2ODQzY2ZlZCwKLQkweDY4NWQ4MTk5LCAweDY4NzczMTI5LCAweDY4OTBkZTlmLCAweDY4YWE4OWZhLAotCTB4NjhjNDMzM2QsIDB4NjhkZGRhNjcsIDB4NjhmNzdmN2EsIDB4NjkxMTIyNzcsCi0JMHg2OTJhYzM1ZSwgMHg2OTQ0NjIzMCwgMHg2OTVkZmVlZSwgMHg2OTc3OTk5YSwKLQkweDY5OTEzMjMyLCAweDY5YWFjOGJhLCAweDY5YzQ1ZDMxLCAweDY5ZGRlZjk4LAotCTB4NjlmNzdmZjAsIDB4NmExMTBlM2EsIDB4NmEyYTlhNzcsIDB4NmE0NDI0YTgsCi0JMHg2YTVkYWNjYywgMHg2YTc3MzJlNiwgMHg2YTkwYjZmNiwgMHg2YWFhMzhmZCwKLQkweDZhYzNiOGZiLCAweDZhZGQzNmYyLCAweDZhZjZiMmUyLCAweDZiMTAyY2NkLAotCTB4NmIyOWE0YjIsIDB4NmI0MzFhOTIsIDB4NmI1YzhlNmYsIDB4NmI3NjAwNGEsCi0JMHg2YjhmNzAyMiwgMHg2YmE4ZGRmOSwgMHg2YmMyNDlkMCwgMHg2YmRiYjNhNywKLQkweDZiZjUxYjgwLCAweDZjMGU4MTVhLCAweDZjMjdlNTM3LCAweDZjNDE0NzE4LAotCTB4NmM1YWE2ZmQsIDB4NmM3NDA0ZTcsIDB4NmM4ZDYwZDcsIDB4NmNhNmJhY2UsCi0JMHg2Y2MwMTJjYywgMHg2Y2Q5NjhkMiwgMHg2Y2YyYmNlMSwgMHg2ZDBjMGVmOSwKLQkweDZkMjU1ZjFkLCAweDZkM2VhZDRiLCAweDZkNTdmOTg1LCAweDZkNzE0M2NjLAotCTB4NmQ4YThjMjEsIDB4NmRhM2QyODMsIDB4NmRiZDE2ZjUsIDB4NmRkNjU5NzYsCi0JMHg2ZGVmOWEwOCwgMHg2ZTA4ZDhhYiwgMHg2ZTIyMTU2MCwgMHg2ZTNiNTAyNywKLQkweDZlNTQ4OTAyLCAweDZlNmRiZmYxLCAweDZlODZmNGY1LCAweDZlYTAyODBlLAotCTB4NmViOTU5M2UsIDB4NmVkMjg4ODUsIDB4NmVlYmI1ZTMsIDB4NmYwNGUxNWEsCi0JMHg2ZjFlMGFlYSwgMHg2ZjM3MzI5NCwgMHg2ZjUwNTg1OSwgMHg2ZjY5N2MzOSwKLQkweDZmODI5ZTM1LCAweDZmOWJiZTRlLCAweDZmYjRkYzg1LCAweDZmY2RmOGQ5LAotCTB4NmZlNzEzNGQsIDB4NzAwMDJiZTAsIDB4NzAxOTQyOTMsIDB4NzAzMjU3NjcsCi0JMHg3MDRiNmE1ZCwgMHg3MDY0N2I3NiwgMHg3MDdkOGFiMSwgMHg3MDk2OTgxMSwKLQkweDcwYWZhMzk0LCAweDcwYzhhZDNkLCAweDcwZTFiNTBjLCAweDcwZmFiYjAxLAotCTB4NzExM2JmMWQsIDB4NzEyY2MxNjEsIDB4NzE0NWMxY2UsIDB4NzE1ZWMwNjQsCi0JMHg3MTc3YmQyNCwgMHg3MTkwYjgwZiwgMHg3MWE5YjEyNCwgMHg3MWMyYTg2NiwKLQkweDcxZGI5ZGQ0LCAweDcxZjQ5MTcwLCAweDcyMGQ4MzM5LCAweDcyMjY3MzMxLAotCTB4NzIzZjYxNTksIDB4NzI1ODRkYjAsIDB4NzI3MTM4MzgsIDB4NzI4YTIwZjEsCi0JMHg3MmEzMDdkYiwgMHg3MmJiZWNmOSwgMHg3MmQ0ZDA0OSwgMHg3MmVkYjFjZSwKLQkweDczMDY5MTg3LCAweDczMWY2Zjc1LCAweDczMzg0Yjk4LCAweDczNTEyNWYzLAotCTB4NzM2OWZlODQsIDB4NzM4MmQ1NGQsIDB4NzM5YmFhNGUsIDB4NzNiNDdkODksCi0JMHg3M2NkNGVmZCwgMHg3M2U2MWVhYiwgMHg3M2ZlZWM5NCwgMHg3NDE3YjhiOCwKLQkweDc0MzA4MzE5LCAweDc0NDk0YmI2LCAweDc0NjIxMjkxLCAweDc0N2FkN2FhLAotCTB4NzQ5MzliMDIsIDB4NzRhYzVjOTgsIDB4NzRjNTFjNmYsIDB4NzRkZGRhODYsCi0JMHg3NGY2OTZkZSwgMHg3NTBmNTE3OCwgMHg3NTI4MGE1NCwgMHg3NTQwYzE3NCwKLQkweDc1NTk3NmQ3LCAweDc1NzIyYTdlLCAweDc1OGFkYzY5LCAweDc1YTM4YzliLAotCTB4NzViYzNiMTIsIDB4NzVkNGU3Y2YsIDB4NzVlZDkyZDQsIDB4NzYwNjNjMjEsCi0JMHg3NjFlZTNiNiwgMHg3NjM3ODk5NCwgMHg3NjUwMmRiYywgMHg3NjY4ZDAyZSwKLQkweDc2ODE3MGViLCAweDc2OWEwZmYzLCAweDc2YjJhZDQ3LCAweDc2Y2I0OGU3LAotCTB4NzZlM2UyZDUsIDB4NzZmYzdiMTAsIDB4NzcxNTExOWEsIDB4NzcyZGE2NzMsCi0JMHg3NzQ2Mzk5YiwgMHg3NzVlY2IxMywgMHg3Nzc3NWFkYywgMHg3NzhmZThmNiwKLQkweDc3YTg3NTYxLCAweDc3YzEwMDFmLCAweDc3ZDk4OTMwLCAweDc3ZjIxMDk1LAotCTB4NzgwYTk2NGQsIDB4NzgyMzFhNWIsIDB4NzgzYjljYmQsIDB4Nzg1NDFkNzUsCi0JMHg3ODZjOWM4NCwgMHg3ODg1MTllOSwgMHg3ODlkOTVhNiwgMHg3OGI2MGZiYiwKLQkweDc4Y2U4ODI4LCAweDc4ZTZmZWVmLCAweDc4ZmY3NDBmLCAweDc5MTdlNzhhLAotCTB4NzkzMDU5NWYsIDB4Nzk0OGM5OTAsIDB4Nzk2MTM4MWQsIDB4Nzk3OWE1MDYsCi0JMHg3OTkyMTA0YywgMHg3OWFhNzlmMCwgMHg3OWMyZTFmMSwgMHg3OWRiNDg1MiwKLQkweDc5ZjNhZDExLCAweDdhMGMxMDMxLCAweDdhMjQ3MWIwLCAweDdhM2NkMTkxLAotCTB4N2E1NTJmZDMsIDB4N2E2ZDhjNzYsIDB4N2E4NWU3N2QsIDB4N2E5ZTQwZTYsCi0JMHg3YWI2OThiMiwgMHg3YWNlZWVlMywgMHg3YWU3NDM3OCwgMHg3YWZmOTY3MywKLQkweDdiMTdlN2QyLCAweDdiMzAzNzk5LCAweDdiNDg4NWM1LCAweDdiNjBkMjU5LAotCTB4N2I3OTFkNTUsIDB4N2I5MTY2YjksIDB4N2JhOWFlODYsIDB4N2JjMWY0YmMsCi0JMHg3YmRhMzk1YywgMHg3YmYyN2M2NiwgMHg3YzBhYmRkYiwgMHg3YzIyZmRiYiwKLQkweDdjM2IzYzA3LCAweDdjNTM3OGMwLCAweDdjNmJiM2U1LCAweDdjODNlZDc4LAotCTB4N2M5YzI1NzksIDB4N2NiNDViZTksIDB4N2NjYzkwYzcsIDB4N2NlNGM0MTQsCi0JMHg3Y2ZjZjVkMiwgMHg3ZDE1MjYwMCwgMHg3ZDJkNTQ5ZiwgMHg3ZDQ1ODFiMCwKLQkweDdkNWRhZDMyLCAweDdkNzVkNzI3LCAweDdkOGRmZjhmLCAweDdkYTYyNjZhLAotCTB4N2RiZTRiYmEsIDB4N2RkNjZmN2QsIDB4N2RlZTkxYjYsIDB4N2UwNmIyNjQsCi0JMHg3ZTFlZDE4OCwgMHg3ZTM2ZWYyMiwgMHg3ZTRmMGIzNCwgMHg3ZTY3MjViZCwKLQkweDdlN2YzZWJkLCAweDdlOTc1NjM2LCAweDdlYWY2YzI4LCAweDdlYzc4MDkzLAotCTB4N2VkZjkzNzgsIDB4N2VmN2E0ZDcsIDB4N2YwZmI0YjEsIDB4N2YyN2MzMDcsCi0JMHg3ZjNmY2ZkOCwgMHg3ZjU3ZGIyNSwgMHg3ZjZmZTRlZiwgMHg3Zjg3ZWQzNiwKLQkweDdmOWZmM2ZiLCAweDdmYjdmOTNlLCAweDdmY2ZmY2ZmLCAweDdmZTdmZjQwCi19OwotCi1jb25zdCBXb3JkMzIgbVRhYl80XzNbNTEyXT17Ci0JMHgzMmNiZmQ0YSwgMHgzMmVkZGQ3MCwgMHgzMzBmYzMzOSwgMHgzMzMxYWVhMywKLQkweDMzNTM5ZmFjLCAweDMzNzU5NjUyLCAweDMzOTc5Mjk0LCAweDMzYjk5NDcwLAotCTB4MzNkYjliZTQsIDB4MzNmZGE4ZWQsIDB4MzQxZmJiOGIsIDB4MzQ0MWQzYmIsCi0JMHgzNDYzZjE3YywgMHgzNDg2MTRjYywgMHgzNGE4M2RhOCwgMHgzNGNhNmMxMCwKLQkweDM0ZWNhMDAxLCAweDM1MGVkOTc5LCAweDM1MzExODc3LCAweDM1NTM1Y2ZhLAotCTB4MzU3NWE2ZmUsIDB4MzU5N2Y2ODMsIDB4MzViYTRiODcsIDB4MzVkY2E2MDcsCi0JMHgzNWZmMDYwMywgMHgzNjIxNmI3OCwgMHgzNjQzZDY2NSwgMHgzNjY2NDZjNywKLQkweDM2ODhiYzllLCAweDM2YWIzN2U4LCAweDM2Y2RiOGEyLCAweDM2ZjAzZWNiLAotCTB4MzcxMmNhNjIsIDB4MzczNTViNjQsIDB4Mzc1N2YxZDEsIDB4Mzc3YThkYTUsCi0JMHgzNzlkMmVlMCwgMHgzN2JmZDU4MCwgMHgzN2UyODE4NCwgMHgzODA1MzJlOCwKLQkweDM4MjdlOWFkLCAweDM4NGFhNWQwLCAweDM4NmQ2NzRmLCAweDM4OTAyZTJhLAotCTB4MzhiMmZhNWQsIDB4MzhkNWNiZTksIDB4MzhmOGEyY2EsIDB4MzkxYjdlZmYsCi0JMHgzOTNlNjA4OCwgMHgzOTYxNDc2MSwgMHgzOTg0MzM4YSwgMHgzOWE3MjUwMSwKLQkweDM5Y2ExYmM0LCAweDM5ZWQxN2QxLCAweDNhMTAxOTI4LCAweDNhMzMxZmM2LAotCTB4M2E1NjJiYWEsIDB4M2E3OTNjZDIsIDB4M2E5YzUzM2QsIDB4M2FiZjZlZTksCi0JMHgzYWUyOGZkNSwgMHgzYjA1YjVmZiwgMHgzYjI4ZTE2NSwgMHgzYjRjMTIwNiwKLQkweDNiNmY0N2UwLCAweDNiOTI4MmYyLCAweDNiYjVjMzNhLCAweDNiZDkwOGI3LAotCTB4M2JmYzUzNjgsIDB4M2MxZmEzNDksIDB4M2M0MmY4NWIsIDB4M2M2NjUyOWMsCi0JMHgzYzg5YjIwOSwgMHgzY2FkMTZhMiwgMHgzY2QwODA2NSwgMHgzY2YzZWY1MSwKLQkweDNkMTc2MzY0LCAweDNkM2FkYzljLCAweDNkNWU1YWY4LCAweDNkODFkZTc3LAotCTB4M2RhNTY3MTcsIDB4M2RjOGY0ZDYsIDB4M2RlYzg3YjQsIDB4M2UxMDFmYWUsCi0JMHgzZTMzYmNjMywgMHgzZTU3NWVmMiwgMHgzZTdiMDYzYSwgMHgzZTllYjI5OCwKLQkweDNlYzI2NDBjLCAweDNlZTYxYTkzLCAweDNmMDlkNjJkLCAweDNmMmQ5NmQ4LAotCTB4M2Y1MTVjOTMsIDB4M2Y3NTI3NWIsIDB4M2Y5OGY3MzEsIDB4M2ZiY2NjMTEsCi0JMHgzZmUwYTVmYywgMHg0MDA0ODRlZiwgMHg0MDI4NjhlYSwgMHg0MDRjNTFlOSwKLQkweDQwNzAzZmVlLCAweDQwOTQzMmY1LCAweDQwYjgyYWZkLCAweDQwZGMyODA2LAotCTB4NDEwMDJhMGQsIDB4NDEyNDMxMTEsIDB4NDE0ODNkMTIsIDB4NDE2YzRlMGQsCi0JMHg0MTkwNjQwMSwgMHg0MWI0N2VlZCwgMHg0MWQ4OWVjZiwgMHg0MWZjYzNhNywKLQkweDQyMjBlZDcyLCAweDQyNDUxYzMwLCAweDQyNjk0ZmRlLCAweDQyOGQ4ODdkLAotCTB4NDJiMWM2MDksIDB4NDJkNjA4ODMsIDB4NDJmYTRmZTgsIDB4NDMxZTljMzcsCi0JMHg0MzQyZWQ3MCwgMHg0MzY3NDM5MCwgMHg0MzhiOWU5NiwgMHg0M2FmZmU4MiwKLQkweDQzZDQ2MzUxLCAweDQzZjhjZDAzLCAweDQ0MWQzYjk1LCAweDQ0NDFhZjA4LAotCTB4NDQ2NjI3NTgsIDB4NDQ4YWE0ODcsIDB4NDRhZjI2OTAsIDB4NDRkM2FkNzUsCi0JMHg0NGY4MzkzMywgMHg0NTFjYzljOCwgMHg0NTQxNWYzNSwgMHg0NTY1Zjk3NywKLQkweDQ1OGE5ODhkLCAweDQ1YWYzYzc2LCAweDQ1ZDNlNTMxLCAweDQ1Zjg5MmJjLAotCTB4NDYxZDQ1MTYsIDB4NDY0MWZjM2UsIDB4NDY2NmI4MzIsIDB4NDY4Yjc4ZjIsCi0JMHg0NmIwM2U3YywgMHg0NmQ1MDhjZiwgMHg0NmY5ZDdlOSwgMHg0NzFlYWJjYSwKLQkweDQ3NDM4NDcwLCAweDQ3Njg2MWQ5LCAweDQ3OGQ0NDA2LCAweDQ3YjIyYWYzLAotCTB4NDdkNzE2YTEsIDB4NDdmYzA3MGUsIDB4NDgyMGZjMzksIDB4NDg0NWY2MjAsCi0JMHg0ODZhZjRjMywgMHg0ODhmZjgyMCwgMHg0OGI1MDAzNSwgMHg0OGRhMGQwMywKLQkweDQ4ZmYxZTg3LCAweDQ5MjQzNGMwLCAweDQ5NDk0ZmFkLCAweDQ5NmU2ZjRkLAotCTB4NDk5MzkzOWYsIDB4NDliOGJjYTIsIDB4NDlkZGVhNTQsIDB4NGEwMzFjYjQsCi0JMHg0YTI4NTNjMSwgMHg0YTRkOGY3YSwgMHg0YTcyY2ZkZSwgMHg0YTk4MTRlYiwKLQkweDRhYmQ1ZWExLCAweDRhZTJhY2ZkLCAweDRiMDgwMDAwLCAweDRiMmQ1N2E4LAotCTB4NGI1MmIzZjMsIDB4NGI3ODE0ZTEsIDB4NGI5ZDdhNzAsIDB4NGJjMmU0OWYsCi0JMHg0YmU4NTM2ZSwgMHg0YzBkYzZkYiwgMHg0YzMzM2VlNCwgMHg0YzU4YmI4OSwKLQkweDRjN2UzY2M5LCAweDRjYTNjMmEyLCAweDRjYzk0ZDE0LCAweDRjZWVkYzFjLAotCTB4NGQxNDZmYmIsIDB4NGQzYTA3ZWYsIDB4NGQ1ZmE0YjYsIDB4NGQ4NTQ2MTEsCi0JMHg0ZGFhZWJmZCwgMHg0ZGQwOTY3OSwgMHg0ZGY2NDU4NSwgMHg0ZTFiZjkxZiwKLQkweDRlNDFiMTQ2LCAweDRlNjc2ZGZhLCAweDRlOGQyZjM4LCAweDRlYjJmNTAxLAotCTB4NGVkOGJmNTIsIDB4NGVmZThlMmIsIDB4NGYyNDYxOGEsIDB4NGY0YTM5NzAsCi0JMHg0ZjcwMTVkOSwgMHg0Zjk1ZjZjNiwgMHg0ZmJiZGMzNiwgMHg0ZmUxYzYyNiwKLQkweDUwMDdiNDk3LCAweDUwMmRhNzg3LCAweDUwNTM5ZWY1LCAweDUwNzk5YWUxLAotCTB4NTA5ZjliNDgsIDB4NTBjNWEwMmEsIDB4NTBlYmE5ODUsIDB4NTExMWI3NWEsCi0JMHg1MTM3YzlhNiwgMHg1MTVkZTA2OSwgMHg1MTgzZmJhMiwgMHg1MWFhMWI0ZiwKLQkweDUxZDAzZjcwLCAweDUxZjY2ODAzLCAweDUyMWM5NTA4LCAweDUyNDJjNjdkLAotCTB4NTI2OGZjNjIsIDB4NTI4ZjM2YjUsIDB4NTJiNTc1NzUsIDB4NTJkYmI4YTIsCi0JMHg1MzAyMDAzYSwgMHg1MzI4NGMzYywgMHg1MzRlOWNhOCwgMHg1Mzc0ZjE3YywKLQkweDUzOWI0YWI3LCAweDUzYzFhODU4LCAweDUzZTgwYTVmLCAweDU0MGU3MGNhLAotCTB4NTQzNGRiOTgsIDB4NTQ1YjRhYzgsIDB4NTQ4MWJlNWEsIDB4NTRhODM2NGIsCi0JMHg1NGNlYjI5YywgMHg1NGY1MzM0YywgMHg1NTFiYjg1OCwgMHg1NTQyNDFjMSwKLQkweDU1NjhjZjg1LCAweDU1OGY2MWEzLCAweDU1YjVmODFiLCAweDU1ZGM5MmViLAotCTB4NTYwMzMyMTIsIDB4NTYyOWQ1OTAsIDB4NTY1MDdkNjMsIDB4NTY3NzI5OGEsCi0JMHg1NjlkZGEwNSwgMHg1NmM0OGVkMywgMHg1NmViNDdmMiwgMHg1NzEyMDU2MiwKLQkweDU3MzhjNzIxLCAweDU3NWY4ZDJmLCAweDU3ODY1NzhhLCAweDU3YWQyNjMzLAotCTB4NTdkM2Y5MjcsIDB4NTdmYWQwNjYsIDB4NTgyMWFiZWYsIDB4NTg0ODhiYzAsCi0JMHg1ODZmNmZkYSwgMHg1ODk2NTgzYiwgMHg1OGJkNDRlMiwgMHg1OGU0MzVjZSwKLQkweDU5MGIyYWZmLCAweDU5MzIyNDczLCAweDU5NTkyMjI5LCAweDU5ODAyNDIwLAotCTB4NTlhNzJhNTksIDB4NTljZTM0ZDAsIDB4NTlmNTQzODcsIDB4NWExYzU2N2IsCi0JMHg1YTQzNmRhYywgMHg1YTZhODkxOSwgMHg1YTkxYThjMSwgMHg1YWI4Y2NhMywKLQkweDVhZGZmNGJlLCAweDViMDcyMTExLCAweDViMmU1MTljLCAweDViNTU4NjVlLAotCTB4NWI3Y2JmNTQsIDB4NWJhM2ZjODAsIDB4NWJjYjNkZGYsIDB4NWJmMjgzNzEsCi0JMHg1YzE5Y2QzNSwgMHg1YzQxMWIyYSwgMHg1YzY4NmQ0ZiwgMHg1YzhmYzNhNCwKLQkweDVjYjcxZTI3LCAweDVjZGU3Y2Q3LCAweDVkMDVkZmI0LCAweDVkMmQ0NmJkLAotCTB4NWQ1NGIxZjAsIDB4NWQ3YzIxNGUsIDB4NWRhMzk0ZDQsIDB4NWRjYjBjODMsCi0JMHg1ZGYyODg1OSwgMHg1ZTFhMDg1NiwgMHg1ZTQxOGM3OCwgMHg1ZTY5MTRiZSwKLQkweDVlOTBhMTI5LCAweDVlYjgzMWI3LCAweDVlZGZjNjY3LCAweDVmMDc1ZjM4LAotCTB4NWYyZWZjMjksIDB4NWY1NjlkM2EsIDB4NWY3ZTQyNmEsIDB4NWZhNWViYjcsCi0JMHg1ZmNkOTkyMSwgMHg1ZmY1NGFhOCwgMHg2MDFkMDA0YSwgMHg2MDQ0YmEwNiwKLQkweDYwNmM3N2RjLCAweDYwOTQzOWNhLCAweDYwYmJmZmQwLCAweDYwZTNjOWVlLAotCTB4NjEwYjk4MjEsIDB4NjEzMzZhNmEsIDB4NjE1YjQwYzgsIDB4NjE4MzFiMzksCi0JMHg2MWFhZjliZCwgMHg2MWQyZGM1MywgMHg2MWZhYzJmYSwgMHg2MjIyYWRiMiwKLQkweDYyNGE5Yzc5LCAweDYyNzI4ZjRmLCAweDYyOWE4NjMzLCAweDYyYzI4MTIzLAotCTB4NjJlYTgwMjAsIDB4NjMxMjgzMjksIDB4NjMzYThhM2MsIDB4NjM2Mjk1NTksCi0JMHg2MzhhYTQ3ZiwgMHg2M2IyYjdhZCwgMHg2M2RhY2VlMiwgMHg2NDAyZWExZSwKLQkweDY0MmIwOTYwLCAweDY0NTMyY2E2LCAweDY0N2I1M2YxLCAweDY0YTM3ZjNmLAotCTB4NjRjYmFlOGYsIDB4NjRmM2UxZTIsIDB4NjUxYzE5MzUsIDB4NjU0NDU0ODgsCi0JMHg2NTZjOTNkYiwgMHg2NTk0ZDcyYywgMHg2NWJkMWU3YiwgMHg2NWU1NjljNywKLQkweDY2MGRiOTBmLCAweDY2MzYwYzUzLCAweDY2NWU2MzkxLCAweDY2ODZiZWM5LAotCTB4NjZhZjFkZmEsIDB4NjZkNzgxMjMsIDB4NjZmZmU4NDQsIDB4NjcyODUzNWIsCi0JMHg2NzUwYzI2OCwgMHg2Nzc5MzU2YiwgMHg2N2ExYWM2MiwgMHg2N2NhMjc0YywKLQkweDY3ZjJhNjI5LCAweDY4MWIyOGY5LCAweDY4NDNhZmI5LCAweDY4NmMzYTZhLAotCTB4Njg5NGM5MGIsIDB4NjhiZDViOWIsIDB4NjhlNWYyMTksIDB4NjkwZThjODQsCi0JMHg2OTM3MmFkZCwgMHg2OTVmY2QyMSwgMHg2OTg4NzM1MCwgMHg2OWIxMWQ2YSwKLQkweDY5ZDljYjZkLCAweDZhMDI3ZDVhLCAweDZhMmIzMzJmLCAweDZhNTNlY2ViLAotCTB4NmE3Y2FhOGQsIDB4NmFhNTZjMTYsIDB4NmFjZTMxODQsIDB4NmFmNmZhZDYsCi0JMHg2YjFmYzgwYywgMHg2YjQ4OTkyNSwgMHg2YjcxNmUyMCwgMHg2YjlhNDZmZCwKLQkweDZiYzMyM2JiLCAweDZiZWMwNDU4LCAweDZjMTRlOGQ1LCAweDZjM2RkMTMwLAotCTB4NmM2NmJkNjksIDB4NmM4ZmFkODAsIDB4NmNiOGExNzIsIDB4NmNlMTk5NDAsCi0JMHg2ZDBhOTRlOSwgMHg2ZDMzOTQ2ZCwgMHg2ZDVjOTdjYSwgMHg2ZDg1OWVmZiwKLQkweDZkYWVhYTBkLCAweDZkZDdiOGYxLCAweDZlMDBjYmFkLCAweDZlMjllMjNlLAotCTB4NmU1MmZjYTQsIDB4NmU3YzFhZGYsIDB4NmVhNTNjZWUsIDB4NmVjZTYyY2YsCi0JMHg2ZWY3OGM4MywgMHg2ZjIwYmEwOSwgMHg2ZjQ5ZWI1ZiwgMHg2ZjczMjA4NSwKLQkweDZmOWM1OTdiLCAweDZmYzU5NjQwLCAweDZmZWVkNmQzLCAweDcwMTgxYjMzLAotCTB4NzA0MTYzNjAsIDB4NzA2YWFmNTksIDB4NzA5M2ZmMWQsIDB4NzBiZDUyYWIsCi0JMHg3MGU2YWEwNCwgMHg3MTEwMDUyNSwgMHg3MTM5NjQwZiwgMHg3MTYyYzZjMSwKLQkweDcxOGMyZDNhLCAweDcxYjU5NzdhLCAweDcxZGYwNTdmLCAweDcyMDg3NzQ5LAotCTB4NzIzMWVjZDgsIDB4NzI1YjY2MmEsIDB4NzI4NGUzM2YsIDB4NzJhZTY0MTcsCi0JMHg3MmQ3ZThiMCwgMHg3MzAxNzEwYSwgMHg3MzJhZmQyNCwgMHg3MzU0OGNmZSwKLQkweDczN2UyMDk3LCAweDczYTdiN2VlLCAweDczZDE1MzAzLCAweDczZmFmMWQ1LAotCTB4NzQyNDk0NjIsIDB4NzQ0ZTNhYWMsIDB4NzQ3N2U0YjAsIDB4NzRhMTkyNmUsCi0JMHg3NGNiNDNlNiwgMHg3NGY0ZjkxNywgMHg3NTFlYjIwMSwgMHg3NTQ4NmVhMSwKLQkweDc1NzIyZWY5LCAweDc1OWJmMzA3LCAweDc1YzViYWNhLCAweDc1ZWY4NjQyLAotCTB4NzYxOTU1NmYsIDB4NzY0MzI4NGYsIDB4NzY2Y2ZlZTIsIDB4NzY5NmQ5MjgsCi0JMHg3NmMwYjcxZiwgMHg3NmVhOThjNywgMHg3NzE0N2UyMCwgMHg3NzNlNjcyOCwKLQkweDc3Njg1M2RmLCAweDc3OTI0NDQ1LCAweDc3YmMzODU4LCAweDc3ZTYzMDE5LAotCTB4NzgxMDJiODUsIDB4NzgzYTJhOWUsIDB4Nzg2NDJkNjIsIDB4Nzg4ZTMzZDEsCi0JMHg3OGI4M2RlOSwgMHg3OGUyNGJhYiwgMHg3OTBjNWQxNSwgMHg3OTM2NzIyOCwKLQkweDc5NjA4YWUxLCAweDc5OGFhNzQyLCAweDc5YjRjNzQ4LCAweDc5ZGVlYWY0LAotCTB4N2EwOTEyNDUsIDB4N2EzMzNkM2EsIDB4N2E1ZDZiZDIsIDB4N2E4NzllMGUsCi0JMHg3YWIxZDNlYywgMHg3YWRjMGQ2YiwgMHg3YjA2NGE4YywgMHg3YjMwOGI0ZCwKLQkweDdiNWFjZmFlLCAweDdiODUxN2FlLCAweDdiYWY2MzRjLCAweDdiZDliMjg5LAotCTB4N2MwNDA1NjMsIDB4N2MyZTViZGEsIDB4N2M1OGI1ZWMsIDB4N2M4MzEzOWIsCi0JMHg3Y2FkNzRlNCwgMHg3Y2Q3ZDljNywgMHg3ZDAyNDI0NCwgMHg3ZDJjYWU1YSwKLQkweDdkNTcxZTA5LCAweDdkODE5MTRmLCAweDdkYWMwODJkLCAweDdkZDY4MmExLAotCTB4N2UwMTAwYWMsIDB4N2UyYjgyNGIsIDB4N2U1NjA3ODAsIDB4N2U4MDkwNDgsCi0JMHg3ZWFiMWNhNSwgMHg3ZWQ1YWM5NCwgMHg3ZjAwNDAxNSwgMHg3ZjJhZDcyOSwKLQkweDdmNTU3MWNkLCAweDdmODAxMDAzLCAweDdmYWFiMWM4LCAweDdmZDU1NzFkCi19OwotCi0KLWNvbnN0IFdvcmQzMiBpbnZTQkZbMjRdID0gewotICAweDNGRkQzNEZDLCAweDJEM0Y4MDAwLCAweDI0RjE4QzdFLCAweDFGRkU5QTdFLAotICAweDFDOURGMTBDLCAweDFBMUY4NTFBLCAweDE4MkZFOTk0LCAweDE2OUZDMDAwLAotICAweDE1NTQyQUFBLCAweDE0M0MzMUMyLCAweDEzNEIxQjZDLCAweDEyNzkyMEJFLAotICAweDExQkYyRkNDLCAweDExMUE3NDlFLCAweDEwODVGQzQyLCAweDBGRkZBN0JFLAotICAweDBGODU1ODE4LCAweDBGMTRFRTU2LCAweDBFQUU2QTc4LCAweDBFNEVGODg2LAotICAweDBERjY5ODgwLCAweDBEQTQ5NTY4LCAweDBENTc4NTQyLCAweDBEMTAxRDBDCi19OwotCi1jb25zdCBXb3JkMTYgcG93MnRvbWludXNOb3ZlcjE2WzE3XSA9IHsKLSAgMHg3ZmZmLCAweDdhOTMsIDB4NzU2MCwgMHg3MDY2LAotICAweDZiYTIsIDB4NjcxMiwgMHg2MmI0LCAweDVlODQsCi0gIDB4NWE4MiwgMHg1NmFjLCAweDUyZmYsIDB4NGY3YiwKLSAgMHg0YzFjLCAweDQ4ZTIsIDB4NDVjYiwgMHg0MmQ1LAotICAweDQwMDAKLX07Ci0KLWNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYkxvbmdbTUFYX1NGQl9MT05HICsgMV0gPSB7Ci0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDE0LCAxNCwgMTQsIDE0LAotICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gIDE0LCAxNCwgMTQKLX07Ci0KLWNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYlNob3J0W01BWF9TRkJfU0hPUlQgKyAxXSA9IHsKLSAgNywgNywgNywgNywgNywgNywgNywgMTAsIDEwLAotICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEzLCAxMwotfTsKLQotY29uc3QgV29yZDMyIHNwZWNFeHBNYW50VGFibGVDb21iX2VuY1s0XVsxNF0gPQotewotICB7MHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwKLSAgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsCi0gICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LAotICAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTZ9LAotCi0gIHsweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LAotICAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwKLSAgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsCi0gICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZX0sCi0KLSAgezB4NWE4Mjc5OWEsICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsCi0gICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkLAotICAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwKLSAgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkfSwKLQotICB7MHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwKLSAgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsCi0gICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LAotICAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGJ9Ci19OwotCi1jb25zdCAgVVdvcmQ4IHNwZWNFeHBUYWJsZUNvbWJfZW5jWzRdWzE0XSA9Ci17Ci0gIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCi0gIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCi0gIHsxLCAyLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOH0sCi0gIHsxLCAzLCA0LCA1LCA3LCA4LCA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE3LCAxOX0KLX07Ci0KLWNvbnN0IFdvcmQxNiBxdWFudEJvcmRlcnNbNF1bNF0gPSB7Ci0gIC8qIHBvdygxLjAtMC40MDU0LCA0LzMpLzE2ICogcG93KDIsICgwLi4zKS80KSAqLwotICB7MHgwNDAwLCAweDBlZTcsIDB4MWM4NiwgMHgyYzBkfSwKLSAgLyogcG93KDIuMC0wLjQwNTQsIDQvMykvMTYgKiBwb3coMiwgKDAuLjMpLzQpICovCi0gIHsweDA0YzIsIDB4MTFiOSwgMHgyMWViLCAweDM0NjN9LAotICAvKiBwb3coMy4wLTAuNDA1NCwgNC8zKS8xNiAqIHBvdygyLCAoMC4uMykvNCkgKi8KLSAgezB4MDVhOCwgMHgxNTE0LCAweDI4NTYsIDB4M2U0Y30sCi0gIC8qIHBvdyg0LjAtMC40MDU0LCA0LzMpLzE2ICogcG93KDIsICgwLi4zKS80KSAqLwotICB7MHgwNmJhLCAweDE5MTEsIDB4MmZmOCwgMHg0YTE2fSwKLX07Ci0KLWNvbnN0IFdvcmQxNiBxdWFudFJlY29uWzRdWzNdID0gewotICB7MHgwODAwLCAweDE0MjksIDB4MjI5ZH0sCi0gIHsweDA5ODMsIDB4MTdmOSwgMHgyOTJhfSwKLSAgezB4MGI1MCwgMHgxYzgyLCAweDMwZjR9LAotICB7MHgwZDc0LCAweDIxZTcsIDB4M2EzN30sCi19OwotCi1jb25zdCBpbnQgc2FtcFJhdGVUYWJbTlVNX1NBTVBMRV9SQVRFU10gPSB7Ci0gICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKLQkyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsICA4MDAwCi19OwotCi0KLWNvbnN0IGludAlyYXRlc1s4XSA9IHsKLQkxNjAsIDI0MCwgMzIwLCA0MDAsIDQ4MCwgNTYwLCA2NDAsIDAKLX07Ci0KLWNvbnN0IGludCBCYW5kd2l0aENvZWZUYWJbOF1bTlVNX1NBTVBMRV9SQVRFU10gPSB7Ci0JeyA3MDAwLCAgNzAwMCwgIDQ2NjYsICAzNTAwLCAgMzUwMCwgIDI4MDAsICAyODAwLCAgMjgwMCwgIDI4MDAsICAyMDAwLCAgMjAwMCwgIDIwMDB9LAotCXsxMjAwMCwgMTIwMDAsICA4MDAwLCAgNjAwMCwgIDYwMDAsICA2MDAwLCAgNDAwMCwgIDQwMDAsICA0MDAwLCAgMzAwMCwgIDMwMDAsICAzMDAwfSwKLQl7MTgwMDAsIDE4MDAwLCAxMjAwMCwgIDkwMDAsICA5MDAwLCAgOTAwMCwgIDcwMDAsICA3MDAwLCAgNzAwMCwgIDUwMDAsICA1MDAwLCAgNTAwMH0sCi0JezIwMDAwLCAyMDAwMCwgMTYwMDAsIDEyMDAwLCAxMjAwMCwgMTIwMDAsICA5MDAwLCAgOTAwMCwgIDkwMDAsICA2MDAwLCAgNjAwMCwgIDYwMDB9LAotCXsyMDAwMCwgMjAwMDAsIDE4NjY2LCAxNDAwMCwgMTQwMDAsIDE0MDAwLCAxMDAwMCwgMTAwMDAsIDEwMDAwLCAgNzAwMCwgIDcwMDAsICA3MDAwfSwKLQl7MjAwMDAsIDIwMDAwLCAyMDAwMCwgMTYwMDAsIDE2MDAwLCAxNjAwMCwgMTIwMDAsIDEyMDAwLCAxMjAwMCwgIDgwMDAsICA4MDAwLCAgODAwMH0sCi0JezIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDE1MDAwLCAxNTAwMCwgMTUwMDAsIDEwMDAwLCAxMDAwMCwgMTAwMDB9LAotCXsyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwfQotfTsKLQotCi0vKiB0b3RhbCBudW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzIGluIG9uZSB3aW5kb3cgKi8KLWNvbnN0IFVXb3JkOCBzZkJhbmRUb3RhbFNob3J0W05VTV9TQU1QTEVfUkFURVNdID0gewotICAgIDEyLCAxMiwgMTIsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUKLX07Ci0KLWNvbnN0IFVXb3JkOCBzZkJhbmRUb3RhbExvbmdbTlVNX1NBTVBMRV9SQVRFU10gPSB7Ci0gICAgNDEsIDQxLCA0NywgNDksIDQ5LCA1MSwgNDcsIDQ3LCA0MywgNDMsIDQzLCA0MAotfTsKLQotLyogc2NhbGUgZmFjdG9yIGJhbmQgdGFibGVzICovCi1jb25zdCBpbnQgc2ZCYW5kVGFiU2hvcnRPZmZzZXRbTlVNX1NBTVBMRV9SQVRFU10gPSB7MCwgMCwgMCwgMTMsIDEzLCAxMywgMjgsIDI4LCA0NCwgNDQsIDQ0LCA2MH07Ci0KLWNvbnN0IHNob3J0IHNmQmFuZFRhYlNob3J0Wzc2XSA9IHsKLQkvKiBzaG9ydCBibG9jayA2NCwgODgsIDk2IGtIeiBbMTNdICAqLwotCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAzMiwgIDQwLCAgNDgsICA2NCwgIDkyLCAxMjgsCi0KLQkvKiBzaG9ydCBibG9jayAzMiwgNDQsIDQ4IGtIeiBbMTVdICAqLwotCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjgsICAzNiwgIDQ0LCAgNTYsICA2OCwgIDgwLCAgOTYsIDExMiwgMTI4LAotCi0JLyogc2hvcnQgYmxvY2sgMjIsIDI0IGtIeiBbMTZdICAqLwotCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDM2LCAgNDQsICA1MiwgIDY0LCAgNzYsICA5MiwgMTA4LCAxMjgsCi0KLQkvKiBzaG9ydCBibG9jayAxMSwgMTIsIDE2IGtIeiBbMTZdICovCi0JMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICA0MCwgIDQ4LCAgNjAsICA3MiwgIDg4LCAxMDgsIDEyOCwKLQotCS8qIHNob3J0IGJsb2NrIDgga0h6IFsxNl0gKi8KLQkwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzNiwgIDQ0LCAgNTIsICA2MCwgIDcyLCAgODgsIDEwOCwgMTI4Ci19OwotCi1jb25zdCBpbnQgc2ZCYW5kVGFiTG9uZ09mZnNldFtOVU1fU0FNUExFX1JBVEVTXSA9IHswLCAwLCA0MiwgOTAsIDkwLCAxNDAsIDE5MiwgMTkyLCAyNDAsIDI0MCwgMjQwLCAyODR9OwotCi1jb25zdCBzaG9ydCBzZkJhbmRUYWJMb25nWzMyNV0gPSB7Ci0JLyogbG9uZyBibG9jayA4OCwgOTYga0h6IFs0Ml0gICovCi0JICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LCAgIDUyLAotCSA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTU2LCAxNzIsIDE4OCwgIDIxMiwKLQkyNDAsIDI3NiwgMzIwLCAzODQsIDQ0OCwgNTEyLCA1NzYsIDY0MCwgNzA0LCA3NjgsIDgzMiwgODk2LCA5NjAsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDY0IGtIeiBbNDhdICAqLwotCSAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLCAgNTYsICAgNjQsCi0JIDcyLCAgODAsICA4OCwgMTAwLCAxMTIsIDEyNCwgMTQwLCAxNTYsIDE3MiwgMTkyLCAyMTYsIDI0MCwgMjY4LCAzMDQsIDM0NCwgIDM4NCwKLQk0MjQsIDQ2NCwgNTA0LCA1NDQsIDU4NCwgNjI0LCA2NjQsIDcwNCwgNzQ0LCA3ODQsIDgyNCwgODY0LCA5MDQsIDk0NCwgOTg0LCAxMDI0LAotCi0JLyogbG9uZyBibG9jayA0NCwgNDgga0h6IFs1MF0gKi8KLQkgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDcyLCAgIDgwLCAgODgsCi0JIDk2LCAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwgMjQwLCAyNjQsIDI5MiwgMzIwLCAzNTIsIDM4NCwgIDQxNiwgNDQ4LAotCTQ4MCwgNTEyLCA1NDQsIDU3NiwgNjA4LCA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDMyIGtIeiBbNTJdICovCi0JICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LCAgNjQsICA3MiwgICA4MCwgIDg4LCAgOTYsCi0JMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNjAsIDE3NiwgMTk2LCAyMTYsIDI0MCwgMjY0LCAyOTIsIDMyMCwgMzUyLCAzODQsIDQxNiwgIDQ0OCwgNDgwLCA1MTIsCi0JNTQ0LCA1NzYsIDYwOCwgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCA5NjAsIDk5MiwgMTAyNCwKLQotCS8qIGxvbmcgYmxvY2sgMjIsIDI0IGtIeiBbNDhdICovCi0JICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDUyLCAgNjAsICA2OCwgICA3NiwKLQkgODQsICA5MiwgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwgMTYwLCAxNzIsIDE4OCwgMjA0LCAyMjAsIDI0MCwgMjYwLCAgMjg0LAotCTMwOCwgMzM2LCAzNjQsIDM5NiwgNDMyLCA0NjgsIDUwOCwgNTUyLCA2MDAsIDY1MiwgNzA0LCA3NjgsIDgzMiwgODk2LCA5NjAsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDExLCAxMiwgMTYga0h6IFs0NF0gKi8KLQkgIDAsICAgOCwgIDE2LCAgMjQsICAzMiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAxMDAsICAxMTIsIDEyNCwKLQkxMzYsIDE0OCwgMTYwLCAxNzIsIDE4NCwgMTk2LCAyMTIsIDIyOCwgMjQ0LCAyNjAsIDI4MCwgMzAwLCAzMjAsICAzNDQsIDM2OCwKLQkzOTYsIDQyNCwgNDU2LCA0OTIsIDUzMiwgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsIDgzMiwgODk2LCA5NjAsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDgga0h6IFs0MV0gICovCi0JICAwLCAgMTIsICAyNCwgIDM2LCAgNDgsICA2MCwgIDcyLCAgODQsICA5NiwgMTA4LCAxMjAsIDEzMiwgIDE0NCwgMTU2LAotCTE3MiwgMTg4LCAyMDQsIDIyMCwgMjM2LCAyNTIsIDI2OCwgMjg4LCAzMDgsIDMyOCwgMzQ4LCAzNzIsICAzOTYsIDQyMCwKLQk0NDgsIDQ3NiwgNTA4LCA1NDQsIDU4MCwgNjIwLCA2NjQsIDcxMiwgNzY0LCA4MjAsIDg4MCwgOTQ0LCAxMDI0Ci19OwotCi0vKgotICB0aGVzZSB0YWJsZXMgYXJlIHVzZWQgb25seSBmb3IgY291bnRpbmcgYW5kCi0gIGFyZSBzdG9yZWQgaW4gcGFja2VkIGZvcm1hdAotKi8KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgewotICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fSwKLSAgICAgIHsweDBhMDgsMHgwNzA2LDB4MGEwOH0sCi0gICAgICB7MHgwYjA5LDB4MDkwOCwweDBiMDl9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwYTA4LDB4MDcwNiwweDBhMDd9LAotICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKLSAgICAgIHsweDA5MDcsMHgwNzA2LDB4MGEwOH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDBiMDksMHgwOTA3LDB4MGIwOH0sCi0gICAgICB7MHgwOTA4LDB4MDcwNiwweDA5MDh9LAotICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwN30sCi0gICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAotICAgICAgezB4MDkwNywweDA3MDYsMHgwOTA4fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKLSAgICAgIHsweDA1MDUsMHgwMTAzLDB4MDUwNX0sCi0gICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwOTA4LDB4MDcwNiwweDA5MDd9LAotICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKLSAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwOH0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9LAotICAgICAgezB4MDkwOCwweDA3MDYsMHgwOTA4fSwKLSAgICAgIHsweDBiMDgsMHgwOTA3LDB4MGIwOX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDBhMDgsMHgwNzA2LDB4MDkwN30sCi0gICAgICB7MHgwNzA2LDB4MDUwNCwweDA3MDZ9LAotICAgICAgezB4MDkwOCwweDA3MDYsMHgwYTA3fQotICAgIH0sCi0gICAgewotICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fSwKLSAgICAgIHsweDBhMDcsMHgwNzA2LDB4MDkwOH0sCi0gICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9Ci0gICAgfQotICB9Ci19OwotCi0KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgewotICAgICAgezB4MDEwNCwweDA0MDUsMHgwODA4fSwKLSAgICAgIHsweDA0MDUsMHgwNTA0LDB4MDgwOH0sCi0gICAgICB7MHgwOTA5LDB4MDkwOCwweDBhMGJ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwNDA1LDB4MDYwNSwweDA5MDh9LAotICAgICAgezB4MDYwNSwweDA2MDQsMHgwOTA4fSwKLSAgICAgIHsweDA5MDgsMHgwOTA3LDB4MGEwYX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA5MDksMHgwYTA4LDB4MGQwYn0sCi0gICAgICB7MHgwOTA4LDB4MDkwOCwweDBiMGF9LAotICAgICAgezB4MGIwYiwweDBhMGEsMHgwYzBifQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDA0MDQsMHgwNjA1LDB4MGEwOH0sCi0gICAgICB7MHgwNjA0LDB4MDcwNCwweDBhMDh9LAotICAgICAgezB4MGEwOCwweDBhMDgsMHgwYzBhfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDUwNCwweDA3MDQsMHgwYjA4fSwKLSAgICAgIHsweDA2MDQsMHgwNzA0LDB4MGEwN30sCi0gICAgICB7MHgwOTA4LDB4MDkwNywweDBiMDl9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwOTA4LDB4MGEwOCwweDBkMGF9LAotICAgICAgezB4MDgwNywweDA5MDcsMHgwYzA5fSwKLSAgICAgIHsweDBhMGEsMHgwYjA5LDB4MGMwYX0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwODA4LDB4MGEwOCwweDBmMGJ9LAotICAgICAgezB4MDkwOCwweDBiMDcsMHgwZjBhfSwKLSAgICAgIHsweDBkMGIsMHgwZTBhLDB4MTAwY30KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA4MDgsMHgwYTA3LDB4MGUwYX0sCi0gICAgICB7MHgwOTA3LDB4MGEwNywweDBlMDl9LAotICAgICAgezB4MGMwYSwweDBjMDksMHgwZjBifQotICAgIH0sCi0gICAgewotICAgICAgezB4MGIwYiwweDBjMGEsMHgxMDBjfSwKLSAgICAgIHsweDBhMGEsMHgwYjA5LDB4MGYwYn0sCi0gICAgICB7MHgwYzBiLDB4MGMwYSwweDBmMGJ9Ci0gICAgfQotICB9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfbHRhYjVfNls5XVs5XT0KLXsKLSAgezB4MGQwYiwweDBjMGEsMHgwYjA5LDB4MGIwOSwweDBhMDksMHgwYjA5LDB4MGIwOSwweDBjMGEsMHgwZDBifSwKLSAgezB4MGMwYSwweDBiMDksMHgwYTA4LDB4MDkwNywweDA4MDcsMHgwOTA3LDB4MGEwOCwweDBiMDksMHgwYzBhfSwKLSAgezB4MGMwOSwweDBhMDgsMHgwOTA2LDB4MDgwNiwweDA3MDYsMHgwODA2LDB4MDkwNiwweDBhMDgsMHgwYjA5fSwKLSAgezB4MGIwOSwweDA5MDcsMHgwODA2LDB4MDUwNCwweDA0MDQsMHgwNTA0LDB4MDgwNiwweDA5MDcsMHgwYjA5fSwKLSAgezB4MGEwOSwweDA4MDcsMHgwNzA2LDB4MDQwNCwweDAxMDQsMHgwNDA0LDB4MDcwNiwweDA4MDcsMHgwYjA5fSwKLSAgezB4MGIwOSwweDA5MDcsMHgwODA2LDB4MDUwNCwweDA0MDQsMHgwNTA0LDB4MDgwNiwweDA5MDcsMHgwYjA5fSwKLSAgezB4MGIwOSwweDBhMDgsMHgwOTA2LDB4MDgwNiwweDA3MDYsMHgwODA2LDB4MDkwNiwweDBhMDgsMHgwYjA5fSwKLSAgezB4MGMwYSwweDBiMDksMHgwYTA4LDB4MDkwNywweDA4MDcsMHgwOTA3LDB4MGEwNywweDBiMDgsMHgwYzBhfSwKLSAgezB4MGQwYiwweDBjMGEsMHgwYzA5LDB4MGIwOSwweDBhMDksMHgwYTA5LDB4MGIwOSwweDBjMGEsMHgwZDBifQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2x0YWI3XzhbOF1bOF09Ci17Ci0gIHsweDAxMDUsMHgwMzA0LDB4MDYwNSwweDA3MDYsMHgwODA3LDB4MDkwOCwweDBhMDksMHgwYjBhfSwKLSAgezB4MDMwNCwweDA0MDMsMHgwNjA0LDB4MDcwNSwweDA4MDYsMHgwODA3LDB4MDkwNywweDA5MDh9LAotICB7MHgwNjA1LDB4MDYwNCwweDA3MDQsMHgwODA1LDB4MDgwNiwweDA5MDcsMHgwOTA3LDB4MGEwOH0sCi0gIHsweDA3MDYsMHgwNzA1LDB4MDgwNSwweDA4MDYsMHgwOTA2LDB4MDkwNywweDBhMDgsMHgwYTA4fSwKLSAgezB4MDgwNywweDA4MDYsMHgwOTA2LDB4MDkwNiwweDBhMDcsMHgwYTA3LDB4MGEwOCwweDBiMDl9LAotICB7MHgwOTA4LDB4MDgwNywweDA5MDYsMHgwOTA3LDB4MGEwNywweDBhMDgsMHgwYjA4LDB4MGIwYX0sCi0gIHsweDBhMDksMHgwOTA3LDB4MDkwNywweDBhMDgsMHgwYTA4LDB4MGIwOCwweDBjMDksMHgwYzA5fSwKLSAgezB4MGIwYSwweDBhMDgsMHgwYTA4LDB4MGEwOCwweDBiMDksMHgwYjA5LDB4MGMwOSwweDBjMGF9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfbHRhYjlfMTBbMTNdWzEzXT0KLXsKLSAgezB4MDEwNiwweDAzMDUsMHgwNjA2LDB4MDgwNiwweDA5MDcsMHgwYTA4LDB4MGEwOSwweDBiMGEsMHgwYjBhLDB4MGMwYSwweDBjMGIsMHgwZDBiLDB4MGQwY30sCi0gIHsweDAzMDUsMHgwNDA0LDB4MDYwNCwweDA3MDUsMHgwODA2LDB4MDgwNywweDA5MDcsMHgwYTA4LDB4MGEwOCwweDBhMDksMHgwYjBhLDB4MGMwYSwweDBjMGJ9LAotICB7MHgwNjA2LDB4MDYwNCwweDA3MDUsMHgwODA1LDB4MDgwNiwweDA5MDYsMHgwYTA3LDB4MGEwOCwweDBhMDgsMHgwYjA5LDB4MGMwOSwweDBjMGEsMHgwYzBhfSwKLSAgezB4MDgwNiwweDA3MDUsMHgwODA1LDB4MDkwNSwweDA5MDYsMHgwYTA3LDB4MGEwNywweDBiMDgsMHgwYjA4LDB4MGIwOSwweDBjMDksMHgwYzBhLDB4MGQwYX0sCi0gIHsweDA5MDcsMHgwODA2LDB4MDkwNiwweDA5MDYsMHgwYTA2LDB4MGEwNywweDBiMDcsMHgwYjA4LDB4MGIwOCwweDBjMDksMHgwYzA5LDB4MGMwYSwweDBkMGF9LAotICB7MHgwYTA4LDB4MDkwNywweDA5MDYsMHgwYTA3LDB4MGIwNywweDBiMDcsMHgwYjA4LDB4MGMwOCwweDBiMDgsMHgwYzA5LDB4MGMwYSwweDBkMGEsMHgwZDBifSwKLSAgezB4MGIwOSwweDA5MDcsMHgwYTA3LDB4MGIwNywweDBiMDcsMHgwYjA4LDB4MGMwOCwweDBjMDksMHgwYzA5LDB4MGMwOSwweDBkMGEsMHgwZDBhLDB4MGQwYn0sCi0gIHsweDBiMDksMHgwYTA4LDB4MGEwOCwweDBiMDgsMHgwYjA4LDB4MGMwOCwweDBjMDksMHgwZDA5LDB4MGQwOSwweDBkMGEsMHgwZDBhLDB4MGQwYiwweDBkMGJ9LAotICB7MHgwYjA5LDB4MGEwOCwweDBhMDgsMHgwYjA4LDB4MGIwOCwweDBiMDgsMHgwYzA5LDB4MGMwOSwweDBkMGEsMHgwZDBhLDB4MGUwYSwweDBkMGIsMHgwZTBifSwKLSAgezB4MGIwYSwweDBhMDksMHgwYjA5LDB4MGIwOSwweDBjMDksMHgwYzA5LDB4MGMwOSwweDBjMGEsMHgwZDBhLDB4MGQwYSwweDBlMGIsMHgwZTBiLDB4MGUwY30sCi0gIHsweDBjMGEsMHgwYjA5LDB4MGIwOSwweDBjMDksMHgwYzA5LDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBlMGIsMHgwZTBiLDB4MGUwYiwweDBmMGN9LAotICB7MHgwYzBiLDB4MGIwYSwweDBjMDksMHgwYzBhLDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBkMGIsMHgwZTBiLDB4MGUwYiwweDBmMGIsMHgwZjBjfSwKLSAgezB4MGQwYiwweDBjMGEsMHgwYzBhLDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBkMGIsMHgwZTBiLDB4MGUwYywweDBlMGMsMHgwZTBjLDB4MGYwY30KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMTFbMTddWzE3XT0KLXsKLSAgezB4MDAwNCwweDAwMDUsMHgwMDA2LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYywweDAwMGIsMHgwMDBjLDB4MDAwYywweDAwMGF9LAotICB7MHgwMDA1LDB4MDAwNCwweDAwMDUsMHgwMDA2LDB4MDAwNywweDAwMDcsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwOH0sCi0gIHsweDAwMDYsMHgwMDA1LDB4MDAwNSwweDAwMDYsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKLSAgezB4MDAwNywweDAwMDYsMHgwMDA2LDB4MDAwNiwweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAotICB7MHgwMDA4LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCi0gIHsweDAwMDgsMHgwMDA3LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKLSAgezB4MDAwOSwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAotICB7MHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCi0gIHsweDAwMGEsMHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDA4fSwKLSAgezB4MDAwYSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMDh9LAotICB7MHgwMDBiLDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwOH0sCi0gIHsweDAwMGIsMHgwMDBhLDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDA4fSwKLSAgezB4MDAwYiwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMDl9LAotICB7MHgwMDBiLDB4MDAwYSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwOX0sCi0gIHsweDAwMGIsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDA5fSwKLSAgezB4MDAwYywweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBjLDB4MDAwYywweDAwMDl9LAotICB7MHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwNX0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFic2NmWzEyMV09Ci17Ci0gIDB4MDAxMiwKLSAgMHgwMDEyLAotICAweDAwMTIsCi0gIDB4MDAxMiwKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEyLAotICAweDAwMTMsCi0gIDB4MDAxMiwKLSAgMHgwMDExLAotICAweDAwMTEsCi0gIDB4MDAxMCwKLSAgMHgwMDExLAotICAweDAwMTAsCi0gIDB4MDAxMCwKLSAgMHgwMDEwLAotICAweDAwMTAsCi0gIDB4MDAwZiwKLSAgMHgwMDBmLAotICAweDAwMGUsCi0gIDB4MDAwZSwKLSAgMHgwMDBlLAotICAweDAwMGUsCi0gIDB4MDAwZSwKLSAgMHgwMDBlLAotICAweDAwMGQsCi0gIDB4MDAwZCwKLSAgMHgwMDBjLAotICAweDAwMGMsCi0gIDB4MDAwYywKLSAgMHgwMDBiLAotICAweDAwMGMsCi0gIDB4MDAwYiwKLSAgMHgwMDBhLAotICAweDAwMGEsCi0gIDB4MDAwYSwKLSAgMHgwMDA5LAotICAweDAwMDksCi0gIDB4MDAwOCwKLSAgMHgwMDA4LAotICAweDAwMDgsCi0gIDB4MDAwNywKLSAgMHgwMDA2LAotICAweDAwMDYsCi0gIDB4MDAwNSwKLSAgMHgwMDA0LAotICAweDAwMDMsCi0gIDB4MDAwMSwKLSAgMHgwMDA0LAotICAweDAwMDQsCi0gIDB4MDAwNSwKLSAgMHgwMDA2LAotICAweDAwMDYsCi0gIDB4MDAwNywKLSAgMHgwMDA3LAotICAweDAwMDgsCi0gIDB4MDAwOCwKLSAgMHgwMDA5LAotICAweDAwMDksCi0gIDB4MDAwYSwKLSAgMHgwMDBhLAotICAweDAwMGEsCi0gIDB4MDAwYiwKLSAgMHgwMDBiLAotICAweDAwMGIsCi0gIDB4MDAwYiwKLSAgMHgwMDBjLAotICAweDAwMGMsCi0gIDB4MDAwZCwKLSAgMHgwMDBkLAotICAweDAwMGQsCi0gIDB4MDAwZSwKLSAgMHgwMDBlLAotICAweDAwMTAsCi0gIDB4MDAwZiwKLSAgMHgwMDEwLAotICAweDAwMGYsCi0gIDB4MDAxMiwKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMwotfTsKLQotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjFbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7Ci0gICAgICB7MHgwN2Y4LDB4MDFmMSwweDA3ZmR9LAotICAgICAgezB4MDNmNSwweDAwNjgsMHgwM2YwfSwKLSAgICAgIHsweDA3ZjcsMHgwMWVjLDB4MDdmNX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAzZjEsMHgwMDcyLDB4MDNmNH0sCi0gICAgICB7MHgwMDc0LDB4MDAxMSwweDAwNzZ9LAotICAgICAgezB4MDFlYiwweDAwNmMsMHgwM2Y2fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDdmYywweDAxZTEsMHgwN2YxfSwKLSAgICAgIHsweDAxZjAsMHgwMDYxLDB4MDFmNn0sCi0gICAgICB7MHgwN2YyLDB4MDFlYSwweDA3ZmJ9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDFmMiwweDAwNjksMHgwMWVkfSwKLSAgICAgIHsweDAwNzcsMHgwMDE3LDB4MDA2Zn0sCi0gICAgICB7MHgwMWU2LDB4MDA2NCwweDAxZTV9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMDY3LDB4MDAxNSwweDAwNjJ9LAotICAgICAgezB4MDAxMiwweDAwMDAsMHgwMDE0fSwKLSAgICAgIHsweDAwNjUsMHgwMDE2LDB4MDA2ZH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAxZTksMHgwMDYzLDB4MDFlNH0sCi0gICAgICB7MHgwMDZiLDB4MDAxMywweDAwNzF9LAotICAgICAgezB4MDFlMywweDAwNzAsMHgwMWYzfQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDA3ZmUsMHgwMWU3LDB4MDdmM30sCi0gICAgICB7MHgwMWVmLDB4MDA2MCwweDAxZWV9LAotICAgICAgezB4MDdmMCwweDAxZTIsMHgwN2ZhfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDNmMywweDAwNmEsMHgwMWU4fSwKLSAgICAgIHsweDAwNzUsMHgwMDEwLDB4MDA3M30sCi0gICAgICB7MHgwMWY0LDB4MDA2ZSwweDAzZjd9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwN2Y2LDB4MDFlMCwweDA3Zjl9LAotICAgICAgezB4MDNmMiwweDAwNjYsMHgwMWY1fSwKLSAgICAgIHsweDA3ZmYsMHgwMWY3LDB4MDdmNH0KLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMlszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsKLSAgICAgIHsweDAxZjMsMHgwMDZmLDB4MDFmZH0sCi0gICAgICB7MHgwMGViLDB4MDAyMywweDAwZWF9LAotICAgICAgezB4MDFmNywweDAwZTgsMHgwMWZhfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDBmMiwweDAwMmQsMHgwMDcwfSwKLSAgICAgIHsweDAwMjAsMHgwMDA2LDB4MDAyYn0sCi0gICAgICB7MHgwMDZlLDB4MDAyOCwweDAwZTl9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMWY5LDB4MDA2NiwweDAwZjh9LAotICAgICAgezB4MDBlNywweDAwMWIsMHgwMGYxfSwKLSAgICAgIHsweDAxZjQsMHgwMDZiLDB4MDFmNX0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwMGVjLDB4MDAyYSwweDAwNmN9LAotICAgICAgezB4MDAyYywweDAwMGEsMHgwMDI3fSwKLSAgICAgIHsweDAwNjcsMHgwMDFhLDB4MDBmNX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwMjQsMHgwMDA4LDB4MDAxZn0sCi0gICAgICB7MHgwMDA5LDB4MDAwMCwweDAwMDd9LAotICAgICAgezB4MDAxZCwweDAwMGIsMHgwMDMwfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDBlZiwweDAwMWMsMHgwMDY0fSwKLSAgICAgIHsweDAwMWUsMHgwMDBjLDB4MDAyOX0sCi0gICAgICB7MHgwMGYzLDB4MDAyZiwweDAwZjB9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDFmYywweDAwNzEsMHgwMWYyfSwKLSAgICAgIHsweDAwZjQsMHgwMDIxLDB4MDBlNn0sCi0gICAgICB7MHgwMGY3LDB4MDA2OCwweDAxZjh9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMGVlLDB4MDAyMiwweDAwNjV9LAotICAgICAgezB4MDAzMSwweDAwMDIsMHgwMDI2fSwKLSAgICAgIHsweDAwZWQsMHgwMDI1LDB4MDA2YX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAxZmIsMHgwMDcyLDB4MDFmZX0sCi0gICAgICB7MHgwMDY5LDB4MDAyZSwweDAwZjZ9LAotICAgICAgezB4MDFmZiwweDAwNmQsMHgwMWY2fQotICAgIH0KLSAgfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWIzWzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgewotICAgICAgezB4MDAwMCwweDAwMDksMHgwMGVmfSwKLSAgICAgIHsweDAwMGIsMHgwMDE5LDB4MDBmMH0sCi0gICAgICB7MHgwMWViLDB4MDFlNiwweDAzZjJ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMDBhLDB4MDAzNSwweDAxZWZ9LAotICAgICAgezB4MDAzNCwweDAwMzcsMHgwMWU5fSwKLSAgICAgIHsweDAxZWQsMHgwMWU3LDB4MDNmM30KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAxZWUsMHgwM2VkLDB4MWZmYX0sCi0gICAgICB7MHgwMWVjLDB4MDFmMiwweDA3Zjl9LAotICAgICAgezB4MDdmOCwweDAzZjgsMHgwZmY4fQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDAwMDgsMHgwMDM4LDB4MDNmNn0sCi0gICAgICB7MHgwMDM2LDB4MDA3NSwweDAzZjF9LAotICAgICAgezB4MDNlYiwweDAzZWMsMHgwZmY0fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDAxOCwweDAwNzYsMHgwN2Y0fSwKLSAgICAgIHsweDAwMzksMHgwMDc0LDB4MDNlZn0sCi0gICAgICB7MHgwMWYzLDB4MDFmNCwweDA3ZjZ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMWU4LDB4MDNlYSwweDFmZmN9LAotICAgICAgezB4MDBmMiwweDAxZjEsMHgwZmZifSwKLSAgICAgIHsweDAzZjUsMHgwN2YzLDB4MGZmY30KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwMGVlLDB4MDNmNywweDdmZmV9LAotICAgICAgezB4MDFmMCwweDA3ZjUsMHg3ZmZkfSwKLSAgICAgIHsweDFmZmIsMHgzZmZhLDB4ZmZmZn0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwZjEsMHgwM2YwLDB4M2ZmY30sCi0gICAgICB7MHgwMWVhLDB4MDNlZSwweDNmZmJ9LAotICAgICAgezB4MGZmNiwweDBmZmEsMHg3ZmZjfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDdmMiwweDBmZjUsMHhmZmZlfSwKLSAgICAgIHsweDAzZjQsMHgwN2Y3LDB4N2ZmYn0sCi0gICAgICB7MHgwZmY3LDB4MGZmOSwweDdmZmF9Ci0gICAgfQotICB9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjRbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7Ci0gICAgICB7MHgwMDA3LDB4MDAxNiwweDAwZjZ9LAotICAgICAgezB4MDAxOCwweDAwMDgsMHgwMGVmfSwKLSAgICAgIHsweDAxZWYsMHgwMGYzLDB4MDdmOH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwMTksMHgwMDE3LDB4MDBlZH0sCi0gICAgICB7MHgwMDE1LDB4MDAwMSwweDAwZTJ9LAotICAgICAgezB4MDBmMCwweDAwNzAsMHgwM2YwfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDFlZSwweDAwZjEsMHgwN2ZhfSwKLSAgICAgIHsweDAwZWUsMHgwMGU0LDB4MDNmMn0sCi0gICAgICB7MHgwN2Y2LDB4MDNlZiwweDA3ZmR9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDAwNSwweDAwMTQsMHgwMGYyfSwKLSAgICAgIHsweDAwMDksMHgwMDA0LDB4MDBlNX0sCi0gICAgICB7MHgwMGY0LDB4MDBlOCwweDAzZjR9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMDA2LDB4MDAwMiwweDAwZTd9LAotICAgICAgezB4MDAwMywweDAwMDAsMHgwMDZifSwKLSAgICAgIHsweDAwZTMsMHgwMDY5LDB4MDFmM30KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwZWIsMHgwMGU2LDB4MDNmNn0sCi0gICAgICB7MHgwMDZlLDB4MDA2YSwweDAxZjR9LAotICAgICAgezB4MDNlYywweDAxZjAsMHgwM2Y5fQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDAwZjUsMHgwMGVjLDB4MDdmYn0sCi0gICAgICB7MHgwMGVhLDB4MDA2ZiwweDAzZjd9LAotICAgICAgezB4MDdmOSwweDAzZjMsMHgwZmZmfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDBlOSwweDAwNmQsMHgwM2Y4fSwKLSAgICAgIHsweDAwNmMsMHgwMDY4LDB4MDFmNX0sCi0gICAgICB7MHgwM2VlLDB4MDFmMiwweDA3ZjR9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwN2Y3LDB4MDNmMSwweDBmZmV9LAotICAgICAgezB4MDNlZCwweDAxZjEsMHgwN2Y1fSwKLSAgICAgIHsweDA3ZmUsMHgwM2Y1LDB4MDdmY30KLSAgICB9Ci0gIH0KLX07Ci1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjVbOV1bOV09Ci17Ci0gIHsweDFmZmYsMHgwZmY3LDB4MDdmNCwweDA3ZTgsMHgwM2YxLDB4MDdlZSwweDA3ZjksMHgwZmY4LDB4MWZmZH0sCi0gIHsweDBmZmQsMHgwN2YxLDB4MDNlOCwweDAxZTgsMHgwMGYwLDB4MDFlYywweDAzZWUsMHgwN2YyLDB4MGZmYX0sCi0gIHsweDBmZjQsMHgwM2VmLDB4MDFmMiwweDAwZTgsMHgwMDcwLDB4MDBlYywweDAxZjAsMHgwM2VhLDB4MDdmM30sCi0gIHsweDA3ZWIsMHgwMWViLDB4MDBlYSwweDAwMWEsMHgwMDA4LDB4MDAxOSwweDAwZWUsMHgwMWVmLDB4MDdlZH0sCi0gIHsweDAzZjAsMHgwMGYyLDB4MDA3MywweDAwMGIsMHgwMDAwLDB4MDAwYSwweDAwNzEsMHgwMGYzLDB4MDdlOX0sCi0gIHsweDA3ZWYsMHgwMWVlLDB4MDBlZiwweDAwMTgsMHgwMDA5LDB4MDAxYiwweDAwZWIsMHgwMWU5LDB4MDdlY30sCi0gIHsweDA3ZjYsMHgwM2ViLDB4MDFmMywweDAwZWQsMHgwMDcyLDB4MDBlOSwweDAxZjEsMHgwM2VkLDB4MDdmN30sCi0gIHsweDBmZjYsMHgwN2YwLDB4MDNlOSwweDAxZWQsMHgwMGYxLDB4MDFlYSwweDAzZWMsMHgwN2Y4LDB4MGZmOX0sCi0gIHsweDFmZmMsMHgwZmZjLDB4MGZmNSwweDA3ZWEsMHgwM2YzLDB4MDNmMiwweDA3ZjUsMHgwZmZiLDB4MWZmZX0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNls5XVs5XT0KLXsKLSAgezB4MDdmZSwweDAzZmQsMHgwMWYxLDB4MDFlYiwweDAxZjQsMHgwMWVhLDB4MDFmMCwweDAzZmMsMHgwN2ZkfSwKLSAgezB4MDNmNiwweDAxZTUsMHgwMGVhLDB4MDA2YywweDAwNzEsMHgwMDY4LDB4MDBmMCwweDAxZTYsMHgwM2Y3fSwKLSAgezB4MDFmMywweDAwZWYsMHgwMDMyLDB4MDAyNywweDAwMjgsMHgwMDI2LDB4MDAzMSwweDAwZWIsMHgwMWY3fSwKLSAgezB4MDFlOCwweDAwNmYsMHgwMDJlLDB4MDAwOCwweDAwMDQsMHgwMDA2LDB4MDAyOSwweDAwNmIsMHgwMWVlfSwKLSAgezB4MDFlZiwweDAwNzIsMHgwMDJkLDB4MDAwMiwweDAwMDAsMHgwMDAzLDB4MDAyZiwweDAwNzMsMHgwMWZhfSwKLSAgezB4MDFlNywweDAwNmUsMHgwMDJiLDB4MDAwNywweDAwMDEsMHgwMDA1LDB4MDAyYywweDAwNmQsMHgwMWVjfSwKLSAgezB4MDFmOSwweDAwZWUsMHgwMDMwLDB4MDAyNCwweDAwMmEsMHgwMDI1LDB4MDAzMywweDAwZWMsMHgwMWYyfSwKLSAgezB4MDNmOCwweDAxZTQsMHgwMGVkLDB4MDA2YSwweDAwNzAsMHgwMDY5LDB4MDA3NCwweDAwZjEsMHgwM2ZhfSwKLSAgezB4MDdmZiwweDAzZjksMHgwMWY2LDB4MDFlZCwweDAxZjgsMHgwMWU5LDB4MDFmNSwweDAzZmIsMHgwN2ZjfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWI3WzhdWzhdPQotewotICB7MHgwMDAwLDB4MDAwNSwweDAwMzcsMHgwMDc0LDB4MDBmMiwweDAxZWIsMHgwM2VkLDB4MDdmN30sCi0gIHsweDAwMDQsMHgwMDBjLDB4MDAzNSwweDAwNzEsMHgwMGVjLDB4MDBlZSwweDAxZWUsMHgwMWY1fSwKLSAgezB4MDAzNiwweDAwMzQsMHgwMDcyLDB4MDBlYSwweDAwZjEsMHgwMWU5LDB4MDFmMywweDAzZjV9LAotICB7MHgwMDczLDB4MDA3MCwweDAwZWIsMHgwMGYwLDB4MDFmMSwweDAxZjAsMHgwM2VjLDB4MDNmYX0sCi0gIHsweDAwZjMsMHgwMGVkLDB4MDFlOCwweDAxZWYsMHgwM2VmLDB4MDNmMSwweDAzZjksMHgwN2ZifSwKLSAgezB4MDFlZCwweDAwZWYsMHgwMWVhLDB4MDFmMiwweDAzZjMsMHgwM2Y4LDB4MDdmOSwweDA3ZmN9LAotICB7MHgwM2VlLDB4MDFlYywweDAxZjQsMHgwM2Y0LDB4MDNmNywweDA3ZjgsMHgwZmZkLDB4MGZmZX0sCi0gIHsweDA3ZjYsMHgwM2YwLDB4MDNmMiwweDAzZjYsMHgwN2ZhLDB4MDdmZCwweDBmZmMsMHgwZmZmfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWI4WzhdWzhdPQotewotICB7MHgwMDBlLDB4MDAwNSwweDAwMTAsMHgwMDMwLDB4MDA2ZiwweDAwZjEsMHgwMWZhLDB4MDNmZX0sCi0gIHsweDAwMDMsMHgwMDAwLDB4MDAwNCwweDAwMTIsMHgwMDJjLDB4MDA2YSwweDAwNzUsMHgwMGY4fSwKLSAgezB4MDAwZiwweDAwMDIsMHgwMDA2LDB4MDAxNCwweDAwMmUsMHgwMDY5LDB4MDA3MiwweDAwZjV9LAotICB7MHgwMDJmLDB4MDAxMSwweDAwMTMsMHgwMDJhLDB4MDAzMiwweDAwNmMsMHgwMGVjLDB4MDBmYX0sCi0gIHsweDAwNzEsMHgwMDJiLDB4MDAyZCwweDAwMzEsMHgwMDZkLDB4MDA3MCwweDAwZjIsMHgwMWY5fSwKLSAgezB4MDBlZiwweDAwNjgsMHgwMDMzLDB4MDA2YiwweDAwNmUsMHgwMGVlLDB4MDBmOSwweDAzZmN9LAotICB7MHgwMWY4LDB4MDA3NCwweDAwNzMsMHgwMGVkLDB4MDBmMCwweDAwZjYsMHgwMWY2LDB4MDFmZH0sCi0gIHsweDAzZmQsMHgwMGYzLDB4MDBmNCwweDAwZjcsMHgwMWY3LDB4MDFmYiwweDAxZmMsMHgwM2ZmfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWI5WzEzXVsxM109Ci17Ci0gIHsweDAwMDAsMHgwMDA1LDB4MDAzNywweDAwZTcsMHgwMWRlLDB4MDNjZSwweDAzZDksMHgwN2M4LDB4MDdjZCwweDBmYzgsMHgwZmRkLDB4MWZlNCwweDFmZWN9LAotICB7MHgwMDA0LDB4MDAwYywweDAwMzUsMHgwMDcyLDB4MDBlYSwweDAwZWQsMHgwMWUyLDB4MDNkMSwweDAzZDMsMHgwM2UwLDB4MDdkOCwweDBmY2YsMHgwZmQ1fSwKLSAgezB4MDAzNiwweDAwMzQsMHgwMDcxLDB4MDBlOCwweDAwZWMsMHgwMWUxLDB4MDNjZiwweDAzZGQsMHgwM2RiLDB4MDdkMCwweDBmYzcsMHgwZmQ0LDB4MGZlNH0sCi0gIHsweDAwZTYsMHgwMDcwLDB4MDBlOSwweDAxZGQsMHgwMWUzLDB4MDNkMiwweDAzZGMsMHgwN2NjLDB4MDdjYSwweDA3ZGUsMHgwZmQ4LDB4MGZlYSwweDFmZGJ9LAotICB7MHgwMWRmLDB4MDBlYiwweDAxZGMsMHgwMWU2LDB4MDNkNSwweDAzZGUsMHgwN2NiLDB4MDdkZCwweDA3ZGMsMHgwZmNkLDB4MGZlMiwweDBmZTcsMHgxZmUxfSwKLSAgezB4MDNkMCwweDAxZTAsMHgwMWU0LDB4MDNkNiwweDA3YzUsMHgwN2QxLDB4MDdkYiwweDBmZDIsMHgwN2UwLDB4MGZkOSwweDBmZWIsMHgxZmUzLDB4MWZlOX0sCi0gIHsweDA3YzQsMHgwMWU1LDB4MDNkNywweDA3YzYsMHgwN2NmLDB4MDdkYSwweDBmY2IsMHgwZmRhLDB4MGZlMywweDBmZTksMHgxZmU2LDB4MWZmMywweDFmZjd9LAotICB7MHgwN2QzLDB4MDNkOCwweDAzZTEsMHgwN2Q0LDB4MDdkOSwweDBmZDMsMHgwZmRlLDB4MWZkZCwweDFmZDksMHgxZmUyLDB4MWZlYSwweDFmZjEsMHgxZmY2fSwKLSAgezB4MDdkMiwweDAzZDQsMHgwM2RhLDB4MDdjNywweDA3ZDcsMHgwN2UyLDB4MGZjZSwweDBmZGIsMHgxZmQ4LDB4MWZlZSwweDNmZjAsMHgxZmY0LDB4M2ZmMn0sCi0gIHsweDA3ZTEsMHgwM2RmLDB4MDdjOSwweDA3ZDYsMHgwZmNhLDB4MGZkMCwweDBmZTUsMHgwZmU2LDB4MWZlYiwweDFmZWYsMHgzZmYzLDB4M2ZmNCwweDNmZjV9LAotICB7MHgwZmUwLDB4MDdjZSwweDA3ZDUsMHgwZmM2LDB4MGZkMSwweDBmZTEsMHgxZmUwLDB4MWZlOCwweDFmZjAsMHgzZmYxLDB4M2ZmOCwweDNmZjYsMHg3ZmZjfSwKLSAgezB4MGZlOCwweDA3ZGYsMHgwZmM5LDB4MGZkNywweDBmZGMsMHgxZmRjLDB4MWZkZiwweDFmZWQsMHgxZmY1LDB4M2ZmOSwweDNmZmIsMHg3ZmZkLDB4N2ZmZX0sCi0gIHsweDFmZTcsMHgwZmNjLDB4MGZkNiwweDBmZGYsMHgxZmRlLDB4MWZkYSwweDFmZTUsMHgxZmYyLDB4M2ZmYSwweDNmZjcsMHgzZmZjLDB4M2ZmZCwweDdmZmZ9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjEwWzEzXVsxM109Ci17Ci0gIHsweDAwMjIsMHgwMDA4LDB4MDAxZCwweDAwMjYsMHgwMDVmLDB4MDBkMywweDAxY2YsMHgwM2QwLDB4MDNkNywweDAzZWQsMHgwN2YwLDB4MDdmNiwweDBmZmR9LAotICB7MHgwMDA3LDB4MDAwMCwweDAwMDEsMHgwMDA5LDB4MDAyMCwweDAwNTQsMHgwMDYwLDB4MDBkNSwweDAwZGMsMHgwMWQ0LDB4MDNjZCwweDAzZGUsMHgwN2U3fSwKLSAgezB4MDAxYywweDAwMDIsMHgwMDA2LDB4MDAwYywweDAwMWUsMHgwMDI4LDB4MDA1YiwweDAwY2QsMHgwMGQ5LDB4MDFjZSwweDAxZGMsMHgwM2Q5LDB4MDNmMX0sCi0gIHsweDAwMjUsMHgwMDBiLDB4MDAwYSwweDAwMGQsMHgwMDI0LDB4MDA1NywweDAwNjEsMHgwMGNjLDB4MDBkZCwweDAxY2MsMHgwMWRlLDB4MDNkMywweDAzZTd9LAotICB7MHgwMDVkLDB4MDAyMSwweDAwMWYsMHgwMDIzLDB4MDAyNywweDAwNTksMHgwMDY0LDB4MDBkOCwweDAwZGYsMHgwMWQyLDB4MDFlMiwweDAzZGQsMHgwM2VlfSwKLSAgezB4MDBkMSwweDAwNTUsMHgwMDI5LDB4MDA1NiwweDAwNTgsMHgwMDYyLDB4MDBjZSwweDAwZTAsMHgwMGUyLDB4MDFkYSwweDAzZDQsMHgwM2UzLDB4MDdlYn0sCi0gIHsweDAxYzksMHgwMDVlLDB4MDA1YSwweDAwNWMsMHgwMDYzLDB4MDBjYSwweDAwZGEsMHgwMWM3LDB4MDFjYSwweDAxZTAsMHgwM2RiLDB4MDNlOCwweDA3ZWN9LAotICB7MHgwMWUzLDB4MDBkMiwweDAwY2IsMHgwMGQwLDB4MDBkNywweDAwZGIsMHgwMWM2LDB4MDFkNSwweDAxZDgsMHgwM2NhLDB4MDNkYSwweDA3ZWEsMHgwN2YxfSwKLSAgezB4MDFlMSwweDAwZDQsMHgwMGNmLDB4MDBkNiwweDAwZGUsMHgwMGUxLDB4MDFkMCwweDAxZDYsMHgwM2QxLDB4MDNkNSwweDAzZjIsMHgwN2VlLDB4MDdmYn0sCi0gIHsweDAzZTksMHgwMWNkLDB4MDFjOCwweDAxY2IsMHgwMWQxLDB4MDFkNywweDAxZGYsMHgwM2NmLDB4MDNlMCwweDAzZWYsMHgwN2U2LDB4MDdmOCwweDBmZmF9LAotICB7MHgwM2ViLDB4MDFkZCwweDAxZDMsMHgwMWQ5LDB4MDFkYiwweDAzZDIsMHgwM2NjLDB4MDNkYywweDAzZWEsMHgwN2VkLDB4MDdmMywweDA3ZjksMHgwZmY5fSwKLSAgezB4MDdmMiwweDAzY2UsMHgwMWU0LDB4MDNjYiwweDAzZDgsMHgwM2Q2LDB4MDNlMiwweDAzZTUsMHgwN2U4LDB4MDdmNCwweDA3ZjUsMHgwN2Y3LDB4MGZmYn0sCi0gIHsweDA3ZmEsMHgwM2VjLDB4MDNkZiwweDAzZTEsMHgwM2U0LDB4MDNlNiwweDAzZjAsMHgwN2U5LDB4MDdlZiwweDBmZjgsMHgwZmZlLDB4MGZmYywweDBmZmZ9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjExWzE3XVsxN109Ci17Ci0gIHsweDAwMDAsMHgwMDA2LDB4MDAxOSwweDAwM2QsMHgwMDljLDB4MDBjNiwweDAxYTcsMHgwMzkwLDB4MDNjMiwweDAzZGYsMHgwN2U2LDB4MDdmMywweDBmZmIsMHgwN2VjLDB4MGZmYSwweDBmZmUsMHgwMzhlfSwKLSAgezB4MDAwNSwweDAwMDEsMHgwMDA4LDB4MDAxNCwweDAwMzcsMHgwMDQyLDB4MDA5MiwweDAwYWYsMHgwMTkxLDB4MDFhNSwweDAxYjUsMHgwMzllLDB4MDNjMCwweDAzYTIsMHgwM2NkLDB4MDdkNiwweDAwYWV9LAotICB7MHgwMDE3LDB4MDAwNywweDAwMDksMHgwMDE4LDB4MDAzOSwweDAwNDAsMHgwMDhlLDB4MDBhMywweDAwYjgsMHgwMTk5LDB4MDFhYywweDAxYzEsMHgwM2IxLDB4MDM5NiwweDAzYmUsMHgwM2NhLDB4MDA5ZH0sCi0gIHsweDAwM2MsMHgwMDE1LDB4MDAxNiwweDAwMWEsMHgwMDNiLDB4MDA0NCwweDAwOTEsMHgwMGE1LDB4MDBiZSwweDAxOTYsMHgwMWFlLDB4MDFiOSwweDAzYTEsMHgwMzkxLDB4MDNhNSwweDAzZDUsMHgwMDk0fSwKLSAgezB4MDA5YSwweDAwMzYsMHgwMDM4LDB4MDAzYSwweDAwNDEsMHgwMDhjLDB4MDA5YiwweDAwYjAsMHgwMGMzLDB4MDE5ZSwweDAxYWIsMHgwMWJjLDB4MDM5ZiwweDAzOGYsMHgwM2E5LDB4MDNjZiwweDAwOTN9LAotICB7MHgwMGJmLDB4MDAzZSwweDAwM2YsMHgwMDQzLDB4MDA0NSwweDAwOWUsMHgwMGE3LDB4MDBiOSwweDAxOTQsMHgwMWEyLDB4MDFiYSwweDAxYzMsMHgwM2E2LDB4MDNhNywweDAzYmIsMHgwM2Q0LDB4MDA5Zn0sCi0gIHsweDAxYTAsMHgwMDhmLDB4MDA4ZCwweDAwOTAsMHgwMDk4LDB4MDBhNiwweDAwYjYsMHgwMGM0LDB4MDE5ZiwweDAxYWYsMHgwMWJmLDB4MDM5OSwweDAzYmYsMHgwM2I0LDB4MDNjOSwweDAzZTcsMHgwMGE4fSwKLSAgezB4MDFiNiwweDAwYWIsMHgwMGE0LDB4MDBhYSwweDAwYjIsMHgwMGMyLDB4MDBjNSwweDAxOTgsMHgwMWE0LDB4MDFiOCwweDAzOGMsMHgwM2E0LDB4MDNjNCwweDAzYzYsMHgwM2RkLDB4MDNlOCwweDAwYWR9LAotICB7MHgwM2FmLDB4MDE5MiwweDAwYmQsMHgwMGJjLDB4MDE4ZSwweDAxOTcsMHgwMTlhLDB4MDFhMywweDAxYjEsMHgwMzhkLDB4MDM5OCwweDAzYjcsMHgwM2QzLDB4MDNkMSwweDAzZGIsMHgwN2RkLDB4MDBiNH0sCi0gIHsweDAzZGUsMHgwMWE5LDB4MDE5YiwweDAxOWMsMHgwMWExLDB4MDFhYSwweDAxYWQsMHgwMWIzLDB4MDM4YiwweDAzYjIsMHgwM2I4LDB4MDNjZSwweDAzZTEsMHgwM2UwLDB4MDdkMiwweDA3ZTUsMHgwMGI3fSwKLSAgezB4MDdlMywweDAxYmIsMHgwMWE4LDB4MDFhNiwweDAxYjAsMHgwMWIyLDB4MDFiNywweDAzOWIsMHgwMzlhLDB4MDNiYSwweDAzYjUsMHgwM2Q2LDB4MDdkNywweDAzZTQsMHgwN2Q4LDB4MDdlYSwweDAwYmF9LAotICB7MHgwN2U4LDB4MDNhMCwweDAxYmQsMHgwMWI0LDB4MDM4YSwweDAxYzQsMHgwMzkyLDB4MDNhYSwweDAzYjAsMHgwM2JjLDB4MDNkNywweDA3ZDQsMHgwN2RjLDB4MDdkYiwweDA3ZDUsMHgwN2YwLDB4MDBjMX0sCi0gIHsweDA3ZmIsMHgwM2M4LDB4MDNhMywweDAzOTUsMHgwMzlkLDB4MDNhYywweDAzYWUsMHgwM2M1LDB4MDNkOCwweDAzZTIsMHgwM2U2LDB4MDdlNCwweDA3ZTcsMHgwN2UwLDB4MDdlOSwweDA3ZjcsMHgwMTkwfSwKLSAgezB4MDdmMiwweDAzOTMsMHgwMWJlLDB4MDFjMCwweDAzOTQsMHgwMzk3LDB4MDNhZCwweDAzYzMsMHgwM2MxLDB4MDNkMiwweDA3ZGEsMHgwN2Q5LDB4MDdkZiwweDA3ZWIsMHgwN2Y0LDB4MDdmYSwweDAxOTV9LAotICB7MHgwN2Y4LDB4MDNiZCwweDAzOWMsMHgwM2FiLDB4MDNhOCwweDAzYjMsMHgwM2I5LDB4MDNkMCwweDAzZTMsMHgwM2U1LDB4MDdlMiwweDA3ZGUsMHgwN2VkLDB4MDdmMSwweDA3ZjksMHgwN2ZjLDB4MDE5M30sCi0gIHsweDBmZmQsMHgwM2RjLDB4MDNiNiwweDAzYzcsMHgwM2NjLDB4MDNjYiwweDAzZDksMHgwM2RhLDB4MDdkMywweDA3ZTEsMHgwN2VlLDB4MDdlZiwweDA3ZjUsMHgwN2Y2LDB4MGZmYywweDBmZmYsMHgwMTlkfSwKLSAgezB4MDFjMiwweDAwYjUsMHgwMGExLDB4MDA5NiwweDAwOTcsMHgwMDk1LDB4MDA5OSwweDAwYTAsMHgwMGEyLDB4MDBhYywweDAwYTksMHgwMGIxLDB4MDBiMywweDAwYmIsMHgwMGMwLDB4MDE4ZiwweDAwMDR9Ci19OwotCi1jb25zdCBVV29yZDMyIGh1ZmZfY3RhYnNjZlsxMjFdPQotewotICAweDAwMDNmZmU4LAotICAweDAwMDNmZmU2LAotICAweDAwMDNmZmU3LAotICAweDAwMDNmZmU1LAotICAweDAwMDdmZmY1LAotICAweDAwMDdmZmYxLAotICAweDAwMDdmZmVkLAotICAweDAwMDdmZmY2LAotICAweDAwMDdmZmVlLAotICAweDAwMDdmZmVmLAotICAweDAwMDdmZmYwLAotICAweDAwMDdmZmZjLAotICAweDAwMDdmZmZkLAotICAweDAwMDdmZmZmLAotICAweDAwMDdmZmZlLAotICAweDAwMDdmZmY3LAotICAweDAwMDdmZmY4LAotICAweDAwMDdmZmZiLAotICAweDAwMDdmZmY5LAotICAweDAwMDNmZmU0LAotICAweDAwMDdmZmZhLAotICAweDAwMDNmZmUzLAotICAweDAwMDFmZmVmLAotICAweDAwMDFmZmYwLAotICAweDAwMDBmZmY1LAotICAweDAwMDFmZmVlLAotICAweDAwMDBmZmYyLAotICAweDAwMDBmZmYzLAotICAweDAwMDBmZmY0LAotICAweDAwMDBmZmYxLAotICAweDAwMDA3ZmY2LAotICAweDAwMDA3ZmY3LAotICAweDAwMDAzZmY5LAotICAweDAwMDAzZmY1LAotICAweDAwMDAzZmY3LAotICAweDAwMDAzZmYzLAotICAweDAwMDAzZmY2LAotICAweDAwMDAzZmYyLAotICAweDAwMDAxZmY3LAotICAweDAwMDAxZmY1LAotICAweDAwMDAwZmY5LAotICAweDAwMDAwZmY3LAotICAweDAwMDAwZmY2LAotICAweDAwMDAwN2Y5LAotICAweDAwMDAwZmY0LAotICAweDAwMDAwN2Y4LAotICAweDAwMDAwM2Y5LAotICAweDAwMDAwM2Y3LAotICAweDAwMDAwM2Y1LAotICAweDAwMDAwMWY4LAotICAweDAwMDAwMWY3LAotICAweDAwMDAwMGZhLAotICAweDAwMDAwMGY4LAotICAweDAwMDAwMGY2LAotICAweDAwMDAwMDc5LAotICAweDAwMDAwMDNhLAotICAweDAwMDAwMDM4LAotICAweDAwMDAwMDFhLAotICAweDAwMDAwMDBiLAotICAweDAwMDAwMDA0LAotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDBhLAotICAweDAwMDAwMDBjLAotICAweDAwMDAwMDFiLAotICAweDAwMDAwMDM5LAotICAweDAwMDAwMDNiLAotICAweDAwMDAwMDc4LAotICAweDAwMDAwMDdhLAotICAweDAwMDAwMGY3LAotICAweDAwMDAwMGY5LAotICAweDAwMDAwMWY2LAotICAweDAwMDAwMWY5LAotICAweDAwMDAwM2Y0LAotICAweDAwMDAwM2Y2LAotICAweDAwMDAwM2Y4LAotICAweDAwMDAwN2Y1LAotICAweDAwMDAwN2Y0LAotICAweDAwMDAwN2Y2LAotICAweDAwMDAwN2Y3LAotICAweDAwMDAwZmY1LAotICAweDAwMDAwZmY4LAotICAweDAwMDAxZmY0LAotICAweDAwMDAxZmY2LAotICAweDAwMDAxZmY4LAotICAweDAwMDAzZmY4LAotICAweDAwMDAzZmY0LAotICAweDAwMDBmZmYwLAotICAweDAwMDA3ZmY0LAotICAweDAwMDBmZmY2LAotICAweDAwMDA3ZmY1LAotICAweDAwMDNmZmUyLAotICAweDAwMDdmZmQ5LAotICAweDAwMDdmZmRhLAotICAweDAwMDdmZmRiLAotICAweDAwMDdmZmRjLAotICAweDAwMDdmZmRkLAotICAweDAwMDdmZmRlLAotICAweDAwMDdmZmQ4LAotICAweDAwMDdmZmQyLAotICAweDAwMDdmZmQzLAotICAweDAwMDdmZmQ0LAotICAweDAwMDdmZmQ1LAotICAweDAwMDdmZmQ2LAotICAweDAwMDdmZmYyLAotICAweDAwMDdmZmRmLAotICAweDAwMDdmZmU3LAotICAweDAwMDdmZmU4LAotICAweDAwMDdmZmU5LAotICAweDAwMDdmZmVhLAotICAweDAwMDdmZmViLAotICAweDAwMDdmZmU2LAotICAweDAwMDdmZmUwLAotICAweDAwMDdmZmUxLAotICAweDAwMDdmZmUyLAotICAweDAwMDdmZmUzLAotICAweDAwMDdmZmU0LAotICAweDAwMDdmZmU1LAotICAweDAwMDdmZmQ3LAotICAweDAwMDdmZmVjLAotICAweDAwMDdmZmY0LAotICAweDAwMDdmZmYzCi19OwotCi1jb25zdCBXb3JkMzIgbV9sb2cyX3RhYmxlW0lOVF9CSVRTXSA9IHsKLSAgMHgwMDAwMDAwMCwweDRhZTAwZDAwLDB4MjkzNGYwODAsMHgxNWMwMWEzZiwKLSAgMHgwYjMxZmI4MCwweDA1YWViNGUwLDB4MDJkY2YyZDAsMHgwMTZmZTUwYywKLSAgMHgwMGI4NGUyMywweDAwNWMzZTEwLDB4MDAyZTI0Y2EsMHgwMDE3MTNkNiwKLSAgMHgwMDBiOGE0NywweDAwMDVjNTNiLDB4MDAwMmUyYTMsMHgwMDAxNzE1MywKLSAgMHgwMDAwYjhhYSwweDAwMDA1YzU1LDB4MDAwMDJlMmIsMHgwMDAwMTcxNSwKLSAgMHgwMDAwMGI4YiwweDAwMDAwNWM1LDB4MDAwMDAyZTMsMHgwMDAwMDE3MSwKLSAgMHgwMDAwMDBiOSwweDAwMDAwMDVjLDB4MDAwMDAwMmUsMHgwMDAwMDAxNywKLSAgMHgwMDAwMDAwYywweDAwMDAwMDA2LDB4MDAwMDAwMDMsMHgwMDAwMDAwMQotfTsKLQotCi0vKgotICAzIGJpdCByZXNvbHV0aW9uCi0qLwotY29uc3QgV29yZDMyIHRuc0NvZWZmM1s4XSA9Ci17Ci0gIDB4ODFmMWQxZDQsCi0gIDB4OTEyNjE0N2MsCi0gIDB4YWRiOTIyZjcsCi0gIDB4ZDQzOGFmMDksCi0gIDB4MDAwMDAwMDAsCi0gIDB4Mzc4OTgwODcsCi0gIDB4NjQxMzBkZmEsCi0gIDB4N2NjYTZmZmIsCi19OwotCi1jb25zdCBXb3JkMzIgdG5zQ29lZmYzQm9yZGVyc1s4XSA9Ci17Ci0gIDB4ODAwMDAwMDAsICAvKiAtNCAqLwotICAweDg3YjgyNmRlLCAgLyogLTMgKi8KLSAgMHg5ZGYyNDE1MywgIC8qIC0yICovCi0gIDB4YmZmZmZmZTUsICAvKiAtMSAqLwotICAweGU5YzVlNTc4LCAgLyogIDAgKi8KLSAgMHgxYzdiOTBmMCwgIC8qICAxICovCi0gIDB4NGZjZTgzYWEsICAvKiAgMiAqLwotICAweDczNTJmMmM0LCAgLyogIDMgKi8KLX07Ci0KLQotLyoKLSAgNCBiaXQgcmVzb2x1dGlvbgotKi8KLQotY29uc3QgV29yZDMyIHRuc0NvZWZmNFsxNl0gPQotewotICAweDgwOGJjODRiLAotICAweDg0ZTJlNTdkLAotICAweDhkNmI0OWZiLAotICAweDk5ZGE5MjA3LAotICAweGE5YzQ1NzA3LAotICAweGJjOWRkZTc4LAotICAweGQxYzJkNGZjLAotICAweGU4N2FlNTM5LAotICAweDAwMDAwMDAwLAotICAweDFhOWNkOWMwLAotICAweDM0MGZmMjNiLAotICAweDRiM2M4YmY3LAotICAweDVmMWY1ZTgwLAotICAweDZlZDllYjg0LAotICAweDc5YmMzODgwLAotICAweDdmNGM3ZTg5Ci19OwotCi1jb25zdCBXb3JkMzIgdG5zQ29lZmY0Qm9yZGVyc1sxNl09Ci17Ci0gIDB4ODAwMDAwMDAsICAvKiAtOCAqLwotICAweDgyMmRlZmVmLCAgLyogLTcgKi8KLSAgMHg4OGE0YmZlNSwgIC8qIC02ICovCi0gIDB4OTMyYzE1OWMsICAvKiAtNSAqLwotICAweGExNjgyN2MxLCAgLyogLTQgKi8KLSAgMHhiMmRjZGUyNiwgIC8qIC0zICovCi0gIDB4YzZmMjBiOTEsICAvKiAtMiAqLwotICAweGRjZjg5YzY0LCAgLyogLTEgKi8KLSAgMHhmNDMwOGNlMSwgIC8qICAwICovCi0gIDB4MGQ2MTMwNTQsICAvKiAgMSAqLwotICAweDI3OGRkZTgwLCAgLyogIDIgKi8KLSAgMHg0MDAwMDAxYiwgIC8qICAzICovCi0gIDB4NTVhNjEyN2MsICAvKiAgNCAqLwotICAweDY3OGRkZThmLCAgLyogIDUgKi8KLSAgMHg3NGVmMGVkOCwgIC8qICA2ICovCi0gIDB4N2QzM2YwZGIgICAvKiAgNyAqLwotfTsKLQotCi1jb25zdCB1bnNpZ25lZCBjaGFyIGJpdHJldlRhYlsxNyArIDEyOV0gPQotewotLyogNjQgKi8KLTB4MDEsIDB4MDgsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MGMsIDB4MDUsIDB4MGEsIDB4MDcsIDB4MGUsIDB4MGIsIDB4MGQsIDB4MDAsIDB4MDYsIDB4MDksIDB4MGYsCi0weDAwLAotCi0vKiA1MTIgKi8KLTB4MDEsIDB4NDAsIDB4MDIsIDB4MjAsIDB4MDMsIDB4NjAsIDB4MDQsIDB4MTAsIDB4MDUsIDB4NTAsIDB4MDYsIDB4MzAsIDB4MDcsIDB4NzAsIDB4MDksIDB4NDgsCi0weDBhLCAweDI4LCAweDBiLCAweDY4LCAweDBjLCAweDE4LCAweDBkLCAweDU4LCAweDBlLCAweDM4LCAweDBmLCAweDc4LCAweDExLCAweDQ0LCAweDEyLCAweDI0LAotMHgxMywgMHg2NCwgMHgxNSwgMHg1NCwgMHgxNiwgMHgzNCwgMHgxNywgMHg3NCwgMHgxOSwgMHg0YywgMHgxYSwgMHgyYywgMHgxYiwgMHg2YywgMHgxZCwgMHg1YywKLTB4MWUsIDB4M2MsIDB4MWYsIDB4N2MsIDB4MjEsIDB4NDIsIDB4MjMsIDB4NjIsIDB4MjUsIDB4NTIsIDB4MjYsIDB4MzIsIDB4MjcsIDB4NzIsIDB4MjksIDB4NGEsCi0weDJiLCAweDZhLCAweDJkLCAweDVhLCAweDJlLCAweDNhLCAweDJmLCAweDdhLCAweDMxLCAweDQ2LCAweDMzLCAweDY2LCAweDM1LCAweDU2LCAweDM3LCAweDc2LAotMHgzOSwgMHg0ZSwgMHgzYiwgMHg2ZSwgMHgzZCwgMHg1ZSwgMHgzZiwgMHg3ZSwgMHg0MywgMHg2MSwgMHg0NSwgMHg1MSwgMHg0NywgMHg3MSwgMHg0YiwgMHg2OSwKLTB4NGQsIDB4NTksIDB4NGYsIDB4NzksIDB4NTMsIDB4NjUsIDB4NTcsIDB4NzUsIDB4NWIsIDB4NmQsIDB4NWYsIDB4N2QsIDB4NjcsIDB4NzMsIDB4NmYsIDB4N2IsCi0weDAwLCAweDA4LCAweDE0LCAweDFjLCAweDIyLCAweDJhLCAweDM2LCAweDNlLCAweDQxLCAweDQ5LCAweDU1LCAweDVkLCAweDYzLCAweDZiLCAweDc3LCAweDdmLAotMHgwMCwKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjE3Nzg3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYWFjZW5jLmMKLQotCUNvbnRlbnQ6CWFhYyBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInZvQUFDLmgiCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImFhY2VuY19jb3JlLmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotI2luY2x1ZGUgImNtbk1lbW9yeS5oIgotI2luY2x1ZGUgIm1lbWFsaWduLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0vKioKLSogSW5pdCB0aGUgYXVkaW8gY29kZWMgbW9kdWxlIGFuZCByZXR1cm4gY29kZWMgaGFuZGxlCi0qIFxwYXJhbSBwaENvZGVjIFtPVVRdIFJldHVybiB0aGUgdmlkZW8gY29kZWMgaGFuZGxlCi0qIFxwYXJhbSB2VHlwZQlbSU5dIFRoZSBjb2RlYyB0eXBlIGlmIHRoZSBtb2R1bGUgc3VwcG9ydCBtdWx0aSBjb2RlYy4KLSogXHBhcmFtIHBVc2VyRGF0YQlbSU5dIFRoZSBpbml0IHBhcmFtLiBJdCBpcyBtZW1vcnkgb3BlcmF0b3Igb3IgYWxsb2NlZCBtZW1vcnkKLSogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuCi0qLwotVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY0luaXQoVk9fSEFORExFICogcGhDb2RlYyxWT19BVURJT19DT0RJTkdUWVBFIHZUeXBlLCBWT19DT0RFQ19JTklUX1VTRVJEQVRBICpwVXNlckRhdGEpCi17Ci0JQUFDX0VOQ09ERVIqaEFhY0VuYzsKLQlpbnQgZXJyb3I7Ci0KLSNpZmRlZiBVU0VfREVBVUxUX01FTQotCVZPX01FTV9PUEVSQVRPUiB2b01lbW9wcmF0b3I7Ci0jZW5kaWYKLQlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsKLQotI2lmZGVmIFVTRV9ERUFVTFRfTUVNCi0JaW50IGludGVyTWVtOwotICAgICAgICBpbnRlck1lbSA9IDA7Ci0jZW5kaWYKLQotICAgICAgICBVTlVTRUQodlR5cGUpOwotCi0JZXJyb3IgPSAwOwotCi0JLyogaW5pdCB0aGUgbWVtb3J5IG9wZXJhdG9yICovCi0JaWYocFVzZXJEYXRhID09IE5VTEwgfHwgcFVzZXJEYXRhLT5tZW1mbGFnICE9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1IgfHwgcFVzZXJEYXRhLT5tZW1EYXRhID09IE5VTEwgKQotCXsKLSNpZmRlZiBVU0VfREVBVUxUX01FTQotCQl2b01lbW9wcmF0b3IuQWxsb2MgPSBjbW5NZW1BbGxvYzsKLQkJdm9NZW1vcHJhdG9yLkNvcHkgPSBjbW5NZW1Db3B5OwotCQl2b01lbW9wcmF0b3IuRnJlZSA9IGNtbk1lbUZyZWU7Ci0JCXZvTWVtb3ByYXRvci5TZXQgPSBjbW5NZW1TZXQ7Ci0JCXZvTWVtb3ByYXRvci5DaGVjayA9IGNtbk1lbUNoZWNrOwotCi0JCWludGVyTWVtID0gMTsKLQotCQlwTWVtT1AgPSAmdm9NZW1vcHJhdG9yOwotI2Vsc2UKLQkJKnBoQ29kZWMgPSBOVUxMOwotCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotI2VuZGlmCi0JfQotCWVsc2UKLQl7Ci0JCXBNZW1PUCA9IChWT19NRU1fT1BFUkFUT1IgKilwVXNlckRhdGEtPm1lbURhdGE7Ci0JfQotCi0JLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgaGFuZGxlICovCi0JaEFhY0VuYyA9IChBQUNfRU5DT0RFUiopbWVtX21hbGxvYyhwTWVtT1AsIHNpemVvZihBQUNfRU5DT0RFUiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKLQlpZihOVUxMID09IGhBYWNFbmMpCi0JewotCQllcnJvciA9IDE7Ci0JfQotCi0JaWYoIWVycm9yKQotCXsKLQkJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgaW50cmEgbWVtb3J5ICovCi0JCWhBYWNFbmMtPmludGJ1ZiA9IChzaG9ydCAqKW1lbV9tYWxsb2MocE1lbU9QLCBBQUNFTkNfQkxPQ0tTSVpFKk1BWF9DSEFOTkVMUypzaXplb2Yoc2hvcnQpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0JCWlmKE5VTEwgPT0gaEFhY0VuYy0+aW50YnVmKQotCQl7Ci0JCQllcnJvciA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoIWVycm9yKSB7Ci0JCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIHBzeWNob2Fjb3VzdGljICovCi0JCWVycm9yID0gKFBzeU5ldygmaEFhY0VuYy0+cHN5S2VybmVsLCBNQVhfQ0hBTk5FTFMsIHBNZW1PUCkgfHwKLQkJCVBzeU91dE5ldygmaEFhY0VuYy0+cHN5T3V0LCBwTWVtT1ApKTsKLQl9Ci0KLQlpZiAoIWVycm9yKSB7Ci0JCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIHF1YW50aXphdGlvbiBlbGVtZW50cyAqLwotCQllcnJvciA9IFFDT3V0TmV3KCZoQWFjRW5jLT5xY091dCxNQVhfQ0hBTk5FTFMsIHBNZW1PUCk7Ci0JfQotCi0JaWYgKCFlcnJvcikgewotCQkvKiBpbml0IHRoZSBhYWMgZW5jb2RlciBxdWFudGl6YXRpb24gc3RhdGUgKi8KLQkJZXJyb3IgPSBRQ05ldygmaEFhY0VuYy0+cWNLZXJuZWwsIHBNZW1PUCk7Ci0JfQotCi0JLyogdW5pbml0IHRoZSBhYWMgZW5jb2RlciBpZiBlcnJvciBpcyBub3plcm8gKi8KLQlpZihlcnJvcikKLQl7Ci0JCUFhY0VuY0Nsb3NlKGhBYWNFbmMsIHBNZW1PUCk7Ci0JCWlmKGhBYWNFbmMpCi0JCXsKLQkJCW1lbV9mcmVlKHBNZW1PUCwgaEFhY0VuYywgVk9fSU5ERVhfRU5DX0FBQyk7Ci0JCQloQWFjRW5jID0gTlVMTDsKLQkJfQotCQkqcGhDb2RlYyA9IE5VTEw7Ci0JCXJldHVybiBWT19FUlJfT1VUT0ZfTUVNT1JZOwotCX0KLQotCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIG1lbW9yeSBvcGVyYXRvciAgKi8KLSNpZmRlZiBVU0VfREVBVUxUX01FTQotCWlmKGludGVyTWVtKQotCXsKLQkJaEFhY0VuYy0+dm9NZW1vcHJhdG9yLkFsbG9jID0gY21uTWVtQWxsb2M7Ci0JCWhBYWNFbmMtPnZvTWVtb3ByYXRvci5Db3B5ID0gY21uTWVtQ29weTsKLQkJaEFhY0VuYy0+dm9NZW1vcHJhdG9yLkZyZWUgPSBjbW5NZW1GcmVlOwotCQloQWFjRW5jLT52b01lbW9wcmF0b3IuU2V0ID0gY21uTWVtU2V0OwotCQloQWFjRW5jLT52b01lbW9wcmF0b3IuQ2hlY2sgPSBjbW5NZW1DaGVjazsKLQotCQlwTWVtT1AgPSAmaEFhY0VuYy0+dm9NZW1vcHJhdG9yOwotCX0KLSNlbmRpZgotCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIGRlZmF1bHQgcGFyYW1ldGVyICAqLwotCWlmKGhBYWNFbmMtPmluaXRPSyA9PSAwKQotCXsKLQkJIEFBQ0VOQ19DT05GSUcgY29uZmlnOwotCQkgY29uZmlnLmFkdHNVc2VkID0gMTsKLQkJIGNvbmZpZy5iaXRSYXRlID0gMTI4MDAwOwotCQkgY29uZmlnLm5DaGFubmVsc0luID0gMjsKLQkJIGNvbmZpZy5uQ2hhbm5lbHNPdXQgPSAyOwotCQkgY29uZmlnLnNhbXBsZVJhdGUgPSA0NDEwMDsKLQkJIGNvbmZpZy5iYW5kV2lkdGggPSAyMDAwMDsKLQotCQkgQWFjRW5jT3BlbihoQWFjRW5jLCBjb25maWcpOwotCX0KLQotCWhBYWNFbmMtPnZvTWVtb3AgPSBwTWVtT1A7Ci0KLQkqcGhDb2RlYyA9IGhBYWNFbmM7Ci0KLQlyZXR1cm4gVk9fRVJSX05PTkU7Ci19Ci0KLS8qKgotKiBTZXQgaW5wdXQgYXVkaW8gZGF0YS4KLSogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgQ29kZWMgSGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uCi0qIFxwYXJhbSBwSW5wdXQgW0lOXSBUaGUgaW5wdXQgYnVmZmVyIHBhcmFtLgotKiBccGFyYW0gcE91dEJ1ZmZlciBbT1VUXSBUaGUgb3V0cHV0IGJ1ZmZlciBpbmZvLgotKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jU2V0SW5wdXREYXRhKFZPX0hBTkRMRSBoQ29kZWMsIFZPX0NPREVDQlVGRkVSICogcElucHV0KQotewotCUFBQ19FTkNPREVSICpoQWFjRW5jOwotCWludCAgbGVuZ3RoOwotCi0JaWYoTlVMTCA9PSBoQ29kZWMgfHwgTlVMTCA9PSBwSW5wdXQgfHwgTlVMTCA9PSBwSW5wdXQtPkJ1ZmZlcikKLQl7Ci0JCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7Ci0JfQotCi0JaEFhY0VuYyA9IChBQUNfRU5DT0RFUiAqKWhDb2RlYzsKLQotCS8qIGluaXQgaW5wdXQgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8KLQloQWFjRW5jLT5pbmJ1ZiA9IChzaG9ydCAqKXBJbnB1dC0+QnVmZmVyOwotCWhBYWNFbmMtPmlubGVuID0gcElucHV0LT5MZW5ndGggLyBzaXplb2Yoc2hvcnQpOwotCWhBYWNFbmMtPnVzZWxlbmd0aCA9IDA7Ci0KLQloQWFjRW5jLT5lbmNidWYgPSBoQWFjRW5jLT5pbmJ1ZjsKLQloQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5pbmxlbjsKLQotCS8qIHJlYnVpbGQgaW50cmEgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8KLQlpZihoQWFjRW5jLT5pbnRsZW4pCi0JewotCQlsZW5ndGggPSBtaW4oaEFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc0luKkFBQ0VOQ19CTE9DS1NJWkUgLSBoQWFjRW5jLT5pbnRsZW4sIGhBYWNFbmMtPmlubGVuKTsKLQkJaEFhY0VuYy0+dm9NZW1vcC0+Q29weShWT19JTkRFWF9FTkNfQUFDLCBoQWFjRW5jLT5pbnRidWYgKyBoQWFjRW5jLT5pbnRsZW4sCi0JCQloQWFjRW5jLT5pbmJ1ZiwgbGVuZ3RoKnNpemVvZihzaG9ydCkpOwotCi0JCWhBYWNFbmMtPmVuY2J1ZiA9IGhBYWNFbmMtPmludGJ1ZjsKLQkJaEFhY0VuYy0+ZW5jbGVuID0gaEFhY0VuYy0+aW50bGVuICsgbGVuZ3RoOwotCi0JCWhBYWNFbmMtPmluYnVmICs9IGxlbmd0aDsKLQkJaEFhY0VuYy0+aW5sZW4gLT0gbGVuZ3RoOwotCX0KLQotCXJldHVybiBWT19FUlJfTk9ORTsKLX0KLQotLyoqCi0qIEdldCB0aGUgb3V0dXQgYXVkaW8gZGF0YQotKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4KLSogXHBhcmFtIHBPdXRCdWZmZXIgW09VVF0gVGhlIG91dHB1dCBhdWRpbyBkYXRhCi0qIFxwYXJhbSBwT3V0SW5mbyBbT1VUXSBUaGUgZGVjIG1vZHVsZSBmaWxsZWQgYXVkaW8gZm9ybWF0IGFuZCB1c2VkIHRoZSBpbnB1dCBzaXplLgotKgkJCQkJCSBwT3V0SW5mby0+SW5wdXRVc2VkIGlzIHRvdGFsIHVzZWQgdGhlIGlucHV0IHNpemUuCi0qIFxyZXR2YWwgIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSoJCQlWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMLiBUaGUgaW5wdXQgd2FzIGZpbmlzaGVkIG9yIHRoZSBpbnB1dCBkYXRhIHdhcyBub3QgZW5vdWdodC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0T3V0cHV0RGF0YShWT19IQU5ETEUgaENvZGVjLCBWT19DT0RFQ0JVRkZFUiAqIHBPdXRwdXQsIFZPX0FVRElPX09VVFBVVElORk8gKiBwT3V0SW5mbykKLXsKLQlBQUNfRU5DT0RFUiogaEFhY0VuYyA9IChBQUNfRU5DT0RFUiopaENvZGVjOwotCVdvcmQxNiBudW1BbmNEYXRhQnl0ZXM9MDsKLQlXb3JkMzIgIGluYnVmbGVuOwotCWludCBsZW5ndGg7Ci0JaWYoTlVMTCA9PSBoQWFjRW5jKQotCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCi0JIGluYnVmbGVuID0gQUFDRU5DX0JMT0NLU0laRSpoQWFjRW5jLT5jb25maWcubkNoYW5uZWxzSW47Ci0KLQkgLyogY2hlY2sgdGhlIGlucHV0IHBjbSBidWZmZXIgYW5kIGxlbmd0aCovCi0JIGlmKE5VTEwgPT0gaEFhY0VuYy0+ZW5jYnVmIHx8IGhBYWNFbmMtPmVuY2xlbiA8IGluYnVmbGVuKQotCSB7Ci0JCWxlbmd0aCA9IGhBYWNFbmMtPmVuY2xlbjsKLQkJaWYoaEFhY0VuYy0+aW50bGVuID09IDApCi0JCXsKLQkJCWhBYWNFbmMtPnZvTWVtb3AtPkNvcHkoVk9fSU5ERVhfRU5DX0FBQywgaEFhY0VuYy0+aW50YnVmLAotCQkJCWhBYWNFbmMtPmVuY2J1ZiwgbGVuZ3RoKnNpemVvZihzaG9ydCkpOwotCQkJaEFhY0VuYy0+dXNlbGVuZ3RoICs9IGxlbmd0aCpzaXplb2Yoc2hvcnQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaEFhY0VuYy0+dXNlbGVuZ3RoICs9IChsZW5ndGggLSBoQWFjRW5jLT5pbnRsZW4pKnNpemVvZihzaG9ydCk7Ci0JCX0KLQotCQloQWFjRW5jLT5pbnRsZW4gPSBsZW5ndGg7Ci0KLQkJcE91dHB1dC0+TGVuZ3RoID0gMDsKLQkJaWYocE91dEluZm8pCi0JCQlwT3V0SW5mby0+SW5wdXRVc2VkID0gaEFhY0VuYy0+dXNlbGVuZ3RoOwotCQlyZXR1cm4gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTDsKLQkgfQotCi0JIC8qIGNoZWNrIHRoZSBvdXRwdXQgYWFjIGJ1ZmZlciBhbmQgbGVuZ3RoKi8KLQkgaWYoTlVMTCA9PSBwT3V0cHV0IHx8IE5VTEwgPT0gcE91dHB1dC0+QnVmZmVyIHx8IHBPdXRwdXQtPkxlbmd0aCA8ICg2MTQ0LzgpKmhBYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNPdXQvKHNpemVvZihXb3JkMzIpKSkKLQkJIHJldHVybiBWT19FUlJfT1VUUFVUX0JVRkZFUl9TTUFMTDsKLQotCSAvKiBhYWMgZW5jb2RlciBjb3JlIGZ1bmN0aW9uICovCi0JIEFhY0VuY0VuY29kZSggaEFhY0VuYywKLQkJCShXb3JkMTYqKWhBYWNFbmMtPmVuY2J1ZiwKLQkJCU5VTEwsCi0JCQkmbnVtQW5jRGF0YUJ5dGVzLAotCQkJcE91dHB1dC0+QnVmZmVyLAotCQkJJnBPdXRwdXQtPkxlbmd0aCk7Ci0KLQkgLyogdXBkYXRlIHRoZSBpbnB1dCBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLwotCSBpZihoQWFjRW5jLT5pbnRsZW4pCi0JIHsKLQkJbGVuZ3RoID0gaW5idWZsZW4gLSBoQWFjRW5jLT5pbnRsZW47Ci0JCWhBYWNFbmMtPmVuY2J1ZiA9IGhBYWNFbmMtPmluYnVmOwotCQloQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5pbmxlbjsKLQkJaEFhY0VuYy0+dXNlbGVuZ3RoICs9IGxlbmd0aCpzaXplb2Yoc2hvcnQpOwotCQloQWFjRW5jLT5pbnRsZW4gPSAwOwotCSB9Ci0JIGVsc2UKLQkgewotCQkgaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+ZW5jYnVmICsgaW5idWZsZW47Ci0JCSBoQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5lbmNsZW4gLSBpbmJ1ZmxlbjsKLQkJIGhBYWNFbmMtPnVzZWxlbmd0aCArPSBpbmJ1ZmxlbipzaXplb2Yoc2hvcnQpOwotCSB9Ci0KLQkgLyogdXBkYXRlIHRoZSBvdXRwdXQgYWFjIGluZm9ybWF0aW9uICovCi0JaWYocE91dEluZm8pCi0JewotCQlwT3V0SW5mby0+Rm9ybWF0LkNoYW5uZWxzID0gaEFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc091dDsKLQkJcE91dEluZm8tPkZvcm1hdC5TYW1wbGVSYXRlID0gaEFhY0VuYy0+Y29uZmlnLnNhbXBsZVJhdGU7Ci0JCXBPdXRJbmZvLT5Gb3JtYXQuU2FtcGxlQml0cyA9IDE2OwotCQlwT3V0SW5mby0+SW5wdXRVc2VkID0gaEFhY0VuYy0+dXNlbGVuZ3RoOwotCX0KLQotCSByZXR1cm4gVk9fRVJSX05PTkU7Ci19Ci0KLS8qKgotKiBVbmluaXQgdGhlIENvZGVjLgotKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4KLSogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuCi0qLwotVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY1VuaW5pdChWT19IQU5ETEUgaENvZGVjKQotewotCUFBQ19FTkNPREVSKiBoQWFjRW5jID0gKEFBQ19FTkNPREVSKiloQ29kZWM7Ci0KLQlpZihOVUxMICE9IGhBYWNFbmMpCi0JewotCQkvKiBjbG9zZSB0aGUgYWFjIGVuY29kZXIgKi8KLQkJQWFjRW5jQ2xvc2UoaEFhY0VuYywgaEFhY0VuYy0+dm9NZW1vcCk7Ci0KLQkJLyogZnJlZSB0aGUgYWFjIGVuY29kZXIgaGFuZGxlKi8KLQkJbWVtX2ZyZWUoaEFhY0VuYy0+dm9NZW1vcCwgaEFhY0VuYywgVk9fSU5ERVhfRU5DX0FBQyk7Ci0JCWhBYWNFbmMgPSBOVUxMOwotCX0KLQotCXJldHVybiBWT19FUlJfTk9ORTsKLX0KLQotLyoqCi0qIFNldCB0aGUgcGFyYW0gZm9yIHNwZWNpYWwgdGFyZ2V0LgotKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4KLSogXHBhcmFtIHVQYXJhbUlEIFtJTl0gVGhlIHBhcmFtIElELgotKiBccGFyYW0gcERhdGEgW0lOXSBUaGUgcGFyYW0gdmFsdWUgZGVwZW5kIG9uIHRoZSBJRD4KLSogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuCi0qLwotVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY1NldFBhcmFtKFZPX0hBTkRMRSBoQ29kZWMsIFZPX1MzMiB1UGFyYW1JRCwgVk9fUFRSIHBEYXRhKQotewotCUFBQ0VOQ19DT05GSUcgY29uZmlnOwotCUFBQ0VOQ19QQVJBTSogcEFBQ19wYXJhbTsKLQlWT19BVURJT19GT1JNQVQgKnBXQVZfRm9ybWF0OwotCUFBQ19FTkNPREVSKiBoQWFjRW5jID0gKEFBQ19FTkNPREVSKiloQ29kZWM7Ci0JaW50IHJldCwgaSwgYml0cmF0ZSwgdG1wOwotCWludCBTYW1wbGVSYXRlSWR4OwotCi0JaWYoTlVMTCA9PSBoQWFjRW5jKQotCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCi0Jc3dpdGNoKHVQYXJhbUlEKQotCXsKLQljYXNlIFZPX1BJRF9BQUNfRU5DUEFSQU06ICAvKiBpbml0IGFhYyBlbmNvZGVyIHBhcmFtZXRlciovCi0JCUFhY0luaXREZWZhdWx0Q29uZmlnKCZjb25maWcpOwotCQlpZihwRGF0YSA9PSBOVUxMKQotCQkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKLQkJcEFBQ19wYXJhbSA9IChBQUNFTkNfUEFSQU0qKXBEYXRhOwotCQljb25maWcuYWR0c1VzZWQgPSBwQUFDX3BhcmFtLT5hZHRzVXNlZDsKLQkJY29uZmlnLmJpdFJhdGUgPSBwQUFDX3BhcmFtLT5iaXRSYXRlOwotCQljb25maWcubkNoYW5uZWxzSW4gPSBwQUFDX3BhcmFtLT5uQ2hhbm5lbHM7Ci0JCWNvbmZpZy5uQ2hhbm5lbHNPdXQgPSBwQUFDX3BhcmFtLT5uQ2hhbm5lbHM7Ci0JCWNvbmZpZy5zYW1wbGVSYXRlID0gcEFBQ19wYXJhbS0+c2FtcGxlUmF0ZTsKLQotCQkvKiBjaGVjayB0aGUgY2hhbm5lbCAqLwotCQlpZihjb25maWcubkNoYW5uZWxzSW48IDEgIHx8IGNvbmZpZy5uQ2hhbm5lbHNJbiA+IE1BWF9DSEFOTkVMUyAgfHwKLSAgICAgICAgICAgICBjb25maWcubkNoYW5uZWxzT3V0IDwgMSB8fCBjb25maWcubkNoYW5uZWxzT3V0ID4gTUFYX0NIQU5ORUxTIHx8IGNvbmZpZy5uQ2hhbm5lbHNJbiA8IGNvbmZpZy5uQ2hhbm5lbHNPdXQpCi0JCQkgcmV0dXJuIFZPX0VSUl9BVURJT19VTlNDSEFOTkVMOwotCi0JCS8qIGNoZWNrIHRoZSBzYW1wbGVyYXRlICovCi0JCXJldCA9IC0xOwotCQlmb3IoaSA9IDA7IGkgPCBOVU1fU0FNUExFX1JBVEVTOyBpKyspCi0JCXsKLQkJCWlmKGNvbmZpZy5zYW1wbGVSYXRlID09IHNhbXBSYXRlVGFiW2ldKQotCQkJewotCQkJCXJldCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYocmV0IDwgMCkKLQkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TU0FNUExFUkFURTsKLQotCQlTYW1wbGVSYXRlSWR4ID0gaTsKLQotCQl0bXAgPSA0NDE7Ci0JCWlmKGNvbmZpZy5zYW1wbGVSYXRlJTgwMDAgPT0gMCkKLQkJCXRtcCA9NDgwOwotCQkvKiBjaGVjayB0aGUgYml0cmF0ZSAqLwotCQlpZihjb25maWcuYml0UmF0ZSE9MCAmJiAoKGNvbmZpZy5iaXRSYXRlL2NvbmZpZy5uQ2hhbm5lbHNPdXQgPCA0MDAwKSB8fAotICAgICAgICAgICAoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA+IDE2MDAwMCkgfHwKLQkJICAgKGNvbmZpZy5iaXRSYXRlID4gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0KSkpCi0JCXsKLQkJCWNvbmZpZy5iaXRSYXRlID0gNjQwKmNvbmZpZy5zYW1wbGVSYXRlL3RtcCpjb25maWcubkNoYW5uZWxzT3V0OwotCi0JCQlpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0IDwgNDAwMCkKLQkJCQljb25maWcuYml0UmF0ZSA9IDQwMDAgKiBjb25maWcubkNoYW5uZWxzT3V0OwotCQkJZWxzZSBpZihjb25maWcuYml0UmF0ZSA+IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dCkKLQkJCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dDsKLQkJCWVsc2UgaWYoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA+IDE2MDAwMCkKLQkJCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5uQ2hhbm5lbHNPdXQqMTYwMDAwOwotCQl9Ci0KLQkJLyogY2hlY2sgdGhlIGJhbmR3aWR0aCAqLwotCQliaXRyYXRlID0gY29uZmlnLmJpdFJhdGUgLyBjb25maWcubkNoYW5uZWxzT3V0OwotCQliaXRyYXRlID0gYml0cmF0ZSAqIHRtcCAvIGNvbmZpZy5zYW1wbGVSYXRlOwotCi0JCWZvciAoaSA9IDA7IHJhdGVzW2ldOyBpKyspCi0JCXsKLQkJCWlmIChyYXRlc1tpXSA+PSBiaXRyYXRlKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJY29uZmlnLmJhbmRXaWR0aCA9IEJhbmR3aXRoQ29lZlRhYltpXVtTYW1wbGVSYXRlSWR4XTsKLQotCQkvKiBpbml0IGFhYyBlbmNvZGVyIGNvcmUgKi8KLQkJcmV0ID0gQWFjRW5jT3BlbihoQWFjRW5jLCBjb25maWcpOwotCQlpZihyZXQpCi0JCQlyZXR1cm4gVk9fRVJSX0FVRElPX1VOU0ZFQVRVUkU7Ci0JCWJyZWFrOwotCWNhc2UgVk9fUElEX0FVRElPX0ZPUk1BVDoJLyogaW5pdCBwY20gY2hhbm5lbCBhbmQgc2FtcGxlcmF0ZSovCi0JCUFhY0luaXREZWZhdWx0Q29uZmlnKCZjb25maWcpOwotCQlpZihwRGF0YSA9PSBOVUxMKQotCQkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKLQkJcFdBVl9Gb3JtYXQgPSAoVk9fQVVESU9fRk9STUFUKilwRGF0YTsKLQkJY29uZmlnLmFkdHNVc2VkID0gMTsKLQkJY29uZmlnLm5DaGFubmVsc0luID0gcFdBVl9Gb3JtYXQtPkNoYW5uZWxzOwotCQljb25maWcubkNoYW5uZWxzT3V0ID0gcFdBVl9Gb3JtYXQtPkNoYW5uZWxzOwotCQljb25maWcuc2FtcGxlUmF0ZSA9IHBXQVZfRm9ybWF0LT5TYW1wbGVSYXRlOwotCi0JCS8qIGNoZWNrIHRoZSBjaGFubmVsICovCi0JCWlmKGNvbmZpZy5uQ2hhbm5lbHNJbjwgMSAgfHwgY29uZmlnLm5DaGFubmVsc0luID4gTUFYX0NIQU5ORUxTICB8fAotICAgICAgICAgICAgIGNvbmZpZy5uQ2hhbm5lbHNPdXQgPCAxIHx8IGNvbmZpZy5uQ2hhbm5lbHNPdXQgPiBNQVhfQ0hBTk5FTFMgfHwgY29uZmlnLm5DaGFubmVsc0luIDwgY29uZmlnLm5DaGFubmVsc091dCkKLQkJCSByZXR1cm4gVk9fRVJSX0FVRElPX1VOU0NIQU5ORUw7Ci0KLQkJLyogY2hlY2sgdGhlIHNhbXBsZWJpdHMgKi8KLQkJaWYocFdBVl9Gb3JtYXQtPlNhbXBsZUJpdHMgIT0gMTYpCi0JCXsKLQkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TRkVBVFVSRTsKLQkJfQotCi0JCS8qIGNoZWNrIHRoZSBzYW1wbGVyYXRlICovCi0JCXJldCA9IC0xOwotCQlmb3IoaSA9IDA7IGkgPCBOVU1fU0FNUExFX1JBVEVTOyBpKyspCi0JCXsKLQkJCWlmKGNvbmZpZy5zYW1wbGVSYXRlID09IHNhbXBSYXRlVGFiW2ldKQotCQkJewotCQkJCXJldCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYocmV0IDwgMCkKLQkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TU0FNUExFUkFURTsKLQotCQlTYW1wbGVSYXRlSWR4ID0gaTsKLQotCQkvKiB1cGRhdGUgdGhlIGJpdHJhdGVzICovCi0JCXRtcCA9IDQ0MTsKLQkJaWYoY29uZmlnLnNhbXBsZVJhdGUlODAwMCA9PSAwKQotCQkJdG1wID00ODA7Ci0KLQkJY29uZmlnLmJpdFJhdGUgPSA2NDAqY29uZmlnLnNhbXBsZVJhdGUvdG1wKmNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0KLQkJaWYoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA8IDQwMDApCi0JCQljb25maWcuYml0UmF0ZSA9IDQwMDAgKiBjb25maWcubkNoYW5uZWxzT3V0OwotCQllbHNlIGlmKGNvbmZpZy5iaXRSYXRlID4gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0KQotCQkJY29uZmlnLmJpdFJhdGUgPSBjb25maWcuc2FtcGxlUmF0ZSo2KmNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0JCWVsc2UgaWYoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA+IDE2MDAwMCkKLQkJCWNvbmZpZy5iaXRSYXRlID0gY29uZmlnLm5DaGFubmVsc091dCoxNjAwMDA7Ci0KLQkJLyogY2hlY2sgdGhlIGJhbmR3aWR0aCAqLwotCQliaXRyYXRlID0gY29uZmlnLmJpdFJhdGUgLyBjb25maWcubkNoYW5uZWxzT3V0OwotCQliaXRyYXRlID0gYml0cmF0ZSAqIHRtcCAvIGNvbmZpZy5zYW1wbGVSYXRlOwotCi0JCWZvciAoaSA9IDA7IHJhdGVzW2ldOyBpKyspCi0JCXsKLQkJCWlmIChyYXRlc1tpXSA+PSBiaXRyYXRlKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJY29uZmlnLmJhbmRXaWR0aCA9IEJhbmR3aXRoQ29lZlRhYltpXVtTYW1wbGVSYXRlSWR4XTsKLQotCQkvKiBpbml0IGFhYyBlbmNvZGVyIGNvcmUgKi8KLQkJcmV0ID0gQWFjRW5jT3BlbihoQWFjRW5jLCBjb25maWcpOwotCQlpZihyZXQpCi0JCQlyZXR1cm4gVk9fRVJSX0FVRElPX1VOU0ZFQVRVUkU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBWT19FUlJfV1JPTkdfUEFSQU1fSUQ7Ci0JfQotCi0JcmV0dXJuIFZPX0VSUl9OT05FOwotfQotCi0vKioKLSogR2V0IHRoZSBwYXJhbSBmb3Igc3BlY2lhbCB0YXJnZXQuCi0qIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLgotKiBccGFyYW0gdVBhcmFtSUQgW0lOXSBUaGUgcGFyYW0gSUQuCi0qIFxwYXJhbSBwRGF0YSBbSU5dIFRoZSBwYXJhbSB2YWx1ZSBkZXBlbmQgb24gdGhlIElEPgotKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0UGFyYW0oVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpCi17Ci0gICAgICAgIFVOVVNFRChoQ29kZWMpOwotICAgICAgICBVTlVTRUQodVBhcmFtSUQpOwotICAgICAgICBVTlVTRUQocERhdGEpOwotCi0JcmV0dXJuIFZPX0VSUl9OT05FOwotfQotCi0vKioKLSAqIEdldCBhdWRpbyBjb2RlYyBBUEkgaW50ZXJmYWNlCi0gKiBccGFyYW0gcEVuY0hhbmRsZSBbb3V0XSBSZXR1cm4gdGhlIEFBQyBFbmNvZGVyIGhhbmRsZS4KLSAqIFxyZXR2YWwgVk9fRVJSX09LIFN1Y2NlZWRlZC4KLSAqLwotVk9fUzMyIFZPX0FQSSB2b0dldEFBQ0VuY0FQSShWT19BVURJT19DT0RFQ0FQSSAqIHBEZWNIYW5kbGUpCi17Ci0JaWYocERlY0hhbmRsZSA9PSBOVUxMKQotCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCi0JcERlY0hhbmRsZS0+SW5pdCA9IHZvQUFDRW5jSW5pdDsKLQlwRGVjSGFuZGxlLT5TZXRJbnB1dERhdGEgPSB2b0FBQ0VuY1NldElucHV0RGF0YTsKLQlwRGVjSGFuZGxlLT5HZXRPdXRwdXREYXRhID0gdm9BQUNFbmNHZXRPdXRwdXREYXRhOwotCXBEZWNIYW5kbGUtPlNldFBhcmFtID0gdm9BQUNFbmNTZXRQYXJhbTsKLQlwRGVjSGFuZGxlLT5HZXRQYXJhbSA9IHZvQUFDRW5jR2V0UGFyYW07Ci0JcERlY0hhbmRsZS0+VW5pbml0ID0gdm9BQUNFbmNVbmluaXQ7Ci0KLQlyZXR1cm4gVk9fRVJSX05PTkU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jX2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0NTJkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYWFjZW5jX2NvcmUuYwotCi0JQ29udGVudDoJYWFjIGVuY29kZXIgY29yZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJhYWNlbmNfY29yZS5oIgotI2luY2x1ZGUgImJpdGVuYy5oIgotCi0jaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJwc3lfbWFpbi5oIgotI2luY2x1ZGUgInFjX21haW4uaCIKLSNpbmNsdWRlICJwc3lfbWFpbi5oIgotI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQWFjSW5pdERlZmF1bHRDb25maWcKLSogZGVzY3JpcHRpb246ICBnaXZlcyByZWFzb25hYmxlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAqY29uZmlnKQotewotICAvKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zICovCi0gIGNvbmZpZy0+YWR0c1VzZWQgICAgICAgID0gMTsKLSAgY29uZmlnLT5uQ2hhbm5lbHNJbiAgICAgPSAyOwotICBjb25maWctPm5DaGFubmVsc091dCAgICA9IDI7Ci0gIGNvbmZpZy0+Yml0UmF0ZSAgICAgICAgID0gMTI4MDAwOwotICBjb25maWctPmJhbmRXaWR0aCAgICAgICA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBBYWNFbmNPcGVuCi0qIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgZW5jb2RlciBpbnN0YW5jZQotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiAgQWFjRW5jT3BlbiggIEFBQ19FTkNPREVSKiAgICAgIGhBYWNFbmMsICAgICAgICAvKiBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLCBpbml0aWFsaXplZCBvbiByZXR1cm4gKi8KLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBBQUNFTkNfQ09ORklHICAgICBjb25maWcgICAvKiBwcmUtaW5pdGlhbGl6ZWQgY29uZmlnIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgKQotewotICBXb3JkMzIgZXJyb3IgPSAwOwotICBXb3JkMTYgcHJvZmlsZSA9IDE7Ci0KLSAgRUxFTUVOVF9JTkZPICplbEluZm8gPSBOVUxMOwotCi0gIGlmIChoQWFjRW5jPT0wKSB7Ci0gICAgZXJyb3I9MTsKLSAgfQotCi0gIGlmICghZXJyb3IpIHsKLSAgICBoQWFjRW5jLT5jb25maWcgPSBjb25maWc7Ci0gIH0KLQotICBpZiAoIWVycm9yKSB7Ci0gICAgZXJyb3IgPSBJbml0RWxlbWVudEluZm8gKGNvbmZpZy5uQ2hhbm5lbHNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjRW5jLT5lbEluZm8pOwotICB9Ci0KLSAgaWYgKCFlcnJvcikgewotICAgIGVsSW5mbyA9ICZoQWFjRW5jLT5lbEluZm87Ci0gIH0KLQotICBpZiAoIWVycm9yKSB7Ci0gICAgLyogdXNlIG9yIG5vdCB0bnMgdG9vbCBmb3IgbG9uZyBhbmQgc2hvcnQgYmxvY2sgKi8KLQkgV29yZDE2IHRuc01hc2s9MzsKLQotCS8qIGluaXQgZW5jb2RlciBwc3ljaG9hY291c3RpYyAqLwotICAgIGVycm9yID0gcHN5TWFpbkluaXQoJmhBYWNFbmMtPnBzeUtlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbEluZm8tPm5DaGFubmVsc0luRWwsCi0gICAgICAgICAgICAgICAgICAgICAgICB0bnNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLmJhbmRXaWR0aCk7Ci0gIH0KLQotIC8qIHVzZSBvciBub3QgYWR0cyBoZWFkZXIgKi8KLSAgaWYoIWVycm9yKSB7Ci0JICBoQWFjRW5jLT5xY091dC5xY0VsZW1lbnQuYWR0c1VzZWQgPSBjb25maWcuYWR0c1VzZWQ7Ci0gIH0KLQotICAvKiBpbml0IGVuY29kZXIgcXVhbnRpemF0aW9uICovCi0gIGlmICghZXJyb3IpIHsKLSAgICBzdHJ1Y3QgUUNfSU5JVCBxY0luaXQ7Ci0KLSAgICAvKnFjSW5pdC5jaGFubmVsTWFwcGluZyA9ICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZzsqLwotICAgIHFjSW5pdC5lbEluZm8gPSAmaEFhY0VuYy0+ZWxJbmZvOwotCi0gICAgcWNJbml0Lm1heEJpdHMgPSAoV29yZDE2KSAoTUFYQklUU19DT0VGKmVsSW5mby0+bkNoYW5uZWxzSW5FbCk7Ci0gICAgcWNJbml0LmJpdFJlcyA9IHFjSW5pdC5tYXhCaXRzOwotICAgIHFjSW5pdC5hdmVyYWdlQml0cyA9IChXb3JkMTYpICgoY29uZmlnLmJpdFJhdGUgKiBGUkFNRV9MRU5fTE9ORykgLyBjb25maWcuc2FtcGxlUmF0ZSk7Ci0KLSAgICBxY0luaXQucGFkZGluZy5wYWRkaW5nUmVzdCA9IGNvbmZpZy5zYW1wbGVSYXRlOwotCi0gICAgcWNJbml0Lm1lYW5QZSA9IChXb3JkMTYpICgoMTAgKiBGUkFNRV9MRU5fTE9ORyAqIGhBYWNFbmMtPmNvbmZpZy5iYW5kV2lkdGgpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLnNhbXBsZVJhdGU+PjEpKTsKLQotICAgIHFjSW5pdC5tYXhCaXRGYWMgPSAoV29yZDE2KSAoKDEwMCAqIChNQVhCSVRTX0NPRUYtTUlOQklUU19DT0VGKSogZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKS8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocWNJbml0LmF2ZXJhZ2VCaXRzP3FjSW5pdC5hdmVyYWdlQml0czoxKSk7Ci0KLSAgICBxY0luaXQuYml0cmF0ZSA9IGNvbmZpZy5iaXRSYXRlOwotCi0gICAgZXJyb3IgPSBRQ0luaXQoJmhBYWNFbmMtPnFjS2VybmVsLCAmcWNJbml0KTsKLSAgfQotCi0gIC8qIGluaXQgYml0c3RyZWFtIGVuY29kZXIgKi8KLSAgaWYgKCFlcnJvcikgewotICAgIGhBYWNFbmMtPmJzZUluaXQubkNoYW5uZWxzICAgPSBlbEluZm8tPm5DaGFubmVsc0luRWw7Ci0gICAgaEFhY0VuYy0+YnNlSW5pdC5iaXRyYXRlICAgICA9IGNvbmZpZy5iaXRSYXRlOwotICAgIGhBYWNFbmMtPmJzZUluaXQuc2FtcGxlUmF0ZSAgPSBjb25maWcuc2FtcGxlUmF0ZTsKLSAgICBoQWFjRW5jLT5ic2VJbml0LnByb2ZpbGUgICAgID0gcHJvZmlsZTsKLSAgfQotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFhY0VuY0VuY29kZQotKiBkZXNjcmlwdGlvbjogIGVuY29kZSBwY20gdG8gYWFjIGRhdGEgY29yZSBmdW5jdGlvbgotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBBYWNFbmNFbmNvZGUoQUFDX0VOQ09ERVIgKmFhY0VuYywJCS8qITwgYW4gZW5jb2RlciBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLCAgICAgICAgIC8qITwgQkxPQ0tTSVpFKm5DaGFubmVscyBhdWRpbyBzYW1wbGVzLCBpbnRlcmxlYXZlZCAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDggKmFuY0J5dGVzLCAgICAgLyohPCBwb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbnVtQW5jQnl0ZXMsCQkvKiE8IG51bWJlciBvZiBhbmNpbGxhcnkgRGF0YSBCeXRlcyAqLwotICAgICAgICAgICAgICAgICAgICBVV29yZDggKm91dEJ5dGVzLCAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIgKG11c3QgYmUgbGFyZ2UgTUlOQklUU19DT0VGLzgqTUFYX0NIQU5ORUxTIGJ5dGVzKSAqLwotICAgICAgICAgICAgICAgICAgICBWT19VMzIgKm51bU91dEJ5dGVzICAgICAgICAgLyohPCBudW1iZXIgb2YgYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciBhZnRlciBwcm9jZXNzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICkKLXsKLSAgRUxFTUVOVF9JTkZPICplbEluZm8gPSAmYWFjRW5jLT5lbEluZm87Ci0gIFdvcmQxNiBnbG9iVXNlZEJpdHM7Ci0gIFdvcmQxNiBhbmNEYXRhQnl0ZXMsIGFuY0RhdGFCeXRlc0xlZnQ7Ci0KLSAgYW5jRGF0YUJ5dGVzID0gYW5jRGF0YUJ5dGVzTGVmdCA9ICpudW1BbmNCeXRlczsKLQotICAvKiBpbml0IG91dHB1dCBhYWMgZGF0YSBidWZmZXIgYW5kIGxlbmd0aCAqLwotICBhYWNFbmMtPmhCaXRTdHJlYW0gPSBDcmVhdGVCaXRCdWZmZXIoJmFhY0VuYy0+Yml0U3RyZWFtLCBvdXRCeXRlcywgKm51bU91dEJ5dGVzKTsKLQotICAvKiBwc3ljaG9hY291c3RpYyBwcm9jZXNzICovCi0gIHBzeU1haW4oYWFjRW5jLT5jb25maWcubkNoYW5uZWxzT3V0LAotICAgICAgICAgIGVsSW5mbywKLSAgICAgICAgICB0aW1lU2lnbmFsLAotICAgICAgICAgICZhYWNFbmMtPnBzeUtlcm5lbC5wc3lEYXRhW2VsSW5mby0+Q2hhbm5lbEluZGV4WzBdXSwKLSAgICAgICAgICAmYWFjRW5jLT5wc3lLZXJuZWwudG5zRGF0YVtlbEluZm8tPkNoYW5uZWxJbmRleFswXV0sCi0gICAgICAgICAgJmFhY0VuYy0+cHN5S2VybmVsLnBzeUNvbmZMb25nLAotICAgICAgICAgICZhYWNFbmMtPnBzeUtlcm5lbC5wc3lDb25mU2hvcnQsCi0gICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dENoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgICZhYWNFbmMtPnBzeU91dC5wc3lPdXRFbGVtZW50LAotICAgICAgICAgIGFhY0VuYy0+cHN5S2VybmVsLnBTY3JhdGNoVG5zLAotCQkgIGFhY0VuYy0+Y29uZmlnLnNhbXBsZVJhdGUpOwotCi0gIC8qIGFkanVzdCBiaXRyYXRlIGFuZCBmcmFtZSBsZW5ndGggKi8KLSAgQWRqdXN0Qml0cmF0ZSgmYWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICBhYWNFbmMtPmNvbmZpZy5iaXRSYXRlLAotICAgICAgICAgICAgICAgIGFhY0VuYy0+Y29uZmlnLnNhbXBsZVJhdGUpOwotCi0gIC8qIHF1YW50aXphdGlvbiBhbmQgY29kaW5nIHByb2Nlc3MgKi8KLSAgUUNNYWluKCZhYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgJmFhY0VuYy0+cWNLZXJuZWwuZWxlbWVudEJpdHMsCi0gICAgICAgICAmYWFjRW5jLT5xY0tlcm5lbC5hZGpUaHIuYWRqVGhyU3RhdGVFbGVtLAotICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dENoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAmYWFjRW5jLT5xY091dC5xY0NoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgJmFhY0VuYy0+cWNPdXQucWNFbGVtZW50LAotICAgICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsLAotCQkgbWluKGFuY0RhdGFCeXRlc0xlZnQsYW5jRGF0YUJ5dGVzKSk7Ci0KLSAgYW5jRGF0YUJ5dGVzTGVmdCA9IGFuY0RhdGFCeXRlc0xlZnQgLSBhbmNEYXRhQnl0ZXM7Ci0KLSAgZ2xvYlVzZWRCaXRzID0gRmluYWxpemVCaXRDb25zdW1wdGlvbigmYWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCk7Ci0KLSAgLyogd3JpdGUgYml0c3RyZWFtIHByb2Nlc3MgKi8KLSAgV3JpdGVCaXRzdHJlYW0oYWFjRW5jLT5oQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAqZWxJbmZvLAotICAgICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCwKLSAgICAgICAgICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LAotICAgICAgICAgICAgICAgICAmZ2xvYlVzZWRCaXRzLAotICAgICAgICAgICAgICAgICBhbmNCeXRlcywKLQkJCQkgYWFjRW5jLT5wc3lLZXJuZWwuc2FtcGxlUmF0ZUlkeCk7Ci0KLSAgdXBkYXRlQml0cmVzKCZhYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgJmFhY0VuYy0+cWNPdXQpOwotCi0gIC8qIHdyaXRlIG91dCB0aGUgYml0c3RyZWFtICovCi0gICpudW1PdXRCeXRlcyA9IEdldEJpdHNBdmFpbChhYWNFbmMtPmhCaXRTdHJlYW0pID4+IDM7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6QWFjRW5jQ2xvc2UKLSogZGVzY3JpcHRpb246IGRlYWxsb2NhdGUgYW4gZW5jb2RlciBpbnN0YW5jZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQWFjRW5jQ2xvc2UgKEFBQ19FTkNPREVSKiBoQWFjRW5jLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgaWYgKGhBYWNFbmMpIHsKLSAgICBRQ0RlbGV0ZSgmaEFhY0VuYy0+cWNLZXJuZWwsIHBNZW1PUCk7Ci0KLSAgICBRQ091dERlbGV0ZSgmaEFhY0VuYy0+cWNPdXQsIHBNZW1PUCk7Ci0KLSAgICBQc3lEZWxldGUoJmhBYWNFbmMtPnBzeUtlcm5lbCwgcE1lbU9QKTsKLQotICAgIFBzeU91dERlbGV0ZSgmaEFhY0VuYy0+cHN5T3V0LCBwTWVtT1ApOwotCi0gICAgRGVsZXRlQml0QnVmZmVyKCZoQWFjRW5jLT5oQml0U3RyZWFtKTsKLQotCWlmKGhBYWNFbmMtPmludGJ1ZikKLQl7Ci0JCW1lbV9mcmVlKHBNZW1PUCwgaEFhY0VuYy0+aW50YnVmLCBWT19JTkRFWF9FTkNfQUFDKTsKLQkJaEFhY0VuYy0+aW50YnVmID0gTlVMTDsKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4YmUwZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYWRqX3Roci5jCi0KLQlDb250ZW50OglUaHJlc2hvbGQgY29tcGVuc2F0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBJbmNsdWRlIHN5c3RlbSBoZWFkZXJzIGJlZm9yZSBsb2NhbCBoZWFkZXJzIC0gdGhlIGxvY2FsIGhlYWRlcnMKLSAqIHJlZGVmaW5lIF9faW5saW5lLCB3aGljaCBjYW4gbWVzcyB1cCBkZWZpbml0aW9ucyBpbiBsaWJjIGhlYWRlcnMgaWYKLSAqIHRoZXkgaGFwcGVuIHRvIHVzZSBfX2lubGluZS4gKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgIm9wZXJfMzJiLmgiCi0jaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCi0jaW5jbHVkZSAiYWRqX3Roci5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLSNpbmNsdWRlICJsaW5lX3BlLmgiCi0KLQotI2RlZmluZSAgbWluU25yTGltaXQgICAgMHg2NjY2IC8qIDEgZEIgKi8KLSNkZWZpbmUgIFBFQklUU19DT0VGCTB4MTcwYSAvKiAwLjE4KigxIDw8IDE1KSovCi0KLSNkZWZpbmUgIEhPTEVfVEhSX0xPTkcJMHgyODczCS8qIDAuMzE2KigxIDw8IDE1KSAqLwotI2RlZmluZSAgSE9MRV9USFJfU0hPUlQgMHg0MDAwICAvKiAwLjUgICooMSA8PCAxNSkgKi8KLQotI2RlZmluZSAgTVNfVEhSU1BSRUFEX0NPRUYgMHg3MzMzICAvKiAwLjkgKiAoMSA8PCAxNSkgKi8KLQotI2RlZmluZQkgTUlOX1NOUl9DT0VGCSAgIDB4NjUxZiAgLyogMy4xNiogKDEgPDwgKDE1IC0gMikpICovCi0KLS8qIHZhbHVlcyBmb3IgYXZvaWQgaG9sZSBmbGFnICovCi1lbnVtIF9hdm9pZF9ob2xlX3N0YXRlIHsKLSAgTk9fQUggICAgICAgICAgICAgID0wLAotICBBSF9JTkFDVElWRSAgICAgICAgPTEsCi0gIEFIX0FDVElWRSAgICAgICAgICA9MgotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6Yml0czJwZQotKiBkZXNjcmlwdGlvbjogY29udmVydCBmcm9tIGJpdHMgdG8gcGUKLSoJCQkgICBwZSA9IDEuMTgqZGVzaXJlZEJpdHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgYml0czJwZShjb25zdCBXb3JkMTYgYml0cykgewotICByZXR1cm4gKGJpdHMgKyAoKFBFQklUU19DT0VGICogYml0cykgPj4gMTUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6Y2FsY1RocmVzaEV4cAotKiBkZXNjcmlwdGlvbjogbG91ZG5lc3MgY2FsY3VsYXRpb24gKHRocmVzaG9sZCB0byB0aGUgcG93ZXIgb2YgcmVkRXhwKQotKgkJCSAgIHRocihuKV4wLjI1Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY2FsY1RocmVzaEV4cChXb3JkMzIgdGhyRXhwW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscykKLXsKLSAgV29yZDE2IGNoLCBzZmIsIHNmYkdycDsKLSAgV29yZDMyICpwdGhyRXhwID0gTlVMTCwgKnBzZmJUaHJlOwotICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLQkgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApCi0JICBwdGhyRXhwID0gJih0aHJFeHBbY2hdW3NmYkdycF0pOwotCSAgcHNmYlRocmUgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQgKyBzZmJHcnA7Ci0JICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0JCSpwdGhyRXhwID0gcnNxcnQocnNxcnQoKnBzZmJUaHJlLElOVF9CSVRTKSxJTlRfQklUUyk7Ci0JCXB0aHJFeHArKzsgcHNmYlRocmUrKzsKLSAgICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTphZGFwdE1pblNucgotKiBkZXNjcmlwdGlvbjogcmVkdWNlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGJhbmRzIHdpdGggcmVsYXRpdmUgbG93IGVuZXJnaWVzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRhcHRNaW5TbnIoUFNZX09VVF9DSEFOTkVMICAgICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICBuQ2hhbm5lbHMpCi17Ci0gIFdvcmQxNiBjaCwgc2ZiLCBzZmJPZmZzOwotICBXb3JkMzIgblNmYiwgYXZnRW47Ci0gIFdvcmQxNiBsb2dfYXZnRW4gPSAwOwotICBXb3JkMzIgc3RhcnRSYXRpb194X2F2Z0VuID0gMDsKLQotCi0gIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotCi0gICAgLyogY2FsYyBhdmVyYWdlIGVuZXJneSBwZXIgc2NhbGVmYWN0b3IgYmFuZCAqLwotICAgIGF2Z0VuID0gMDsKLSAgICBuU2ZiID0gMDsKLSAgICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIGF2Z0VuID0gTF9hZGQoYXZnRW4sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJPZmZzK3NmYl0pOwotICAgICAgICBuU2ZiID0gblNmYiArIDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5TZmIgPiAwKSB7Ci0JICBhdmdFbiA9IGF2Z0VuIC8gblNmYjsKLQotICAgICAgbG9nX2F2Z0VuID0gaUxvZzQoYXZnRW4pOwotICAgICAgc3RhcnRSYXRpb194X2F2Z0VuID0gZml4bXVsKG1zYVBhcmFtLT5zdGFydFJhdGlvLCBhdmdFbik7Ci0gICAgfQotCi0KLSAgICAvKiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50IGJ5IG1pblNucl5taW5TbnJSZWQgZGVwZW5kZW50IG9uIGF2Z0VuL3NmYkVuICovCi0gICAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgewotICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBpZiAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYk9mZnMrc2ZiXSA8IHN0YXJ0UmF0aW9feF9hdmdFbikgewotICAgICAgICAgIFdvcmQxNiBkYlJhdGlvLCBtaW5TbnJSZWQ7Ci0gICAgICAgICAgV29yZDMyIHNuclJlZDsKLSAgICAgICAgICBXb3JkMTYgbmV3TWluU25yOwotCi0gICAgICAgICAgZGJSYXRpbyA9IGxvZ19hdmdFbiAtIGxvZ1NmYkVuZXJneVtjaF1bc2ZiT2ZmcytzZmJdOwotICAgICAgICAgIGRiUmF0aW8gPSBkYlJhdGlvICsgKGRiUmF0aW8gPDwgMSk7Ci0KLSAgICAgICAgICBtaW5TbnJSZWQgPSAxMTAgLSAoKGRiUmF0aW8gKyAoZGJSYXRpbyA8PCAxKSkgPj4gMik7Ci0gICAgICAgICAgbWluU25yUmVkID0gbWF4KG1pblNuclJlZCwgMjApOyAvKiAxMTA6ICgwLjM3NShyZWRPZmZzKSsxKSo4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogMC4wMDM3NShyZWRSYXRpb0ZhYykqODAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6IDAuMjUobWF4UmVkKSAqIDgwICovCi0KLSAgICAgICAgICBzbnJSZWQgPSBtaW5TbnJSZWQgKiBpTG9nNCgocHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYk9mZnMrc2ZiXSA8PCAxNikpOwotICAgICAgICAgIC8qCi0gICAgICAgICAgICAgc25yUmVkSSBzaSBub3cgc2NhbGVkIGJ5IDgwIChtaW5TbnJSZWQpIGFuZCA0IChmZnJfaUxvZzQpCi0gICAgICAgICAgKi8KLQotICAgICAgICAgIG5ld01pblNuciA9IHJvdW5kMTYocG93Ml94eShzbnJSZWQsODAqNCkpOwotCi0gICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYk9mZnMrc2ZiXSA9IG1pbihuZXdNaW5TbnIsIG1pblNuckxpbWl0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6aW5pdEF2b2lkSG9sZUZsYWcKLSogZGVzY3JpcHRpb246IGRldGVybWluZSBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIG5vdCBuZWNlc3NhcnkgcmVzcC4gcG9zc2libGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpbml0QXZvaWRIb2xlRmxhZyhXb3JkMTYgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIX1BBUkFNICphaFBhcmFtKQotewotICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwLCBzaGlmdDsKLSAgV29yZDMyIHRocmVzaG9sZDsKLSAgV29yZDMyKiBwc2ZiU3ByZWFkRW47Ci0KLSAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0KLSAgICBpZiAocHN5T3V0Q2hhbi0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotICAgICAgICAgcHNmYlNwcmVhZEVuID0gcHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3kgKyBzZmJHcnA7Ci0JCSBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0JCQkqcHNmYlNwcmVhZEVuID0gKnBzZmJTcHJlYWRFbiA+PiAxOyAgLyogMC41ICovCi0JCQkrK3BzZmJTcHJlYWRFbjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0JCXBzZmJTcHJlYWRFbiA9IHBzeU91dENoYW4tPnNmYlNwcmVhZGVkRW5lcmd5ICsgc2ZiR3JwOwotICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgKnBzZmJTcHJlYWRFbiA9ICgqcHNmYlNwcmVhZEVuID4+IDEpICsgKCpwc2ZiU3ByZWFkRW4gPj4gMyk7ICAvKiAwLjYzICovCi0JCSAgKytwc2ZiU3ByZWFkRW47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBpbmNyZWFzZSBtaW5TbnIgZm9yIGxvY2FsIHBlYWtzLCBkZWNyZWFzZSBpdCBmb3IgdmFsbGV5cyAqLwotICBpZiAoYWhQYXJhbS0+bW9kaWZ5TWluU25yKSB7Ci0gICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotCi0gICAgICBpZiAocHN5T3V0Q2hhbi0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQotICAgICAgICB0aHJlc2hvbGQgPSBIT0xFX1RIUl9MT05HOwotICAgICAgZWxzZQotICAgICAgICB0aHJlc2hvbGQgPSBIT0xFX1RIUl9TSE9SVDsKLQotICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgICAgV29yZDE2ICpwc2ZiTWluU25yID0gcHN5T3V0Q2hhbi0+c2ZiTWluU25yICsgc2ZiR3JwOwotCQlmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgV29yZDMyIHNmYkVuLCBzZmJFbm0xLCBzZmJFbnAxLCBhdmdFbjsKLQotICAgICAgICAgIGlmIChzZmIgPiAwKQotICAgICAgICAgICAgc2ZiRW5tMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiLTFdOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNmYkVubTEgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwXTsKLQotICAgICAgICAgIGlmIChzZmIgPCAocHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXAtMSkpCi0gICAgICAgICAgICBzZmJFbnAxID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmIrMV07Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2ZiRW5wMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICBhdmdFbiA9IChzZmJFbm0xICsgc2ZiRW5wMSkgPj4gMTsKLSAgICAgICAgICBzZmJFbiA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLQotICAgICAgICAgIGlmIChzZmJFbiA+IGF2Z0VuICYmIGF2Z0VuID4gMCkgewotICAgICAgICAgICAgV29yZDMyIHRtcE1pblNucjsKLSAgICAgICAgICAgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuKTsKLQkJCXRtcE1pblNuciA9IERpdl8zMihMX21weV9scyhhdmdFbiwgbWluU25yTGltaXQpIDw8IHNoaWZ0LCBzZmJFbiA8PCBzaGlmdCApOwotICAgICAgICAgICAgdG1wTWluU25yID0gbWF4KHRtcE1pblNuciwgSE9MRV9USFJfTE9ORyk7Ci0gICAgICAgICAgICB0bXBNaW5TbnIgPSBtYXgodG1wTWluU25yLCB0aHJlc2hvbGQpOwotICAgICAgICAgICAgKnBzZmJNaW5TbnIgPSBtaW4oKnBzZmJNaW5TbnIsIHRtcE1pblNucik7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8qIHZhbGxleSA/ICovCi0KLSAgICAgICAgICBpZiAoKHNmYkVuIDwgKGF2Z0VuID4+IDEpKSAmJiAoc2ZiRW4gPiAwKSkgewotICAgICAgICAgICAgV29yZDMyIHRtcE1pblNucjsKLSAgICAgICAgICAgIFdvcmQzMiBtaW5TbnJFbiA9IExfbXB5X3d4KGF2Z0VuLCAqcHNmYk1pblNucik7Ci0KLSAgICAgICAgICAgIGlmKG1pblNuckVuIDwgc2ZiRW4pIHsKLQkJCSAgc2hpZnQgPSBub3JtX2woc2ZiRW4pOwotICAgICAgICAgICAgICB0bXBNaW5TbnIgPSBEaXZfMzIoIG1pblNuckVuIDw8IHNoaWZ0LCBzZmJFbjw8c2hpZnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHRtcE1pblNuciA9IE1BWF8xNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcE1pblNuciA9IG1pbihtaW5TbnJMaW1pdCwgdG1wTWluU25yKTsKLQotICAgICAgICAgICAgKnBzZmJNaW5TbnIgPQotICAgICAgICAgICAgICAobWluKCh0bXBNaW5TbnIgPj4gIDIpLCBtdWx0KCpwc2ZiTWluU25yLCBNSU5fU05SX0NPRUYpKSA8PCAyKTsKLSAgICAgICAgICB9Ci0JCSAgcHNmYk1pblNucisrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogc3RlcmVvOiBhZGFwdCB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgc2ZiTWluU25yIG9mIG1pZCBhbmQKLSAgICAgc2lkZSBjaGFubmVscyAqLwotCi0gIGlmIChuQ2hhbm5lbHMgPT0gMikgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbk0gPSAmcHN5T3V0Q2hhbm5lbFswXTsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5TID0gJnBzeU91dENoYW5uZWxbMV07Ci0gICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5NLT5zZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBpZiAocHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFza1tzZmJdKSB7Ci0gICAgICAgIFdvcmQzMiBzZmJFbk0gPSBwc3lPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYl07Ci0gICAgICAgIFdvcmQzMiBzZmJFblMgPSBwc3lPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYl07Ci0gICAgICAgIFdvcmQzMiBtYXhTZmJFbiA9IG1heChzZmJFbk0sIHNmYkVuUyk7Ci0gICAgICAgIFdvcmQzMiBtYXhUaHIgPSBMX21weV93eChtYXhTZmJFbiwgcHN5T3V0Q2hhbk0tPnNmYk1pblNucltzZmJdKSA+PiAxOwotCi0gICAgICAgIGlmKG1heFRociA+PSBzZmJFbk0pIHsKLSAgICAgICAgICBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0gPSBNQVhfMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgc2hpZnQgPSBub3JtX2woc2ZiRW5NKTsKLQkJICBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0gPSBtaW4obWF4KHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSwKLQkJCSAgcm91bmQxNihEaXZfMzIobWF4VGhyPDxzaGlmdCwgc2ZiRW5NIDw8IHNoaWZ0KSkpLCBtaW5TbnJMaW1pdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXhUaHIgPj0gc2ZiRW5TKSB7Ci0gICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gTUFYXzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCQkgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuUyk7Ci0gICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gbWluKG1heChwc3lPdXRDaGFuUy0+c2ZiTWluU25yW3NmYl0sCi0JCQkgIHJvdW5kMTYoRGl2XzMyKG1heFRociA8PCBzaGlmdCwgc2ZiRW5TIDw8IHNoaWZ0KSkpLCBtaW5TbnJMaW1pdCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChzZmJFbk0gPiBwc3lPdXRDaGFuTS0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSkKLSAgICAgICAgICBwc3lPdXRDaGFuUy0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSA9IExfbXB5X2xzKHNmYkVuUywgTVNfVEhSU1BSRUFEX0NPRUYpOwotCi0gICAgICAgIGlmIChzZmJFblMgPiBwc3lPdXRDaGFuUy0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSkKLSAgICAgICAgICBwc3lPdXRDaGFuTS0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSA9IExfbXB5X2xzKHNmYkVuTSwgTVNfVEhSU1BSRUFEX0NPRUYpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICBXb3JkMTYgKnBhaEZsYWcgPSBhaEZsYWdbY2hdICsgc2ZiR3JwOwotCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotCi0gICAgICAgIGlmICgocHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0pIHx8Ci0gICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdIDw9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXSkgfHwKLSAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0gPT0gTUFYXzE2KSkgewotICAgICAgICAgICpwYWhGbGFnKysgPSBOT19BSDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAqcGFoRmxhZysrID0gQUhfSU5BQ1RJVkU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvciAoc2ZiPXBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmI8cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICpwYWhGbGFnKysgPSBOT19BSDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6Y2FsY1BlTm9BSAotKiBkZXNjcmlwdGlvbjogc3VtIHRoZSBwZSBkYXRhIG9ubHkgZm9yIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjYWxjUGVOb0FIKFdvcmQxNiAgICAgICAgICAqcGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqY29uc3RQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKm5BY3RpdmVMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzKQotewotICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwOwotICBpbnQgaXBlLCBpY29uc3RQYXJ0LCBpbkFjdGl2ZUxpbmVzOwotCi0gIGlwZSA9IDA7Ci0gIGljb25zdFBhcnQgPSAwOwotICBpbkFjdGl2ZUxpbmVzID0gMDsKLSAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKLSAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotCi0gICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdIDwgQUhfQUNUSVZFKSB7Ci0gICAgICAgICAgaXBlID0gaXBlICsgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgaWNvbnN0UGFydCA9IGljb25zdFBhcnQgKyBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgaW5BY3RpdmVMaW5lcyA9IGluQWN0aXZlTGluZXMgKyBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAqcGUgPSBzYXR1cmF0ZShpcGUpOwotICAqY29uc3RQYXJ0ID0gc2F0dXJhdGUoaWNvbnN0UGFydCk7Ci0gICpuQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShpbkFjdGl2ZUxpbmVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6cmVkdWNlVGhyZXNob2xkcwotKiBkZXNjcmlwdGlvbjogYXBwbHkgcmVkdWN0aW9uIGZvcm11bGEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZWR1Y2VUaHJlc2hvbGRzKFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgdGhyRXhwW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgICAgcmVkVmFsKQotewotICBXb3JkMzIgc2ZiVGhyUmVkdWNlZDsKLSAgV29yZDMyICpwc2ZiRW4sICpwc2ZiVGhyOwotICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwOwotCi0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgZm9yKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7Ci0gCSAgcHNmYkVuICA9IHBzeU91dENoYW4tPnNmYkVuZXJneSArIHNmYkdycDsKLSAgICAgIHBzZmJUaHIgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQgKyBzZmJHcnA7Ci0JICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0KLSAgICAgICAgaWYgKCpwc2ZiRW4gPiAqcHNmYlRocikgewotICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYSAqLwotICAgICAgICAgIFdvcmQzMiB0bXAgPSB0aHJFeHBbY2hdW3NmYkdycCtzZmJdICsgcmVkVmFsOwotICAgICAgICAgIHRtcCA9IGZpeG11bCh0bXAsIHRtcCk7Ci0gICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IGZpeG11bCh0bXAsIHRtcCk7Ci0gICAgICAgICAgLyogYXZvaWQgaG9sZXMgKi8KLSAgICAgICAgICB0bXAgPSBMX21weV9scygqcHNmYkVuLCBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0pOwotCi0gICAgICAgICAgaWYgKChzZmJUaHJSZWR1Y2VkID4gdG1wKSAmJgotICAgICAgICAgICAgICAoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkpewotICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IG1heCh0bXAsICpwc2ZiVGhyKTsKLSAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7Ci0gICAgICAgICAgfQotCQkgICpwc2ZiVGhyID0gc2ZiVGhyUmVkdWNlZDsKLSAgICAgICAgfQotCi0JCXBzZmJFbisrOyAgcHNmYlRocisrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmNvcnJlY3RUaHJlc2gKLSogZGVzY3JpcHRpb246IGlmIHBlIGRpZmZlcmVuY2UgZGVsdGFQZSBiZXR3ZWVuIGRlc2lyZWQgcGUgYW5kIHJlYWwgcGUgaXMgc21hbGwgZW5vdWdoLAotKiAgICAgICAgICAgICB0aGUgZGlmZmVyZW5jZSBjYW4gYmUgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlIHNjYWxlIGZhY3RvciBiYW5kcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb3JyZWN0VGhyZXNoKFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAgKnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICB0aHJFeHBbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgICAgIHJlZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgICAgZGVsdGFQZSkKLXsKLSAgV29yZDE2IGNoLCBzZmIsIHNmYkdycCxzaGlmdDsKLSAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuOwotICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGE7Ci0gIFdvcmQzMiBkZWx0YVNmYlBlOwotICBXb3JkMzIgbm9ybUZhY3RvcjsKLSAgV29yZDMyICpwc2ZiUGVGYWN0b3JzOwotICBXb3JkMTYgKnBzZmJOQWN0aXZlTGluZXMsICpwYWhGbGFnOwotICBXb3JkMzIgc2ZiRW4sIHNmYlRocjsKLSAgV29yZDMyIHNmYlRoclJlZHVjZWQ7Ci0KLSAgLyogZm9yIGVhY2ggc2ZiIGNhbGMgcmVsYXRpdmUgZmFjdG9ycyBmb3IgcGUgY2hhbmdlcyAqLwotICBub3JtRmFjdG9yID0gMTsKLSAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIHBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwotICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICBwc2ZiUGVGYWN0b3JzID0gcGVEYXRhLT5zZmJQZUZhY3RvcnNbY2hdICsgc2ZiR3JwOwotCSAgcHNmYk5BY3RpdmVMaW5lcyA9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lcyArIHNmYkdycDsKLQkgIHBhaEZsYWcgPSBhaEZsYWdbY2hdICsgc2ZiR3JwOwotCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBXb3JkMzIgcmVkVGhyRXhwID0gdGhyRXhwW2NoXVtzZmJHcnArc2ZiXSArIHJlZFZhbDsKLQotICAgICAgICBpZiAoKCgqcGFoRmxhZyA8IEFIX0FDVElWRSkgfHwgKGRlbHRhUGUgPiAwKSkgJiYgKHJlZFRockV4cCA+IDApICYmIChyZWRUaHJFeHAgPj0gKnBzZmJOQWN0aXZlTGluZXMpKSB7Ci0KLSAgICAgICAgICAqcHNmYlBlRmFjdG9ycyA9ICgqcHNmYk5BY3RpdmVMaW5lcykgKiAoMHg3ZmZmZmZmZiAvIHJlZFRockV4cCk7Ci0gICAgICAgICAgbm9ybUZhY3RvciA9IExfYWRkKG5vcm1GYWN0b3IsICpwc2ZiUGVGYWN0b3JzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAqcHNmYlBlRmFjdG9ycyA9IDA7Ci0gICAgICAgIH0KLQkJcHNmYlBlRmFjdG9ycysrOwotCQlwYWhGbGFnKys7IHBzZmJOQWN0aXZlTGluZXMrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIGNhbGN1bGF0ZSBuZXcgdGhyZXNob2xkcyAqLwotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICBwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07Ci0gICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgIHBzZmJQZUZhY3RvcnMgPSBwZURhdGEtPnNmYlBlRmFjdG9yc1tjaF0gKyBzZmJHcnA7Ci0JICBwc2ZiTkFjdGl2ZUxpbmVzID0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzICsgc2ZiR3JwOwotCSAgcGFoRmxhZyA9IGFoRmxhZ1tjaF0gKyBzZmJHcnA7Ci0JICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIC8qIHBlIGRpZmZlcmVuY2UgZm9yIHRoaXMgc2ZiICovCi0gICAgICAgIGRlbHRhU2ZiUGUgPSAqcHNmYlBlRmFjdG9ycyAqIGRlbHRhUGU7Ci0KLQkJLyogdGhyMyhuKSA9IHRocjIobikqMl5kZWx0YVNmYlBlL2IobikgKi8KLSAgICAgICAgaWYgKCpwc2ZiTkFjdGl2ZUxpbmVzID4gMCAmJiAobm9ybUZhY3RvciogKCpwc2ZiTkFjdGl2ZUxpbmVzKSkgIT0gMCkgewotICAgICAgICAgIC8qIG5ldyB0aHJlc2hvbGQgKi8KLSAgICAgICAgICBXb3JkMzIgdGhyRmFjdG9yOwotICAgICAgICAgIHNmYkVuICA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICBzZmJUaHIgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiR3JwK3NmYl07Ci0KLSAgICAgICAgICAgaWYoZGVsdGFTZmJQZSA+PSAwKXsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgIHJlZHVjZSB0aHJlc2hvbGQKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICB0aHJGYWN0b3IgPSBwb3cyX3h5KExfbmVnYXRlKGRlbHRhU2ZiUGUpLCAobm9ybUZhY3RvciogKCpwc2ZiTkFjdGl2ZUxpbmVzKSkpOwotCi0gICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gTF9tcHlfbHMoc2ZiVGhyLCByb3VuZDE2KHRockZhY3RvcikpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgIGluY3JlYXNlIHRocmVzaG9sZAotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHRockZhY3RvciA9IHBvdzJfeHkoZGVsdGFTZmJQZSwgKG5vcm1GYWN0b3IgKiAoKnBzZmJOQWN0aXZlTGluZXMpKSk7Ci0KLQotICAgICAgICAgICAgaWYodGhyRmFjdG9yID4gc2ZiVGhyKSB7Ci0gICAgICAgICAgICAgIHNoaWZ0ID0gbm9ybV9sKHRockZhY3Rvcik7Ci0JCQkgIHNmYlRoclJlZHVjZWQgPSBEaXZfMzIoIHNmYlRociA8PCBzaGlmdCwgdGhyRmFjdG9yPDxzaGlmdCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHNmYlRoclJlZHVjZWQgPSBNQVhfMzI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBhdm9pZCBob2xlICovCi0gICAgICAgICAgc2ZiRW4gPSBMX21weV9scyhzZmJFbiwgcHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYkdycCtzZmJdKTsKLQotICAgICAgICAgIGlmICgoc2ZiVGhyUmVkdWNlZCA+IHNmYkVuKSAmJgotICAgICAgICAgICAgICAoKnBhaEZsYWcgPT0gQUhfSU5BQ1RJVkUpKSB7Ci0gICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gbWF4KHNmYkVuLCBzZmJUaHIpOwotICAgICAgICAgICAgKnBhaEZsYWcgPSBBSF9BQ1RJVkU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZDsKLSAgICAgICAgfQotCi0JCXBhaEZsYWcrKzsgcHNmYk5BY3RpdmVMaW5lcysrOyBwc2ZiUGVGYWN0b3JzKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6cmVkdWNlTWluU25yCi0qIGRlc2NyaXB0aW9uOiBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHJlZHVjZSBwZSBieSByZWR1Y2luZyBtaW5TbnIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZWR1Y2VNaW5TbnIoUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgZGVzaXJlZFBlKQotewotICBXb3JkMTYgY2gsIHNmYiwgc2ZiU3ViV2luOwotICBXb3JkMTYgZGVsdGFQZTsKLQotICAvKiBzdGFydCBhdCBoaWdoZXN0IGZyZXEgZG93biB0byAwICovCi0gIHNmYlN1YldpbiA9IHBzeU91dENoYW5uZWxbMF0ubWF4U2ZiUGVyR3JvdXA7Ci0gIHdoaWxlIChwZURhdGEtPnBlID4gZGVzaXJlZFBlICYmIHNmYlN1YldpbiA+IDApIHsKLQotICAgIHNmYlN1YldpbiA9IHNmYlN1YldpbiAtIDE7Ci0gICAgLyogbG9vcCBvdmVyIGFsbCBzdWJ3aW5kb3dzICovCi0gICAgZm9yIChzZmI9c2ZiU3ViV2luOyBzZmI8cHN5T3V0Q2hhbm5lbFswXS5zZmJDbnQ7Ci0gICAgICAgIHNmYis9cHN5T3V0Q2hhbm5lbFswXS5zZmJQZXJHcm91cCkgewotICAgICAgLyogbG9vcCBvdmVyIGFsbCBjaGFubmVscyAqLwotCQlQRV9DSEFOTkVMX0RBVEEqIHBlQ2hhbiA9IHBlRGF0YS0+cGVDaGFubmVsRGF0YTsKLQkJUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaCA9IHBzeU91dENoYW5uZWw7Ci0JCWZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYl0gIT0gTk9fQUggJiYKLSAgICAgICAgICAgIHBzeU91dENoLT5zZmJNaW5TbnJbc2ZiXSA8IG1pblNuckxpbWl0KSB7Ci0gICAgICAgICAgcHN5T3V0Q2gtPnNmYk1pblNucltzZmJdID0gbWluU25yTGltaXQ7Ci0gICAgICAgICAgcHN5T3V0Q2gtPnNmYlRocmVzaG9sZFtzZmJdID0KLSAgICAgICAgICAgIExfbXB5X2xzKHBzeU91dENoLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2gtPnNmYk1pblNucltzZmJdKTsKLQotICAgICAgICAgIC8qIGNhbGMgbmV3IHBlICovCi0gICAgICAgICAgZGVsdGFQZSA9ICgocGVDaGFuLT5zZmJOTGluZXM0W3NmYl0gKyAocGVDaGFuLT5zZmJOTGluZXM0W3NmYl0gPj4gMSkpID4+IDIpIC0KLSAgICAgICAgICAgICAgcGVDaGFuLT5zZmJQZVtzZmJdOwotICAgICAgICAgIHBlRGF0YS0+cGUgPSBwZURhdGEtPnBlICsgZGVsdGFQZTsKLSAgICAgICAgICBwZUNoYW4tPnBlID0gcGVDaGFuLT5wZSArIGRlbHRhUGU7Ci0gICAgICAgIH0KLQkJcGVDaGFuICs9IDE7IHBzeU91dENoICs9IDE7Ci0gICAgICB9Ci0gICAgICAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwotCi0gICAgICBpZiAocGVEYXRhLT5wZSA8PSBkZXNpcmVkUGUpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTphbGxvd01vcmVIb2xlcwotKiBkZXNjcmlwdGlvbjogaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCBzb21lIG1vcmUgc2NhbGVmYWN0b3IgYmFuZHMKLSogICAgICAgICAgICAgIGhhdmUgdG8gYmUgcXVhbnRpemVkIHRvIHplcm8KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhbGxvd01vcmVIb2xlcyhQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUhfUEFSQU0gICphaFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIGRlc2lyZWRQZSkKLXsKLSAgV29yZDE2IGNoLCBzZmI7Ci0gIFdvcmQxNiBhY3RQZSwgc2hpZnQ7Ci0KLSAgYWN0UGUgPSBwZURhdGEtPnBlOwotCi0gIC8qIGZvciBNUyBhbGxvdyBob2xlIGluIHRoZSBjaGFubmVsIHdpdGggbGVzcyBlbmVyZ3kgKi8KLQotICBpZiAobkNoYW5uZWxzPT0yICYmCi0gICAgICBwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlPT1wc3lPdXRDaGFubmVsWzFdLndpbmRvd1NlcXVlbmNlKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuTCA9ICZwc3lPdXRDaGFubmVsWzBdOwotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhblIgPSAmcHN5T3V0Q2hhbm5lbFsxXTsKLSAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbkwtPnNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiBtaW5FbjsKLQotICAgICAgaWYgKHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2tbc2ZiXSkgewotICAgICAgICAvKiBhbGxvdyBob2xlIGluIHNpZGUgY2hhbm5lbCA/ICovCi0gICAgICAgIG1pbkVuID0gTF9tcHlfbHMocHN5T3V0Q2hhbkwtPnNmYkVuZXJneVtzZmJdLCAobWluU25yTGltaXQgKiBwc3lPdXRDaGFuTC0+c2ZiTWluU25yW3NmYl0pID4+IDE2KTsKLQotICAgICAgICBpZiAoYWhGbGFnWzFdW3NmYl0gIT0gTk9fQUggJiYKLSAgICAgICAgICAgIG1pbkVuID4gcHN5T3V0Q2hhblItPnNmYkVuZXJneVtzZmJdKSB7Ci0gICAgICAgICAgYWhGbGFnWzFdW3NmYl0gPSBOT19BSDsKLSAgICAgICAgICBwc3lPdXRDaGFuUi0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSk7Ci0gICAgICAgICAgYWN0UGUgPSBhY3RQZSAtIHBlRGF0YS0+cGVDaGFubmVsRGF0YVsxXS5zZmJQZVtzZmJdOwotICAgICAgICB9Ci0gICAgICAgIC8qIGFsbG93IGhvbGUgaW4gbWlkIGNoYW5uZWwgPyAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgbWluRW4gPSBMX21weV9scyhwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0sIChtaW5TbnJMaW1pdCAqIHBzeU91dENoYW5SLT5zZmJNaW5TbnJbc2ZiXSkgPj4gMTYpOwotCi0gICAgICAgICAgaWYgKGFoRmxhZ1swXVtzZmJdIT0gTk9fQUggJiYKLSAgICAgICAgICAgICAgbWluRW4gPiBwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0pIHsKLSAgICAgICAgICAgIGFoRmxhZ1swXVtzZmJdID0gTk9fQUg7Ci0gICAgICAgICAgICBwc3lPdXRDaGFuTC0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW5MLT5zZmJFbmVyZ3lbc2ZiXSk7Ci0gICAgICAgICAgICBhY3RQZSA9IGFjdFBlIC0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzBdLnNmYlBlW3NmYl07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdFBlIDwgZGVzaXJlZFBlKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIHN1YnNlcXVlbnRseSBlcmFzZSBiYW5kcyAqLwotICBpZiAoYWN0UGUgPiBkZXNpcmVkUGUpIHsKLSAgICBXb3JkMTYgc3RhcnRTZmJbMl07Ci0gICAgV29yZDMyIGF2Z0VuLCBtaW5FbjsKLSAgICBXb3JkMTYgYWhDbnQ7Ci0gICAgV29yZDE2IGVuSWR4OwotICAgIFdvcmQxNiBlbkRpZmY7Ci0gICAgV29yZDMyIGVuWzRdOwotICAgIFdvcmQxNiBtaW5TZmIsIG1heFNmYjsKLSAgICBGbGFnICAgZG9uZTsKLQotICAgIC8qIGRvIG5vdCBnbyBiZWxvdyBzdGFydFNmYiAqLwotICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0KLSAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCi0gICAgICAgIHN0YXJ0U2ZiW2NoXSA9IGFoUGFyYW0tPnN0YXJ0U2ZiTDsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RhcnRTZmJbY2hdID0gYWhQYXJhbS0+c3RhcnRTZmJTOwotICAgIH0KLQotICAgIGF2Z0VuID0gMDsKLSAgICBtaW5FbiA9IE1BWF8zMjsKLSAgICBhaENudCA9IDA7Ci0gICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiW2NoXTsgc2ZiPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiKyspIHsKLQotICAgICAgICBpZiAoKGFoRmxhZ1tjaF1bc2ZiXSAhPSBOT19BSCkgJiYKLSAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSA+IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJdKSkgewotICAgICAgICAgIG1pbkVuID0gbWluKG1pbkVuLCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSk7Ci0gICAgICAgICAgYXZnRW4gPSBMX2FkZChhdmdFbiwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0pOwotICAgICAgICAgIGFoQ250Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihhaENudCkgewotICAgICAgV29yZDMyIGlhaENudDsKLSAgICAgIHNoaWZ0ID0gbm9ybV9sKGFoQ250KTsKLQkgIGlhaENudCA9IERpdl8zMiggMSA8PCBzaGlmdCwgYWhDbnQgPDwgc2hpZnQgKTsKLSAgICAgIGF2Z0VuID0gZml4bXVsKGF2Z0VuLCBpYWhDbnQpOwotICAgIH0KLQotICAgIGVuRGlmZiA9IGlMb2c0KGF2Z0VuKSAtIGlMb2c0KG1pbkVuKTsKLSAgICAvKiBjYWxjIHNvbWUgZW5lcmd5IGJvcmRlcnMgYmV0d2VlbiBtaW5FbiBhbmQgYXZnRW4gKi8KLSAgICBmb3IgKGVuSWR4PTA7IGVuSWR4PDQ7IGVuSWR4KyspIHsKLSAgICAgIFdvcmQzMiBlbkZhYzsKLSAgICAgIGVuRmFjID0gKCg2LShlbklkeCA8PCAxKSkgKiBlbkRpZmYpOwotICAgICAgZW5bZW5JZHhdID0gZml4bXVsKGF2Z0VuLCBwb3cyX3h5KExfbmVnYXRlKGVuRmFjKSw3KjQpKTsKLSAgICB9Ci0KLSAgICAvKiBzdGFydCB3aXRoIGxvd2VzdCBlbmVyZ3kgYm9yZGVyIGF0IGhpZ2hlc3Qgc2ZiICovCi0gICAgbWF4U2ZiID0gcHN5T3V0Q2hhbm5lbFswXS5zZmJDbnQgLSAxOwotICAgIG1pblNmYiA9IHN0YXJ0U2ZiWzBdOwotCi0gICAgaWYgKG5DaGFubmVscyA9PSAyKSB7Ci0gICAgICBtYXhTZmIgPSBtYXgobWF4U2ZiLCAocHN5T3V0Q2hhbm5lbFsxXS5zZmJDbnQgLSAxKSk7Ci0gICAgICBtaW5TZmIgPSBtaW4obWluU2ZiLCBzdGFydFNmYlsxXSk7Ci0gICAgfQotCi0gICAgc2ZiID0gbWF4U2ZiOwotICAgIGVuSWR4ID0gMDsKLSAgICBkb25lID0gMDsKLSAgICB3aGlsZSAoIWRvbmUpIHsKLQotICAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotCi0gICAgICAgIGlmIChzZmI+PXN0YXJ0U2ZiW2NoXSAmJiBzZmI8cHN5T3V0Q2hhbi0+c2ZiQ250KSB7Ci0gICAgICAgICAgLyogc2ZiIGVuZXJneSBiZWxvdyBib3JkZXIgPyAqLwotCi0gICAgICAgICAgaWYgKGFoRmxhZ1tjaF1bc2ZiXSAhPSBOT19BSCAmJiBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSA8IGVuW2VuSWR4XSl7Ci0gICAgICAgICAgICAvKiBhbGxvdyBob2xlICovCi0gICAgICAgICAgICBhaEZsYWdbY2hdW3NmYl0gPSBOT19BSDsKLSAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJdID0gTF9hZGQocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdKTsKLSAgICAgICAgICAgIGFjdFBlID0gYWN0UGUgLSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYl07Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGFjdFBlIDwgZGVzaXJlZFBlKSB7Ci0gICAgICAgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2ZiID0gc2ZiIC0gMTsKLQotICAgICAgaWYgKHNmYiA8IG1pblNmYikgewotICAgICAgICAvKiByZXN0YXJ0IHdpdGggbmV4dCBlbmVyZ3kgYm9yZGVyICovCi0gICAgICAgIHNmYiA9IG1heFNmYjsKLSAgICAgICAgZW5JZHggPSBlbklkeCArIDE7Ci0KLSAgICAgICAgaWYgKGVuSWR4IC0gNCA+PSAwKQotICAgICAgICAgIGRvbmUgPSAxOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTphZGFwdFRocmVzaG9sZHNUb1BlCi0qIGRlc2NyaXB0aW9uOiB0d28gZ3Vlc3NlcyBmb3IgdGhlIHJlZHVjdGlvbiB2YWx1ZSBhbmQgb25lIGZpbmFsIGNvcnJlY3Rpb24gb2YgdGhlCi0qICAgICAgICAgICAgICB0aHJlc2hvbGRzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRhcHRUaHJlc2hvbGRzVG9QZShQU1lfT1VUX0NIQU5ORUwgICAgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAgICAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICBkZXNpcmVkUGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIX1BBUkFNICAgICAgICAgICAqYWhQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSkKLXsKLSAgV29yZDE2IG5vUmVkUGUsIHJlZFBlLCByZWRQZU5vQUg7Ci0gIFdvcmQxNiBjb25zdFBhcnQsIGNvbnN0UGFydE5vQUg7Ci0gIFdvcmQxNiBuQWN0aXZlTGluZXMsIG5BY3RpdmVMaW5lc05vQUg7Ci0gIFdvcmQxNiBkZXNpcmVkUGVOb0FIOwotICBXb3JkMzIgcmVkVmFsLCBhdmdUaHJFeHA7Ci0gIFdvcmQzMiBpdGVyOwotCi0gIGNhbGNUaHJlc2hFeHAocGVEYXRhLT50aHJFeHAsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0KLSAgYWRhcHRNaW5TbnIocHN5T3V0Q2hhbm5lbCwgbG9nU2ZiRW5lcmd5LCBtc2FQYXJhbSwgbkNoYW5uZWxzKTsKLQotICBpbml0QXZvaWRIb2xlRmxhZyhwZURhdGEtPmFoRmxhZywgcHN5T3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudCwgbkNoYW5uZWxzLCBhaFBhcmFtKTsKLQotICBub1JlZFBlID0gcGVEYXRhLT5wZTsKLSAgY29uc3RQYXJ0ID0gcGVEYXRhLT5jb25zdFBhcnQ7Ci0gIG5BY3RpdmVMaW5lcyA9IHBlRGF0YS0+bkFjdGl2ZUxpbmVzOwotCi0gIC8qIGZpcnN0IGd1ZXNzIG9mIHJlZHVjdGlvbiB2YWx1ZSB0XjAuMjUgPSAyXigoYS1wZW4pLzQqYikgKi8KLSAgYXZnVGhyRXhwID0gcG93Ml94eSgoY29uc3RQYXJ0IC0gbm9SZWRQZSksIChuQWN0aXZlTGluZXMgPDwgMikpOwotCi0gIC8qIHIxID0gMl4oKGEtcGVyKS80KmIpIC0gdF4wLjI1ICovCi0gIHJlZFZhbCA9IHBvdzJfeHkoKGNvbnN0UGFydCAtIGRlc2lyZWRQZSksIChuQWN0aXZlTGluZXMgPDwgMikpIC0gYXZnVGhyRXhwOwotCi0gIC8qIHJlZHVjZSB0aHJlc2hvbGRzICovCi0gIHJlZHVjZVRocmVzaG9sZHMocHN5T3V0Q2hhbm5lbCwgcGVEYXRhLT5haEZsYWcsIHBlRGF0YS0+dGhyRXhwLCBuQ2hhbm5lbHMsIHJlZFZhbCk7Ci0KLSAgLyogcGUgYWZ0ZXIgZmlyc3QgZ3Vlc3MgKi8KLSAgY2FsY1NmYlBlKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKLSAgcmVkUGUgPSBwZURhdGEtPnBlOwotCi0gIGl0ZXIgPSAwOwotICBkbyB7Ci0gICAgLyogcGUgZm9yIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUgKi8KLSAgICBjYWxjUGVOb0FIKCZyZWRQZU5vQUgsICZjb25zdFBhcnROb0FILCAmbkFjdGl2ZUxpbmVzTm9BSCwKLSAgICAgICAgICAgICAgIHBlRGF0YSwgcGVEYXRhLT5haEZsYWcsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0KLSAgICBkZXNpcmVkUGVOb0FIID0gZGVzaXJlZFBlIC0ocmVkUGUgLSByZWRQZU5vQUgpOwotCi0gICAgaWYgKGRlc2lyZWRQZU5vQUggPCAwKSB7Ci0gICAgICBkZXNpcmVkUGVOb0FIID0gMDsKLSAgICB9Ci0KLSAgICAvKiBzZWNvbmQgZ3Vlc3MgKi8KLQotICAgIGlmIChuQWN0aXZlTGluZXNOb0FIID4gMCkgewotCi0JCWF2Z1RockV4cCA9IHBvdzJfeHkoKGNvbnN0UGFydE5vQUggLSByZWRQZU5vQUgpLCAobkFjdGl2ZUxpbmVzTm9BSCA8PCAyKSk7Ci0KLQkJcmVkVmFsID0gKHJlZFZhbCArIHBvdzJfeHkoKGNvbnN0UGFydE5vQUggLSBkZXNpcmVkUGVOb0FIKSwgKG5BY3RpdmVMaW5lc05vQUggPDwgMikpKSAtIGF2Z1RockV4cDsKLQotCQkvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwotCQlyZWR1Y2VUaHJlc2hvbGRzKHBzeU91dENoYW5uZWwsIHBlRGF0YS0+YWhGbGFnLCBwZURhdGEtPnRockV4cCwgbkNoYW5uZWxzLCByZWRWYWwpOwotICAgIH0KLQotICAgIGNhbGNTZmJQZShwZURhdGEsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0gICAgcmVkUGUgPSBwZURhdGEtPnBlOwotCi0gICAgaXRlciA9IGl0ZXIrMTsKLQotICB9IHdoaWxlICgoMjAgKiBhYnNfcyhyZWRQZSAtIGRlc2lyZWRQZSkgPiBkZXNpcmVkUGUpICYmIChpdGVyIDwgMikpOwotCi0KLSAgaWYgKCgxMDAgKiByZWRQZSA8IDExNSAqIGRlc2lyZWRQZSkpIHsKLSAgICBjb3JyZWN0VGhyZXNoKHBzeU91dENoYW5uZWwsIHBlRGF0YS0+YWhGbGFnLCBwZURhdGEsIHBlRGF0YS0+dGhyRXhwLCByZWRWYWwsCi0gICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIGRlc2lyZWRQZSAtIHJlZFBlKTsKLSAgfQotICBlbHNlIHsKLSAgICBXb3JkMTYgZGVzaXJlZFBlMTA1ID0gKDEwNSAqIGRlc2lyZWRQZSkgLyAxMDA7Ci0gICAgcmVkdWNlTWluU25yKHBzeU91dENoYW5uZWwsIHBlRGF0YSwgcGVEYXRhLT5haEZsYWcsCi0gICAgICAgICAgICAgICAgIG5DaGFubmVscywgZGVzaXJlZFBlMTA1KTsKLSAgICBhbGxvd01vcmVIb2xlcyhwc3lPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50LCBwZURhdGEsIHBlRGF0YS0+YWhGbGFnLAotICAgICAgICAgICAgICAgICAgIGFoUGFyYW0sIG5DaGFubmVscywgZGVzaXJlZFBlMTA1KTsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjYWxjQml0U2F2ZQotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc2F2ZSwgc2VlIGZpZ3VyZSBiZWxvdwotKiByZXR1cm5zOgotKiBpbnB1dDogICAgICAgIHBhcmFtZXRlcnMgYW5kIGJpdHJlcy1mdWxsbmVzcwotKiBvdXRwdXQ6ICAgICAgIHBlcmNlbnRhZ2Ugb2YgYml0IHNhdmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjYWxjQml0U2F2ZShXb3JkMTYgZmlsbExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcExvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNsaXBIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWluQml0U2F2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heEJpdFNhdmUpCi17Ci0gIFdvcmQxNiBiaXRzYXZlID0gMDsKLQotICBmaWxsTGV2ZWwgPSBtYXgoZmlsbExldmVsLCBjbGlwTG93KTsKLSAgZmlsbExldmVsID0gbWluKGZpbGxMZXZlbCwgY2xpcEhpZ2gpOwotCi0gIGlmKGNsaXBIaWdoLWNsaXBMb3cpCi0gIGJpdHNhdmUgPSAobWF4Qml0U2F2ZSAtICgoKG1heEJpdFNhdmUtbWluQml0U2F2ZSkqKGZpbGxMZXZlbC1jbGlwTG93KSkvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpcEhpZ2gtY2xpcExvdykpKTsKLQotICByZXR1cm4gKGJpdHNhdmUpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNCaXRTcGVuZAotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc3BlbmQsIHNlZSBmaWd1cmUgYmVsb3cKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBwYXJhbWV0ZXJzIGFuZCBiaXRyZXMtZnVsbG5lc3MKLSogb3V0cHV0OiAgICAgICBwZXJjZW50YWdlIG9mIGJpdCBzcGVuZAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNhbGNCaXRTcGVuZChXb3JkMTYgZmlsbExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNsaXBMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWluQml0U3BlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4Qml0U3BlbmQpCi17Ci0gIFdvcmQxNiBiaXRzcGVuZCA9IDE7Ci0KLSAgZmlsbExldmVsID0gbWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7Ci0gIGZpbGxMZXZlbCA9IG1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKLQotICBpZihjbGlwSGlnaC1jbGlwTG93KQotICBiaXRzcGVuZCA9IChtaW5CaXRTcGVuZCArICgobWF4Qml0U3BlbmQgLSBtaW5CaXRTcGVuZCkqKGZpbGxMZXZlbCAtIGNsaXBMb3cpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaXBIaWdoLWNsaXBMb3cpKSk7Ci0KLSAgcmV0dXJuIChiaXRzcGVuZCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGFkanVzdFBlTWluTWF4KCkKLSogZGVzY3JpcHRpb246ICBhZGp1c3RzIHBlTWluIGFuZCBwZU1heCBwYXJhbWV0ZXJzIG92ZXIgdGltZQotKiByZXR1cm5zOgotKiBpbnB1dDogICAgICAgIGN1cnJlbnQgcGUsIHBlTWluLCBwZU1heAotKiBvdXRwdXQ6ICAgICAgIGFkanVzdGVkIHBlTWluL3BlTWF4Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkanVzdFBlTWluTWF4KGNvbnN0IFdvcmQxNiBjdXJyUGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAqcGVNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAqcGVNYXgpCi17Ci0gIFdvcmQxNiBtaW5GYWNIaSwgbWF4RmFjSGksIG1pbkZhY0xvLCBtYXhGYWNMbzsKLSAgV29yZDE2IGRpZmY7Ci0gIFdvcmQxNiBtaW5EaWZmID0gZXh0cmFjdF9sKGN1cnJQZSAvIDYpOwotICBtaW5GYWNIaSA9IDMwOwotICBtYXhGYWNIaSA9IDEwMDsKLSAgbWluRmFjTG8gPSAxNDsKLSAgbWF4RmFjTG8gPSA3OwotCi0gIGRpZmYgPSBjdXJyUGUgLSAqcGVNYXggOwotCi0gIGlmIChkaWZmID4gMCkgewotICAgICpwZU1pbiA9ICpwZU1pbiArICgoZGlmZiAqIG1pbkZhY0hpKSAvIDEwMCk7Ci0gICAgKnBlTWF4ID0gKnBlTWF4ICsgKChkaWZmICogbWF4RmFjSGkpIC8gMTAwKTsKLSAgfSBlbHNlIHsKLSAgICBkaWZmID0gKnBlTWluIC0gY3VyclBlOwotCi0gICAgaWYgKGRpZmYgPiAwKSB7Ci0gICAgICAqcGVNaW4gPSAqcGVNaW4gLSAoKGRpZmYgKiBtaW5GYWNMbykgLyAxMDApOwotICAgICAgKnBlTWF4ID0gKnBlTWF4IC0gKChkaWZmICogbWF4RmFjTG8pIC8gMTAwKTsKLSAgICB9IGVsc2UgewotICAgICAgKnBlTWluID0gKnBlTWluICsgKChjdXJyUGUgLSAqcGVNaW4pICogbWluRmFjSGkgLyAxMDApOwotICAgICAgKnBlTWF4ID0gKnBlTWF4IC0gKCgqcGVNYXggLSBjdXJyUGUpICogbWF4RmFjTG8gLyAxMDApOwotICAgIH0KLSAgfQotCi0KLSAgaWYgKCgqcGVNYXggLSAqcGVNaW4pIDwgbWluRGlmZikgewotICAgIFdvcmQxNiBwYXJ0TG8sIHBhcnRIaTsKLQotICAgIHBhcnRMbyA9IG1heCgwLCAoY3VyclBlIC0gKnBlTWluKSk7Ci0gICAgcGFydEhpID0gbWF4KDAsICgqcGVNYXggLSBjdXJyUGUpKTsKLQotICAgICpwZU1heCA9IGN1cnJQZSArICgocGFydEhpICogbWluRGlmZikgLyAocGFydExvICsgcGFydEhpKSk7Ci0gICAgKnBlTWluID0gY3VyclBlIC0gKChwYXJ0TG8gKiBtaW5EaWZmKSAvIChwYXJ0TG8gKyBwYXJ0SGkpKTsKLSAgICAqcGVNaW4gPSBtYXgoMCwgKnBlTWluKTsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBCaXRyZXNDYWxjQml0RmFjCi0qIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyBmYWN0b3Igb2Ygc3BlbmRpbmcgYml0cyBmb3Igb25lIGZyYW1lCi0qICAgICAgICAgICAgICAgIDEuMCA6IHRha2UgYWxsIGZyYW1lIGR5bnBhcnQgYml0cwotKiAgICAgICAgICAgICAgICA+MS4wIDogdGFrZSBhbGwgZnJhbWUgZHlucGFydCBiaXRzICsgYml0cmVzCi0qICAgICAgICAgICAgICAgIDwxLjAgOiBwdXQgYml0cyBpbiBiaXRyZXNlcnZvaXIKLSogIHJldHVybnM6ICAgICAgQml0RmFjKjEwMAotKiAgaW5wdXQ6ICAgICAgICBiaXRyZXMtZnVsbG5lc3MsIHBlLCBibG9ja1R5cGUsIHBhcmFtZXRlci1zZXR0aW5ncwotKiAgb3V0cHV0OgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGJpdHJlc0NhbGNCaXRGYWMoIGNvbnN0IFdvcmQxNiAgIGJpdHJlc0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG1heEJpdHJlc0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICB3aW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgYXZnQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbWF4Qml0RmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpfVEhSX1NUQVRFICpBZGpUaHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UICAgKmFkalRockNoYW4pCi17Ci0gIEJSRVNfUEFSQU0gKmJyZXNQYXJhbTsKLSAgV29yZDE2IHBleDsKLSAgV29yZDE2IGZpbGxMZXZlbDsKLSAgV29yZDE2IGJpdFNhdmUsIGJpdFNwZW5kLCBiaXRyZXNGYWM7Ci0KLSAgZmlsbExldmVsID0gZXh0cmFjdF9sKCgxMDAqIGJpdHJlc0JpdHMpIC8gbWF4Qml0cmVzQml0cyk7Ci0KLSAgaWYgKHdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKLSAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtTG9uZyk7Ci0gIGVsc2UKLSAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtU2hvcnQpOwotCi0gIHBleCA9IG1heChwZSwgYWRqVGhyQ2hhbi0+cGVNaW4pOwotICBwZXggPSBtaW4ocGV4LGFkalRockNoYW4tPnBlTWF4KTsKLQotICBiaXRTYXZlID0gY2FsY0JpdFNhdmUoZmlsbExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlc1BhcmFtLT5jbGlwU2F2ZUxvdywgYnJlc1BhcmFtLT5jbGlwU2F2ZUhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVzUGFyYW0tPm1pbkJpdFNhdmUsIGJyZXNQYXJhbS0+bWF4Qml0U2F2ZSk7Ci0KLSAgYml0U3BlbmQgPSBjYWxjQml0U3BlbmQoZmlsbExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVzUGFyYW0tPmNsaXBTcGVuZExvdywgYnJlc1BhcmFtLT5jbGlwU3BlbmRIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVzUGFyYW0tPm1pbkJpdFNwZW5kLCBicmVzUGFyYW0tPm1heEJpdFNwZW5kKTsKLQotICBpZihhZGpUaHJDaGFuLT5wZU1heCAhPSBhZGpUaHJDaGFuLT5wZU1pbikKLQliaXRyZXNGYWMgPSAoMTAwIC0gYml0U2F2ZSkgKyBleHRyYWN0X2woKChiaXRTcGVuZCArIGJpdFNhdmUpICogKHBleCAtIGFkalRockNoYW4tPnBlTWluKSkgLwotICAgICAgICAgICAgICAgICAgICAoYWRqVGhyQ2hhbi0+cGVNYXggLSBhZGpUaHJDaGFuLT5wZU1pbikpOwotICBlbHNlCi0JYml0cmVzRmFjID0gMHg3ZmZmOwotCi0gIGJpdHJlc0ZhYyA9IG1pbihiaXRyZXNGYWMsCi0gICAgICAgICAgICAgICAgICAgICgxMDAtMzAgKyBleHRyYWN0X2woKDEwMCAqIGJpdHJlc0JpdHMpIC8gYXZnQml0cykpKTsKLQotICBiaXRyZXNGYWMgPSBtaW4oYml0cmVzRmFjLCBtYXhCaXRGYWMpOwotCi0gIGFkanVzdFBlTWluTWF4KHBlLCAmYWRqVGhyQ2hhbi0+cGVNaW4sICZhZGpUaHJDaGFuLT5wZU1heCk7Ci0KLSAgcmV0dXJuIGJpdHJlc0ZhYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFkalRockluaXQKLSogZGVzY3JpcHRpb246ICBpbml0IHRocmVzaG9sZHMgcGFyYW1ldGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQWRqVGhySW5pdChBREpfVEhSX1NUQVRFICpoQWRqVGhyLAotICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgIG1lYW5QZSwKLSAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICBjaEJpdHJhdGUpCi17Ci0gIEFUU19FTEVNRU5UKiBhdHNFbGVtID0gJmhBZGpUaHItPmFkalRoclN0YXRlRWxlbTsKLSAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSA9ICZhdHNFbGVtLT5taW5TbnJBZGFwdFBhcmFtOwotCi0gIC8qIGNvbW1vbiBmb3IgYWxsIGVsZW1lbnRzOiAqLwotICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ICAgPSAgMjA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVIaWdoICA9ICA5NTsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTYXZlICAgID0gIC01OwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgICAgPSAgMzA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kTG93ICA9ICAyMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRIaWdoID0gIDk1OwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNwZW5kICAgPSAtMTA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U3BlbmQgICA9ICA0MDsKLQotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUxvdyAgID0gIDIwOwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUhpZ2ggID0gIDc1OwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTYXZlICAgID0gICAwOwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTYXZlICAgID0gIDIwOwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRMb3cgID0gIDIwOwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRIaWdoID0gIDc1OwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTcGVuZCAgID0gLTU7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1heEJpdFNwZW5kICAgPSAgNTA7Ci0KLSAgLyogc3BlY2lmaWMgZm9yIGVhY2ggZWxlbWVudDogKi8KLQotICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLwotICBhdHNFbGVtLT5wZU1pbiA9IGV4dHJhY3RfbCgoKDgwKm1lYW5QZSkgLyAxMDApKTsKLSAgYXRzRWxlbS0+cGVNYXggPSBleHRyYWN0X2woKCgxMjAqbWVhblBlKSAvIDEwMCkpOwotCi0gIC8qIGFkZGl0aW9uYWwgcGUgb2Zmc2V0IHRvIGNvcnJlY3QgcGUyYml0cyBmb3IgbG93IGJpdHJhdGVzICovCi0gIGF0c0VsZW0tPnBlT2Zmc2V0ID0gMDsKLSAgaWYgKGNoQml0cmF0ZSA8IDMyMDAwKSB7Ci0gICAgYXRzRWxlbS0+cGVPZmZzZXQgPSBtYXgoNTAsICgxMDAgLSBleHRyYWN0X2woKDEwMCAqIGNoQml0cmF0ZSkgLyAzMjAwMCkpKTsKLSAgfQotCi0gIC8qIGF2b2lkIGhvbGUgcGFyYW1ldGVycyAqLwotICBpZiAoY2hCaXRyYXRlID4gMjAwMDApIHsKLSAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IFRSVUU7Ci0gICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYkwgPSAxNTsKLSAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDM7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBGQUxTRTsKLSAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDA7Ci0gICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYlMgPSAwOwotICB9Ci0KLSAgLyogbWluU25yIGFkYXB0YXRpb24gKi8KLSAgLyogbWF4aW11bSByZWR1Y3Rpb24gb2YgbWluU25yIGdvZXMgZG93biB0byBtaW5TbnJebWF4UmVkICovCi0gIG1zYVBhcmFtLT5tYXhSZWQgPSAweDIwMDAwMDAwOyAgICAgLyogKjAuMjVmICovCi0gIC8qIHN0YXJ0IGFkYXB0YXRpb24gb2YgbWluU25yIGZvciBhdmdFbi9zZmJFbiA+IHN0YXJ0UmF0aW8gKi8KLSAgbXNhUGFyYW0tPnN0YXJ0UmF0aW8gPSAweDBjY2NjY2NkOyAvKiAxMCAqLwotICAvKiBtYXhpbXVtIG1pblNuciByZWR1Y3Rpb24gdG8gbWluU25yXm1heFJlZCBpcyByZWFjaGVkIGZvcgotICAgICBhdmdFbi9zZmJFbiA+PSBtYXhSYXRpbyAqLwotICBtc2FQYXJhbS0+bWF4UmF0aW8gPSAgMHgwMDIwYzQ5YzsgLyogMTAwMCAqLwotICAvKiBoZWxwZXIgdmFyaWFibGVzIHRvIGludGVycG9sYXRlIG1pblNuciByZWR1Y3Rpb24gZm9yCi0gICAgIGF2Z0VuL3NmYkVuIGJldHdlZW4gc3RhcnRSYXRpbyBhbmQgbWF4UmF0aW8gKi8KLQotICBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSAweGZiMzMzMzMzOyAvKiAtMC43NS8yMCAqLwotCi0gIG1zYVBhcmFtLT5yZWRPZmZzID0gMHgzMDAwMDAwMDsgIC8qIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyAqIDEwKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvKSAqLwotCi0KLSAgLyogcGUgY29ycmVjdGlvbiAqLwotICBhdHNFbGVtLT5wZUxhc3QgPSAwOwotICBhdHNFbGVtLT5keW5CaXRzTGFzdCA9IDA7Ci0gIGF0c0VsZW0tPnBlQ29ycmVjdGlvbkZhY3RvciA9IDEwMDsgLyogMS4wICovCi0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNQZUNvcnJlY3Rpb24KLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIHRoZSBkZXNpcmVkIHBlcmNlcHR1YWwgZW50cm9weSBmYWN0b3IKLSoJCQkJSXQgaXMgYmV0d2VlbiAwLjg1IGFuZCAxLjE1Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNhbGNQZUNvcnJlY3Rpb24oV29yZDE2ICpjb3JyZWN0aW9uRmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVBY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBwZUxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBiaXRzTGFzdCkKLXsKLSAgV29yZDMyIHBlQWN0MTAwID0gMTAwICogcGVBY3Q7Ci0gIFdvcmQzMiBwZUxhc3QxMDAgPSAxMDAgKiBwZUxhc3Q7Ci0gIFdvcmQxNiBwZUJpdHNMYXN0ID0gYml0czJwZShiaXRzTGFzdCk7Ci0KLSAgaWYgKChiaXRzTGFzdCA+IDApICYmCi0gICAgICAocGVBY3QxMDAgPCAoMTUwICogcGVMYXN0KSkgJiYgIChwZUFjdDEwMCA+ICg3MCAqIHBlTGFzdCkpICYmCi0gICAgICAoKDEyMCAqIHBlQml0c0xhc3QpID4gcGVMYXN0MTAwICkgJiYgKCggNjUgKiBwZUJpdHNMYXN0KSA8IHBlTGFzdDEwMCkpCi0gICAgewotICAgICAgV29yZDE2IG5ld0ZhYyA9ICgxMDAgKiBwZUxhc3QpIC8gcGVCaXRzTGFzdDsKLSAgICAgIC8qIGRlYWQgem9uZSAqLwotCi0gICAgICBpZiAobmV3RmFjIDwgMTAwKSB7Ci0gICAgICAgIG5ld0ZhYyA9IG1pbigoKDExMCAqIG5ld0ZhYykgLyAxMDApLCAxMDApOwotICAgICAgICBuZXdGYWMgPSBtYXgobmV3RmFjLCA4NSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbmV3RmFjID0gbWF4KCgoOTAgKiBuZXdGYWMpIC8gMTAwKSwgMTAwKTsKLSAgICAgICAgbmV3RmFjID0gbWluKG5ld0ZhYywgMTE1KTsKLSAgICAgIH0KLQotICAgICAgaWYgKChuZXdGYWMgPiAxMDAgJiYgKmNvcnJlY3Rpb25GYWMgPCAxMDApIHx8Ci0gICAgICAgICAgKG5ld0ZhYyA8IDEwMCAmJiAqY29ycmVjdGlvbkZhYyA+IDEwMCkpIHsKLSAgICAgICAgKmNvcnJlY3Rpb25GYWMgPSAxMDA7Ci0gICAgICB9Ci0gICAgICAvKiBmYXN0ZXIgYWRhcHRhdGlvbiB0b3dhcmRzIDEuMCwgc2xvd2VyIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gKi8KLQotICAgICAgaWYgKCgqY29ycmVjdGlvbkZhYyA8IDEwMCAmJiBuZXdGYWMgPCAqY29ycmVjdGlvbkZhYykgfHwKLSAgICAgICAgICAoKmNvcnJlY3Rpb25GYWMgPiAxMDAgJiYgbmV3RmFjID4gKmNvcnJlY3Rpb25GYWMpKQotICAgICAgICAqY29ycmVjdGlvbkZhYyA9ICg4NSAqICpjb3JyZWN0aW9uRmFjICsgMTUgKiBuZXdGYWMpIC8gMTAwOwotICAgICAgZWxzZQotICAgICAgICAqY29ycmVjdGlvbkZhYyA9ICg3MCAqICpjb3JyZWN0aW9uRmFjICsgMzAgKiBuZXdGYWMpIC8gMTAwOwotICAgICAgKmNvcnJlY3Rpb25GYWMgPSBtaW4oKmNvcnJlY3Rpb25GYWMsIDExNSk7Ci0gICAgICAqY29ycmVjdGlvbkZhYyA9IG1heCgqY29ycmVjdGlvbkZhYywgODUpOwotICAgIH0KLSAgZWxzZSB7Ci0gICAgKmNvcnJlY3Rpb25GYWMgPSAxMDA7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFkanVzdFRocmVzaG9sZHMKLSogZGVzY3JpcHRpb246ICBBZGp1c3QgdGhyZXNob2xkcyB0byB0aGUgZGVzaXJlZCBiaXRyYXRlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBZGp1c3RUaHJlc2hvbGRzKEFESl9USFJfU1RBVEUgICAqYWRqVGhyU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQgICAgICpBZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqY2hCaXREaXN0cmlidXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UICAqcWNPRSwKLQkJCQkJICBFTEVNRU5UX0JJVFMJICAqZWxCaXRzLAotCQkJCQkgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbWF4Qml0RmFjKQotewotICBQRV9EQVRBIHBlRGF0YTsKLSAgV29yZDE2IG5vUmVkUGUsIGdyYW50ZWRQZSwgZ3JhbnRlZFBlQ29ycjsKLSAgV29yZDE2IGN1cldpbmRvd1NlcXVlbmNlOwotICBXb3JkMTYgYml0RmFjdG9yOwotICBXb3JkMTYgYXZnQml0cyA9IChlbEJpdHMtPmF2ZXJhZ2VCaXRzIC0gKHFjT0UtPnN0YXRpY0JpdHNVc2VkICsgcWNPRS0+YW5jQml0c1VzZWQpKTsKLSAgV29yZDE2IGJpdHJlc0JpdHMgPSBlbEJpdHMtPmJpdFJlc0xldmVsOwotICBXb3JkMTYgbWF4Qml0cmVzQml0cyA9IGVsQml0cy0+bWF4Qml0czsKLSAgV29yZDE2IHNpZGVJbmZvQml0cyA9IChxY09FLT5zdGF0aWNCaXRzVXNlZCArIHFjT0UtPmFuY0JpdHNVc2VkKTsKLSAgV29yZDE2IGNoOwotICBtZW1zZXQoJnBlRGF0YSwgMCwgc2l6ZW9mKHBlRGF0YSkpOwotCi0gIHByZXBhcmVTZmJQZSgmcGVEYXRhLCBwc3lPdXRDaGFubmVsLCBsb2dTZmJFbmVyZ3ksIHNmYk5SZWxldmFudExpbmVzLCBuQ2hhbm5lbHMsIEFkalRoclN0YXRlRWxlbWVudC0+cGVPZmZzZXQpOwotCi0gIC8qIHBlIHdpdGhvdXQgcmVkdWN0aW9uICovCi0gIGNhbGNTZmJQZSgmcGVEYXRhLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwotICBub1JlZFBlID0gcGVEYXRhLnBlOwotCi0KLSAgY3VyV2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKLQotICBpZiAobkNoYW5uZWxzID09IDIpIHsKLQotICAgIGlmICgocHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHx8Ci0gICAgICAgIChwc3lPdXRDaGFubmVsWzFdLndpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykpIHsKLSAgICAgIGN1cldpbmRvd1NlcXVlbmNlID0gU0hPUlRfV0lORE9XOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2U7Ci0gIH0KLQotCi0gIC8qIGJpdCBmYWN0b3IgKi8KLSAgYml0RmFjdG9yID0gYml0cmVzQ2FsY0JpdEZhYyhiaXRyZXNCaXRzLCBtYXhCaXRyZXNCaXRzLCBub1JlZFBlKzUqc2lkZUluZm9CaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cldpbmRvd1NlcXVlbmNlLCBhdmdCaXRzLCBtYXhCaXRGYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqVGhyU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50KTsKLQotICAvKiBkZXNpcmVkIHBlICovCi0gIGdyYW50ZWRQZSA9ICgoYml0RmFjdG9yICogYml0czJwZShhdmdCaXRzKSkgLyAxMDApOwotCi0gIC8qIGNvcnJlY3Rpb24gb2YgcGUgdmFsdWUgKi8KLSAgY2FsY1BlQ29ycmVjdGlvbigmKEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yKSwKLSAgICAgICAgICAgICAgICAgICBtaW4oZ3JhbnRlZFBlLCBub1JlZFBlKSwKLSAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwKLSAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0KTsKLSAgZ3JhbnRlZFBlQ29yciA9IChncmFudGVkUGUgKiBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3RvcikgLyAxMDA7Ci0KLQotICBpZiAoZ3JhbnRlZFBlQ29yciA8IG5vUmVkUGUgJiYgbm9SZWRQZSA+IHBlRGF0YS5vZmZzZXQpIHsKLSAgICAvKiBjYWxjIHRocmVzaG9sZCBuZWNlc3NhcnkgZm9yIGRlc2lyZWQgcGUgKi8KLSAgICBhZGFwdFRocmVzaG9sZHNUb1BlKHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyYW50ZWRQZUNvcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5haFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+bWluU25yQWRhcHRQYXJhbSk7Ci0gIH0KLQotICAvKiBjYWxjdWxhdGUgcmVsYXRpdmUgZGlzdHJpYnV0aW9uICovCi0gIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgV29yZDE2IHBlT2Zmc0RpZmYgPSBwZURhdGEucGUgLSBwZURhdGEub2Zmc2V0OwotICAgIGNoQml0RGlzdHJpYnV0aW9uW2NoXSA9IDIwMDsKLQotICAgIGlmIChwZU9mZnNEaWZmID4gMCkgewotICAgICAgV29yZDMyIHRlbXAgPSAxMDAwIC0gKG5DaGFubmVscyAqIDIwMCk7Ci0gICAgICBjaEJpdERpc3RyaWJ1dGlvbltjaF0gPSBjaEJpdERpc3RyaWJ1dGlvbltjaF0gKwotCQkgICh0ZW1wICogcGVEYXRhLnBlQ2hhbm5lbERhdGFbY2hdLnBlKSAvIHBlT2Zmc0RpZmY7Ci0gICAgfQotICB9Ci0KLSAgLyogc3RvcmUgcGUgKi8KLSAgcWNPRS0+cGUgPSBub1JlZFBlOwotCi0gIC8qIHVwZGF0ZSBsYXN0IHBlICovCi0gIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0ID0gZ3JhbnRlZFBlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQWRqVGhyVXBkYXRlCi0qIGRlc2NyaXB0aW9uOiAgc2F2ZSBkeW5CaXRzVXNlZCBmb3IgY29ycmVjdGlvbiBvZiBiaXRzMnBlIHJlbGF0aW9uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBZGpUaHJVcGRhdGUoQVRTX0VMRU1FTlQgKkFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBkeW5CaXRzVXNlZCkKLXsKLSAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCA9IGR5bkJpdHNVc2VkOwotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzA1MTk3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotQC8qCi1AICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi1AICoqCi1AICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQCAqKgotQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1AICoqCi1AICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1AICovCi0KLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLUAJRmlsZToJCUF1dG9Db3JyZWxhdGlvbl92NS5zCi1ACi1ACUNvbnRlbnQ6CUF1dG9Db3JyZWxhdGlvbiBmdW5jdGlvbiBhcm12NSBhc3NlbWJsZQotQAotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLQotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCUF1dG9Db3JyZWxhdGlvbgotCi1BdXRvQ29ycmVsYXRpb246Ci0Jc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQotICBzdWIgICAgIHIxMywgcjEzLCAjMjAKLQotICBtb3YgICAgIHI1LCByMAotICBtb3YgICAgIHI3LCByMQotICBtb3YgICAgIHI5LCByMwotICBtb3YgICAgIHIyLCByMiwgbHNsICMxNgotICBtb3YgICAgIHIwLCAjMAotICBtb3YgICAgIHI0LCByMiwgYXNyICMxNgotICBtb3YgICAgIHI4LCAjMAotICBjbXAgICAgIHI0LCAjMAotICBibGUgICAgIEwxMzYKLQotCWNtcCAgICAgcjQsICM4Ci0JbW92CQkgIHIyLCAjMAotICBibHQgICAgIEwxMzMKLQotCXN1YiAgICAgcjEyLCByNCwgIzgKLUwxMzI6Ci0gIGxkciAgICAgcjYsIFtyNSwgcjJdCi0JYWRkCQkgIHIyLCByMiwgIzQKLQlzbXVsYmIgIHIzLCByNiwgcjYKLQlsZHIgICAgIHIxLCBbcjUsIHIyXQotCXNtdWx0dAlyMTAsIHI2LCByNgotCW1vdgkJICByMywgcjMsIGFzciAjOQotCXNtdWxiYglyNiwgcjEsIHIxCi0JbW92CQkgIHIxMCwgcjEwLCBhc3IgIzkKLQlxYWRkCSAgcjAsIHIwLCByMwotCXNtdWx0dAlyMTEsIHIxLCByMQotCWFkZCAgICAgcjIsIHIyLCAjNAotCXFhZGQJICByMCwgcjAsIHIxMAotCW1vdgkJICByNiwgcjYsIGFzciAjOQotCW1vdgkJICByMTEsIHIxMSwgYXNyICM5Ci0JbGRyCQkgIHIxLCBbcjUsIHIyXQotCXFhZGQJICByMCwgcjAsIHI2Ci0Jc211bGJiCXIxMCwgcjEsIHIxCi0Jc211bHR0CXI2LCByMSwgcjEKLQlxYWRkCSAgcjAsIHIwLCByMTEKLQltb3YJCSAgcjEwLCByMTAsIGFzciAjOQotCW1vdgkJICByNiwgcjYsIGFzciAjOQotCXFhZGQJICByMCwgcjAsIHIxMAotCWFkZCAgICAgcjIsIHIyLCAjNAotCWFkZCAgICAgcjgsIHI4LCAjNgotCi0JcWFkZAkgIHIwLCByMCwgcjYKLQljbXAgICAgIHI4LCByMTIKLSAgYmx0ICAgICBMMTMyCi1MMTMzOgotICBsZHJzaCAgIHI2LCBbcjUsIHIyXQotICBtdWwgICAgIHIxMCwgcjYsIHI2Ci0JYWRkICAgICByMiwgcjIsICMyCi0gIG1vdiAgICAgcjEsIHIxMCwgYXNyICM5Ci0gIHFhZGQgICAgcjAsIHIwLCByMQotTDEzNDoKLSAgYWRkICAgICByOCwgcjgsICMxCi0gIGNtcCAgICAgcjgsIHI0Ci0gIGJsdCAgICAgTDEzMwotTDEzNToKLUwxMzY6Ci0gIHN0ciAgICAgcjAsIFtyNywgIzBdCi0gIGNtcCAgICAgcjAsICMwCi0gIGJlcSAgICAgTDEzMjAKLUwxMzc6Ci0gIG1vdiAgICAgcjIsIHI5LCBsc2wgIzE2Ci0JbW92ICAgICByOCwgIzEKLSAgbW92ICAgICByMiwgcjIsIGFzciAjMTYKLSAgY21wICAgICByMiwgIzEKLSAgYmxlICAgICBMMTMxOQotTDEzODoKLUwxMzk6Ci0gIHN1YiAgICAgcjQsIHI0LCAjMQotICBtb3YgICAgIHIxNCwgIzAKLSAgbW92ICAgICByMywgIzAKLSAgY21wICAgICByNCwgIzAKLSAgYmxlICAgICBMMTMxNwotTDEzMTA6Ci0gIGNtcCAgICAgcjQsICM2Ci0gIGFkZGx0ICAgcjYsIHI1LCByOCwgbHNsICMxCi0gIGJsdCAgICAgTDEzMTQKLUwxMzExOgotICBhZGQgICAgIHI2LCByNSwgcjgsIGxzbCAjMQotICBzdWIgICAgIHIxMiwgcjQsICM2Ci0gIHN0ciAgICAgcjgsIFtyMTMsICM4XQotICBzdHIgICAgIHI3LCBbcjEzLCAjNF0KLUwxMzEyOgotICBtb3YgICAgIHIxLCByMywgbHNsICMxCi0gIGxkcnNoICAgcjcsIFtyNiwgcjFdCi0gIGxkcnNoICAgcjEwLCBbcjUsIHIxXQotICBhZGQgICAgIHI4LCByMSwgcjYKLQlhZGQgICAgIHI5LCByNSwgcjEKLQltdWwgICAgIHI3LCByMTAsIHI3Ci0gIGxkcnNoICAgcjEsIFtyOCwgIzJdCi0JbGRyc2ggICByMTAsIFtyOCwgIzRdCi0gIGFkZCAgICAgcjcsIHIxNCwgcjcsIGFzciAjOQotICBsZHJzaCAgIHIwLCBbcjksICMyXQotICBsZHJzaCAgIHIxMSwgW3I5LCAjNF0KLSAgbXVsICAgICByMSwgcjAsIHIxCi0gIGxkcnNoICAgcjE0LCBbcjgsICM2XQotICBtdWwgICAgIHIxMCwgcjExLCByMTAKLQlhZGQgICAgIHI3LCByNywgcjEsIGFzciAjOQotICBsZHJzaCAgIHI4LCBbcjgsICM4XQotCWFkZCAgICAgcjMsIHIzLCAjNQotCWxkcnNoICAgcjExLCBbcjksICM2XQotICBsZHJzaCAgIHIxLCBbcjksICM4XQotICBtdWwgICAgIHIxNCwgcjExLCByMTQKLSAgYWRkICAgICByNywgcjcsIHIxMCwgYXNyICM5Ci0gIG11bCAgICAgcjEsIHIxLCByOAotICBhZGQgICAgIHIxNCwgcjcsIHIxNCwgYXNyICM5Ci0JY21wICAgICByMywgcjEyCi0gIGFkZCAgICAgcjE0LCByMTQsIHIxLCBhc3IgIzkKLSAgYmxlICAgICBMMTMxMgotTDEzMTM6Ci0gIGxkciAgICAgcjgsIFtyMTMsICM4XQotICBsZHIgICAgIHI3LCBbcjEzLCAjNF0KLUwxMzE0OgotTDEzMTU6Ci0gIG1vdiAgICAgcjEyLCByMywgbHNsICMxCi0gIGxkcnNoICAgcjksIFtyNiwgcjEyXQotICBsZHJzaCAgIHIxMiwgW3I1LCByMTJdCi0gIGFkZCAgICAgcjMsIHIzLCAjMQotICBjbXAgICAgIHIzLCByNAotICBtdWwgICAgIHIxMiwgcjEyLCByOQotICBhZGQgICAgIHIxNCwgcjE0LCByMTIsIGFzciAjOQotICBibHQgICAgIEwxMzE1Ci1MMTMxNjoKLUwxMzE3OgotICBzdHIgICAgIHIxNCwgW3I3LCArcjgsIGxzbCAjMl0KLSAgYWRkICAgICByOCwgcjgsICMxCi0gIGNtcCAgICAgcjgsIHIyCi0gIGJsdCAgICAgTDEzOQotCi1MMTMxOToKLUwxMzIwOgotCWFkZCAgICAgcjEzLCByMTMsICMyMAotCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0JQEVORFAgIEAgfEF1dG9Db3JyZWxhdGlvbnwKLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0NhbGNXaW5kb3dFbmVyZ3lfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQ2FsY1dpbmRvd0VuZXJneV92NS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzBlOGNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQ2FsY1dpbmRvd0VuZXJneV92NS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlDYWxjV2luZG93RW5lcmd5X3Y1LnMKLUAKLUAJQ29udGVudDoJQ2FsY1dpbmRvd0VuZXJneSBmdW5jdGlvbiBhcm12NSBhc3NlbWJsZQotQAotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLQotCS5zZWN0aW9uIC50ZXh0Ci0KLQkuZ2xvYmFsCUNhbGNXaW5kb3dFbmVyZ3kKLQotQ2FsY1dpbmRvd0VuZXJneToKLQlzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgIHIxMywgcjEzLCAjMjAKLQotICBtb3YgICAgIHIzLCByMywgbHNsICMxNgotCWxkciAgICAgcjEwLCBbcjAsICMxNjhdICAgICAgICAgICAgICAgICAgICBAIHN0YXRlczAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXTsKLSAgbW92ICAgICByMywgcjMsIGFzciAjMTYKLQlsZHIgICAgIHIxMSwgW3IwLCAjMTcyXSAgICAgICAgICAgICAgICAgICAgQCBzdGF0ZXMxID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07Ci0KLQltb3YgICAgIHIyLCByMiwgbHNsICMxNgotCWxkciAgICAgcjEyLCBoaVBhc3NDb2VmZiAgICAgICAgICAgICAgICAgICBAIENvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOwotICBtb3YgICAgIHIyLCByMiwgYXNyICMxNgotCWxkciAgICAgcjE0LCBoaVBhc3NDb2VmZiArIDQJCQkgICAgICAgICBAIENvZWZmMSA9IGhpUGFzc0NvZWZmWzFdOwotCi0JbW92CQkJcjgsICMwCQkJCQkJCSAgICAgICAgICAgICAgIEAgdz0wCi0JbW92CQkJcjUsICMwCQkJCQkJCSAgICAgICAgICAgICAgIEAgd09mZnNldCA9IDA7Ci0KLUJMT0NLX0JFR0lOOgotCW1vdgkJCXI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBhY2N1VUUgPSAwOwotCW1vdgkJCXI3LCAjMAkJCQkJCQkJICAgICAgICAgICAgIEAgYWNjdUZFID0gMDsKLQltb3YJCQlyNCwgIzAJCQkJCQkJICAgICAgICAgICAgICAgQCBpPTAKLQotCXN0cgkJCXI4LCBbcjEzLCAjNF0KLQlzdHIJCQlyMCwgW3IxMywgIzhdCi0Jc3RyCQkJcjMsIFtyMTMsICMxMl0KLQotRU5FUkdZX0JFRzoKLQltb3YgICAgIHI5LCByNSwgbHNsICMxCi0JbGRyc2ggICByOSwgW3IxLCByOV0JCQkJCQkJCQkJCUAgdGVtcFVuZmlsdGVyZWQgPSB0aW1lU2lnbmFsW3RpZHhdOwotCi0JYWRkCQkJcjUsIHI1LCByMgkJCQkJCQkJCQkJCUAgdGlkeCA9IHRpZHggKyBjaEluY3JlbWVudDsKLQotCXNtdWx3YglyMywgcjE0LCByOQkJCQkJCQkJCQkJCUAgYWNjdTEgPSBMX21weV9scyhDb2VmZjEsIHRlbXBVbmZpbHRlcmVkKTsKLQlzbXVsbAkJcjAsIHI4LCByMTIsIHIxMQkJCQkJCQkJCUAgYWNjdTIgPSBmaXhtdWwoIENvZWZmMCwgc3RhdGVzMSApOwotCi0JbW92CQkJcjMsIHIzLCBsc2wgIzEKLQltb3YJCQlyOCwgcjgsIGxzbCAjMQotCi0Jc3ViCQkJcjAsIHIzLCByMTAJCQkJCQkJCQkJCQlAIGFjY3UzID0gYWNjdTEgLSBzdGF0ZXMwOwotCXN1YgkJCXI4LAlyMCwgcjgJCQkJCQkJCQkJCQlAIG91dCA9IGFjY3UzIC0gYWNjdTI7Ci0KLQltb3YJCSAgcjEwLCByMwkJCQkJCQkJCQkJCQkJQCBzdGF0ZXMwID0gYWNjdTE7Ci0JbW92CQkgIHIxMSwgcjgJCQkJCQkJCQkJCQkJCUAgc3RhdGVzMSA9IG91dDsKLQotCW11bAkJICByMywgcjksIHI5Ci0JbW92ICAgICByOCwgcjgsIGFzciAjMTYKLQotCWFkZAkJICByNCwgcjQsICMxCi0JYWRkICAgICByNiwgcjYsIHIzLCBhc3IgIzcKLQotCW11bAkJICByOSwgcjgsIHI4Ci0JbGRyCQkgIHIzLCBbcjEzLCAjMTJdCi0KLQlhZGQJCSAgcjcsIHI3LCByOSwgYXNyICM3Ci0KLQljbXAgICAgIHI0LCByMwotICBibHQgICAgIEVORVJHWV9CRUcKLQotCWxkcgkJICByMCwgW3IxMywgIzhdCi0JbGRyCQkgIHI4LCBbcjEzLCAjNF0KLQotRU5FUkdZX0VORDoKLQlhZGQJCSAgcjQsIHIwLCByOCwgbHNsICMyCi0KLQlzdHIgICAgIHI2LCBbcjQsICM3Ml0KLQlhZGQJCSAgcjgsIHI4LCAjMQotICBzdHIgICAgIHI3LCBbcjQsICMxMzZdCi0KLQljbXAJCSAgcjgsICM4Ci0JYmx0CQkgIEJMT0NLX0JFR0lOCi0KLUJMT0NLX0VORDoKLQlzdHIgICAgIHIxMCwgW3IwLCAjMTY4XQotICBzdHIgICAgIHIxMSwgW3IwLCAjMTcyXQotICBtb3YgICAgIHIwLCAjMQotCi0gIGFkZCAgICAgcjEzLCByMTMsICMyMAotCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi1oaVBhc3NDb2VmZjoKLQkud29yZCAweGJlYzhiNDM5Ci0JLndvcmQJMHg2MDlkNDk1MgotCi0JQEVORFAKLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjFkNWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9QcmVQb3N0TURDVF92NS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlQcmVQb3N0TURDVF92NS5zCi1ACi1ACUNvbnRlbnQ6CXByZW1kY3QgYW5kIHBvc3RtZGN0IGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVByZU1EQ1QKLQotUHJlTURDVDoKLQlzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLQlhZGQgICAgICAgICByOSwgcjAsIHIxLCBsc2wgIzIKLQlzdWIgICAgICAgICByMywgcjksICM4Ci0KLQltb3ZzICAgICAgICByMSwgcjEsIGFzciAjMgotCWJlcSAgICAgICAgIFByZU1EQ1RfRU5ECi0KLVByZU1EQ1RfTE9PUDoKLQlsZHIJCQkJCXI4LCBbcjJdLCAjNAotCWxkcgkJCQkJcjksIFtyMl0sICM0Ci0KLQlsZHJkCQkJCXI0LCBbcjBdCi0JbGRyZAkJCQlyNiwgW3IzXQotCi0Jc211bGwJCQkJcjE0LCByMTEsIHI0LCByOAkJCQkJQCBNVUxISUdIKHRyMSwgY29zYSkKLQlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjcsIHI4CQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKQotCi0Jc211bGwJCQkJcjE0LCByOCwgcjcsIHI5CQkJCQkJQCBNVUxISUdIKHRpMSwgc2luYSkKLQlzbXVsbAkJCQlyNywgcjEwLCByNCwgcjkJCQkJCQlAIE1VTEhJR0godHIxLCBzaW5hKQotCi0JYWRkCQkJCQlyMTEsIHIxMSwgcjgJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAKLQlzdWIJCQkJCXI3LCByMTIsIHIxMAkJCQkJCUAgTVVMSElHSCh0aTEsIGNvc2EpIC0gTVVMSElHSCh0cjEsIHNpbmEpCi0KLQlsZHIJCQkJCXI4LCBbcjJdLCAjNAotCWxkcgkJCQkJcjksIFtyMl0sICM0Ci0KLQlzbXVsbAkJCQlyMTQsIHI0LCByNiwgcjgJCQkJCQlAIE1VTEhJR0godHIyLCBjb3NhKQotCXNtdWxsICAgIAkJCXIxMCwgcjEyLCByNSwgcjgJCQkJCUAgTVVMSElHSCh0aTIsIGNvc2EpCi0KLQlzbXVsbAkJCQlyMTQsIHI4LCByNSwgcjkJCQkJCQlAIE1VTEhJR0godGkyLCBzaW5hKQotCXNtdWxsCQkJCXI1LCByMTAsIHI2LCByOQkJCQkJCUAgTVVMSElHSCh0cjIsIHNpbmEpCi0KLQlhZGQJCQkJCXI4LCByOCwgcjQKLQlzdWIJCQkJCXI5LCByMTIsIHIxMAotCi0JbW92CQkJCQlyNiwgcjExCi0KLQlzdHJkCQkJCXI2LCBbcjBdCi0Jc3RyZAkJCQlyOCwgW3IzXQotCi0Jc3VicwkJCQlyMSwgcjEsICMxCi0Jc3ViCQkJCQlyMywgcjMsICM4Ci0JYWRkIAkJCQlyMCwgcjAsICM4Ci0JYm5lCQkJCQlQcmVNRENUX0xPT1AKLQotUHJlTURDVF9FTkQ6Ci0JbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCUBFTkRQICBAIHxQcmVNRENUfAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVBvc3RNRENUCi0KLVBvc3RNRENUOgotCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQotCWFkZCAgICAgICAgIHI5LCByMCwgcjEsIGxzbCAjMgotCXN1YiAgICAgICAgIHIzLCByOSwgIzgKLQotCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyCi0JYmVxICAgICAgICAgUG9zdE1EQ1RfRU5ECi0KLVBvc3RNRENUX0xPT1A6Ci0JbGRyCQkJCQlyOCwgW3IyXSwgIzQKLQlsZHIJCQkJCXI5LCBbcjJdLCAjNAotCi0JbGRyZAkJCQlyNCwgW3IwXQotCWxkcmQJCQkJcjYsIFtyM10KLQotCXNtdWxsCQkJCXIxNCwgcjExLCByNCwgcjgJCQkJCUAgTVVMSElHSCh0cjEsIGNvc2EpCi0Jc211bGwgICAgCQkJcjEwLCByMTIsIHI1LCByOAkJCQkJQCBNVUxISUdIKHRpMSwgY29zYSkKLQotCXNtdWxsCQkJCXIxNCwgcjgsIHI1LCByOQkJCQkJCUAgTVVMSElHSCh0aTEsIHNpbmEpCi0Jc211bGwJCQkJcjUsIHIxMCwgcjQsIHI5CQkJCQkJQCBNVUxISUdIKHRyMSwgc2luYSkKLQotCWFkZAkJCQkJcjQsIHIxMSwgcjgJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSlACi0Jc3ViCQkJCQlyMTEsIHIxMCwgcjEyCQkJCQkJQCBNVUxISUdIKHRpMSwgY29zYSkgLSBNVUxISUdIKHRyMSwgc2luYSlACi0KLQlsZHIJCQkJCXI4LCBbcjJdLCAjNAkJCQkJCUAKLQlsZHIJCQkJCXI5LCBbcjJdLCAjNAotCi0Jc211bGwJCQkJcjE0LCByNSwgcjYsIHI4CQkJCQkJQCBNVUxISUdIKHRyMiwgY29zYSkKLQlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjcsIHI4CQkJCQlAIE1VTEhJR0godGkyLCBjb3NhKQotCi0Jc211bGwJCQkJcjE0LCByOCwgcjcsIHI5CQkJCQkJQCBNVUxISUdIKHRpMiwgc2luYSkKLQlzbXVsbAkJCQlyNywgcjEwLCByNiwgcjkJCQkJCQlAIE1VTEhJR0godHIyLCBzaW5hKQotCi0JYWRkCQkJCQlyNiwgcjgsIHI1CQkJCQkJCUAgTVVMSElHSChjb3NiLCB0cjIpICsgTVVMSElHSChzaW5iLCB0aTIpQAotCXN1YgkJCQkJcjUsIHIxMCwgcjEyCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRyMikgLSBNVUxISUdIKGNvc2IsIHRpMilACi0KLQltb3YJCQkJCXI3LCByMTEKLQotCXN0cmQJCQkJcjQsIFtyMF0KLQlzdHJkCQkJCXI2LCBbcjNdCi0KLQlzdWJzCQkJCXIxLCByMSwgIzEKLQlzdWIJCQkJCXIzLCByMywgIzgKLQlhZGQgCQkJCXIwLCByMCwgIzgKLQlibmUJCQkJCVBvc3RNRENUX0xPT1AKLQotUG9zdE1EQ1RfRU5EOgotCWxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KLQlARU5EUCAgQCB8UG9zdE1EQ1R8Ci0JLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTRmMzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucworKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi1ALyoKLUAgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLUAgKioKLUAgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1AICoqCi1AICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAgKioKLUAgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAgKi8KLQotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotQAlGaWxlOgkJUjRSOEZpcnN0X3Y1LnMKLUAKLUAJQ29udGVudDoJUmFkaXg4Rmlyc3QgYW5kIFJhZGl4NEZpcnN0IGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVJhZGl4NEZpcnN0Ci0KLVJhZGl4NEZpcnN0OgotCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQotCW1vdnMJCQkJcjEwLCByMQotCW1vdgkJCQkJcjExLCByMAotCWJlcQkJCQkJUmFkaXg0Rmlyc3RfRU5ECi0KLVJhZGl4NEZpcnN0X0xPT1A6Ci0JbGRyZAkJCQlyMCwgW3IxMV0KLQlsZHJkCQkJCXIyLCBbcjExLCAjOF0KLQlsZHJkCQkJCXI0LCBbcjExLCAjMTZdCi0JbGRyZAkJCQlyNiwgW3IxMSwgIzI0XQotCi0JYWRkCQkJCQlyOCwgcjAsIHIyCi0JYWRkCQkJCQlyOSwgcjEsIHIzCi0KLQlzdWIJCQkJCXIwLCByMCwgcjIKLQlzdWIJCQkJCXIxLCByMSwgcjMKLQotCWFkZAkJCQkJcjIsIHI0LCByNgotCWFkZAkJCQkJcjMsIHI1LCByNwotCi0Jc3ViCQkJCQlyNCwgcjQsIHI2Ci0Jc3ViCQkJCQlyNSwgcjUsIHI3Ci0KLQlhZGQJCQkJCXI2LCByOCwgcjIKLQlhZGQJCQkJCXI3LCByOSwgcjMKLQotCXN1YgkJCQkJcjgsIHI4LCByMgotCXN1YgkJCQkJcjksIHI5LCByMwotCi0JYWRkCQkJCQlyMiwgcjAsIHI1Ci0Jc3ViCQkJCQlyMywgcjEsIHI0Ci0KLQlzdWIJCQkJCXIwLCByMCwgcjUKLQlhZGQJCQkJCXIxLCByMSwgcjQKLQotCXN0cmQJCQkJcjYsIFtyMTFdCi0Jc3RyZAkJCQlyMiwgW3IxMSwgIzhdCi0Jc3RyZAkJCQlyOCwgW3IxMSwgIzE2XQotCXN0cmQJCQkJcjAsIFtyMTEsICMyNF0KLQotCXN1YnMJCQkJcjEwLCByMTAsICMxCi0JYWRkCQkJCQlyMTEsIHIxMSwgIzMyCi0JYm5lCQkJCQlSYWRpeDRGaXJzdF9MT09QCi0KLVJhZGl4NEZpcnN0X0VORDoKLQlsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0JQEVORFAgIEAgfFJhZGl4NEZpcnN0fAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVJhZGl4OEZpcnN0Ci0KLVJhZGl4OEZpcnN0OgotCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgICAgICBzcCwgc3AsICMweDI0Ci0KLQltb3YJCQkJICByMTIsIHIxCi0JbW92CQkJCQlyMTQsIHIwCi0JY21wCQkJCQlyMTIsICMwCi0JYmVxCQkJCQlSYWRpeDhGaXJzdF9FTkQKLQotUmFkaXg4Rmlyc3RfTE9PUDoKLQlsZHJkCQkJCXIwLCBbcjE0XQotCWxkcmQJCQkJcjIsIFtyMTQsICM4XQotCWxkcmQJCQkJcjQsIFtyMTQsICMxNl0KLQlsZHJkCQkJCXI2LCBbcjE0LCAjMjRdCi0KLQlhZGQJCQkJCXI4LCByMCwgcjIJCQkJCUAgcjAgPSBidWZbMF0gKyBidWZbMl1ACi0JYWRkCQkJCQlyOSwgcjEsIHIzCQkJCQlAIGkwID0gYnVmWzFdICsgYnVmWzNdQAotCi0Jc3ViCQkJCQlyMCwgcjAsIHIyCQkJCQlAIHIxID0gYnVmWzBdIC0gYnVmWzJdQAotCXN1YgkJCQkJcjEsIHIxLCByMwkJCQkJQCBpMSA9IGJ1ZlsxXSAtIGJ1ZlszXUAKLQotCWFkZAkJCQkJcjIsIHI0LCByNgkJCQkJQAlyMiA9IGJ1Zls0XSArIGJ1Zls2XUAKLQlhZGQJCQkJCXIzLCByNSwgcjcJCQkJCUAgaTIgPSBidWZbNV0gKyBidWZbN11ACi0KLQlzdWIJCQkJCXI0LCByNCwgcjYJCQkJCUAJcjMgPSBidWZbNF0gLSBidWZbNl1ACi0Jc3ViCQkJCQlyNSwgcjUsIHI3CQkJCQlAIGkzID0gYnVmWzVdIC0gYnVmWzddQAotCi0JYWRkCQkJCQlyNiwgcjgsIHIyCQkJCQlAIHI0ID0gKHIwICsgcjIpID4+IDFACi0JYWRkCQkJCQlyNywgcjksIHIzCQkJCQlAIGk0ID0gKGkwICsgaTIpID4+IDFACi0KLQlzdWIJCQkJCXI4LCByOCwgcjIJCQkJCUAJcjUgPSAocjAgLSByMikgPj4gMUAKLQlzdWIJCQkJCXI5LCByOSwgcjMJCQkJCUAgaTUgPSAoaTAgLSBpMikgPj4gMUAKLQotCXN1YgkJCQkJcjIsIHIwLCByNQkJCQkJQCByNiA9IChyMSAtIGkzKSA+PiAxQAotCWFkZAkJCQkJcjMsIHIxLCByNAkJCQkJQCBpNiA9IChpMSArIHIzKSA+PiAxQAotCi0JYWRkCQkJCQlyMCwgcjAsIHI1CQkJCQlAIHI3ID0gKHIxICsgaTMpID4+IDFACi0Jc3ViCQkJCQlyMSwgcjEsIHI0CQkJCQlAIGk3ID0gKGkxIC0gcjMpID4+IDFACi0KLQltb3YJCQkJCXI2LCByNiwgYXNyICMxCQkJQAotCW1vdgkJCQkJcjcsIHI3LCBhc3IgIzEJCQlACi0KLQltb3YJCQkJCXI4LCByOCwgYXNyICMxCi0JbW92CQkJCQlyOSwgcjksIGFzciAjMQotCi0JbW92CQkJCQlyMiwgcjIsIGFzciAjMQotCW1vdgkJCQkJcjMsIHIzLCBhc3IgIzEKLQotCW1vdgkJCQkJcjAsIHIwLCBhc3IgIzEKLQltb3YJCQkJCXIxLCByMSwgYXNyICMxCi0KLQlzdHIJCQkJCXI2LCBbc3BdCi0Jc3RyCQkJCQlyNywgW3NwLCAjNF0KLQotCXN0cgkJCQkJcjgsIFtzcCwgIzhdCi0Jc3RyCQkJCQlyOSwgW3NwLCAjMTJdCi0KLQlzdHIJCQkJCXIyLCBbc3AsICMxNl0KLQlzdHIJCQkJCXIzLCBbc3AsICMyMF0KLQotCXN0cgkJCQkJcjAsIFtzcCwgIzI0XQotCXN0cgkJCQkJcjEsIFtzcCwgIzI4XQotCi0JbGRyZAkJCQlyMiwgW3IxNCwgIzMyXQotCWxkcmQJCQkJcjQsIFtyMTQsICM0MF0KLQlsZHJkCQkJCXI2LCBbcjE0LCAjNDhdCi0JbGRyZAkJCQlyOCwgW3IxNCwgIzU2XQotCi0JYWRkCQkJCQlyMCwgcjIsIHI0CQkJCQlAIHIwID0gYnVmWyA4XSArIGJ1ZlsxMF1ACi0JYWRkCQkJCQlyMSwgcjMsIHI1CQkJCQlAIGkwID0gYnVmWyA5XSArIGJ1ZlsxMV1ACi0KLQlzdWIJCQkJCXIyLCByMiwgcjQJCQkJCUAgcjEgPSBidWZbIDhdIC0gYnVmWzEwXUAKLQlzdWIJCQkJCXIzLCByMywgcjUJCQkJCUAgaTEgPSBidWZbIDldIC0gYnVmWzExXUAKLQotCWFkZAkJCQkJcjQsIHI2LCByOAkJCQkJQCByMiA9IGJ1ZlsxMl0gKyBidWZbMTRdQAotCWFkZAkJCQkJcjUsIHI3LCByOQkJCQkJQCBpMiA9IGJ1ZlsxM10gKyBidWZbMTVdQAotCi0Jc3ViCQkJCQlyNiwgcjYsIHI4CQkJCQlAIHIzID0gYnVmWzEyXSAtIGJ1ZlsxNF1ACi0Jc3ViCQkJCQlyNywgcjcsIHI5CQkJCQlACWkzID0gYnVmWzEzXSAtIGJ1ZlsxNV1ACi0KLQlhZGQJCQkJCXI4LCByMCwgcjQJCQkJCUAgdDAgPSAocjAgKyByMikKLQlhZGQJCQkJCXI5LCByMSwgcjUJCQkJCUAgdDEgPSAoaTAgKyBpMikKLQotCXN1YgkJCQkJcjAsIHIwLCByNAkJCQkJQCB0MiA9IChyMCAtIHIyKQotCXN1YgkJCQkJcjEsIHIxLCByNQkJCQkJQCB0MyA9IChpMCAtIGkyKQotCi0JbW92CQkJCQlyOCwgcjgsIGFzciAjMQotCWxkcgkJCQkJcjQsIFtzcF0KLQotCW1vdgkJCQkJcjksIHI5LCBhc3IgIzEKLQlsZHIJCQkJCXI1LCBbc3AsICM0XQotCi0JbW92CQkJCQlyMCwgcjAsIGFzciAjMQotCW1vdgkJCQkJcjEsIHIxLCBhc3IgIzEKLQotCWFkZAkJCQkJcjEwLCByNCwgcjgJCQkJCUAgYnVmWyAwXSA9IHI0ICsgdDBACi0JYWRkCQkJCQlyMTEsIHI1LCByOQkJCQkJQCBidWZbIDFdID0gaTQgKyB0MUAKLQotCXN1YgkJCQkJcjQsICByNCwgcjgJCQkJCUAgYnVmWyA4XSA9IHI0IC0gdDBACi0Jc3ViCQkJCQlyNSwgIHI1LCByOQkJCQkJQAlidWZbIDldID0gaTQgLSB0MUAKLQotIAlzdHJkCQkJCXIxMCwgW3IxNF0KLSAJc3RyZAkJCQlyNCwgIFtyMTQsICMzMl0KLQotIAlsZHIJCQkJCXIxMCwgW3NwLCAjOF0KLSAJbGRyCQkJCQlyMTEsIFtzcCwgIzEyXQotCi0gCWFkZAkJCQkJcjQsIHIxMCwgcjEJCQkJCUAgYnVmWyA0XSA9IHI1ICsgdDNACi0gCXN1YgkJCQkJcjUsIHIxMSwgcjAJCQkJCUAJYnVmWyA1XSA9IGk1IC0gdDJACi0KLSAJc3ViCQkJCQlyMTAsIHIxMCwgcjEJCQkJQCBidWZbMTJdID0gcjUgLSB0M0AKLSAJYWRkCQkJCQlyMTEsIHIxMSwgcjAJCQkJQCBidWZbMTNdID0gaTUgKyB0MkAKLQotIAlzdHJkCQkJCXI0LCAgW3IxNCwgIzE2XQotIAlzdHJkCQkJCXIxMCwgW3IxNCwgIzQ4XQotCi0gCXN1YgkJCQkJcjAsIHIyLCByNwkJCQkJQCByMCA9IHIxIC0gaTNACi0gCWFkZAkJCQkJcjEsIHIzLCByNgkJCQkJQCBpMCA9IGkxICsgcjNACi0KLSAgbGRyCQkJCQlyMTEsIERBVEFUYWIKLQotIAlhZGQJCQkJCXIyLCByMiwgcjcJCQkJCUAgcjIgPSByMSArIGkzQAotIAlzdWIJCQkJCXIzLCByMywgcjYJCQkJCUAgaTIgPSBpMSAtIHIzQAotCi0Jc3ViCQkJCQlyNCwgcjAsIHIxCQkJCQlAIHIwIC0gaTAKLQlhZGQJCQkJCXI1LCByMCwgcjEJCQkJCUAgcjAgKyBpMAotCi0Jc3ViCQkJCQlyMCwgcjIsIHIzCQkJCQlAIHIyIC0gaTIKLQlhZGQJCQkJCXIxLCByMiwgcjMJCQkJCUAgcjIgKyBpMgotCi0Jc211bGwJCQkJcjgsIHI2LCByNCwgcjExCi0Jc211bGwJCQkJcjksIHI3LCByNSwgcjExCi0KLQlsZHIJCQkJCXIyLCBbc3AsICMxNl0KLQlsZHIJCQkJCXIzLCBbc3AsICMyMF0KLQotCXNtdWxsCQkJCXI4LCByNCwgcjAsIHIxMQotCXNtdWxsCQkJCXI5LCByNSwgcjEsIHIxMQotCi0JbGRyCQkJCQlyMTAsIFtzcCwgIzI0XQotCWxkcgkJCQkJcjExLCBbc3AsICMyOF0KLQotCXN1YgkJCQkJcjgsIHIyLCByNgotCXN1YgkJCQkJcjksIHIzLCByNwotCi0JYWRkCQkJCQlyMiwgcjIsIHI2Ci0JYWRkCQkJCQlyMywgcjMsIHI3Ci0KLQlhZGQJCQkJCXI2LCByMTAsIHI1Ci0Jc3ViCQkJCQlyNywgcjExLCByNAotCi0Jc3ViCQkJCQlyMCwgcjEwLCByNQotCWFkZAkJCQkJcjEsIHIxMSwgcjQKLQotCXN0cmQJCQkJcjYsIFtyMTQsICM4XQotCXN0cmQJCQkJcjgsIFtyMTQsICMyNF0KLQlzdHJkCQkJCXIwLCBbcjE0LCAjNDBdCi0Jc3RyZAkJCQlyMiwgW3IxNCwgIzU2XQotCi0Jc3VicwkJCQlyMTIsIHIxMiwgIzEKLQlhZGQJCQkJCXIxNCwgcjE0LCAjNjQKLQotCWJuZQkJCQkJUmFkaXg4Rmlyc3RfTE9PUAotCi1SYWRpeDhGaXJzdF9FTkQ6Ci0JYWRkICAgICAgICAgc3AsIHNwLCAjMHgyNAotCWxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KLQotREFUQVRhYjoKLQkud29yZCAgICAgICAweDVhODI3OTlhCi0KLQlARU5EUCAgQCB8UmFkaXg4Rmlyc3R8Ci0JLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUmFkaXg0RkZUX3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWI5NjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi1ALyoKLUAgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLUAgKioKLUAgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1AICoqCi1AICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAgKioKLUAgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAgKi8KLQotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotQAlGaWxlOgkJUmFkaXg0RkZUX3Y1LnMKLUAKLUAJQ29udGVudDoJUmFkaXg0RkZUIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCS5zZWN0aW9uIC50ZXh0Ci0JLmdsb2JhbAlSYWRpeDRGRlQKLQotUmFkaXg0RkZUOgotCXN0bWRiICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0Jc3ViICAgICAgIHNwLCBzcCwgIzMyCi0KLQltb3YJCQlyMSwgcjEsIGFzciAjMgotCWNtcCAgICAgcjEsICMwCi0JYmVxICAgICBSYWRpeDRGRlRfRU5ECi0KLVJhZGl4NEZGVF9MT09QMToKLQltb3YgICAgIHIxNCwgcjAgICAgICAgICAgCQkJCQkJCUAgeHB0ciA9IGJ1ZkAKLQltb3YJCXIxMCwgcjEgCQkJCQkJCQkJCQkJQCBpID0gbnVtQAotCW1vdiAgICAgcjksIHIyLCBsc2wgIzMgIAkJCQkJCQlAIHN0ZXAgPSAyKmJnbkAKLQljbXAgICAgIHIxMCwgIzAKLQlzdHIJCXIwLCBbc3BdCi0Jc3RyCQlyMSwgW3NwLCAjNF0KLQlzdHIJCXIyLCBbc3AsICM4XQotCXN0cgkJcjMsIFtzcCwgIzEyXQotCWJlcSAgICAgUmFkaXg0RkZUX0xPT1AxX0VORAotCi1SYWRpeDRGRlRfTE9PUDI6Ci0JbW92ICAgICByMTIsIHIzCQkJCSAgICAgICAgCQkJCUAgY3NwdHIgPSB0d2lkVGFiQAotCW1vdgkJcjExLCByMgkJCQkJCQkJCQkJCUAgaiA9IGJnbgotCWNtcCAgICAgcjExLCAjMAotCXN0cgkJcjEwLCBbc3AsICMxNl0KLQliZXEgICAgIFJhZGl4NEZGVF9MT09QMl9FTkQKLQotUmFkaXg0RkZUX0xPT1AzOgotCXN0cgkJCXIxMSwgW3NwLCAjMjBdCi0KLQlsZHJkCQlyMCwgW3IxNCwgIzBdCQkJCQkJCQkJQCByMCA9IHhwdHJbMF1AIHIxID0geHB0clsxXUAKLQlhZGQJCQlyMTQsIHIxNCwgcjkgCSAJCQkJCQkJCUAgeHB0ciArPSBzdGVwQAotCi0JbGRyZAkJcjEwLAlbcjE0LCAjMF0gIAkJCQkJIAkJCUAgcjIgPSB4cHRyWzBdQCByMyA9IHhwdHJbMV1ACi0JbGRyCQkJcjgsIFtyMTJdLCAjNAkJCQkJCQkJCUAgY29zeHNpbnggPSBjc3B0clswXUAKLQotCXNtdWx3dAlyNCwgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQwKQotCXNtdWx3dAlyMywgcjExLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQxKQotCi0Jc21sYXdiCXIyLCByMTEsIHI4LCByNAkJCQkJCQkJQCByMiA9IExfbXB5X3d4KGNvc3gsIHQwKSArIExfbXB5X3d4KHNpbngsIHQxKUAKLQlzbXVsd2IJcjUsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChzaW54LCB0MCkKLQotCW1vdgkJCXIxMCwgcjAsIGFzciAjMgkJCQkJCQkJQCB0MCA9IHIwID4+IDJACi0JbW92CQkJcjExLCByMSwgYXNyICMyCQkJCQkJCQlACXQxID0gcjEgPj4gMkAKLQotCXN1YgkJCXIzLCByMywgcjUJCQkJCQkJCQkJQCByMyA9IExfbXB5X3d4KGNvc3gsIHQxKSAtIExfbXB5X3d4KHNpbngsIHQwKUAKLQlhZGQgICAgIHIxNCwgcjE0LCByOSAJIAkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACi0KLQlzdWIJCQlyMCwgcjEwLCByMgkJCQkJCQkJCQlAIHIwID0gdDAgLSByMkAKLQlzdWIJCQlyMSwgcjExLCByMwkJCQkJCQkJCSAgQCByMSA9IHQxIC0gcjNACi0KLQlhZGQJCQlyMiwgcjEwLCByMgkJCQkJCQkJCQlAIHIyID0gdDAgKyByMkAKLQlhZGQJCQlyMywgcjExLCByMwkJCQkJCQkJCQlAIHIzID0gdDEgKyByM0AKLQotCXN0cgkJCXIyLCBbc3AsICMyNF0KLQlzdHIJCQlyMywgW3NwLCAjMjhdCi0KLQlsZHJkCQlyMTAsIFtyMTQsICMwXQkJCQkJCQkJQCByNCA9IHhwdHJbMF1AIHI1ID0geHB0clsxXUAKLQlsZHIJCQlyOCwgW3IxMl0sICM0CQkJCQkJCQkJQCBjb3N4c2lueCA9IGNzcHRyWzFdQAotCi0Jc211bHd0CXI2LCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDApCi0Jc211bHd0CXI1LCByMTEsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDEpCi0KLQlzbWxhd2IJcjQsIHIxMSwgcjgsIHI2CQkJCQkJCQlAIHI0ID0gTF9tcHlfd3goY29zeCwgdDApICsgTF9tcHlfd3goc2lueCwgdDEpQAotCXNtdWx3YglyNywgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KHNpbngsIHQwKQotCi0JYWRkCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACi0Jc3ViCQkJcjUsIHI1LCByNwkJCQkJCQkJCQlAIHI1ID0gTF9tcHlfd3goY29zeCwgdDEpIC0gTF9tcHlfd3goc2lueCwgdDApQAotCi0JbGRyZAkJcjEwLCBbcjE0XQkJCQkJCQkJCQlAIHI2ID0geHB0clswXUAgcjcgPSB4cHRyWzFdQAotCWxkcgkJCXI4LCBbcjEyXSwgIzQJCQkJCQkJCQlAIGNvc3hzaW54ID0gY3NwdHJbMV1ACi0KLQlzbXVsd3QJcjIsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MCkKLQlzbXVsd3QJcjcsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkKLQotCXNtbGF3YglyNiwgcjExLCByOCwgcjIJCQkJCQkJCUAgcjQgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlACi0Jc211bHdiCXIzLCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goc2lueCwgdDApCi0KLQltb3YJCQlyMTAsIHI0CQkJCQkJCQkJCQkJQCB0MCA9IHI0QAotCW1vdgkJCXIxMSwgcjUJCQkJCQkJCQkJCQlAIHQxID0gcjVACi0KLQlzdWIJCQlyNywgcjcsIHIzCQkJCQkJCQkJCUAgcjUgPSBMX21weV93eChjb3N4LCB0MSkgLSBMX21weV93eChzaW54LCB0MClACi0KLQotCWFkZAkJCXI0LCAgcjEwLCByNgkJCQkJCQkJCUAJcjQgPSB0MCArIHI2QAotCXN1YgkJCXI1LCByNywgcjExCQkJCQkJCQkJCUAgcjUgPSByNyAtIHQxQAotCi0Jc3ViCQkJcjYsIHIxMCwgcjYJCQkJCQkJCQkJQCByNiA9IHQwIC0gcjZACi0JYWRkCQkJcjcsIHI3LCByMTEJCQkJCQkJCQkJQCByNyA9IHI3ICsgdDFACi0KLQlsZHIJCQlyMiwgW3NwLCAjMjRdCi0JbGRyCQkJcjMsIFtzcCwgIzI4XQotCi0JYWRkCQkJcjEwLCByMCwgcjUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgKyByNUAKLQlhZGQJCQlyMTEsIHIxLCByNgkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMSArIHI2Ci0KLQlzdHJkCQlyMTAsIFtyMTRdCi0Jc3ViCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0KLQlzdWIJCQlyMTAsIHIyLCByNAkJCQkJCQkJCQlACXhwdHJbMF0gPSByMiAtIHI0QAotCXN1YgkJCXIxMSwgcjMsIHI3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzIC0gcjdACi0KLQlzdHJkCQlyMTAsIFtyMTRdCi0Jc3ViCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0KLQlzdWIJCQlyMTAsIHIwLCByNQkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMCAtIHI1QAotCXN1YgkJCXIxMSwgcjEsIHI2CQkJCQkJCQkJCUAgeHB0clswXSA9IHIxIC0gcjYKLQotCXN0cmQJCXIxMCwgW3IxNF0KLQlzdWIJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKLQotCWFkZAkJCXIxMCwgcjIsIHI0CQkJCQkJCQkJCUAJeHB0clswXSA9IHIyIC0gcjRACi0JYWRkCQkJcjExLCByMywgcjcJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjMgLSByN0AKLQotCXN0cmQJCXIxMCwgW3IxNF0KLQlhZGQJCQlyMTQsIHIxNCwgIzgJCQkJCQkJCQlAIHhwdHIgKz0gMkAKLQotCWxkcgkJCXIxMSwgW3NwLCAjMjBdCi0Jc3VicwkJcjExLCByMTEsICMxCi0JYm5lCQkJUmFkaXg0RkZUX0xPT1AzCi0KLVJhZGl4NEZGVF9MT09QMl9FTkQ6Ci0JbGRyCQkJcjEwLCBbc3AsICMxNl0KLQlsZHIJCQlyMywgW3NwLCAjMTJdCi0JbGRyCQkJcjIsIFtzcCwgIzhdCi0JcnNiCQkJcjgsIHI5LCByOSwgbHNsICMyCi0Jc3ViCQkJcjEwLCByMTAsICMxCi0JYWRkCQkJcjE0LCByMTQsIHI4Ci0JY21wCQkJcjEwLCAjMAotCWJoaSAgICAgUmFkaXg0RkZUX0xPT1AyCi0KLVJhZGl4NEZGVF9MT09QMV9FTkQ6Ci0JbGRyICAgICByMCwgW3NwXQotCWxkcgkJcjEsIFtzcCwgIzRdCi0JYWRkICAgICByMywgcjMsIHI4LCBhc3IgIzEKLQltb3YgICAgIHIyLCByMiwgbHNsICMyCi0JbW92cyAgICByMSwgcjEsIGFzciAjMgotCWJuZSAgICAgUmFkaXg0RkZUX0xPT1AxCi0KLVJhZGl4NEZGVF9FTkQ6Ci0JYWRkICAgICBzcCwgc3AsICMzMgotCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0JQEVORFAgIEAgfFJhZGl4NEZGVHwKLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODlmNmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9iYW5kX25yZ192NS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQliYW5kX25yZ192NS5zCi1ACi1ACUNvbnRlbnQ6CUNhbGNCYW5kRW5lcmd5IGFuZCBDYWxjQmFuZEVuZXJneU1TIGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0JLnNlY3Rpb24gLnRleHQKLQotCS5nbG9iYWwJQ2FsY0JhbmRFbmVyZ3kKLQotQ2FsY0JhbmRFbmVyZ3k6Ci0Jc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgbW92ICAgICByMiwgcjIsIGxzbCAjMTYKLQlsZHIgICAgIHIxMiwgW3IxMywgIzM2XQotCW1vdgkJCXI5LCAjMAotICBtb3YgICAgIHI1LCByMiwgYXNyICMxNgotCW1vdgkJCXI0LCAjMAotICBjbXAgICAgIHI1LCAjMAotCWJsZSAgICAgTDIxMgotCi1MMjI6Ci0gIG1vdiAgICAgcjIsIHI0LCBsc2wgIzEKLSAgbGRyc2ggICByMTAsIFtyMSwgcjJdCi0gIGFkZCAgICAgcjExLCByMSwgcjIKLSAgbGRyc2ggICByMiwgW3IxMSwgIzJdCi0JbW92ICAgICByMTQsICMwCi0gIGNtcCAgICAgcjEwLCByMgotICBiZ2UgICAgIEwyOAotCi1MMjM6Ci0JbGRyICAgICByMTEsIFtyMCwgK3IxMCwgbHNsICMyXQotICBhZGQgICAgIHIxMCwgcjEwLCAjMQotCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQotCXNtdWxsICAgcjExLCByNywgcjExLCByMTEKLQlhZGQgICAgIHIxMCwgcjEwLCAjMQotCXNtdWxsCSAgcjYsIHI4LCByNiwgcjYKLQlsZHIgICAgIHIxMSwgW3IwLCArcjEwLCBsc2wgIzJdCi0JcWFkZAkgIHIxNCwgcjE0LCByNwotCWFkZCAgICAgcjEwLCByMTAsICMxCi0Jc211bGwJICByMTEsIHI3LCByMTEsIHIxMQotCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQotCXFhZGQJICByMTQsIHIxNCwgcjgKLQlzbXVsbAkgIHI2LCByOCwgcjYsIHI2Ci0gIGFkZCAgICAgcjEwLCByMTAsICMxCi0JcWFkZAkgIHIxNCwgcjE0LCByNwotCWNtcCAgICAgcjEwLCByMgotCXFhZGQJICByMTQsIHIxNCwgcjgKLQlibHQgICAgIEwyMwotCi1MMjg6Ci0JcWFkZAkgIHIxNCwgcjE0LCByMTQKLQlzdHIgICAgIHIxNCwgW3IzLCArcjQsIGxzbCAjMl0KLQlhZGQgICAgIHI0LCByNCwgIzEKLQlxYWRkCSAgcjksIHI5LCByMTQKLQljbXAgICAgIHI0LCByNQotCi0gIGJsdCAgICAgTDIyCi0KLUwyMTI6Ci0Jc3RyICAgICByOSwgW3IxMiwgIzBdCi0JbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLQlARU5EUCAgOyB8Q2FsY0JhbmRFbmVyZ3l8Ci0KLQkuZ2xvYmFsCUNhbGNCYW5kRW5lcmd5TVMKLQotQ2FsY0JhbmRFbmVyZ3lNUzoKLQlzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgIHIxMywgcjEzLCAjMjQKLQotCW1vdiAgICAgcjEyLCAjMAotICBtb3YgICAgIHIzLCByMywgbHNsICMxNgotICBtb3YgICAgIHIxNCwgIzAKLQltb3YgICAgIHIzLCByMywgYXNyICMxNgotCWNtcCAgICAgcjMsICMwCi0JbW92CQkgIHI0LCAjMAotICBibGUgICAgIEwzMTUKLQotTDMyOgotCW1vdgkJICByNSwgcjQsIGxzbCAjMQotCW1vdgkJICByNiwgIzAKLQlsZHJzaCAgIHIxMCwgW3IyLCByNV0KLQlhZGQgICAgIHI1LCByMiwgcjUKLQltb3YJCSAgcjcsICMwCi0JbGRyc2gJICByMTEsIFtyNSwgIzJdCi0JY21wICAgICByMTAsIHIxMQotICBiZ2UgICAgIEwzOQotCi0Jc3RyCQkgIHIzLCBbcjEzLCAjNF0KLQlzdHIJCSAgcjQsIFtyMTMsICM4XQotCXN0cgkJICByMTIsIFtyMTMsICMxMl0KLQlzdHIJCSAgcjE0LCBbcjEzLCAjMTZdCi0KLUwzMzoKLQlsZHIgICAgIHI4LCBbcjAsICtyMTAsIGxzbCAjMl0KLQlsZHIgICAgIHI5LCBbcjEsICtyMTAsIGxzbCAjMl0KLQltb3YJCSAgcjgsIHI4LCBhc3IgIzEKLQlhZGQJCSAgcjEwLCByMTAsICMxCi0JbW92CQkgIHI5LCByOSwgYXNyICMxCi0KLQlsZHIgICAgIHIxMiwgW3IwLCArcjEwLCBsc2wgIzJdCi0JYWRkCQkgIHI1LCByOCwgcjkKLQlsZHIgICAgIHIxNCwgW3IxLCArcjEwLCBsc2wgIzJdCi0Jc3ViCQkgIHI4LCByOCwgcjkKLQotCXNtdWxsICAgcjUsIHIzLCByNSwgcjUKLQltb3YJCSAgcjEyLCByMTIsIGFzciAjMQotCXNtdWxsICAgcjgsIHI0LCByOCwgcjgKLQltb3YJCSAgcjE0LCByMTQsIGFzciAjMQotCi0JcWFkZAkgIHI2LCByNiwgcjMKLQlhZGQJCSAgcjUsIHIxMiwgcjE0Ci0JcWFkZAkgIHI3LCByNywgcjQKLQlzdWIJCSAgcjgsIHIxMiwgcjE0Ci0KLQlzbXVsbCAgIHI1LCByMywgcjUsIHI1Ci0JYWRkCQkgIHIxMCwgcjEwLCAjMQotCXNtdWxsICAgcjgsIHI0LCByOCwgcjgKLQotCXFhZGQJICByNiwgcjYsIHIzCi0JcWFkZAkgIHI3LCByNywgcjQKLQotCWxkciAgICAgcjgsIFtyMCwgK3IxMCwgbHNsICMyXQotCWxkciAgICAgcjksIFtyMSwgK3IxMCwgbHNsICMyXQotCW1vdgkJICByOCwgcjgsIGFzciAjMQotCWFkZAkJICByMTAsIHIxMCwgIzEKLQltb3YJCSAgcjksIHI5LCBhc3IgIzEKLQotCWxkciAgICAgcjEyLCBbcjAsICtyMTAsIGxzbCAjMl0KLQlhZGQJCSAgcjUsIHI4LCByOQotCWxkciAgICAgcjE0LCBbcjEsICtyMTAsIGxzbCAjMl0KLQlzdWIJCSAgcjgsIHI4LCByOQotCi0Jc211bGwgICByNSwgcjMsIHI1LCByNQotCW1vdgkJICByMTIsIHIxMiwgYXNyICMxCi0Jc211bGwgICByOCwgcjQsIHI4LCByOAotCW1vdgkJICByMTQsIHIxNCwgYXNyICMxCi0KLQlxYWRkCSAgcjYsIHI2LCByMwotCWFkZAkJICByNSwgcjEyLCByMTQKLQlxYWRkCSAgcjcsIHI3LCByNAotCXN1YgkJICByOCwgcjEyLCByMTQKLQotCXNtdWxsICAgcjUsIHIzLCByNSwgcjUKLQlhZGQJCSAgcjEwLCByMTAsICMxCi0Jc211bGwgICByOCwgcjQsIHI4LCByOAotCi0JcWFkZAkgIHI2LCByNiwgcjMKLQlxYWRkCSAgcjcsIHI3LCByNAotCi0JY21wICAgICByMTAsIHIxMQotCi0JYmx0CQkgIEwzMwotCi0JbGRyCQkgIHIzLCBbcjEzLCAjNF0KLQlsZHIJCSAgcjQsIFtyMTMsICM4XQotCWxkcgkJICByMTIsIFtyMTMsICMxMl0KLQlsZHIJCSAgcjE0LCBbcjEzLCAjMTZdCi1MMzk6Ci0JcWFkZAkgIHI2LCByNiwgcjYKLQlxYWRkCSAgcjcsIHI3LCByNwotCi0JbGRyCQkgIHI4LCBbcjEzLCAjNjBdCi0JbGRyCQkgIHI5LCBbcjEzLCAjNjhdCi0KLQlxYWRkCSAgcjEyLCByMTIsIHI2Ci0JcWFkZAkgIHIxNCwgcjE0LCByNwotCi0Jc3RyCQkgIHI2LCBbcjgsICtyNCwgbHNsICMyXQotCXN0ciAgICAgcjcsIFtyOSwgK3I0LCBsc2wgIzJdCi0KLQlhZGQJCSAgcjQsIHI0LCAjMQotCWNtcAkJICByNCwgcjMKLQlibHQgICAgIEwzMgotCi1MMzE1OgotCWxkcgkJICByOCwgW3IxMywgIzY0XQotCWxkcgkJICByOSwgW3IxMywgIzcyXQotCXN0cgkJICByMTIsIFtyOCwgIzBdCi0Jc3RyCQkgIHIxNCwgW3I5LCAjMF0KLQotCWFkZCAgICAgcjEzLCByMTMsICMyNAotCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCUBFTkRQICA7IHxDYWxjQmFuZEVuZXJneU1TfAotCi0JLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1ByZVBvc3RNRENUX3Y3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2Yjg4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi1ALyoKLUAgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLUAgKioKLUAgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1AICoqCi1AICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAgKioKLUAgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAgKi8KLQotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotQAlGaWxlOgkJUHJlUG9zdE1EQ1RfdjcucwotQAotQAlDb250ZW50OglwcmVtZGN0IGFuZCBwb3N0bWRjdCBmdW5jdGlvbiBhcm12NyBhc3NlbWJsZQotQAotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLQotCS5zZWN0aW9uIC50ZXh0Ci0JLmdsb2JhbAlQcmVNRENUCi0JLmZuc3RhcnQKLQotUHJlTURDVDoKLQlzdG1kYiAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCS5zYXZlCSAge3I0IC0gcjExLCBscn0KLQlmc3RtZmRkICAgc3AhLCB7ZDggLSBkMTV9Ci0JLnZzYXZlCSAge2Q4IC0gZDE1fQotCi0JYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyCi0Jc3ViICAgICAgICAgcjMsIHI5LCAjMzIKLQotCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyCi0JYmVxICAgICAgICAgUHJlTURDVF9FTkQKLQotUHJlTURDVF9MT09QOgotCVZMRDQuSTMyCQkJe2QwLCBkMiwgZDQsIGQ2fSwgW3IyXSEJCQkJQCBjb3NhID0gKmNzcHRyKytAIHNpbmEgPSAqY3NwdHIrK0AKLQlWTEQ0LkkzMgkJCXtkMSwgZDMsIGQ1LCBkN30sIFtyMl0hCQkJCUAgY29zYiA9ICpjc3B0cisrQCBzaW5iID0gKmNzcHRyKytACi0JVkxEMi5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0JCQlAIHRyMSA9ICooYnVmMCArIDApQCB0aTIgPSAqKGJ1ZjAgKyAxKUAKLQlWTEQyLkkzMgkJCXtkMTMsIGQxNX0sIFtyM10hCQkJCQlAIHRyMiA9ICooYnVmMSAtIDEpQCB0aTEgPSAqKGJ1ZjEgKyAwKUAKLQlWTEQyLkkzMgkJCXtkMTIsIGQxNH0sIFtyM10hCQkJCQlAIHRyMiA9ICooYnVmMSAtIDEpQCB0aTEgPSAqKGJ1ZjEgKyAwKUAKLQotCVZSRVY2NC4zMgkJCVE4LCBRNwotCVZSRVY2NC4zMgkJCVE5LCBRNgotCi0KLQlWUURNVUxILlMzMgkJUTEwLCBRMCwgUTQJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjEpCi0JVlFETVVMSC5TMzIJCVExMSwgUTEsIFE4CQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdGkxKQotCVZRRE1VTEguUzMyCQlRMTIsIFEwLCBROAkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRpMSkKLQlWUURNVUxILlMzMgkJUTEzLCBRMSwgUTQJCQkJCQkJCUAgTVVMSElHSChzaW5hLCB0cjEpCi0KLQlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAKLQlWU1VCLlMzMgkJCVExLCBRMTIsIFExMwkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdGkxKSAtIE1VTEhJR0goc2luYSwgdHIxKUAKLQotCVZTVDIuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXSEKLQlzdWIJCQkJCQlyMywgcjMsICMzMgotCi0JVlFETVVMSC5TMzIJCVExMCwgUTIsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0cjIpCi0JVlFETVVMSC5TMzIJCVExMSwgUTMsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0aTIpCi0JVlFETVVMSC5TMzIJCVExMiwgUTIsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0aTIpCi0JVlFETVVMSC5TMzIJCVExMywgUTMsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0cjIpCi0KLQlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjIpICsgTVVMSElHSChzaW5hLCB0aTIpQAotCVZTVUIuUzMyCQkJUTEsIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRpMikgLSBNVUxISUdIKHNpbmEsIHRyMilACi0KLQlWUkVWNjQuMzIJCQlRMywgUTEKLQlWUkVWNjQuMzIJCQlRMiwgUTAKLQotCVZTVDIuSTMyCQl7ZDUsIGQ3fSwgW3IzXSEKLQlWU1QyLkkzMgkJe2Q0LCBkNn0sIFtyM10hCi0KLQlzdWJzICAgICAJCXIxLCByMSwgIzQKLQlzdWIJCSAgCQlyMywgcjMsICM2NAotCWJuZSAgICAgICAJUHJlTURDVF9MT09QCi0KLVByZU1EQ1RfRU5EOgotCWZsZG1mZGQgICBzcCEsIHtkOCAtIGQxNX0KLQlsZG1pYSAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCUBFTkRQICBAIHxQcmVNRENUfAotCS5mbmVuZAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVBvc3RNRENUCi0JLmZuc3RhcnQKLQotUG9zdE1EQ1Q6Ci0Jc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQkuc2F2ZQkgIHtyNCAtIHIxMSwgbHJ9Ci0JZnN0bWZkZCAgIHNwISwge2Q4IC0gZDE1fQotCS52c2F2ZQkgIHtkOCAtIGQxNX0KLQotCWFkZCAgICAgICAgIHI5LCByMCwgcjEsIGxzbCAjMgotCXN1YiAgICAgICAgIHIzLCByOSwgIzMyCi0KLQltb3ZzICAgICAgICByMSwgcjEsIGFzciAjMgotCWJlcSAgICAgICAgIFBvc3RNRENUX0VORAotCi1Qb3N0TURDVF9MT09QOgotCVZMRDQuSTMyCQkJe2QwLCBkMiwgZDQsIGQ2fSwgW3IyXSEJCQkJQCBjb3NhID0gKmNzcHRyKytAIHNpbmEgPSAqY3NwdHIrK0AKLQlWTEQ0LkkzMgkJCXtkMSwgZDMsIGQ1LCBkN30sIFtyMl0hCQkJCUAgY29zYiA9ICpjc3B0cisrQCBzaW5iID0gKmNzcHRyKytACi0JVkxEMi5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0JCQlAIHRyMSA9ICooemJ1ZjEgKyAwKUAgdGkxID0gKih6YnVmMSArIDEpQAotCVZMRDIuSTMyCQkJe2QxMywgZDE1fSwgW3IzXSEJCQkJCQkJQCB0cjIgPSAqKHpidWYyIC0gMSlAIHRpMiA9ICooemJ1ZjIgKyAwKUAKLQlWTEQyLkkzMgkJCXtkMTIsIGQxNH0sIFtyM10hCQkJCQkJCUAgdHIyID0gKih6YnVmMiAtIDEpQCB0aTIgPSAqKHpidWYyICsgMClACi0KLQlWUkVWNjQuMzIJCQlROCwgUTYKLQlWUkVWNjQuMzIJCQlROSwgUTcKLQotCVZRRE1VTEguUzMyCQlRMTAsIFEwLCBRNAkJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKQotCVZRRE1VTEguUzMyCQlRMTEsIFExLCBRNQkJCQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdGkxKQotCVZRRE1VTEguUzMyCQlRMTIsIFEwLCBRNQkJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdGkxKQotCVZRRE1VTEguUzMyCQlRMTMsIFExLCBRNAkJCQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdHIxKQotCi0JVkFERC5TMzIJCQlRMCwgUTEwLCBRMTEJCQkJCQkJCQlAICpidWYwKysgPSBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSlACi0JVlNVQi5TMzIJCQlRNSwgUTEzLCBRMTIJCQkJCQkJCQlAICpidWYxLS0gPSBNVUxISUdIKHNpbmEsIHRyMSkgLSBNVUxISUdIKGNvc2EsIHRpMSlACi0KLQlWUURNVUxILlMzMgkJUTEwLCBRMiwgUTgJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRyMikKLQlWUURNVUxILlMzMgkJUTExLCBRMywgUTkJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRpMikKLQlWUURNVUxILlMzMgkJUTEyLCBRMiwgUTkJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRpMikKLQlWUURNVUxILlMzMgkJUTEzLCBRMywgUTgJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRyMikKLQotCVZBREQuUzMyCQkJUTQsIFExMCwgUTExCQkJCQkJCQkJQCAqYnVmMS0tID0gTVVMSElHSChjb3NhLCB0cjIpICsgTVVMSElHSChzaW5hLCB0aTIpQAotCVZTVUIuUzMyCQkJUTEsIFExMywgUTEyCQkJCQkJCQkJQCAqYnVmMCsrID0gTVVMSElHSChzaW5hLCB0cjIpIC0gTVVMSElHSChjb3NhLCB0aTIpQAotCi0JVlJFVjY0LjMyCQkJUTIsIFE0Ci0JVlJFVjY0LjMyCQkJUTMsIFE1Ci0KLQlzdWIJCQkJCQlyMywgcjMsICMzMgotCVZTVDIuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXSEKLQotCVZTVDIuSTMyCQkJe2Q1LCBkN30sIFtyM10hCi0JVlNUMi5JMzIJCQl7ZDQsIGQ2fSwgW3IzXSEKLQotCXN1YnMgICAgIAkJCXIxLCByMSwgIzQKLQlzdWIJCSAgCQkJcjMsIHIzLCAjNjQKLQlibmUgICAgICAgCVBvc3RNRENUX0xPT1AKLQotUG9zdE1EQ1RfRU5EOgotCWZsZG1mZGQgICBzcCEsIHtkOCAtIGQxNX0KLQlsZG1pYSAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0JQEVORFAgIAkJQCB8UG9zdE1EQ1R8Ci0JLmZuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZmE2YTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1I0UjhGaXJzdF92Ny5zCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlSNFI4Rmlyc3RfdjcucwotQAotQAlDb250ZW50OglSYWRpeDhGaXJzdCBhbmQgUmFkaXg0Rmlyc3QgZnVuY3Rpb24gYXJtdjcgYXNzZW1ibGUKLUAKLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUmFkaXg4Rmlyc3QKLQkuZm5zdGFydAotCi1SYWRpeDhGaXJzdDoKLQlzdG1kYiAgICAgCQlzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0JLnNhdmUJICAJCXtyNCAtIHIxMSwgbHJ9Ci0JZnN0bWZkZCAgIAkJc3AhLCB7ZDggLSBkMTV9Ci0JLnZzYXZlCSAgCQl7ZDggLSBkMTV9Ci0KLQlsZHIgICAgICAgCQlyMywgU1FSVDFfMgotCWNtcCAgICAgICAJCXIxLCAjMAotCi0JVkRVUC5JMzIgIAkJUTE1LCByMwotCWJlcSAgICAgICAJCVJhZGl4OEZpcnN0X0VORAotCi1SYWRpeDhGaXJzdF9MT09QOgotCVZMRDEuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwJW3IwXSEKLQlWTEQxLkkzMgkJCXtkOCwgZDksIGQxMCwgZDExfSwJW3IwXSEKLQotCVZBREQuUzMyCQkJZDQsIGQwLCBkMQkJQCByMCA9IGJ1ZlswXSArIGJ1ZlsyXUBpMCA9IGJ1ZlsxXSArIGJ1ZlszXUAKLQlWU1VCLlMzMgkJCWQ1LCBkMCwgZDEJCUAgcjEgPSBidWZbMF0gLSBidWZbMl1AaTEgPSBidWZbMV0gLSBidWZbM11ACi0JVlNVQi5TMzIJCQlkNywgZDIsIGQzCQlAIHIyID0gYnVmWzRdIC0gYnVmWzZdQGkyID0gYnVmWzVdIC0gYnVmWzddQAotCVZBREQuUzMyCQkJZDYsIGQyLCBkMwkJQCByMyA9IGJ1Zls0XSArIGJ1Zls2XUBpMyA9IGJ1Zls1XSArIGJ1Zls3XUAKLQlWUkVWNjQuSTMyCQkJZDcsIGQ3Ci0KLQlWQURELlMzMgkJCVEwLCBRMiwgUTMJCUAgcjQgPSAocjAgKyByMilAaTQgPSAoaTAgKyBpMilAaTYgPSAoaTEgKyByMylAcjcgPSAocjEgKyBpMykKLQlWU1VCLlMzMgkJCVExLCBRMiwgUTMJCUAgcjUgPSAocjAgLSByMilAaTUgPSAoaTAgLSBpMilAcjYgPSAocjEgLSBpMylAaTcgPSAoaTEgLSByMylACi0KLQlWUkVWNjQuSTMyCQkJZDMsIGQzCi0KLQlWQURELlMzMgkJCWQ0LCBkOCwgZDkJCUAgcjAgPSBidWZbIDhdICsgYnVmWzEwXUBpMCA9IGJ1ZlsgOV0gKyBidWZbMTFdQAotCVZTVUIuUzMyCQkJZDcsIGQxMCwgZDExCUAgcjEgPSBidWZbMTJdIC0gYnVmWzE0XUBpMSA9IGJ1ZlsxM10gLSBidWZbMTVdQAotCVZBREQuUzMyCQkJZDYsIGQxMCwgZDExCUAgcjIgPSBidWZbMTJdICsgYnVmWzE0XUBpMiA9IGJ1ZlsxM10gKyBidWZbMTVdQAotCVZSRVY2NC5JMzIJCQlkNywgZDcKLQlWU1VCLlMzMgkJCWQ1LCBkOCwgZDkJCUAgcjMgPSBidWZbIDhdIC0gYnVmWzEwXUBpMyA9IGJ1ZlsgOV0gLSBidWZbMTFdQAotCi0JVlRSTi4zMgkJCQlkMSwgZDMKLQotCVZBREQuUzMyCQkJUTQsIFEyLCBRMwkJQCB0MCA9IChyMCArIHIyKSA+PiAxQHQxID0gKGkwICsgaTIpID4+IDFAaTAgPSBpMSArIHIzQHIyID0gcjEgKyBpM0AKLQlWU1VCLlMzMgkJCVE1LCBRMiwgUTMJCUAgdDIgPSAocjAgLSByMikgPj4gMUB0MyA9IChpMCAtIGkyKSA+PiAxQHIwID0gcjEgLSBpM0BpMiA9IGkxIC0gcjNACi0KLQlWUkVWNjQuSTMyCQkJZDMsIGQzCi0KLQlWU0hSLlMzMgkJCWQ4LCBkOCwgIzEKLQlWU0hSLlMzMgkJCVEwLCBRMCwgIzEKLQlWUkVWNjQuSTMyCQkJZDEwLCBkMTAKLQlWVFJOLjMyCQkJCWQxMSwgZDkKLQlWU0hSLlMzMgkJCVExLCBRMSwgIzEKLQlWU0hSLlMzMgkJCWQxMCwgZDEwLCAjMQotCVZSRVY2NC5JMzIJCQlkOSwgZDkKLQotCXN1YiAgICAgICAJCQlyMCwgcjAsICMweDQwCi0KLQlWQURELlMzMgkJCWQxMiwgZDAsIGQ4Ci0JVlNVQi5TMzIJCQlkMTYsIGQwLCBkOAotCVZBREQuUzMyCQkJZDE0LCBkMiwgZDEwCi0JVlNVQi5TMzIJCQlkMTgsIGQyLCBkMTAKLQotCVZTVUIuUzMyCQkJZDQsIGQxMSwgZDkKLQlWQURELlMzMgkJCWQ1LCBkMTEsIGQ5Ci0KLQlWUkVWNjQuSTMyCQkJZDE4LCBkMTgKLQotCVZRRE1VTEguUzMyCQkJUTMsIFEyLCBRMTUKLQlWVFJOLjMyCQkJCWQxNCwgZDE4Ci0JVlRSTi4zMgkJCQlkNiwgZDcKLQlWUkVWNjQuSTMyCQkJZDE4LCBkMTgKLQotCVZTVUIuUzMyCQkJZDE1LCBkMywgZDYKLQlWUkVWNjQuSTMyCQkJZDcsIGQ3Ci0JVkFERC5TMzIJCQlkMTksIGQzLCBkNgotCVZBREQuUzMyCQkJZDEzLCBkMSwgZDcKLQlWU1VCLlMzMgkJCWQxNywgZDEsIGQ3Ci0KLQlWUkVWNjQuSTMyCQkJZDE3LCBkMTcKLQlWVFJOLjMyCQkJCWQxMywgZDE3Ci0JVlJFVjY0LkkzMgkJCWQxNywgZDE3Ci0KLQlzdWJzICAgICAgIAkJCXIxLCByMSwgIzEKLQotCVZTVDEuSTMyCQkJe2QxMiwgZDEzLCBkMTQsIGQxNX0sIFtyMF0hCi0JVlNUMS5JMzIJCQl7ZDE2LCBkMTcsIGQxOCwgZDE5fSwgW3IwXSEKLQlibmUgICAgICAgCQkJUmFkaXg4Rmlyc3RfTE9PUAotCi1SYWRpeDhGaXJzdF9FTkQ6Ci0JZmxkbWZkZCAgIHNwISwge2Q4IC0gZDE1fQotCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci1TUVJUMV8yOgotCS53b3JkICAgICAgMHgyZDQxM2NjZAotCi0JQEVORFAgIEAgfFJhZGl4OEZpcnN0fAotCS5mbmVuZAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVJhZGl4NEZpcnN0Ci0JLmZuc3RhcnQKLQotUmFkaXg0Rmlyc3Q6Ci0Jc3RtZGIgICAgIAlzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0JLnNhdmUJICAJe3I0IC0gcjExLCBscn0KLQlmc3RtZmRkICAgCXNwISwge2Q4IC0gZDE1fQotCS52c2F2ZQkgIAl7ZDggLSBkMTV9Ci0KLQljbXAgICAgICAgCXIxLCAjMAotCWJlcSAgICAgICAJUmFkaXg0Rmlyc3RfRU5ECi0KLVJhZGl4NEZpcnN0X0xPT1A6Ci0JVkxEMS5JMzIJCQl7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCi0KLQlWQURELlMzMgkJCWQ0LCBkMCwgZDEJCQkJCQkJQCByMCA9IGJ1ZlswXSArIGJ1ZlsyXUAgcjEgPSBidWZbMV0gKyBidWZbM11ACi0JVlNVQi5TMzIJCQlkNSwgZDAsIGQxCQkJCQkJCUAgcjIgPSBidWZbMF0gLSBidWZbMl1AIHIzID0gYnVmWzFdIC0gYnVmWzNdQAotCVZTVUIuUzMyCQkJZDcsIGQyLCBkMwkJCQkJCQlAIHI0ID0gYnVmWzRdICsgYnVmWzZdQCByNSA9IGJ1Zls1XSArIGJ1Zls3XUAKLQlWQURELlMzMgkJCWQ2LCBkMiwgZDMJCQkJCQkJQCByNiA9IGJ1Zls0XSAtIGJ1Zls2XUAgcjcgPSBidWZbNV0gLSBidWZbN11ACi0KLQlWUkVWNjQuSTMyCQlkNywgZDcJCQkJCQkJCQlACi0KLQlWQURELlMzMgkJCVE0LCBRMiwgUTMKLQlWU1VCLlMzMgkJCVE1LCBRMiwgUTMKLQotCVZSRVY2NC5JMzIJCWQxMSwgZDExCi0JVlRSTi4zMgkJCQlkOSwgZDExCi0Jc3VicyAgICAgICAJCXIxLCByMSwgIzEKLQlWUkVWNjQuSTMyCQlkMTEsIGQxMQotCVZTVDEuSTMyCQkJe2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjBdIQotCi0JYm5lICAgICAgIAkJUmFkaXg0Rmlyc3RfTE9PUAotCi1SYWRpeDRGaXJzdF9FTkQ6Ci0JZmxkbWZkZCAgIAkJc3AhLCB7ZDggLSBkMTV9Ci0JbGRtaWEgICAgCQlzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLQlARU5EUCAgQCB8UmFkaXg0Rmlyc3R8Ci0JLmZuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUmFkaXg0RkZUX3Y3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUmFkaXg0RkZUX3Y3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMWJjMzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlSYWRpeDRGRlRfdjcucwotQAotQAlDb250ZW50OglSYWRpeDRGRlQgYXJtdjcgYXNzZW1ibGUKLUAKLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUmFkaXg0RkZUCi0JLmZuc3RhcnQKLQotUmFkaXg0RkZUOgotCXN0bWRiICAgIHNwISwge3I0IC0gcjExLCBscn0KLQkuc2F2ZQkge3I0IC0gcjExLCBscn0KLQlmc3RtZmRkICBzcCEsIHtkOCAtIGQxNX0KLQkudnNhdmUJIHtkOCAtIGQxNX0KLQotCW1vdgkJCXIxLCByMSwgYXNyICMyCi0JY21wICAgICAJcjEsICMwCi0JYmVxICAgICAJUmFkaXg0RkZUX0VORAotCi1SYWRpeDRGRlRfTE9PUDE6Ci0JbW92ICAgICAJcjUsIHIyLCBsc2wgIzEKLQltb3YgICAgIAlyOCwgcjAKLQltb3YgICAgIAlyNywgcjEKLQltb3YgICAgIAlyNSwgcjUsIGxzbCAjMgotCWNtcCAgICAgCXIxLCAjMAotCXJzYmVxICAgCXIxMiwgcjUsIHI1LCBsc2wgIzIKLQliZXEgICAgIAlSYWRpeDRGRlRfTE9PUDFfRU5ECi0KLQlyc2IgICAgIAlyMTIsIHI1LCByNSwgbHNsICMyCi0KLVJhZGl4NEZGVF9MT09QMjoKLQltb3YgICAgIAlyNiwgcjMKLQltb3YgICAgIAlyNCwgcjIKLQljbXAgICAgIAlyMiwgIzAKLQliZXEgICAgIAlSYWRpeDRGRlRfTE9PUDJfRU5ECi0KLVJhZGl4NEZGVF9MT09QMzoKLQlAcjAgPSB4cHRyWzBdQAotCUByMSA9IHhwdHJbMV1ACi0JVkxEMi5JMzIJCQl7RDAsIEQxLCBEMiwgRDN9LCBbcjhdCi0JVkxEMi5JMzIJCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEJCUAgY29zeCA9IGNzcHRyWzBdQCBzaW54ID0gY3NwdHJbMV1ACi0KLQlhZGQJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACi0JVkxEMi5JMzIJCQl7RDQsIEQ1LCBENixEN30sIFtyOF0JCQkJCUAgcjIgPSB4cHRyWzBdQCByMyA9IHhwdHJbMV1ACi0KLQlWUURNVUxILlMzMgkJUTEwLCBRMiwgUTE0CQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQwKQotCVZRRE1VTEguUzMyCQlRMTEsIFEzLCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDEpCi0JVlFETVVMSC5TMzIJCVExMiwgUTMsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkKLQlWUURNVUxILlMzMgkJUTEzLCBRMiwgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQwKQotCi0JVkFERC5TMzIJCQlRMiwgUTEwLCBRMTEJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSkKLQlWU1VCLlMzMgkJCVEzLCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKQotCi0JYWRkCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciArPSBzdGVwQAotCVZTSFIuUzMyCQkJUTEwLCBRMCwgIzIJCQkJCQkJCQkJQCB0MCA9IHIwID4+IDJACi0JVlNIUi5TMzIJCQlRMTEsIFExLCAjMgkJCQkJCQkJCQlAIHQxID0gcjEgPj4gMkAKLQotCVZTVUIuUzMyCQkJUTAsCVExMCwgUTIJCQkJCQkJCQkJQCByMCA9IHQwIC0gcjJACi0JVlNVQi5TMzIJCQlRMSwJUTExLCBRMwkJCQkJCQkJCQlAIHIxID0gdDEgLSByM0AKLQlWQURELlMzMgkJCVEyLCBRMTAsIFEyCQkJCQkJCQkJCUAgcjIgPSB0MCArIHIyQAotCVZBREQuUzMyCQkJUTMsIFExMSwgUTMJCQkJCQkJCQkJQCByMyA9IHQxICsgcjNACi0KLQlWTEQyLkkzMgkJCXtEOCwgRDksIEQxMCwgRDExfSwgW3I4XQotCVZMRDIuSTMyCQkJe0QyOCwgRDI5LCBEMzAsIEQzMX0sIFtyNl0hCi0JYWRkCQkJCQkJcjgsIHI4LCByNQotCi0JVlFETVVMSC5TMzIJCVExMCwgUTQsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkKLQlWUURNVUxILlMzMgkJUTExLCBRNSwgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQxKQotCVZRRE1VTEguUzMyCQlRMTIsIFE1LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpCi0JVlFETVVMSC5TMzIJCVExMywgUTQsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkKLQotCVZBREQuUzMyCQkJUTgsIFExMCwgUTExCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpCi0JVlNVQi5TMzIJCQlROSwgUTEyLCBRMTMJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCkKLQotCVZMRDIuSTMyCQl7RDEyLCBEMTMsIEQxNCwgRDE1fSwgW3I4XQotCVZMRDIuSTMyCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEKLQotCVZRRE1VTEguUzMyCQlRMTAsIFE2LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApCi0JVlFETVVMSC5TMzIJCVExMSwgUTcsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MSkKLQlWUURNVUxILlMzMgkJUTEyLCBRNywgUTE0CQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKQotCVZRRE1VTEguUzMyCQlRMTMsIFE2LCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDApCi0KLQlWQURELlMzMgkJCVE2LCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQotCVZTVUIuUzMyCQkJUTcsIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApCi0KLQlWQURELlMzMgkJCVE0LCBROCwgUTYJCQkJCQkJCQkJQCByNCA9IHQwICsgcjZACi0JVlNVQi5TMzIJCQlRNSwgUTcsIFE5CQkJCQkJCQkJCUAgcjUgPSByNyAtIHQxQAotCVZTVUIuUzMyCQkJUTYsIFE4LCBRNgkJCQkJCQkJCQlAIHI2ID0gdDAgLSByNkAKLQlWQURELlMzMgkJCVE3LCBRNywgUTkJCQkJCQkJCQkJQCByNyA9IHI3ICsgdDFACi0KLQlWQURELlMzMgkJCVE4LCBRMCwgUTUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgKyByNUAKLQlWQURELlMzMgkJCVE5LCBRMSwgUTYJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjEgKyByNkAKLQlWU1QyLkkzMgkJCXtEMTYsIEQxNywgRDE4LCBEMTl9LCBbcjhdCi0KLQlWU1VCLlMzMgkJCVExMCwgUTIsIFE0CQkJCQkJCQkJCUAgeHB0clswXSA9IHIyIC0gcjRACi0Jc3ViCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciAtPSBzdGVwQAotCVZTVUIuUzMyCQkJUTExLCBRMywgUTcJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjMgLSByN0AKLQlWU1QyLkkzMgkJCXtEMjAsIEQyMSwgRDIyLCBEMjN9LCBbcjhdCi0KLQlWU1VCLlMzMgkJCVE4LCBRMCwgUTUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgLSByNUAKLQlzdWIJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0JVlNVQi5TMzIJCQlROSwgUTEsIFE2CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIxIC0gcjZACi0JVlNUMi5JMzIJCQl7RDE2LCBEMTcsIEQxOCwgRDE5fSwgW3I4XQotCi0JVkFERC5TMzIJCQlRMTAsIFEyLCBRNAkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMiArIHI0QAotCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKLQlWQURELlMzMgkJCVExMSwgUTMsIFE3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzICsgcjdACi0JVlNUMi5JMzIJCQl7RDIwLCBEMjEsIEQyMiwgRDIzfSwgW3I4XSEKLQotCXN1YnMgICAgCQkJcjQsIHI0LCAjNAotCWJuZSAgICAgCQkJUmFkaXg0RkZUX0xPT1AzCi0KLVJhZGl4NEZGVF9MT09QMl9FTkQ6Ci0JYWRkICAgICAJCQlyOCwgcjgsIHIxMgotCXN1YiAgICAJCQkJcjcsIHI3LCAjMQotCWNtcAkJCQkJcjcsICMwCi0JYmhpICAgICAJCQlSYWRpeDRGRlRfTE9PUDIKLQotUmFkaXg0RkZUX0xPT1AxX0VORDoKLQlhZGQgICAgIAkJCXIzLCByMTIsIHIzCi0JbW92ICAgICAJCQlyMiwgcjIsIGxzbCAjMgotCW1vdnMgICAgCQkJcjEsIHIxLCBhc3IgIzIKLQlibmUgICAgIAkJCVJhZGl4NEZGVF9MT09QMQotCi1SYWRpeDRGRlRfRU5EOgotCWZsZG1mZGQgICAJCQlzcCEsIHtkOCAtIGQxNX0KLQlsZG1pYSAgIAkJCXNwISwge3I0IC0gcjExLCBwY30KLQotCUBFTkRQICBAIHxSYWRpeDRGRlR8Ci0JLmZuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iYW5kX25yZy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmFuZF9ucmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwMzRiOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iYW5kX25yZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYmFuZF9ucmcuYwotCi0JQ29udGVudDoJQmFuZC9MaW5lIGVuZXJneSBjYWxjdWxhdGlvbnMgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgImJhbmRfbnJnLmgiCi0KLSNpZm5kZWYgQVJNVjVFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ2FsY0JhbmRFbmVyZ3kKLSogZGVzY3JpcHRpb246ICAgQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQ2FsY0JhbmRFbmVyZ3koY29uc3QgV29yZDMyICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTdW0pCi17Ci0gIFdvcmQzMiBpLCBqOwotICBXb3JkMzIgYWNjdVN1bSA9IDA7Ci0KLSAgZm9yIChpPTA7IGk8bnVtQmFuZHM7IGkrKykgewotICAgIFdvcmQzMiBhY2N1ID0gMDsKLSAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTsgajxiYW5kT2Zmc2V0W2krMV07IGorKykKLSAgICAgIGFjY3UgPSBMX2FkZChhY2N1LCBNVUxISUdIKG1kY3RTcGVjdHJ1bVtqXSwgbWRjdFNwZWN0cnVtW2pdKSk7Ci0KLQlhY2N1ID0gTF9hZGQoYWNjdSwgYWNjdSk7Ci0gICAgYWNjdVN1bSA9IExfYWRkKGFjY3VTdW0sIGFjY3UpOwotICAgIGJhbmRFbmVyZ3lbaV0gPSBhY2N1OwotICB9Ci0gICpiYW5kRW5lcmd5U3VtID0gYWNjdVN1bTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENhbGNCYW5kRW5lcmd5TVMKLSogZGVzY3JpcHRpb246ICAgQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQ2FsY0JhbmRFbmVyZ3lNUyhjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICptZGN0U3BlY3RydW1SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5TWlkU3VtLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U2lkZVN1bSkKLXsKLQotICBXb3JkMzIgaSwgajsKLSAgV29yZDMyIGFjY3VNaWRTdW0gPSAwOwotICBXb3JkMzIgYWNjdVNpZGVTdW0gPSAwOwotCi0KLSAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7Ci0gICAgV29yZDMyIGFjY3VNaWQgPSAwOwotICAgIFdvcmQzMiBhY2N1U2lkZSA9IDA7Ci0gICAgZm9yIChqPWJhbmRPZmZzZXRbaV07IGo8YmFuZE9mZnNldFtpKzFdOyBqKyspIHsKLSAgICAgIFdvcmQzMiBzcGVjbSwgc3BlY3M7Ci0gICAgICBXb3JkMzIgbCwgcjsKLQotICAgICAgbCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gMTsKLSAgICAgIHIgPSBtZGN0U3BlY3RydW1SaWdodFtqXSA+PiAxOwotICAgICAgc3BlY20gPSBsICsgcjsKLSAgICAgIHNwZWNzID0gbCAtIHI7Ci0gICAgICBhY2N1TWlkID0gTF9hZGQoYWNjdU1pZCwgTVVMSElHSChzcGVjbSwgc3BlY20pKTsKLSAgICAgIGFjY3VTaWRlID0gTF9hZGQoYWNjdVNpZGUsIE1VTEhJR0goc3BlY3MsIHNwZWNzKSk7Ci0gICAgfQotCi0JYWNjdU1pZCA9IExfYWRkKGFjY3VNaWQsIGFjY3VNaWQpOwotCWFjY3VTaWRlID0gTF9hZGQoYWNjdVNpZGUsIGFjY3VTaWRlKTsKLQliYW5kRW5lcmd5TWlkW2ldID0gYWNjdU1pZDsKLSAgICBhY2N1TWlkU3VtID0gTF9hZGQoYWNjdU1pZFN1bSwgYWNjdU1pZCk7Ci0gICAgYmFuZEVuZXJneVNpZGVbaV0gPSBhY2N1U2lkZTsKLSAgICBhY2N1U2lkZVN1bSA9IExfYWRkKGFjY3VTaWRlU3VtLCBhY2N1U2lkZSk7Ci0KLSAgfQotICAqYmFuZEVuZXJneU1pZFN1bSA9IGFjY3VNaWRTdW07Ci0gICpiYW5kRW5lcmd5U2lkZVN1bSA9IGFjY3VTaWRlU3VtOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdF9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdF9jbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViMDM1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRfY250LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliaXRfY250LmMKLQotCUNvbnRlbnQ6CUh1ZmZtYW4gQml0Y291bnRlciAmIGNvZGVyIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYml0X2NudC5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotI2RlZmluZSBISV9MVEFCKGEpICgoYSk+PjgpCi0jZGVmaW5lIExPX0xUQUIoYSkgKChhKSAmIDB4ZmYpCi0KLSNkZWZpbmUgRVhQQU5EKGEpICAoKCgoV29yZDMyKSgoYSkmMHhmZjAwKSkgPDwgOCl8KFdvcmQzMikoKGEpJjB4ZmYpKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyAxLTExCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyAxLTExCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKLXsKLSAgV29yZDMyIHQwLHQxLHQyLHQzLGk7Ci0gIFdvcmQzMiBiYzFfMixiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTA7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjMV8yPTA7Ci0gIGJjM180PTA7Ci0gIGJjNV82PTA7Ci0gIGJjN184PTA7Ci0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7Ci0KLSAgZm9yKGk9MDtpPHdpZHRoO2krPTQpewotCi0gICAgdDA9IHZhbHVlc1tpKzBdOwotICAgIHQxPSB2YWx1ZXNbaSsxXTsKLSAgICB0Mj0gdmFsdWVzW2krMl07Ci0gICAgdDM9IHZhbHVlc1tpKzNdOwotCi0gICAgLyogMSwyICovCi0KLSAgICBiYzFfMiA9IGJjMV8yICsgRVhQQU5EKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7Ci0KLSAgICAvKiA1LDYgKi8KLSAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0gICAgYmM1XzYgPSBiYzVfNiArIEVYUEFORChodWZmX2x0YWI1XzZbdDIrNF1bdDMrNF0pOwotCi0gICAgdDA9QUJTKHQwKTsKLSAgICB0MT1BQlModDEpOwotICAgIHQyPUFCUyh0Mik7Ci0gICAgdDM9QUJTKHQzKTsKLQotCi0gICAgYmMzXzQgPSBiYzNfNCArIEVYUEFORChodWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKLQotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QyXVt0M10pOwotCi0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDJdW3QzXSk7Ci0KLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0Ml1bdDNdOwotCi0KLSAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApICsgKHQyPjApICsgKHQzPjApOwotICB9Ci0KLSAgYml0Q291bnRbMV09ZXh0cmFjdF9oKGJjMV8yKTsKLSAgYml0Q291bnRbMl09ZXh0cmFjdF9sKGJjMV8yKTsKLSAgYml0Q291bnRbM109ZXh0cmFjdF9oKGJjM180KSArIHNjOwotICBiaXRDb3VudFs0XT1leHRyYWN0X2woYmMzXzQpICsgc2M7Ci0gIGJpdENvdW50WzVdPWV4dHJhY3RfaChiYzVfNik7Ci0gIGJpdENvdW50WzZdPWV4dHJhY3RfbChiYzVfNik7Ci0gIGJpdENvdW50WzddPWV4dHJhY3RfaChiYzdfOCkgKyBzYzsKLSAgYml0Q291bnRbOF09ZXh0cmFjdF9sKGJjN184KSArIHNjOwotICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMF09ZXh0cmFjdF9sKGJjOV8xMCkgKyBzYzsKLSAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnQzXzRfNV82XzdfOF85XzEwXzExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyAzLTExCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyAzLTExCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgY291bnQzXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKLXsKLSAgV29yZDMyIHQwLHQxLHQyLHQzLCBpOwotICBXb3JkMzIgYmMzXzQsYmM1XzYsYmM3XzgsYmM5XzEwOwotICBXb3JkMTYgYmMxMSxzYzsKLQotICBiYzNfND0wOwotICBiYzVfNj0wOwotICBiYzdfOD0wOwotICBiYzlfMTA9MDsKLSAgYmMxMT0wOwotICBzYz0wOwotCi0gIGZvcihpPTA7aTx3aWR0aDtpKz00KXsKLQotICAgIHQwPSB2YWx1ZXNbaSswXTsKLSAgICB0MT0gdmFsdWVzW2krMV07Ci0gICAgdDI9IHZhbHVlc1tpKzJdOwotICAgIHQzPSB2YWx1ZXNbaSszXTsKLQotICAgIC8qCi0gICAgICA1LDYKLSAgICAqLwotICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKLSAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XSk7Ci0KLSAgICB0MD1BQlModDApOwotICAgIHQxPUFCUyh0MSk7Ci0gICAgdDI9QUJTKHQyKTsKLSAgICB0Mz1BQlModDMpOwotCi0KLSAgICBiYzNfNCA9IGJjM180ICsgRVhQQU5EKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotCi0gICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDJdW3QzXSk7Ci0KLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0Ml1bdDNdKTsKLQotICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QyXVt0M107Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCkgKyAodDI+MCkgKyAodDM+MCk7Ci0gIH0KLQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1leHRyYWN0X2goYmMzXzQpICsgc2M7Ci0gIGJpdENvdW50WzRdPWV4dHJhY3RfbChiYzNfNCkgKyBzYzsKLSAgYml0Q291bnRbNV09ZXh0cmFjdF9oKGJjNV82KTsKLSAgYml0Q291bnRbNl09ZXh0cmFjdF9sKGJjNV82KTsKLSAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOwotICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7Ci0gIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCi19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnQ1XzZfN184XzlfMTBfMTEKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDUtMTEKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDUtMTEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY291bnQ1XzZfN184XzlfMTBfMTEoY29uc3QgV29yZDE2ICp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKLXsKLQotICBXb3JkMzIgdDAsdDEsaTsKLSAgV29yZDMyIGJjNV82LGJjN184LGJjOV8xMDsKLSAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmM1XzY9MDsKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKLQotICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7Ci0KLSAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0KLSAgICB0MD1BQlModDApOwotICAgIHQxPUFCUyh0MSk7Ci0KLSAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7Ci0gIH0KLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09ZXh0cmFjdF9oKGJjNV82KTsKLSAgYml0Q291bnRbNl09ZXh0cmFjdF9sKGJjNV82KTsKLSAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOwotICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7Ci0gIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50N184XzlfMTBfMTEKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDctMTEKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDctMTEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjb3VudDdfOF85XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotICBXb3JkMzIgdDAsdDEsIGk7Ci0gIFdvcmQzMiBiYzdfOCxiYzlfMTA7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjN184PTA7Ci0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7Ci0KLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotCi0gICAgdDA9QUJTKHZhbHVlc1tpKzBdKTsKLSAgICB0MT1BQlModmFsdWVzW2krMV0pOwotCi0gICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOwotCi0KLSAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApOwotICB9Ci0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPWV4dHJhY3RfaChiYzdfOCkgKyBzYzsKLSAgYml0Q291bnRbOF09ZXh0cmFjdF9sKGJjN184KSArIHNjOwotICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMF09ZXh0cmFjdF9sKGJjOV8xMCkgKyBzYzsKLSAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnQ5XzEwXzExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyA5LTExCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyA5LTExCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvdW50OV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpCi17Ci0KLSAgV29yZDMyIHQwLHQxLGk7Ci0gIFdvcmQzMiBiYzlfMTA7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7Ci0KLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotCi0gICAgdDA9QUJTKHZhbHVlc1tpKzBdKTsKLSAgICB0MT1BQlModmFsdWVzW2krMV0pOwotCi0KLSAgICBiYzlfMTAgKz0gRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOwotCi0KLSAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApOwotICB9Ci0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzhdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudDExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlIDExCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlIDExCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSBzdGF0aWMgdm9pZCBjb3VudDExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpiaXRDb3VudCkKLXsKLSAgV29yZDMyIHQwLHQxLGk7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjMTE9MDsKLSAgc2M9MDsKLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotICAgIHQwPUFCUyh2YWx1ZXNbaSswXSk7Ci0gICAgdDE9QUJTKHZhbHVlc1tpKzFdKTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7Ci0gIH0KLQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs5XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsxMF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50RXNjCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlIDExICh3aXRoIEVzYykKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDExICh3aXRoIEVzYykKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjb3VudEVzYyhjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotICBXb3JkMzIgdDAsdDEsdDAwLHQwMSxpOwotICBXb3JkMTYgYmMxMSxlYyxzYzsKLQotICBiYzExPTA7Ci0gIHNjPTA7Ci0gIGVjPTA7Ci0gIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKLSAgICB0MD1BQlModmFsdWVzW2krMF0pOwotICAgIHQxPUFCUyh2YWx1ZXNbaSsxXSk7Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7Ci0KLSAgICB0MDAgPSBtaW4odDAsMTYpOwotICAgIHQwMSA9IG1pbih0MSwxNik7Ci0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MDBdW3QwMV07Ci0KLQotICAgIGlmKHQwID49IDE2KXsKLSAgICAgIGVjID0gZWMgKyA1OwotICAgICAgd2hpbGUoc3ViKHQwPSh0MCA+PiAxKSwgMTYpID49IDApIHsKLSAgICAgICAgZWMgPSBlYyArIDI7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBpZih0MSA+PSAxNil7Ci0gICAgICBlYyA9IGVjICsgNTsKLSAgICAgIHdoaWxlKHN1Yih0MT0odDEgPj4gMSksIDE2KSA+PSAwKSB7Ci0gICAgICAgIGVjID0gZWMgKyAyOwotICAgICAgfQotICAgIH0KLSAgfQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs5XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsxMF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMTFdPWJjMTEgKyBzYyArIGVjOwotfQotCi0KLXR5cGVkZWYgdm9pZCAoKkNPVU5UX0ZVTkNUSU9OKShjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpOwotCi1zdGF0aWMgQ09VTlRfRlVOQ1RJT04gY291bnRGdW5jVGFibGVbQ09ERV9CT09LX0VTQ19MQVYrMV0gPQotICB7Ci0KLSAgICBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAgLyogMCAgKi8KLSAgICBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAgLyogMSAgKi8KLSAgICBjb3VudDNfNF81XzZfN184XzlfMTBfMTEsICAgICAgLyogMiAgKi8KLSAgICBjb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAgLyogMyAgKi8KLSAgICBjb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAgLyogNCAgKi8KLSAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNSAgKi8KLSAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNiAgKi8KLSAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNyAgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogOCAgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogOSAgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTAgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTEgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTIgKi8KLSAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgKi8KLSAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTQgKi8KLSAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTUgKi8KLSAgICBjb3VudEVzYyAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgKi8KLSAgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGJpdENvdW50Ci0qIGRlc2NyaXB0aW9uOiAgY291bnQgYml0cwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgYml0Q291bnQoY29uc3QgV29yZDE2ICp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKLSAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIG1heFZhbCwKLSAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotICAvKgotICAgIGNoZWNrIGlmIHdlIGNhbiB1c2UgY29kZWJvb2sgMAotICAqLwotCi0gIGlmKG1heFZhbCA9PSAwKQotICAgIGJpdENvdW50WzBdID0gMDsKLSAgZWxzZQotICAgIGJpdENvdW50WzBdID0gSU5WQUxJRF9CSVRDT1VOVDsKLQotICBtYXhWYWwgPSBtaW4obWF4VmFsLCBDT0RFX0JPT0tfRVNDX0xBVik7Ci0gIGNvdW50RnVuY1RhYmxlW21heFZhbF0odmFsdWVzLHdpZHRoLGJpdENvdW50KTsKLQotICByZXR1cm4oMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb2RlVmFsdWVzCi0qIGRlc2NyaXB0aW9uOiAgd3JpdGUgaHVmZnVtIGJpdHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IGNvZGVWYWx1ZXMoV29yZDE2ICp2YWx1ZXMsIFdvcmQxNiB3aWR0aCwgV29yZDE2IGNvZGVCb29rLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKQotewotCi0gIFdvcmQzMiBpLCB0MCwgdDEsIHQyLCB0MywgdDAwLCB0MDE7Ci0gIFVXb3JkMTYgY29kZVdvcmQsIGNvZGVMZW5ndGg7Ci0gIFdvcmQxNiBzaWduLCBzaWduTGVuZ3RoOwotCi0KLSAgc3dpdGNoIChjb2RlQm9vaykgewotICAgIGNhc2UgQ09ERV9CT09LX1pFUk9fTk86Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzFfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07Ci0gICAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjFbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLCBjb2RlV29yZCwgY29kZUxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzJfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07Ci0gICAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS18zX05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHQyID0gdmFsdWVzW2krMl07Ci0KLSAgICAgICAgaWYodDIgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MiA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQyPS10MjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDMgPSB2YWx1ZXNbaSszXTsKLSAgICAgICAgaWYodDMgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MyA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQzPS10MzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiM1t0MF1bdDFdW3QyXVt0M107Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT0RFX0JPT0tfNF9OTzoKLSAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0gICAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MD0tdDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKLQotICAgICAgICBpZih0MiAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQyIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDI9LXQyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0MyA9IHZhbHVlc1tpKzNdOwotCi0gICAgICAgIGlmKHQzICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDMgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0Mz0tdDM7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI0W3QwXVt0MV1bdDJdW3QzXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS181X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjVbdDArNF1bdDErNF07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS182X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjZbdDArNF1bdDErNF07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS183X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9Mil7Ci0gICAgICAgIHNpZ249MDsKLSAgICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOwotCi0gICAgICAgIGlmKHQwICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MD0tdDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLQotICAgICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQxIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDE9LXQxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiN1t0MF1bdDFdOwotICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihodWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS184X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjhbdDBdW3QxXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT0RFX0JPT0tfOV9OTzoKLSAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI5W3QwXVt0MV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS18xMF9OTzoKLSAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxMFt0MF1bdDFdOwotICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihodWZmX2x0YWI5XzEwW3QwXVt0MV0pOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT0RFX0JPT0tfRVNDX05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDAwID0gbWluKHQwLDE2KTsKLSAgICAgICAgdDAxID0gbWluKHQxLDE2KTsKLQotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiMTFbdDAwXVt0MDFdOwotICAgICAgICBjb2RlTGVuZ3RoID0gaHVmZl9sdGFiMTFbdDAwXVt0MDFdOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLQotICAgICAgICBpZih0MCA+PSAxNil7Ci0gICAgICAgICAgV29yZDE2IG4sIHA7Ci0gICAgICAgICAgbj0wOwotICAgICAgICAgIHA9dDA7Ci0gICAgICAgICAgd2hpbGUoc3ViKHA9KHAgPj4gMSksIDE2KSA+PSAwKXsKLQotICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMSwxKTsKLSAgICAgICAgICAgIG4gPSBuICsgMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMCwxKTsKLSAgICAgICAgICBuID0gbiArIDQ7Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sKHQwIC0gKDEgPDwgbikpLG4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodDEgPj0gMTYpewotICAgICAgICAgIFdvcmQxNiBuLCBwOwotICAgICAgICAgIG49MDsKLSAgICAgICAgICBwPXQxOwotICAgICAgICAgIHdoaWxlKHN1YihwPShwID4+IDEpLCAxNikgPj0gMCl7Ci0KLSAgICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLDEsMSk7Ci0gICAgICAgICAgICBuID0gbiArIDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLDAsMSk7Ci0gICAgICAgICAgbiA9IG4gKyA0OwotICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLCh0MSAtICgxIDw8IG4pKSxuKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuKDApOwotfQotCi1Xb3JkMTYgYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKFdvcmQxNiBkZWx0YSkKLXsKLSAgcmV0dXJuKGh1ZmZfbHRhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl0pOwotfQotCi1Xb3JkMTYgY29kZVNjYWxlZmFjdG9yRGVsdGEoV29yZDE2IGRlbHRhLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKQotewotICBXb3JkMzIgY29kZVdvcmQ7Ci0gIFdvcmQxNiBjb2RlTGVuZ3RoOwotCi0KLSAgaWYoZGVsdGEgPiBDT0RFX0JPT0tfU0NGX0xBViB8fCBkZWx0YSA8IC1DT0RFX0JPT0tfU0NGX0xBVikKLSAgICByZXR1cm4oMSk7Ci0KLSAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsKLSAgY29kZUxlbmd0aCA9IGh1ZmZfbHRhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsKLSAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gIHJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZWViZDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliaXRidWZmZXIuYwotCi0JQ29udGVudDoJQml0IEJ1ZmZlciBNYW5hZ2VtZW50IGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYml0YnVmZmVyLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDcmVhdGVCaXRCdWZmZXIKLSogZGVzY3JpcHRpb246ICBjcmVhdGUgYW5kIGluaXQgQml0IEJ1ZmZlciBNYW5hZ2VtZW50Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUhBTkRMRV9CSVRfQlVGIENyZWF0ZUJpdEJ1ZmZlcihIQU5ETEVfQklUX0JVRiBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkOCAqcEJpdEJ1ZkJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKQotewotICBhc3NlcnQoYml0QnVmU2l6ZSo4IDw9IDMyNzY4KTsKLQotICBoQml0QnVmLT5wQml0QnVmQmFzZSA9IHBCaXRCdWZCYXNlOwotICBoQml0QnVmLT5wQml0QnVmRW5kICA9IHBCaXRCdWZCYXNlICsgYml0QnVmU2l6ZSAtIDE7Ci0KLSAgaEJpdEJ1Zi0+cFdyaXRlTmV4dCAgPSBwQml0QnVmQmFzZTsKLQotICBoQml0QnVmLT5jYWNoZSAgICAgICA9IDA7Ci0KLSAgaEJpdEJ1Zi0+d0JpdFBvcyAgICAgPSAwOwotICBoQml0QnVmLT5jbnRCaXRzICAgICA9IDA7Ci0KLSAgaEJpdEJ1Zi0+c2l6ZSAgICAgICAgPSAoYml0QnVmU2l6ZSA8PCAzKTsKLSAgaEJpdEJ1Zi0+aXNWYWxpZCAgICAgPSAxOwotCi0gIHJldHVybiBoQml0QnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogRGVsZXRlQml0QnVmZmVyCi0qIGRlc2NyaXB0aW9uOiAgdW5pbml0IEJpdCBCdWZmZXIgTWFuYWdlbWVudAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIERlbGV0ZUJpdEJ1ZmZlcihIQU5ETEVfQklUX0JVRiAqaEJpdEJ1ZikKLXsKLSAgaWYoKmhCaXRCdWYpCi0JKCpoQml0QnVmKS0+aXNWYWxpZCA9IDA7Ci0gICpoQml0QnVmID0gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFJlc2V0Qml0QnVmCi0qIGRlc2NyaXB0aW9uOiAgcmVzZXQgQml0IEJ1ZmZlciBNYW5hZ2VtZW50Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUmVzZXRCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKLSAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKQotewotICBoQml0QnVmLT5wQml0QnVmQmFzZSA9IHBCaXRCdWZCYXNlOwotICBoQml0QnVmLT5wQml0QnVmRW5kICA9IHBCaXRCdWZCYXNlICsgYml0QnVmU2l6ZSAtIDE7Ci0KLQotICBoQml0QnVmLT5wV3JpdGVOZXh0ICA9IHBCaXRCdWZCYXNlOwotCi0gIGhCaXRCdWYtPndCaXRQb3MgICAgID0gMDsKLSAgaEJpdEJ1Zi0+Y250Qml0cyAgICAgPSAwOwotCi0gIGhCaXRCdWYtPmNhY2hlCSAgID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENvcHlCaXRCdWYKLSogZGVzY3JpcHRpb246ICBjb3B5IEJpdCBCdWZmZXIgTWFuYWdlbWVudAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIENvcHlCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZlNyYywKLSAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0QnVmRHN0KQotewotICAqaEJpdEJ1ZkRzdCA9ICpoQml0QnVmU3JjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogR2V0Qml0c0F2YWlsCi0qIGRlc2NyaXB0aW9uOiAgZ2V0IGF2YWlsYWJsZSBiaXRzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBHZXRCaXRzQXZhaWwoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZikKLXsKLSAgcmV0dXJuIGhCaXRCdWYtPmNudEJpdHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBXcml0ZUJpdHMKLSogZGVzY3JpcHRpb246ICB3cml0ZSBiaXRzIHRvIHRoZSBidWZmZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFdyaXRlQml0cyhIQU5ETEVfQklUX0JVRiBoQml0QnVmLAotICAgICAgICAgICAgICAgICBVV29yZDMyIHdyaXRlVmFsdWUsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBub0JpdHNUb1dyaXRlKQotewotICBXb3JkMTYgd0JpdFBvczsKLQotICBhc3NlcnQobm9CaXRzVG9Xcml0ZSA8PSAoV29yZDE2KXNpemVvZihXb3JkMzIpKjgpOwotCi0gIGlmKG5vQml0c1RvV3JpdGUgPT0gMCkKLQkgIHJldHVybiBub0JpdHNUb1dyaXRlOwotCi0gIGhCaXRCdWYtPmNudEJpdHMgKz0gbm9CaXRzVG9Xcml0ZTsKLQotICB3Qml0UG9zID0gaEJpdEJ1Zi0+d0JpdFBvczsKLSAgd0JpdFBvcyArPSBub0JpdHNUb1dyaXRlOwotICB3cml0ZVZhbHVlICY9IH4oMHhmZmZmZmZmZiA8PCBub0JpdHNUb1dyaXRlKTsgLy8gTWFzayBvdXQgZXZlcnl0aGluZyBleGNlcHQgdGhlIGxvd2VzdCBub0JpdHNUb1dyaXRlIGJpdHMKLSAgd3JpdGVWYWx1ZSA8PD0gMzIgLSB3Qml0UG9zOwotICB3cml0ZVZhbHVlIHw9IGhCaXRCdWYtPmNhY2hlOwotCi0gIHdoaWxlICh3Qml0UG9zID49IDgpCi0gIHsKLQkgIFVXb3JkOCB0bXA7Ci0JICB0bXAgPSAoVVdvcmQ4KSgod3JpdGVWYWx1ZSA+PiAyNCkgJiAweEZGKTsKLQotCSAgKmhCaXRCdWYtPnBXcml0ZU5leHQrKyA9IHRtcDsKLQkgIHdyaXRlVmFsdWUgPDw9IDg7Ci0JICB3Qml0UG9zIC09IDg7Ci0gIH0KLQotICBoQml0QnVmLT53Qml0UG9zID0gd0JpdFBvczsKLSAgaEJpdEJ1Zi0+Y2FjaGUgPSB3cml0ZVZhbHVlOwotCi0gIHJldHVybiBub0JpdHNUb1dyaXRlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4MTIwNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYworKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJpdGVuYy5jCi0KLQlDb250ZW50OglCaXRzdHJlYW0gZW5jb2RlciBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJpdGVuYy5oIgotI2luY2x1ZGUgImJpdF9jbnQuaCIKLSNpbmNsdWRlICJkeW5fYml0cy5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLXN0YXRpYyBjb25zdCAgV29yZDE2IGdsb2JhbEdhaW5PZmZzZXQgPSAxMDA7Ci1zdGF0aWMgY29uc3QgIFdvcmQxNiBpY3NSZXNlcnZlZEJpdCAgID0gMDsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogZW5jb2RlU3BlY3RyYWxEYXRhCi0qIGRlc2NyaXB0aW9uOiAgZW5jb2RlIHNwZWN0cmFsIGRhdGEKLSogcmV0dXJuczogICAgICBzcGVjdHJhbCBiaXRzIHVzZWQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQzMiBlbmNvZGVTcGVjdHJhbERhdGEoV29yZDE2ICAgICAgICAgICAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgICAgICAgKnNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgICAgICBoQml0U3RyZWFtKQotewotICBXb3JkMTYgaSxzZmI7Ci0gIFdvcmQxNiBkYmdWYWw7Ci0gIFNFQ1RJT05fSU5GTyogcHNlY3Rpb25pbmZvOwotICBkYmdWYWwgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0KLSAgZm9yKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspIHsKLSAgICBwc2VjdGlvbmluZm8gPSAmKHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tpXSk7Ci0JLyoKLSAgICAgICBodWZmZW5jb2RlIHNwZWN0cmFsIGRhdGEgZm9yIHRoaXMgc2VjdGlvbgotICAgICovCi0gICAgZm9yKHNmYj1wc2VjdGlvbmluZm8tPnNmYlN0YXJ0OwotICAgICAgICBzZmI8cHNlY3Rpb25pbmZvLT5zZmJTdGFydCtwc2VjdGlvbmluZm8tPnNmYkNudDsKLSAgICAgICAgc2ZiKyspIHsKLSAgICAgIGNvZGVWYWx1ZXMocXVhbnRTcGVjdHJ1bStzZmJPZmZzZXRbc2ZiXSwKLSAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYisxXSAtIHNmYk9mZnNldFtzZmJdLAotICAgICAgICAgICAgICAgICBwc2VjdGlvbmluZm8tPmNvZGVCb29rLAotICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4oR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmVuY29kZUdsb2JhbEdhaW4KLSogZGVzY3JpcHRpb246IGVuY29kZXMgR2xvYmFsIEdhaW4gKGNvbW1vbiBzY2FsZSBmYWN0b3IpCi0qIHJldHVybnM6ICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGVuY29kZUdsb2JhbEdhaW4oV29yZDE2IGdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dOb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2NhbGVmYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCi17Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLCAoKGdsb2JhbEdhaW4gLSBzY2FsZWZhYykgKyBnbG9iYWxHYWluT2Zmc2V0LShsb2dOb3JtIDw8IDIpKSwgOCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6ZW5jb2RlSWNzSW5mbwotKiBkZXNjcmlwdGlvbjogZW5jb2RlcyBJY3MgSW5mbwotKiByZXR1cm5zOiAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGVuY29kZUljc0luZm8oV29yZDE2IGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZ3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiAgaEJpdFN0cmVhbSkKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0saWNzUmVzZXJ2ZWRCaXQsMSk7Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLGJsb2NrVHlwZSwyKTsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sd2luZG93U2hhcGUsMSk7Ci0KLQotICBzd2l0Y2goYmxvY2tUeXBlKXsKLSAgICBjYXNlIExPTkdfV0lORE9XOgotICAgIGNhc2UgU1RBUlRfV0lORE9XOgotICAgIGNhc2UgU1RPUF9XSU5ET1c6Ci0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsNik7Ci0KLSAgICAgIC8qIE5vIHByZWRpY3RvciBkYXRhIHByZXNlbnQgKi8KLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsNCk7Ci0KLSAgICAgIC8qCi0gICAgICBXcml0ZSBncm91cGluZyBiaXRzCi0gICAgICAqLwotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sZ3JvdXBpbmdNYXNrLFRSQU5TX0ZBQy0xKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVTZWN0aW9uRGF0YQotKiBkZXNjcmlwdGlvbjogIGVuY29kZSBzZWN0aW9uIGRhdGEgKGNvbW1vbiBIdWZmbWFuIGNvZGVib29rcyBmb3IgYWRqYWNlbnQKLSogICAgICAgICAgICAgICBTRkIncykKLSogcmV0dXJuczogICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMzIgZW5jb2RlU2VjdGlvbkRhdGEoU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKLXsKLSAgV29yZDE2IHNlY3RFc2NhcGVWYWw9MCxzZWN0TGVuQml0cz0wOwotICBXb3JkMTYgc2VjdExlbjsKLSAgV29yZDE2IGk7Ci0gIFdvcmQxNiBkYmdWYWw9R2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOwotCi0KLQotICBzd2l0Y2goc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSkKLSAgewotICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgY2FzZSBTVEFSVF9XSU5ET1c6Ci0gICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfTE9ORzsKLSAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfTE9ORzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICBzZWN0RXNjYXBlVmFsID0gU0VDVF9FU0NfVkFMX1NIT1JUOwotICAgICAgc2VjdExlbkJpdHMgICA9IFNFQ1RfQklUU19TSE9SVDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgZm9yKGk9MDtpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7aSsrKSB7Ci0gICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldLmNvZGVCb29rLDQpOwotICAgIHNlY3RMZW4gPSBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9baV0uc2ZiQ250OwotCi0gICAgd2hpbGUoc2VjdExlbiA+PSBzZWN0RXNjYXBlVmFsKSB7Ci0KLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3RFc2NhcGVWYWwsc2VjdExlbkJpdHMpOwotICAgICAgc2VjdExlbiA9IHNlY3RMZW4gLSBzZWN0RXNjYXBlVmFsOwotICAgIH0KLSAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0TGVuLHNlY3RMZW5CaXRzKTsKLSAgfQotICByZXR1cm4oR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVTY2FsZUZhY3RvckRhdGEKLSogZGVzY3JpcHRpb246ICBlbmNvZGUgRFBDTSBjb2RlZCBzY2FsZSBmYWN0b3JzCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDMyIGVuY29kZVNjYWxlRmFjdG9yRGF0YShVV29yZDE2ICAgICAgICAqbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgICpzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICpzY2FsZWZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtKQotewotICBXb3JkMTYgaSxqLGxhc3RWYWxTY2YsZGVsdGFTY2Y7Ci0gIFdvcmQxNiBkYmdWYWwgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0gIFNFQ1RJT05fSU5GTyogcHNlY3Rpb25pbmZvOwotCi0gIGxhc3RWYWxTY2Y9c2NhbGVmYWNbc2VjdGlvbkRhdGEtPmZpcnN0U2NmXTsKLQotICBmb3IoaT0wO2k8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucztpKyspewotICAgIHBzZWN0aW9uaW5mbyA9ICYoc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldKTsKLSAgICBpZiAocHNlY3Rpb25pbmZvLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTyl7Ci0gICAgICBmb3IgKGo9cHNlY3Rpb25pbmZvLT5zZmJTdGFydDsKLSAgICAgICAgICAgajxwc2VjdGlvbmluZm8tPnNmYlN0YXJ0K3BzZWN0aW9uaW5mby0+c2ZiQ250OyBqKyspewotCi0gICAgICAgIGlmKG1heFZhbHVlSW5TZmJbal0gPT0gMCkgewotICAgICAgICAgIGRlbHRhU2NmID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBkZWx0YVNjZiA9IGxhc3RWYWxTY2YgLSBzY2FsZWZhY1tqXTsKLSAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNbal07Ci0gICAgICAgIH0KLQotICAgICAgICBpZihjb2RlU2NhbGVmYWN0b3JEZWx0YShkZWx0YVNjZixoQml0U3RyZWFtKSl7Ci0gICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLSAgcmV0dXJuKEdldEJpdHNBdmFpbChoQml0U3RyZWFtKS1kYmdWYWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTplbmNvZGVNc0luZm8KLSogZGVzY3JpcHRpb246IGVuY29kZXMgTVMtU3RlcmVvIEluZm8KLSogcmV0dXJuczogICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZW5jb2RlTVNJbmZvKFdvcmQxNiAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGdycFNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbWF4U2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBtc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAqanNGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiAgaEJpdFN0cmVhbSkKLXsKLSAgV29yZDE2IHNmYiwgc2ZiT2ZmOwotCi0KLSAgc3dpdGNoKG1zRGlnZXN0KQotICB7Ci0gICAgY2FzZSBNU19OT05FOgotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19OT05FLDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1TX0FMTDoKLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLFNJX01TX01BU0tfQUxMLDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1TX1NPTUU6Ci0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxTSV9NU19NQVNLX1NPTUUsMik7Ci0gICAgICBmb3Ioc2ZiT2ZmID0gMDsgc2ZiT2ZmIDwgc2ZiQ250OyBzZmJPZmYrPWdycFNmYikgewotICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxtYXhTZmI7IHNmYisrKSB7Ci0KLSAgICAgICAgICBpZihqc0ZsYWdzW3NmYk9mZitzZmJdICYgTVNfT04pIHsKLSAgICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDEsMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogZW5jb2RlVG5zRGF0YQotKiBkZXNjcmlwdGlvbjogIGVuY29kZSBUTlMgZGF0YSAoZmlsdGVyIG9yZGVyLCBjb2VmZnMsIC4uKQotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZW5jb2RlVG5zRGF0YShUTlNfSU5GTyB0bnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtKSB7Ci0gIFdvcmQxNiBpLGs7Ci0gIEZsYWcgdG5zUHJlc2VudDsKLSAgV29yZDE2IG51bU9mV2luZG93czsKLSAgV29yZDE2IGNvZWZCaXRzOwotICBGbGFnIGlzU2hvcnQ7Ci0KLQotICBpZiAoYmxvY2tUeXBlPT0yKSB7Ci0gICAgaXNTaG9ydCA9IDE7Ci0gICAgbnVtT2ZXaW5kb3dzID0gVFJBTlNfRkFDOwotICB9Ci0gIGVsc2UgewotICAgIGlzU2hvcnQgPSAwOwotICAgIG51bU9mV2luZG93cyA9IDE7Ci0gIH0KLQotICB0bnNQcmVzZW50PTA7Ci0gIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KLSAgICBpZiAodG5zSW5mby50bnNBY3RpdmVbaV0pIHsKLSAgICAgIHRuc1ByZXNlbnQ9MTsKLSAgICB9Ci0gIH0KLQotICBpZiAodG5zUHJlc2VudD09MCkgewotICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7Ci0gIH0KLSAgZWxzZXsgLyogdGhlcmUgaXMgZGF0YSB0byBiZSB3cml0dGVuKi8KLSAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwxLDEpOyAvKmRhdGFfcHJlc2VudCAqLwotICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8udG5zQWN0aXZlW2ldLChpc1Nob3J0PzE6MikpOwotCi0gICAgICBpZiAodG5zSW5mby50bnNBY3RpdmVbaV0pIHsKLQotICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwoKHRuc0luZm8uY29lZlJlc1tpXSAtIDQpPT0wPzE6MCksMSk7Ci0KLSAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby5sZW5ndGhbaV0sKGlzU2hvcnQ/NDo2KSk7Ci0KLSAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby5vcmRlcltpXSwoaXNTaG9ydD8zOjUpKTsKLQotICAgICAgICBpZiAodG5zSW5mby5vcmRlcltpXSl7Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIEZJTFRFUl9ESVJFQ1RJT04sIDEpOwotCi0gICAgICAgICAgaWYodG5zSW5mby5jb2VmUmVzW2ldID09IDQpIHsKLSAgICAgICAgICAgIGNvZWZCaXRzID0gMzsKLSAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby5vcmRlcltpXTsgaysrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPiAzIHx8Ci0gICAgICAgICAgICAgICAgICB0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdIDwgLTQpIHsKLSAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb2VmQml0cyA9IDI7Ci0gICAgICAgICAgICBmb3Ioaz0wOyBrPHRuc0luZm8ub3JkZXJbaV07IGsrKykgewotCi0gICAgICAgICAgICAgIGlmICh0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdID4gMSB8fAotICAgICAgICAgICAgICAgICAgdG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSA8IC0yKSB7Ci0gICAgICAgICAgICAgICAgY29lZkJpdHMgPSAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCB0bnNJbmZvLmNvZWZSZXNbaV0gLSBjb2VmQml0cywgMSk7IC8qY29lZl9jb21wcmVzKi8KLSAgICAgICAgICBmb3IgKGs9MDsgazx0bnNJbmZvLm9yZGVyW2ldOyBrKysgKSB7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgV29yZDE2IHJtYXNrW10gPSB7MCwxLDMsNywxNX07Ci0KLSAgICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gJiBybWFza1tjb2VmQml0c10sY29lZkJpdHMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVHYWluQ29udHJvbERhdGEKLSogZGVzY3JpcHRpb246ICB1bnN1cHBvcnRlZAotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZW5jb2RlR2FpbkNvbnRyb2xEYXRhKEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCi17Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVQdWxzZURhdGEKLSogZGVzY3JpcHRpb246ICBub3Qgc3VwcG9ydGVkIHlldCAoZHVtbXkpCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBlbmNvZGVQdWxzZURhdGEoSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogV3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbQotKiBkZXNjcmlwdGlvbjogIG1hbmFnZW1lbnQgb2Ygd3JpdGUgcHJvY2VzcyBvZiBpbmRpdmlkdWFsIGNoYW5uZWwgc3RyZWFtCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotd3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbShGbGFnICAgY29tbW9uV2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBncm91cGluZ01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2NmW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBnbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgcXVhbnRTcGVjW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPIHRuc0luZm8pCi17Ci0gIFdvcmQxNiBsb2dOb3JtOwotCi0gIGxvZ05vcm0gPSBMT0dfTk9STV9QQ00gLSAobWRjdFNjYWxlICsgMSk7Ci0KLSAgZW5jb2RlR2xvYmFsR2FpbihnbG9iYWxHYWluLCBsb2dOb3JtLHNjZltzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdLCBoQml0U3RyZWFtKTsKLQotCi0gIGlmKCFjb21tb25XaW5kb3cpIHsKLSAgICBlbmNvZGVJY3NJbmZvKHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUsIHdpbmRvd1NoYXBlLCBncm91cGluZ01hc2ssIHNlY3Rpb25EYXRhLCBoQml0U3RyZWFtKTsKLSAgfQotCi0gIGVuY29kZVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCBoQml0U3RyZWFtKTsKLQotICBlbmNvZGVTY2FsZUZhY3RvckRhdGEobWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7Ci0KLSAgZW5jb2RlUHVsc2VEYXRhKGhCaXRTdHJlYW0pOwotCi0gIGVuY29kZVRuc0RhdGEodG5zSW5mbywgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSwgaEJpdFN0cmVhbSk7Ci0KLSAgZW5jb2RlR2FpbkNvbnRyb2xEYXRhKGhCaXRTdHJlYW0pOwotCi0gIGVuY29kZVNwZWN0cmFsRGF0YShzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiB3cml0ZVNpbmdsZUNoYW5uZWxFbGVtZW50Ci0qIGRlc2NyaXB0aW9uOiAgd3JpdGUgc2luZ2xlIGNoYW5uZWwgZWxlbWVudCB0byBiaXRzdHJlYW0KLSogcmV0dXJuczogICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgd3JpdGVTaW5nbGVDaGFubmVsRWxlbWVudChXb3JkMTYgaW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPIHRuc0luZm8pCi17Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLElEX1NDRSwzKTsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0saW5zdGFuY2VUYWcsNCk7Ci0gIHdyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0oMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPndpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+Z3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5nbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+cXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocWNPdXRDaGFubmVsLT5zZWN0aW9uRGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgcmV0dXJuKDApOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHdyaXRlQ2hhbm5lbFBhaXJFbGVtZW50Ci0qIGRlc2NyaXB0aW9uOgotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiB3cml0ZUNoYW5uZWxQYWlyRWxlbWVudChXb3JkMTYgaW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1zRmxhZ3NbTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXRbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMIHFjT3V0Q2hhbm5lbFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gdG5zSW5mb1syXSkKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sSURfQ1BFLDMpOwotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxpbnN0YW5jZVRhZyw0KTsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMSwxKTsgLyogY29tbW9uIHdpbmRvdyAqLwotCi0gIGVuY29kZUljc0luZm8ocWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhLmJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ud2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLmdyb3VwaW5nTWFzaywKLSAgICAgICAgICAgICAgICAmKHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YSksCi0gICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7Ci0KLSAgZW5jb2RlTVNJbmZvKHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YS5zZmJDbnQsCi0gICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEuc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEubWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBtc0RpZ2VzdCwKLSAgICAgICAgICAgICAgIG1zRmxhZ3MsCi0gICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLQotICB3cml0ZUluZGl2aWR1YWxDaGFubmVsU3RyZWFtKDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLm1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ud2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLmdyb3VwaW5nTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ubWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ucXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm9bMF0pOwotCi0gIHdyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0oMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0ubWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS53aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0uZ3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0uc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5tYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5nbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5xdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihxY091dENoYW5uZWxbMV0uc2VjdGlvbkRhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mb1sxXSk7Ci0KLSAgcmV0dXJuKDApOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHdyaXRlRmlsbEVsZW1lbnQKLSogZGVzY3JpcHRpb246ICB3cml0ZSBmaWxsIGVsZW1lbnRzIHRvIGJpdHN0cmVhbQotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgd3JpdGVGaWxsRWxlbWVudCggY29uc3QgVVdvcmQ4ICphbmNCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0b3RGaWxsQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCi17Ci0gIFdvcmQxNiBpOwotICBXb3JkMTYgY250LGVzY19jb3VudDsKLQotICAvKgotICAgIFdyaXRlIGZpbGwgRWxlbWVudChzKToKLSAgICBhbW91bnQgb2YgYSBmaWxsIGVsZW1lbnQgY2FuIGJlIDcrWCo4IEJpdHMsIFggZWxlbWVudCBvZiBbMC4uMjcwXQotICAqLwotCi0gIHdoaWxlKHRvdEZpbGxCaXRzID49ICgzKzQpKSB7Ci0gICAgY250ID0gbWluKCgodG90RmlsbEJpdHMgLSAoMys0KSkgPj4gMyksICgoMTw8NCktMSkpOwotCi0gICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sSURfRklMLDMpOwotICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLGNudCw0KTsKLQotICAgIHRvdEZpbGxCaXRzID0gdG90RmlsbEJpdHMgLSAoMys0KTsKLQotCi0gICAgaWYgKGNudCA9PSAoMTw8NCktMSkgewotCi0gICAgICBlc2NfY291bnQgPSBtaW4oICgodG90RmlsbEJpdHMgPj4gMykgLSAoKDE8PDQpLTEpKSwgKDE8PDgpLTEpOwotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sZXNjX2NvdW50LDgpOwotICAgICAgdG90RmlsbEJpdHMgPSAodG90RmlsbEJpdHMgLSA4KTsKLSAgICAgIGNudCA9IGNudCArIChlc2NfY291bnQgLSAxKTsKLSAgICB9Ci0KLSAgICBmb3IoaT0wO2k8Y250O2krKykgewotCi0gICAgICBpZihhbmNCeXRlcykKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sICphbmNCeXRlcysrLDgpOwotICAgICAgZWxzZQotICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLDgpOwotICAgICAgdG90RmlsbEJpdHMgPSB0b3RGaWxsQml0cyAtIDg7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBXcml0ZUJpdFN0cmVhbQotKiBkZXNjcmlwdGlvbjogIG1haW4gZnVuY3Rpb24gb2Ygd3JpdGUgYml0c3RlYW0gcHJvY2VzcwotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgV3JpdGVCaXRzdHJlYW0gKEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgKnBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpnbG9iVXNlZEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkOCAqYW5jQnl0ZXMsCi0JCQkJCSAgIFdvcmQxNiBzYW1waW5kZXgKLSAgICAgICAgICAgICAgICAgICAgICAgKSAvKiByZXR1cm5zIGVycm9yIGNvZGUgKi8KLXsKLSAgV29yZDE2IGJpdE1hcmtVcDsKLSAgV29yZDE2IGVsZW1lbnRVc2VkQml0czsKLSAgV29yZDE2IGZyYW1lQml0cz0wOwotCi0gIFVOVVNFRChhbmNCeXRlcyk7Ci0KLSAgLyogICBzdHJ1Y3QgYml0YnVmZmVyIGJzV3JpdGVDb3B5OyAqLwotICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0gIGlmKHFjT3V0LT5xY0VsZW1lbnQuYWR0c1VzZWQpICAvKiAgd3JpdGUgYWR0cyBoZWFkZXIqLwotICB7Ci0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMHhGRkYsIDEyKTsgLyogMTIgYml0IFN5bmN3b3JkICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMSwgMSk7IC8qIElEID09IDAgZm9yIE1QRUc0IEFBQywgMSBmb3IgTVBFRzIgQUFDICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMik7IC8qIGxheWVyID09IDAgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAxKTsgLyogcHJvdGVjdGlvbiBhYnNlbnQgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAyKTsgLyogcHJvZmlsZSAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNhbXBpbmRleCwgNCk7IC8qIHNhbXBsaW5nIHJhdGUgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogcHJpdmF0ZSBiaXQgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCBlbEluZm8ubkNoYW5uZWxzSW5FbCwgMyk7IC8qIGNoLiBjb25maWcgKG11c3QgYmUgPiAwKSAqLwotCQkJCQkJCQkgICAvKiBzaW1wbHkgdXNpbmcgbnVtQ2hhbm5lbHMgb25seSB3b3JrcyBmb3IKLQkJCQkJCQkJCTYgY2hhbm5lbHMgb3IgbGVzcywgZWxzZSBhIGNoYW5uZWwKLQkJCQkJCQkJCWNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHdyaXR0ZW4gKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogb3JpZ2luYWwvY29weSAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBob21lICovCi0KLQkgIC8qIFZhcmlhYmxlIEFEVFMgaGVhZGVyICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7IC8qIGNvcHlyLiBpZC4gYml0ICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7IC8qIGNvcHlyLiBpZC4gc3RhcnQgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAqZ2xvYlVzZWRCaXRzID4+IDMsIDEzKTsKLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAweDdGRiwgMTEpOyAvKiBidWZmZXIgZnVsbG5lc3MgKDB4N0ZGIGZvciBWQlIpICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMik7IC8qIHJhdyBkYXRhIGJsb2NrcyAoMCsxPTEpICovCi0gIH0KLQotICAqZ2xvYlVzZWRCaXRzPTA7Ci0KLSAgewotCi0gICAgV29yZDE2ICpzZmJPZmZzZXRbMl07Ci0gICAgVE5TX0lORk8gdG5zSW5mb1syXTsKLSAgICBlbGVtZW50VXNlZEJpdHMgPSAwOwotCi0gICAgc3dpdGNoIChlbEluZm8uZWxUeXBlKSB7Ci0KLSAgICAgIGNhc2UgSURfU0NFOiAgICAgIC8qIHNpbmdsZSBjaGFubmVsICovCi0gICAgICAgIHNmYk9mZnNldFswXSA9IHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXS5zZmJPZmZzZXRzOwotICAgICAgICB0bnNJbmZvWzBdID0gcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnRuc0luZm87Ci0KLSAgICAgICAgd3JpdGVTaW5nbGVDaGFubmVsRWxlbWVudChlbEluZm8uaW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mb1swXSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElEX0NQRTogICAgIC8qIGNoYW5uZWwgcGFpciAqLwotICAgICAgICB7Ci0gICAgICAgICAgV29yZDE2IG1zRGlnZXN0OwotICAgICAgICAgIFdvcmQxNiAqbXNGbGFncyA9IHBzeU91dC0+cHN5T3V0RWxlbWVudC50b29sc0luZm8ubXNNYXNrOwotICAgICAgICAgIG1zRGlnZXN0ID0gcHN5T3V0LT5wc3lPdXRFbGVtZW50LnRvb2xzSW5mby5tc0RpZ2VzdDsKLSAgICAgICAgICBzZmJPZmZzZXRbMF0gPQotICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnNmYk9mZnNldHM7Ci0gICAgICAgICAgc2ZiT2Zmc2V0WzFdID0KLSAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzFdXS5zZmJPZmZzZXRzOwotCi0gICAgICAgICAgdG5zSW5mb1swXT0KLSAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXS50bnNJbmZvOwotICAgICAgICAgIHRuc0luZm9bMV09Ci0gICAgICAgICAgICBwc3lPdXQtPnBzeU91dENoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFsxXV0udG5zSW5mbzsKLSAgICAgICAgICB3cml0ZUNoYW5uZWxQYWlyRWxlbWVudChlbEluZm8uaW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0NoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFswXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuKDEpOwotCi0gICAgICB9ICAgLyogc3dpdGNoICovCi0KLSAgICBlbGVtZW50VXNlZEJpdHMgPSBlbGVtZW50VXNlZEJpdHMgLSBiaXRNYXJrVXA7Ci0gICAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOwotICAgIGZyYW1lQml0cyA9IGZyYW1lQml0cyArIGVsZW1lbnRVc2VkQml0cyArIGJpdE1hcmtVcDsKLQotICB9Ci0KLSAgd3JpdGVGaWxsRWxlbWVudChOVUxMLAotICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RGaWxsQml0cywKLSAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLQotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxJRF9FTkQsMyk7Ci0KLSAgLyogYnl0ZSBhbGlnbmVtZW50ICovCi0gIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsICg4IC0gKGhCaXRTdHJlYW0tPmNudEJpdHMgJiA3KSkgJiA3KTsKLQotICAqZ2xvYlVzZWRCaXRzID0gKmdsb2JVc2VkQml0cy0gYml0TWFya1VwOwotICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0gICpnbG9iVXNlZEJpdHMgPSAqZ2xvYlVzZWRCaXRzICsgYml0TWFya1VwOwotICBmcmFtZUJpdHMgPSBmcmFtZUJpdHMgKyAqZ2xvYlVzZWRCaXRzOwotCi0KLSAgaWYgKGZyYW1lQml0cyAhPSAgKHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCtxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90QW5jQml0c1VzZWQgKwotICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzICsgcWNPdXQtPmFsaWduQml0cykpIHsKLSAgICByZXR1cm4oLTEpOwotICB9Ci0gIHJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmM3ZTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlibG9ja19zd2l0Y2guYwotCi0JQ29udGVudDoJQmxvY2sgc3dpdGNoaW5nIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJibG9ja19zd2l0Y2guaCIKLQotCi0jZGVmaW5lIEVORVJHWV9TSElGVCAoOCAtIDEpCi0KLS8qKioqKioqKioqKioqKioqIGludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKiovCi1zdGF0aWMgV29yZDMyCi1TcmNoTWF4V2l0aEluZGV4KGNvbnN0IFdvcmQzMiAqaW4sIFdvcmQxNiAqaW5kZXgsIFdvcmQxNiBuKTsKLQotCi1Xb3JkMzIKLUNhbGNXaW5kb3dFbmVyZ3koQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAotICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiB3aW5kb3dMZW4pOwotCi0KLQotLyoqKioqKioqKioqKioqKioqKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAgSUlSIGhpZ2ggcGFzcyBjb2VmZnMKLSovCi1jb25zdCBXb3JkMzIgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dID0gewotICAweGJlYzhiNDM5LCAweDYwOWQ0OTUyICAvKiAtMC41MDk1ZiwgMC43NTQ4ZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IFdvcmQzMiBhY2NXaW5kb3dOcmdGYWMgPSAweDI2NjY2NjY2OyAgICAgICAgICAgICAgICAgICAvKiBmYWN0b3IgZm9yIGFjY3VtdWxhdGluZyBmaWx0ZXJlZCB3aW5kb3cgZW5lcmdpZXMgMC4zICovCi1zdGF0aWMgY29uc3QgV29yZDMyIG9uZU1pbnVzQWNjV2luZG93TnJnRmFjID0gMHg1OTk5OTk5YTsJCQkvKiAwLjcgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgaW52QXR0YWNrUmF0aW9IaWdoQnIgPSAweDBjY2NjY2NkOyAgICAgICAgICAgICAgLyogaW52ZXJ0ZWQgbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgMC4xKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgaW52QXR0YWNrUmF0aW9Mb3dCciA9ICAweDA3MmIwMjBjOyAgICAgICAgICAgICAgLyogMC4wNTYgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgbWluQXR0YWNrTnJnID0gMHgwMDAwMWU4NDsgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgMWUrNiAqLwotCi0KLS8qKioqKioqKioqKioqKioqKiogUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogSW5pdEJsb2NrU3dpdGNoaW5nCi0qIGRlc2NyaXB0aW9uOiAgaW5pdCBCbG9jayBTd2l0Y2hpbmcgcGFyYW1ldGVyLgotKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBJbml0QmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIGJpdFJhdGUsIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCi17Ci0gIC8qIHNlbGVjdCBhdHRhY2tSYXRpbyAqLwotCi0gIGlmICgoc3ViKG5DaGFubmVscywxKT09MCAmJiBMX3N1YihiaXRSYXRlLCAyNDAwMCkgPiAwKSB8fAotICAgICAgKHN1YihuQ2hhbm5lbHMsMSk+MCAmJiBiaXRSYXRlID4gKG5DaGFubmVscyAqIDE2MDAwKSkpIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmludkF0dGFja1JhdGlvID0gaW52QXR0YWNrUmF0aW9IaWdoQnI7Ci0gIH0KLSAgZWxzZSAgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aW52QXR0YWNrUmF0aW8gPSBpbnZBdHRhY2tSYXRpb0xvd0JyOwotICB9Ci0KLSAgcmV0dXJuKFRSVUUpOwotfQotCi1zdGF0aWMgV29yZDE2IHN1Z2dlc3RlZEdyb3VwaW5nVGFibGVbVFJBTlNfRkFDXVtNQVhfTk9fT0ZfR1JPVVBTXSA9IHsKLSAgLyogQXR0YWNrIGluIFdpbmRvdyAwICovIHsxLCAgMywgIDMsICAxfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyAxICovIHsxLCAgMSwgIDMsICAzfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyAyICovIHsyLCAgMSwgIDMsICAyfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyAzICovIHszLCAgMSwgIDMsICAxfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyA0ICovIHszLCAgMSwgIDEsICAzfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyA1ICovIHszLCAgMiwgIDEsICAyfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyA2ICovIHszLCAgMywgIDEsICAxfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyA3ICovIHszLCAgMywgIDEsICAxfQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEJsb2NrU3dpdGNoaW5nCi0qIGRlc2NyaXB0aW9uOiAgZGV0ZWN0IHRoaXMgZnJhbWUgd2hldGhlciB0aGVyZSBpcyBhbiBhdHRhY2sKLSogcmV0dXJuczogICAgICBUUlVFIGlmIHN1Y2Nlc3MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCi0JCQkJCSAgV29yZDMyIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50KQotewotICBXb3JkMzIgaSwgdzsKLSAgV29yZDMyIGVuTTEsIGVuTWF4OwotCi0gIC8qIFJlc2V0IGdyb3VwaW5nIGluZm8gKi8KLSAgZm9yIChpPTA7IGk8VFJBTlNfRkFDOyBpKyspIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuW2ldID0gMDsKLSAgfQotCi0KLSAgLyogU2VhcmNoIGZvciBwb3NpdGlvbiBhbmQgYW1wbGl0dWRlIG9mIGF0dGFjayBpbiBsYXN0IGZyYW1lICgxIHdpbmRvd3MgZGVsYXkpICovCi0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gU3JjaE1heFdpdGhJbmRleCggJmJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdW0JMT0NLX1NXSVRDSF9XSU5ET1dTLTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NXSVRDSF9XSU5ET1dTKTsKLQotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXg7Ci0KLSAgLyogU2V0IGdyb3VwaW5nIGluZm8gKi8KLSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzID0gTUFYX05PX09GX0dST1VQUzsKLQotICBmb3IgKGk9MDsgaTxNQVhfTk9fT0ZfR1JPVVBTOyBpKyspIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuW2ldID0gc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4XVtpXTsKLSAgfQotCi0gIC8qIGlmIHRoZSBzYW1wbGVyYXRlIGlzIGxlc3MgdGhhbiAxNjAwMCwgaXQgc2hvdWxkIGJlIGFsbCB0aGUgc2hvcnQgYmxvY2ssIGF2b2lkIHByZSZwb3N0IGVjaG8gKi8KLSAgaWYoc2FtcGxlUmF0ZSA+PSAxNjAwMCkgewotCSAgLyogU2F2ZSBjdXJyZW50IHdpbmRvdyBlbmVyZ3kgYXMgbGFzdCB3aW5kb3cgZW5lcmd5ICovCi0JICBmb3IgKHc9MDsgdzxCTE9DS19TV0lUQ0hfV0lORE9XUzsgdysrKSB7Ci0JCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF1bd10gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XTsKLQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bd10gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd107Ci0JICB9Ci0KLQotCSAgLyogQ2FsY3VsYXRlIHVuZmlsdGVyZWQgYW5kIGZpbHRlcmVkIGVuZXJnaWVzIGluIHN1YndpbmRvd3MgYW5kIGNvbWJpbmUgdG8gc2VnbWVudHMgKi8KLQkgIENhbGNXaW5kb3dFbmVyZ3koYmxvY2tTd2l0Y2hpbmdDb250cm9sLCB0aW1lU2lnbmFsLCBjaEluY3JlbWVudCwgQkxPQ0tfU1dJVENIX1dJTkRPV19MRU4pOwotCi0JICAvKiByZXNldCBhdHRhY2sgKi8KLQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gRkFMU0U7Ci0KLQkgIGVuTWF4ID0gMDsKLQkgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bQkxPQ0tfU1dJVENIX1dJTkRPV1MtMV07Ci0KLQkgIGZvciAodz0wOyB3PEJMT0NLX1NXSVRDSF9XSU5ET1dTOyB3KyspIHsKLQkJICBXb3JkMzIgZW5NMV9UbXAsIGFjY1dpbmRvd05yZ19UbXAsIHdpbmRvd05yZ0ZfVG1wOwotCQkgIFdvcmQxNiBlbk0xX1NoZiwgYWNjV2luZG93TnJnX1NoZiwgd2luZG93TnJnRl9TaGY7Ci0KLQkJICBhY2NXaW5kb3dOcmdfU2hmID0gbm9ybV9sKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnKTsKLQkJICBlbk0xX1NoZiA9IG5vcm1fbChlbk0xKTsKLQkJICB3aW5kb3dOcmdGX1NoZiA9IG5vcm1fbChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd10pOwotCi0JCSAgYWNjV2luZG93TnJnX1RtcCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnIDw8IGFjY1dpbmRvd05yZ19TaGY7Ci0JCSAgZW5NMV9UbXAgPSBlbk0xIDw8IGVuTTFfU2hmOwotCQkgIHdpbmRvd05yZ0ZfVG1wID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddIDw8IHdpbmRvd05yZ0ZfU2hmOwotCi0JCSAgLyogYSBzbGlkaW5nIGF2ZXJhZ2Ugb2YgdGhlIHByZXZpb3VzIGVuZXJnaWVzICovCi0JCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgPSAoZml4bXVsKG9uZU1pbnVzQWNjV2luZG93TnJnRmFjLCBhY2NXaW5kb3dOcmdfVG1wKSA+PiBhY2NXaW5kb3dOcmdfU2hmKSArCi0JCQkgIChmaXhtdWwoYWNjV2luZG93TnJnRmFjLCBlbk0xX1RtcCkgPj4gZW5NMV9TaGYpOwotCi0KLQkJICAvKiBpZiB0aGUgZW5lcmd5IHdpdGggdGhlIHJhdGlvIGlzIGJpZ2dlciB0aGFuIHRoZSBhdmVyYWdlLCBhbmQgdGhlIGF0dGFjayBhbmQgc2hvcnQgYmxvY2sgICovCi0JCSAgaWYgKChmaXhtdWwod2luZG93TnJnRl9UbXAsIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aW52QXR0YWNrUmF0aW8pID4+IHdpbmRvd05yZ0ZfU2hmKSA+Ci0JCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnICkgewotCQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOwotCQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPSB3OwotCQkgIH0KLQkJICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddOwotCQkgIGVuTWF4ID0gbWF4KGVuTWF4LCBlbk0xKTsKLQkgIH0KLQotCSAgaWYgKGVuTWF4IDwgbWluQXR0YWNrTnJnKSB7Ci0JCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBGQUxTRTsKLQkgIH0KLSAgfQotICBlbHNlCi0gIHsKLQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKLSAgfQotCi0gIC8qIENoZWNrIGlmIGF0dGFjayBzcHJlYWRzIG92ZXIgZnJhbWUgYm9yZGVyICovCi0gIGlmICgoIWJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrKSAmJiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrKSkgewotCi0gICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPT0gVFJBTlNfRkFDLTEpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKLSAgICB9Ci0KLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBGQUxTRTsKLSAgfQotICBlbHNlIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjazsKLSAgfQotCi0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2U7Ci0KLQotICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2spIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKLSAgfQotICBlbHNlIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOwotICB9Ci0KLSAgLyogdXBkYXRlIHNob3J0IGJsb2NrIGdyb3VwICovCi0gIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKLQotICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlPT0gTE9OR19XSU5ET1cpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSBTVEFSVF9XSU5ET1c7Ci0gICAgfQotCi0gICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPT0gU1RPUF9XSU5ET1cpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSAzOwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblswXSA9IDM7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzFdID0gMzsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5bMl0gPSAyOwotICAgIH0KLSAgfQotCi0gIC8qIHVwZGF0ZSBibG9jayB0eXBlICovCi0gIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9PSBMT05HX1dJTkRPVykgewotCi0gICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IFNUT1BfV0lORE9XOwotICAgIH0KLSAgfQotCi0gIHJldHVybihUUlVFKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogU3JjaE1heFdpdGhJbmRleAotKiBkZXNjcmlwdGlvbjogIHNlYXJjaCBmb3IgdGhlIGJpZ2dlc3QgdmFsdWUgaW4gYW4gYXJyYXkKLSogcmV0dXJuczogICAgICB0aGUgbWF4IHZhbHVlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQzMiBTcmNoTWF4V2l0aEluZGV4KGNvbnN0IFdvcmQzMiBpbltdLCBXb3JkMTYgKmluZGV4LCBXb3JkMTYgbikKLXsKLSAgV29yZDMyIG1heDsKLSAgV29yZDMyIGksIGlkeDsKLQotICAvKiBTZWFyY2ggbWF4aW11bSB2YWx1ZSBpbiBhcnJheSBhbmQgcmV0dXJuIGluZGV4IGFuZCB2YWx1ZSAqLwotICBtYXggPSAwOwotICBpZHggPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQotICAgIGlmIChpbltpKzFdICA+IG1heCkgewotICAgICAgbWF4ID0gaW5baSsxXTsKLSAgICAgIGlkeCA9IGk7Ci0gICAgfQotICB9Ci0gICppbmRleCA9IGlkeDsKLQotICByZXR1cm4obWF4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENhbGNXaW5kb3dFbmVyZ3kKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgdGhlIGVuZXJneSBiZWZvcmUgaWlyLWZpbHRlciBhbmQgYWZ0ZXIgaXJyLWZpbHRlcgotKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQVJNVjVFCi1Xb3JkMzIgQ2FsY1dpbmRvd0VuZXJneShCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd0xlbikKLXsKLSAgV29yZDMyIHcsIGksIHRpZHg7Ci0gIFdvcmQzMiBhY2N1VUUsIGFjY3VGRTsKLSAgV29yZDMyIHRlbXBVbmZpbHRlcmVkOwotICBXb3JkMzIgdGVtcEZpbHRlcmVkOwotICBXb3JkMzIgc3RhdGVzMCwgc3RhdGVzMTsKLSAgV29yZDMyIENvZWZmMCwgQ29lZmYxOwotCi0KLSAgc3RhdGVzMCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdOwotICBzdGF0ZXMxID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07Ci0gIENvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOwotICBDb2VmZjEgPSBoaVBhc3NDb2VmZlsxXTsKLSAgdGlkeCA9IDA7Ci0gIGZvciAodz0wOyB3IDwgQkxPQ0tfU1dJVENIX1dJTkRPV1M7IHcrKykgewotCi0gICAgYWNjdVVFID0gMDsKLSAgICBhY2N1RkUgPSAwOwotCi0gICAgZm9yKGk9MDsgaTx3aW5kb3dMZW47IGkrKykgewotCSAgV29yZDMyIGFjY3UxLCBhY2N1MiwgYWNjdTM7Ci0JICBXb3JkMzIgb3V0OwotCSAgdGVtcFVuZmlsdGVyZWQgPSB0aW1lU2lnbmFsW3RpZHhdOwotICAgICAgdGlkeCA9IHRpZHggKyBjaEluY3JlbWVudDsKLQotCSAgYWNjdTEgPSBMX21weV9scyhDb2VmZjEsIHRlbXBVbmZpbHRlcmVkKTsKLQkgIGFjY3UyID0gZml4bXVsKCBDb2VmZjAsIHN0YXRlczEgKTsKLQkgIGFjY3UzID0gYWNjdTEgLSBzdGF0ZXMwOwotCSAgb3V0ID0gYWNjdTMgLSBhY2N1MjsKLQotCSAgc3RhdGVzMCA9IGFjY3UxOwotCSAgc3RhdGVzMSA9IG91dDsKLQotICAgICAgdGVtcEZpbHRlcmVkID0gZXh0cmFjdF9oKG91dCk7Ci0gICAgICBhY2N1VUUgKz0gKHRlbXBVbmZpbHRlcmVkICogdGVtcFVuZmlsdGVyZWQpID4+IEVORVJHWV9TSElGVDsKLSAgICAgIGFjY3VGRSArPSAodGVtcEZpbHRlcmVkICogdGVtcEZpbHRlcmVkKSA+PiBFTkVSR1lfU0hJRlQ7Ci0gICAgfQotCi0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMV1bd10gPSBhY2N1VUU7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddID0gYWNjdUZFOwotCi0gIH0KLQotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXSA9IHN0YXRlczA7Ci0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzFdID0gc3RhdGVzMTsKLQotICByZXR1cm4oVFJVRSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIFdvcmQxNiBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVs0XVs0XSA9IHsKLSAgLyogICAgICAgICAgICAgICAgIExPTkdfV0lORE9XICAgU1RBUlRfV0lORE9XICBTSE9SVF9XSU5ET1cgIFNUT1BfV0lORE9XICovCi0gIC8qIExPTkdfV0lORE9XICAqL3tMT05HX1dJTkRPVywgIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTVE9QX1dJTkRPV30sCi0gIC8qIFNUQVJUX1dJTkRPVyAqL3tTVEFSVF9XSU5ET1csIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1d9LAotICAvKiBTSE9SVF9XSU5ET1cgKi97U0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XfSwKLSAgLyogU1RPUF9XSU5ET1cgICove1NUT1BfV0lORE9XLCAgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUT1BfV0lORE9XfQotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogU3luY0Jsb2NrU3dpdGNoaW5nCi0qIGRlc2NyaXB0aW9uOiAgdXBkYXRlIGJsb2NrIHR5cGUgYW5kIGdyb3VwIHZhbHVlCi0qIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFN5bmNCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKQotewotICBXb3JkMTYgaTsKLSAgV29yZDE2IHBhdGNoVHlwZSA9IExPTkdfV0lORE9XOwotCi0KLSAgaWYgKG5DaGFubmVscyA9PSAxKSB7IC8qIE1vbm8gKi8KLSAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gMTsKLQotICAgICAgZm9yIChpPTE7IGk8VFJBTlNfRkFDOyBpKyspIHsKLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOwotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIHsgLyogU3RlcmVvIGNvbW1vbiBXaW5kb3cgKi8KLSAgICBwYXRjaFR5cGUgPSBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVtwYXRjaFR5cGVdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NlcXVlbmNlXTsKLSAgICBwYXRjaFR5cGUgPSBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVtwYXRjaFR5cGVdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTZXF1ZW5jZV07Ci0KLSAgICAvKiBTZXQgc3luY2hyb25pemVkIEJsb2NrdHlwZSAqLwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NlcXVlbmNlID0gcGF0Y2hUeXBlOwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTZXF1ZW5jZSA9IHBhdGNoVHlwZTsKLQotICAgIC8qIFN5bmNocm9uaXplIGdyb3VwaW5nIGluZm8gKi8KLSAgICBpZihwYXRjaFR5cGUgIT0gU0hPUlRfV0lORE9XKSB7IC8qIExvbmcgQmxvY2tzICovCi0gICAgICAvKiBTZXQgZ3JvdXBpbmcgaW5mbyAqLwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IDE7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IDE7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMF0gPSAxOwotCi0gICAgICBmb3IgKGk9MTsgaTxUUkFOU19GQUM7IGkrKykgewotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IDA7Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXSA9IDA7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bWF4V2luZG93TnJnID4gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm1heFdpbmRvd05yZykgewotICAgICAgICAvKiBMZWZ0IENoYW5uZWwgd2lucyAqLwotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHM7Ci0gICAgICAgIGZvciAoaT0wOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvKiBSaWdodCBDaGFubmVsIHdpbnMgKi8KLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzOwotICAgICAgICBmb3IgKGk9MDsgaTxUUkFOU19GQUM7IGkrKykgewotICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IC8qZW5kaWYgTW9ubyBvciBTdGVyZW8gKi8KLQotICByZXR1cm4oVFJVRSk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9jaGFubmVsX21hcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvY2hhbm5lbF9tYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1NTJlZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9jaGFubmVsX21hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJY2hhbm5lbF9tYXAuYwotCi0JQ29udGVudDoJY2hhbm5lbCBtYXBwaW5nIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKLSNpbmNsdWRlICJiaXRlbmMuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJxY19kYXRhLmgiCi0KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWF4Q2hhbm5lbEJpdHMgPSBNQVhCSVRTX0NPRUY7Ci0KLXN0YXRpYyBXb3JkMTYgaW5pdEVsZW1lbnQoRUxFTUVOVF9JTkZPKiBlbEluZm8sIEVMRU1FTlRfVFlQRSBlbFR5cGUpCi17Ci0gIFdvcmQxNiBlcnJvcj0wOwotCi0gIGVsSW5mby0+ZWxUeXBlPWVsVHlwZTsKLQotICBzd2l0Y2goZWxJbmZvLT5lbFR5cGUpIHsKLQotICAgIGNhc2UgSURfU0NFOgotICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTE7Ci0KLSAgICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPTA7Ci0KLSAgICAgIGVsSW5mby0+aW5zdGFuY2VUYWc9MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJRF9DUEU6Ci0KLSAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0yOwotCi0gICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXT0wOwotICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMV09MTsKLQotICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3I9MTsKLSAgfQotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotCi1Xb3JkMTYgSW5pdEVsZW1lbnRJbmZvIChXb3JkMTYgbkNoYW5uZWxzLCBFTEVNRU5UX0lORk8qIGVsSW5mbykKLXsKLSAgV29yZDE2IGVycm9yOwotICBlcnJvciA9IDA7Ci0KLSAgc3dpdGNoKG5DaGFubmVscykgewotCi0gICAgY2FzZSAxOgotICAgICAgaW5pdEVsZW1lbnQoZWxJbmZvLCBJRF9TQ0UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBpbml0RWxlbWVudChlbEluZm8sIElEX0NQRSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvcj00OwotICB9Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0KLVdvcmQxNiBJbml0RWxlbWVudEJpdHMoRUxFTUVOVF9CSVRTICplbGVtZW50Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdHJhdGVUb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhdmVyYWdlQml0c1RvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0YXRpY0JpdHNUb3QpCi17Ci0gIFdvcmQxNiBlcnJvcjsKLSAgZXJyb3IgPSAwOwotCi0gICBzd2l0Y2goZWxJbmZvLm5DaGFubmVsc0luRWwpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBlbGVtZW50Qml0cy0+Y2hCaXRyYXRlID0gYml0cmF0ZVRvdDsKLSAgICAgIGVsZW1lbnRCaXRzLT5hdmVyYWdlQml0cyA9IGF2ZXJhZ2VCaXRzVG90IC0gc3RhdGljQml0c1RvdDsKLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRzID0gbWF4Q2hhbm5lbEJpdHM7Ci0KLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gbWF4Q2hhbm5lbEJpdHMgLSBhdmVyYWdlQml0c1RvdDsKLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgLSAoZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgJiA3KTsKLSAgICAgIGVsZW1lbnRCaXRzLT5iaXRSZXNMZXZlbCA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzOwotICAgICAgZWxlbWVudEJpdHMtPnJlbGF0aXZlQml0cyAgPSAweDQwMDA7IC8qIDEuMGYvMiAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBlbGVtZW50Qml0cy0+Y2hCaXRyYXRlICAgPSBiaXRyYXRlVG90ID4+IDE7Ci0gICAgICBlbGVtZW50Qml0cy0+YXZlcmFnZUJpdHMgPSBhdmVyYWdlQml0c1RvdCAtIHN0YXRpY0JpdHNUb3Q7Ci0gICAgICBlbGVtZW50Qml0cy0+bWF4Qml0cyAgICAgPSBtYXhDaGFubmVsQml0cyA8PCAxOwotCi0gICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IChtYXhDaGFubmVsQml0cyA8PCAxKSAtIGF2ZXJhZ2VCaXRzVG90OwotICAgICAgZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyAtIChlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyAmIDcpOwotICAgICAgZWxlbWVudEJpdHMtPmJpdFJlc0xldmVsID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHM7Ci0gICAgICBlbGVtZW50Qml0cy0+cmVsYXRpdmVCaXRzID0gMHg0MDAwOyAvKiAxLjBmLzIgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gMTsKLSAgfQotICByZXR1cm4gZXJyb3I7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1YjQ4Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUxICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJZHluX2JpdHMuYwotCi0JQ29udGVudDoJTm9pc2VsZXNzIGNvZGVyIG1vZHVsZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJOb2lzZWxlc3NDb2RlciIKLQotI2luY2x1ZGUgImxvZy9sb2cuaCIKLQotI2luY2x1ZGUgImFhY19yb20uaCIKLSNpbmNsdWRlICJkeW5fYml0cy5oIgotI2luY2x1ZGUgImJpdF9jbnQuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGJ1aWxkQml0TG9va1VwCi0qIGRlc2NyaXB0aW9uOiAgY291bnQgYml0cyB1c2luZyBhbGwgcG9zc2libGUgdGFibGVzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1idWlsZEJpdExvb2tVcChjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBjb25zdCBVV29yZDE2ICpzZmJNYXgsCi0gICAgICAgICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgICAgICAgIFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvKQotewotICBXb3JkMzIgaTsKLQotICBmb3IgKGk9MDsgaTxtYXhTZmI7IGkrKykgewotICAgIFdvcmQxNiBzZmJXaWR0aCwgbWF4VmFsOwotCi0gICAgc2VjdGlvbkluZm9baV0uc2ZiQ250ID0gMTsKLSAgICBzZWN0aW9uSW5mb1tpXS5zZmJTdGFydCA9IGk7Ci0gICAgc2VjdGlvbkluZm9baV0uc2VjdGlvbkJpdHMgPSBJTlZBTElEX0JJVENPVU5UOwotICAgIHNlY3Rpb25JbmZvW2ldLmNvZGVCb29rID0gLTE7Ci0gICAgc2ZiV2lkdGggPSBzZmJPZmZzZXRbaSArIDFdIC0gc2ZiT2Zmc2V0W2ldOwotICAgIG1heFZhbCA9IHNmYk1heFtpXTsKLSAgICBiaXRDb3VudChxdWFudFNwZWN0cnVtICsgc2ZiT2Zmc2V0W2ldLCBzZmJXaWR0aCwgbWF4VmFsLCBiaXRMb29rVXBbaV0pOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGZpbmRCZXN0Qm9vawotKiBkZXNjcmlwdGlvbjogIGVzc2VudGlhbCBoZWxwZXIgZnVuY3Rpb25zCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYKLWZpbmRCZXN0Qm9vayhjb25zdCBXb3JkMTYgKmJjLCBXb3JkMTYgKmJvb2spCi17Ci0gIFdvcmQzMiBtaW5CaXRzLCBqOwotICBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsKLQotICBmb3IgKGo9MDsgajw9Q09ERV9CT09LX0VTQ19ORFg7IGorKykgewotCi0gICAgaWYgKGJjW2pdIDwgbWluQml0cykgewotICAgICAgbWluQml0cyA9IGJjW2pdOwotICAgICAgKmJvb2sgPSBqOwotICAgIH0KLSAgfQotICByZXR1cm4gZXh0cmFjdF9sKG1pbkJpdHMpOwotfQotCi1zdGF0aWMgV29yZDE2Ci1maW5kTWluTWVyZ2VCaXRzKGNvbnN0IFdvcmQxNiAqYmMxLCBjb25zdCBXb3JkMTYgKmJjMikKLXsKLSAgV29yZDMyIG1pbkJpdHMsIGosIHN1bTsKLSAgbWluQml0cyA9IElOVkFMSURfQklUQ09VTlQ7Ci0KLSAgZm9yIChqPTA7IGo8PUNPREVfQk9PS19FU0NfTkRYOyBqKyspIHsKLSAgICBzdW0gPSBiYzFbal0gKyBiYzJbal07Ci0gICAgaWYgKHN1bSA8IG1pbkJpdHMpIHsKLSAgICAgIG1pbkJpdHMgPSBzdW07Ci0gICAgfQotICB9Ci0gIHJldHVybiBleHRyYWN0X2wobWluQml0cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZXJnZUJpdExvb2tVcChXb3JkMTYgKmJjMSwgY29uc3QgV29yZDE2ICpiYzIpCi17Ci0gIFdvcmQzMiBqOwotCi0gIGZvciAoaj0wOyBqPD1DT0RFX0JPT0tfRVNDX05EWDsgaisrKSB7Ci0gICAgYmMxW2pdID0gbWluKGJjMVtqXSArIGJjMltqXSwgSU5WQUxJRF9CSVRDT1VOVCk7Ci0gIH0KLX0KLQotc3RhdGljIFdvcmQxNgotZmluZE1heE1lcmdlKGNvbnN0IFdvcmQxNiBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXSwKLSAgICAgICAgICAgICBjb25zdCBTRUNUSU9OX0lORk8gKnNlY3Rpb25JbmZvLAotICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIsIFdvcmQxNiAqbWF4TmR4KQotewotICBXb3JkMzIgaSwgbWF4TWVyZ2VHYWluOwotICBtYXhNZXJnZUdhaW4gPSAwOwotCi0gIGZvciAoaT0wOyBpK3NlY3Rpb25JbmZvW2ldLnNmYkNudCA8IG1heFNmYjsgaSArPSBzZWN0aW9uSW5mb1tpXS5zZmJDbnQpIHsKLQotICAgIGlmIChtZXJnZUdhaW5Mb29rVXBbaV0gPiBtYXhNZXJnZUdhaW4pIHsKLSAgICAgIG1heE1lcmdlR2FpbiA9IG1lcmdlR2Fpbkxvb2tVcFtpXTsKLSAgICAgICptYXhOZHggPSBpOwotICAgIH0KLSAgfQotICByZXR1cm4gZXh0cmFjdF9sKG1heE1lcmdlR2Fpbik7Ci19Ci0KLQotCi1zdGF0aWMgV29yZDE2Ci1DYWxjTWVyZ2VHYWluKGNvbnN0IFNFQ1RJT05fSU5GTyAqc2VjdGlvbkluZm8sCi0gICAgICAgICAgICAgIFdvcmQxNiBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAotICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNpZGVJbmZvVGFiLAotICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbmR4MSwKLSAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5keDIpCi17Ci0gIFdvcmQzMiBTcGxpdEJpdHM7Ci0gIFdvcmQzMiBNZXJnZUJpdHM7Ci0gIFdvcmQzMiBNZXJnZUdhaW47Ci0KLSAgLyoKLSAgICBCaXQgYW1vdW50IGZvciBzcGxpdHRlZCBzZWN0aW9ucwotICAqLwotICBTcGxpdEJpdHMgPSBzZWN0aW9uSW5mb1tuZHgxXS5zZWN0aW9uQml0cyArIHNlY3Rpb25JbmZvW25keDJdLnNlY3Rpb25CaXRzOwotCi0gIE1lcmdlQml0cyA9IHNpZGVJbmZvVGFiW3NlY3Rpb25JbmZvW25keDFdLnNmYkNudCArIHNlY3Rpb25JbmZvW25keDJdLnNmYkNudF0gKwotICAgICAgICAgICAgICAgICAgZmluZE1pbk1lcmdlQml0cyhiaXRMb29rVXBbbmR4MV0sIGJpdExvb2tVcFtuZHgyXSk7Ci0gIE1lcmdlR2FpbiA9IChTcGxpdEJpdHMgLSBNZXJnZUJpdHMpOwotCi0gIHJldHVybiBleHRyYWN0X2woTWVyZ2VHYWluKTsKLX0KLQotLyoKLSAgc2VjdGlvbmluZyBTdGFnZSAwOmZpbmQgbWluaW11bSBjb2Rib29rcwotKi8KLQotc3RhdGljIHZvaWQKLWdtU3RhZ2UwKFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvLAotICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiKQotewotICBXb3JkMzIgaTsKLQotICBmb3IgKGk9MDsgaTxtYXhTZmI7IGkrKykgewotICAgIC8qIFNpZGUtSW5mbyBiaXRzIHdpbGwgYmUgY2FsY3VsYXRlZCBpbiBTdGFnZSAxISAgKi8KLQotICAgIGlmIChzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9PSBJTlZBTElEX0JJVENPVU5UKSB7Ci0gICAgICBzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9IGZpbmRCZXN0Qm9vayhiaXRMb29rVXBbaV0sICYoc2VjdGlvbkluZm9baV0uY29kZUJvb2spKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoKLSAgc2VjdGlvbmluZyBTdGFnZSAxOm1lcmdlIGFsbCBjb25uZWN0ZWQgcmVnaW9ucyB3aXRoIHRoZSBzYW1lIGNvZGUgYm9vayBhbmQKLSAgY2FsY3VsYXRlIHNpZGUgaW5mbwotKi8KLQotc3RhdGljIHZvaWQKLWdtU3RhZ2UxKFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvLAotICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiLAotICAgICAgICAgY29uc3QgV29yZDE2ICpzaWRlSW5mb1RhYikKLXsKLSAgU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm9fczsKLSAgU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm9fZTsKLSAgV29yZDMyIG1lcmdlU3RhcnQsIG1lcmdlRW5kOwotICBtZXJnZVN0YXJ0ID0gMDsKLQotICBkbyB7Ci0KLSAgICBzZWN0aW9uSW5mb19zID0gc2VjdGlvbkluZm8gKyBtZXJnZVN0YXJ0OwotCWZvciAobWVyZ2VFbmQ9bWVyZ2VTdGFydCsxOyBtZXJnZUVuZDxtYXhTZmI7IG1lcmdlRW5kKyspIHsKLSAgICAgIHNlY3Rpb25JbmZvX2UgPSBzZWN0aW9uSW5mbyArIG1lcmdlRW5kOwotICAgICAgaWYgKHNlY3Rpb25JbmZvX3MtPmNvZGVCb29rICE9IHNlY3Rpb25JbmZvX2UtPmNvZGVCb29rKQotICAgICAgICBicmVhazsKLSAgICAgIHNlY3Rpb25JbmZvX3MtPnNmYkNudCArPSAxOwotICAgICAgc2VjdGlvbkluZm9fcy0+c2VjdGlvbkJpdHMgKz0gc2VjdGlvbkluZm9fZS0+c2VjdGlvbkJpdHM7Ci0KLSAgICAgIG1lcmdlQml0TG9va1VwKGJpdExvb2tVcFttZXJnZVN0YXJ0XSwgYml0TG9va1VwW21lcmdlRW5kXSk7Ci0gICAgfQotCi0gICAgc2VjdGlvbkluZm9fcy0+c2VjdGlvbkJpdHMgKz0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9fcy0+c2ZiQ250XTsKLSAgICBzZWN0aW9uSW5mb1ttZXJnZUVuZCAtIDFdLnNmYlN0YXJ0ID0gc2VjdGlvbkluZm9fcy0+c2ZiU3RhcnQ7ICAgICAgLyogc3BlZWQgdXAgcHJldiBzZWFyY2ggKi8KLQotICAgIG1lcmdlU3RhcnQgPSBtZXJnZUVuZDsKLQotCi0gIH0gd2hpbGUgKG1lcmdlU3RhcnQgLSBtYXhTZmIgPCAwKTsKLX0KLQotLyoKLSAgc2VjdGlvbmluZyBTdGFnZSAyOmdyZWVkeSBtZXJnZSBhbGdvcml0aG0sIG1lcmdlIGNvbm5lY3RlZCBzZWN0aW9ucyB3aXRoCi0gIG1heGltdW0gYml0IGdhaW4gdW50aWwgbm8gbW9yZSBnYWluIGlzIHBvc3NpYmxlCi0qLwotc3RhdGljIHZvaWQKLWdtU3RhZ2UyKFNFQ1RJT05fSU5GTyAqc2VjdGlvbkluZm8sCi0gICAgICAgICBXb3JkMTYgbWVyZ2VHYWluTG9va1VwW01BWF9TRkJfTE9OR10sCi0gICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIsCi0gICAgICAgICBjb25zdCBXb3JkMTYgKnNpZGVJbmZvVGFiKQotewotICBXb3JkMTYgaTsKLQotICBmb3IgKGk9MDsgaStzZWN0aW9uSW5mb1tpXS5zZmJDbnQ8bWF4U2ZiOyBpKz1zZWN0aW9uSW5mb1tpXS5zZmJDbnQpIHsKLSAgICBtZXJnZUdhaW5Mb29rVXBbaV0gPSBDYWxjTWVyZ2VHYWluKHNlY3Rpb25JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgKyBzZWN0aW9uSW5mb1tpXS5zZmJDbnQpKTsKLSAgfQotCi0gIHdoaWxlIChUUlVFKSB7Ci0gICAgV29yZDE2IG1heE1lcmdlR2FpbiwgbWF4TmR4ID0gMCwgbWF4TmR4TmV4dCwgbWF4TmR4TGFzdDsKLQotICAgIG1heE1lcmdlR2FpbiA9IGZpbmRNYXhNZXJnZShtZXJnZUdhaW5Mb29rVXAsIHNlY3Rpb25JbmZvLCBtYXhTZmIsICZtYXhOZHgpOwotCi0KLSAgICBpZiAobWF4TWVyZ2VHYWluIDw9IDApCi0gICAgICBicmVhazsKLQotCi0gICAgbWF4TmR4TmV4dCA9IG1heE5keCArIHNlY3Rpb25JbmZvW21heE5keF0uc2ZiQ250OwotCi0gICAgc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJDbnQgPSBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYkNudCArIHNlY3Rpb25JbmZvW21heE5keE5leHRdLnNmYkNudDsKLSAgICBzZWN0aW9uSW5mb1ttYXhOZHhdLnNlY3Rpb25CaXRzID0gc2VjdGlvbkluZm9bbWF4TmR4XS5zZWN0aW9uQml0cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VjdGlvbkluZm9bbWF4TmR4TmV4dF0uc2VjdGlvbkJpdHMgLSBtYXhNZXJnZUdhaW4pOwotCi0KLSAgICBtZXJnZUJpdExvb2tVcChiaXRMb29rVXBbbWF4TmR4XSwgYml0TG9va1VwW21heE5keE5leHRdKTsKLQotCi0gICAgaWYgKG1heE5keCAhPSAwKSB7Ci0gICAgICBtYXhOZHhMYXN0ID0gc2VjdGlvbkluZm9bbWF4TmR4IC0gMV0uc2ZiU3RhcnQ7Ci0gICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4TGFzdF0gPSBDYWxjTWVyZ2VHYWluKHNlY3Rpb25JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVJbmZvVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHhMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHgpOwotICAgIH0KLSAgICBtYXhOZHhOZXh0ID0gbWF4TmR4ICsgc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJDbnQ7Ci0KLSAgICBzZWN0aW9uSW5mb1ttYXhOZHhOZXh0IC0gMV0uc2ZiU3RhcnQgPSBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYlN0YXJ0OwotCi0KLSAgICBpZiAobWF4TmR4TmV4dCAtIG1heFNmYiA8IDApIHsKLSAgICAgIG1lcmdlR2Fpbkxvb2tVcFttYXhOZHhdID0gQ2FsY01lcmdlR2FpbihzZWN0aW9uSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE5keE5leHQpOwotICAgIH0KLSAgfQotfQotCi0vKgotICBjb3VudCBiaXRzIHVzZWQgYnkgdGhlIG5vaXNlbGVzcyBjb2RlcgotKi8KLXN0YXRpYyB2b2lkCi1ub2lzZWxlc3NDb3VudGVyKFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBibG9ja1R5cGUpCi17Ci0gIFdvcmQzMiBncnBOZHgsIGk7Ci0gIGNvbnN0IFdvcmQxNiAqc2lkZUluZm9UYWIgPSBOVUxMOwotICBTRUNUSU9OX0lORk8gKnNlY3Rpb25JbmZvOwotCi0gIC8qCi0gICAgdXNlIGFwcHJvcHJpYXRlIHNpZGUgaW5mbyB0YWJsZQotICAqLwotICBzd2l0Y2ggKGJsb2NrVHlwZSkKLSAgewotICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgY2FzZSBTVEFSVF9XSU5ET1c6Ci0gICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgIHNpZGVJbmZvVGFiID0gc2lkZUluZm9UYWJMb25nOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICBzaWRlSW5mb1RhYiA9IHNpZGVJbmZvVGFiU2hvcnQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQUxPR0UoImludmFsaWQgYmxvY2tUeXBlOiAlZCIsIGJsb2NrVHlwZSk7Ci0gICAgICByZXR1cm47Ci0gIH0KLQotCi0gIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgPSAwOwotICBzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgPSAwOwotICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzID0gMDsKLQotCi0gIGlmIChzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyoKLSAgICBsb29wIHRyb3VnaCBncm91cHMKLSAgKi8KLSAgZm9yIChncnBOZHg9MDsgZ3JwTmR4PHNlY3Rpb25EYXRhLT5zZmJDbnQ7IGdycE5keCs9c2VjdGlvbkRhdGEtPnNmYlBlckdyb3VwKSB7Ci0KLSAgICBzZWN0aW9uSW5mbyA9IHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mbyArIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7Ci0KLSAgICBidWlsZEJpdExvb2tVcChxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQgKyBncnBOZHgsCi0gICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiArIGdycE5keCwKLSAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgc2VjdGlvbkluZm8pOwotCi0gICAgLyoKLSAgICAgICAwLlN0YWdlCi0gICAgKi8KLSAgICBnbVN0YWdlMChzZWN0aW9uSW5mbywgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXApOwotCi0gICAgLyoKLSAgICAgICAxLlN0YWdlCi0gICAgKi8KLSAgICBnbVN0YWdlMShzZWN0aW9uSW5mbywgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsIHNpZGVJbmZvVGFiKTsKLQotCi0gICAgLyoKLSAgICAgICAyLlN0YWdlCi0gICAgKi8KLSAgICBnbVN0YWdlMihzZWN0aW9uSW5mbywKLSAgICAgICAgICAgICBtZXJnZUdhaW5Mb29rVXAsCi0gICAgICAgICAgICAgYml0TG9va1VwLAotICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICBzaWRlSW5mb1RhYik7Ci0KLQotICAgIC8qCi0gICAgICAgY29tcHJlc3Mgb3V0cHV0LCBjYWxjdWxhdGUgdG90YWwgaHVmZiBhbmQgc2lkZSBiaXRzCi0gICAgKi8KLSAgICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXA7IGkrPXNlY3Rpb25JbmZvW2ldLnNmYkNudCkgewotICAgICAgZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihzZWN0aW9uSW5mb1tpXS5jb2RlQm9vaykpOwotICAgICAgc2VjdGlvbkluZm9baV0uc2ZiU3RhcnQgPSBzZWN0aW9uSW5mb1tpXS5zZmJTdGFydCArIGdycE5keDsKLQotICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzID0gKHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY3Rpb25JbmZvW2ldLnNlY3Rpb25CaXRzIC0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9baV0uc2ZiQ250XSkpOwotICAgICAgc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyA9IChzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsgc2lkZUluZm9UYWJbc2VjdGlvbkluZm9baV0uc2ZiQ250XSk7Ci0gICAgICBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9bc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uc10gPSBzZWN0aW9uSW5mb1tpXTsKLSAgICAgIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgPSBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zICsgMTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbm5hbWU6IHNjZkNvdW50Ci0qIHJldHVybnMgICAgIDogLS0tCi0qIGRlc2NyaXB0aW9uIDogY291bnQgYml0cyB1c2VkIGJ5IHNjYWxlZmFjdG9ycy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2NmQ291bnQoY29uc3QgV29yZDE2ICpzY2FsZWZhY0dhaW4sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDE2ICptYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICogc2VjdGlvbkRhdGEpCi0KLXsKLSAgU0VDVElPTl9JTkZPICpwc2VjdGlvbkluZm87Ci0gIFNFQ1RJT05fSU5GTyAqcHNlY3Rpb25JbmZvbTsKLQotICAvKiBjb3VudGVyICovCi0gIFdvcmQzMiBpID0gMDsgLyogc2VjdGlvbiBjb3VudGVyICovCi0gIFdvcmQzMiBqID0gMDsgLyogc2ZiIGNvdW50ZXIgKi8KLSAgV29yZDMyIGsgPSAwOyAvKiBjdXJyZW50IHNlY3Rpb24gYXV4aWxpYXJ5IGNvdW50ZXIgKi8KLSAgV29yZDMyIG0gPSAwOyAvKiBvdGhlciBzZWN0aW9uIGF1eGlsaWFyeSBjb3VudGVyICovCi0gIFdvcmQzMiBuID0gMDsgLyogb3RoZXIgc2ZiIGF1eGlsaWFyeSBjb3VudGVyICovCi0KLSAgLyogZnVydGhlciB2YXJpYWJsZXMgKi8KLSAgV29yZDMyIGxhc3RWYWxTY2YgICAgID0gMDsKLSAgV29yZDMyIGRlbHRhU2NmICAgICAgID0gMDsKLSAgRmxhZyBmb3VuZCAgICAgICAgICAgID0gMDsKLSAgV29yZDMyIHNjZlNraXBDb3VudGVyID0gMDsKLQotCi0gIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgPSAwOwotCi0KLSAgaWYgKHNjYWxlZmFjR2FpbiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbGFzdFZhbFNjZiA9IDA7Ci0gIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IDA7Ci0KLSAgcHNlY3Rpb25JbmZvID0gc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvOwotICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspIHsKLQotICAgIGlmIChwc2VjdGlvbkluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKSB7Ci0gICAgICBzZWN0aW9uRGF0YS0+Zmlyc3RTY2YgPSBwc2VjdGlvbkluZm8tPnNmYlN0YXJ0OwotICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOwotICAgICAgYnJlYWs7Ci0gICAgfQotCXBzZWN0aW9uSW5mbyArPSAxOwotICB9Ci0KLSAgcHNlY3Rpb25JbmZvID0gc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvOwotICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyssIHBzZWN0aW9uSW5mbyArPSAxKSB7Ci0KLSAgICBpZiAocHNlY3Rpb25JbmZvLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTwotICAgICAgICAmJiBwc2VjdGlvbkluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pIHsKLSAgICAgIGZvciAoaiA9IHBzZWN0aW9uSW5mby0+c2ZiU3RhcnQ7Ci0gICAgICAgICAgIGogPCAocHNlY3Rpb25JbmZvLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mby0+c2ZiQ250KTsgaisrKSB7Ci0gICAgICAgIC8qIGNoZWNrIGlmIHdlIGNhbiByZXBlYXQgdGhlIGxhc3QgdmFsdWUgdG8gc2F2ZSBiaXRzICovCi0KLSAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJbal0gPT0gMCkgewotICAgICAgICAgIGZvdW5kID0gMDsKLQotICAgICAgICAgIGlmIChzY2ZTa2lwQ291bnRlciA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBlbmQgb2Ygc2VjdGlvbiAqLwotCi0gICAgICAgICAgICBpZiAoaiAtICgocHNlY3Rpb25JbmZvLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mby0+c2ZiQ250KSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgZm91bmQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIGZvciAoayA9IGogKyAxOyBrIDwgcHNlY3Rpb25JbmZvLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mby0+c2ZiQ250OyBrKyspIHsKLQotICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2tdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgIGludCB0bXAgPSBMX2FicyhzY2FsZWZhY0dhaW5ba10gLSBsYXN0VmFsU2NmKTsKLQkJCQkgIGZvdW5kID0gMTsKLQotICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgPCBDT0RFX0JPT0tfU0NGX0xBVikgewotICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBzYXZlIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogY291bnQgc2NhbGVmYWN0b3Igc2tpcCAqLwotICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gc2NmU2tpcENvdW50ZXIgKyAxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQkJCXBzZWN0aW9uSW5mb20gPSBwc2VjdGlvbkluZm8gKyAxOwotICAgICAgICAgICAgLyogc2VhcmNoIGZvciB0aGUgbmV4dCBtYXhWYWx1ZUluU2ZiW10gIT0gMCBpbiBhbGwgb3RoZXIgc2VjdGlvbnMgKi8KLSAgICAgICAgICAgIGZvciAobSA9IGkgKyAxOyAobSA8IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMpICYmIChmb3VuZCA9PSAwKTsgbSsrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKChwc2VjdGlvbkluZm9tLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgJiYKLSAgICAgICAgICAgICAgICAgIChwc2VjdGlvbkluZm9tLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSkgewotICAgICAgICAgICAgICAgIGZvciAobiA9IHBzZWN0aW9uSW5mb20tPnNmYlN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgbiA8IChwc2VjdGlvbkluZm9tLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mb20tPnNmYkNudCk7IG4rKykgewotCi0gICAgICAgICAgICAgICAgICBpZiAobWF4VmFsdWVJblNmYltuXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChhYnNfcyhzY2FsZWZhY0dhaW5bbl0gLSBsYXN0VmFsU2NmKSA8IENPREVfQk9PS19TQ0ZfTEFWKSkgewotICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IChsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIC8qIGNvdW50IHNjYWxlZmFjdG9yIHNraXAgKi8KLSAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gc2NmU2tpcENvdW50ZXIgKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0JCQkgIHBzZWN0aW9uSW5mb20gKz0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsKLSAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwotICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwotICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSBzY2ZTa2lwQ291bnRlciAtIDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjR2FpbltqXTsKLSAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICB9Ci0gICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi10eXBlZGVmIFdvcmQxNiAoKmxvb2tVcFRhYmxlKVtDT0RFX0JPT0tfRVNDX05EWCArIDFdOwotCi0KLVdvcmQxNgotZHluQml0Q291bnQoY29uc3QgV29yZDE2ICAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgIGNvbnN0IFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzY2FsZWZhYywKLSAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIGJsb2NrVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHNmYkNudCwKLSAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICBTRUNUSU9OX0RBVEEgICpzZWN0aW9uRGF0YSkKLXsKLSAgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSAgICAgID0gYmxvY2tUeXBlOwotICBzZWN0aW9uRGF0YS0+c2ZiQ250ICAgICAgICAgPSBzZmJDbnQ7Ci0gIHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCAgICA9IHNmYlBlckdyb3VwOwotICBpZihzZmJQZXJHcm91cCkKLQlzZWN0aW9uRGF0YS0+bm9PZkdyb3VwcyAgID0gc2ZiQ250L3NmYlBlckdyb3VwOwotICBlbHNlCi0Jc2VjdGlvbkRhdGEtPm5vT2ZHcm91cHMgICA9IDB4N2ZmZjsKLSAgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwID0gbWF4U2ZiUGVyR3JvdXA7Ci0KLSAgbm9pc2VsZXNzQ291bnRlcihzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+bWVyZ2VHYWluTG9va1VwLAotICAgICAgICAgICAgICAgICAgIChsb29rVXBUYWJsZSlzZWN0aW9uRGF0YS0+Yml0TG9va1VwLAotICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlKTsKLQotICBzY2ZDb3VudChzY2FsZWZhYywKLSAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgc2VjdGlvbkRhdGEpOwotCi0KLSAgcmV0dXJuIChzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgKyBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsKLQkgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2dycF9kYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmI5NWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWdycF9kYXRhLmMKLQotCUNvbnRlbnQ6CVNob3J0IGJsb2NrIGdyb3VwaW5nIGZ1bmN0aW9uCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImdycF9kYXRhLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBncm91cFNob3J0RGF0YQotKiBkZXNjcmlwdGlvbjogIGdyb3VwIHNob3J0IGRhdGEgZm9yIG5leHQgcXVhbnRpemF0aW9uIGFuZCBjb2RpbmcKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1ncm91cFNob3J0RGF0YShXb3JkMzIgICAgICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICp0bXBTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneU1TLAotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBzZmJDbnQsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJNaW5TbnIsCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpncm91cGVkU2ZiTWluU25yLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKmdyb3VwTGVuKQotewotICBXb3JkMzIgaSwgajsKLSAgV29yZDMyIGxpbmU7Ci0gIFdvcmQzMiBzZmI7Ci0gIFdvcmQzMiBncnA7Ci0gIFdvcmQzMiB3bmQ7Ci0gIFdvcmQzMiBvZmZzZXQ7Ci0gIFdvcmQzMiBoaWdoZXN0U2ZiOwotCi0gIC8qIGZvciBzaG9ydDogcmVncm91cCBhbmQgICovCi0gIC8qIGN1bXVsYXRlIGVuZXJnaWVzIHVuZCB0aHJlc2hvbGRzIGdyb3VwLXdpc2UgLiAqLwotCi0gIC8qIGNhbGN1bGF0ZSBzZmJDbnQgKi8KLSAgaGlnaGVzdFNmYiA9IDA7Ci0gIGZvciAod25kPTA7IHduZDxUUkFOU19GQUM7IHduZCsrKSB7Ci0gICAgZm9yIChzZmI9c2ZiQ250IC0gMTsgc2ZiPj1oaWdoZXN0U2ZiOyBzZmItLSkgewotICAgICAgZm9yIChsaW5lPShzZmJPZmZzZXRbc2ZiICsgMV0gLSAxKTsgbGluZT49c2ZiT2Zmc2V0W3NmYl07IGxpbmUtLSkgewotCi0gICAgICAgIGlmIChtZGN0U3BlY3RydW1bd25kKkZSQU1FX0xFTl9TSE9SVCtsaW5lXSAhPSAwKSBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKGxpbmUgPj0gc2ZiT2Zmc2V0W3NmYl0pIGJyZWFrOwotICAgIH0KLSAgICBoaWdoZXN0U2ZiID0gbWF4KGhpZ2hlc3RTZmIsIHNmYik7Ci0gIH0KLQotICBpZiAoaGlnaGVzdFNmYiA8IDApIHsKLSAgICBoaWdoZXN0U2ZiID0gMDsKLSAgfQotICAqbWF4U2ZiUGVyR3JvdXAgPSBoaWdoZXN0U2ZiICsgMTsKLQotICAvKiBjYWxjdWxhdGUgc2ZiT2Zmc2V0ICovCi0gIGkgPSAwOwotICBvZmZzZXQgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBncm91cGVkU2ZiT2Zmc2V0W2ldID0gb2Zmc2V0ICsgc2ZiT2Zmc2V0W3NmYl0gKiBncm91cExlbltncnBdOwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICBvZmZzZXQgKz0gZ3JvdXBMZW5bZ3JwXSAqIEZSQU1FX0xFTl9TSE9SVDsKLSAgfQotICBncm91cGVkU2ZiT2Zmc2V0W2ldID0gRlJBTUVfTEVOX0xPTkc7Ci0KLSAgLyogY2FsY3VsYXRlIG1pblNuciAqLwotICBpID0gMDsKLSAgb2Zmc2V0ID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgZ3JvdXBlZFNmYk1pblNucltpXSA9IHNmYk1pblNucltzZmJdOwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICBvZmZzZXQgKz0gZ3JvdXBMZW5bZ3JwXSAqIEZSQU1FX0xFTl9TSE9SVDsKLSAgfQotCi0KLSAgLyogc3VtIHVwIHNmYlRocmVzaG9sZHMgKi8KLSAgd25kID0gMDsKLSAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiB0aHJlc2ggPSBzZmJUaHJlc2hvbGQtPnNmYlNob3J0W3duZF1bc2ZiXTsKLSAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgewotICAgICAgICB0aHJlc2ggPSBMX2FkZCh0aHJlc2gsIHNmYlRocmVzaG9sZC0+c2ZiU2hvcnRbd25kK2pdW3NmYl0pOwotICAgICAgfQotICAgICAgc2ZiVGhyZXNob2xkLT5zZmJMb25nW2ldID0gdGhyZXNoOwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKLSAgfQotCi0gIC8qIHN1bSB1cCBzZmJFbmVyZ2llcyBsZWZ0L3JpZ2h0ICovCi0gIHduZCA9IDA7Ci0gIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBXb3JkMzIgZW5lcmd5ID0gc2ZiRW5lcmd5LT5zZmJTaG9ydFt3bmRdW3NmYl07Ci0gICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKLSAgICAgICAgZW5lcmd5ID0gTF9hZGQoZW5lcmd5LCBzZmJFbmVyZ3ktPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKLSAgICAgIH0KLSAgICAgIHNmYkVuZXJneS0+c2ZiTG9uZ1tpXSA9IGVuZXJneTsKLSAgICAgIGkgKz0gMTsKLSAgICB9Ci0gICAgd25kICs9IGdyb3VwTGVuW2dycF07Ci0gIH0KLQotICAvKiBzdW0gdXAgc2ZiRW5lcmdpZXMgbWlkL3NpZGUgKi8KLSAgd25kID0gMDsKLSAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiBlbmVyZ3kgPSBzZmJFbmVyZ3lNUy0+c2ZiU2hvcnRbd25kXVtzZmJdOwotICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7Ci0gICAgICAgIGVuZXJneSA9IExfYWRkKGVuZXJneSwgc2ZiRW5lcmd5TVMtPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKLSAgICAgIH0KLSAgICAgIHNmYkVuZXJneU1TLT5zZmJMb25nW2ldID0gZW5lcmd5OwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKLSAgfQotCi0gIC8qIHN1bSB1cCBzZmJTcHJlYWRlZEVuZXJnaWVzICovCi0gIHduZCA9IDA7Ci0gIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBXb3JkMzIgZW5lcmd5ID0gc2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYlNob3J0W3duZF1bc2ZiXTsKLSAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgewotICAgICAgICBlbmVyZ3kgPSBMX2FkZChlbmVyZ3ksIHNmYlNwcmVhZGVkRW5lcmd5LT5zZmJTaG9ydFt3bmQral1bc2ZiXSk7Ci0gICAgICB9Ci0gICAgICBzZmJTcHJlYWRlZEVuZXJneS0+c2ZiTG9uZ1tpXSA9IGVuZXJneTsKLSAgICAgIGkgKz0gMTsKLSAgICB9Ci0gICAgd25kICs9IGdyb3VwTGVuW2dycF07Ci0gIH0KLQotICAvKiByZS1ncm91cCBzcGVjdHJ1bSAqLwotICB3bmQgPSAwOwotICBpID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgZm9yIChqID0gMDsgaiA8IGdyb3VwTGVuW2dycF07IGorKykgewotICAgICAgICBXb3JkMTYgbGluZU9mZnNldCA9IEZSQU1FX0xFTl9TSE9SVCAqICh3bmQgKyBqKTsKLSAgICAgICAgZm9yIChsaW5lID0gbGluZU9mZnNldCArIHNmYk9mZnNldFtzZmJdOyBsaW5lIDwgbGluZU9mZnNldCArIHNmYk9mZnNldFtzZmIrMV07IGxpbmUrKykgewotICAgICAgICAgIHRtcFNwZWN0cnVtW2ldID0gbWRjdFNwZWN0cnVtW2xpbmVdOwotICAgICAgICAgIGkgPSBpICsgMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKLSAgfQotCi0gIGZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORztpKz00KSB7Ci0gICAgbWRjdFNwZWN0cnVtW2ldID0gdG1wU3BlY3RydW1baV07Ci0JbWRjdFNwZWN0cnVtW2krMV0gPSB0bXBTcGVjdHJ1bVtpKzFdOwotCW1kY3RTcGVjdHJ1bVtpKzJdID0gdG1wU3BlY3RydW1baSsyXTsKLQltZGN0U3BlY3RydW1baSszXSA9IHRtcFNwZWN0cnVtW2krM107Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvaW50ZXJmYWNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9pbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhZDQzMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9pbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWludGVyZmFjZS5jCi0KLQlDb250ZW50OglJbnRlcmZhY2UgcHN5Y2hvYWNjb3VzdGljL3F1YW50aXplciBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEJ1aWxkSW50ZXJmYWNlCi0qIGRlc2NyaXB0aW9uOiAgdXBkYXRlIG91dHB1dCBwYXJhbWV0ZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJ1aWxkSW50ZXJmYWNlKFdvcmQzMiAgICAgICAgICAgICAgICAgICpncm91cGVkTWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICAgICAgICAgICAqZ3JvdXBlZFNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgKmdyb3VwZWRTZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgICAgICAgICAgICpncm91cGVkU2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgICBzZmJFbmVyZ3lTdW1MUiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ZCX0VORVJHWV9TVU0gICAgIHNmYkVuZXJneVN1bU1TLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgd2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICB3aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgIGdyb3VwZWRTZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICpncm91cGVkU2ZiTWluU25yLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgKmdyb3VwTGVuLAotICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICAqcHN5T3V0Q2gpCi17Ci0gIFdvcmQzMiBqOwotICBXb3JkMzIgZ3JwOwotICBXb3JkMzIgbWFzazsKLSAgV29yZDE2ICp0bXBWOwotCi0gIC8qCi0gIGNvcHkgdmFsdWVzIHRvIHBzeU91dAotICAqLwotICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAgICAgPSBtYXhTZmJQZXJHcm91cDsKLSAgcHN5T3V0Q2gtPnNmYkNudCAgICAgICAgICAgID0gZ3JvdXBlZFNmYkNudDsKLSAgaWYobm9PZkdyb3VwcykKLQlwc3lPdXRDaC0+c2ZiUGVyR3JvdXAgICAgID0gZ3JvdXBlZFNmYkNudC8gbm9PZkdyb3VwczsKLSAgZWxzZQotCXBzeU91dENoLT5zZmJQZXJHcm91cCAgICAgPSAweDdmZmY7Ci0gIHBzeU91dENoLT53aW5kb3dTZXF1ZW5jZSAgICA9IHdpbmRvd1NlcXVlbmNlOwotICBwc3lPdXRDaC0+d2luZG93U2hhcGUgICAgICAgPSB3aW5kb3dTaGFwZTsKLSAgcHN5T3V0Q2gtPm1kY3RTY2FsZSAgICAgICAgID0gbWRjdFNjYWxlOwotICBwc3lPdXRDaC0+bWRjdFNwZWN0cnVtICAgICAgPSBncm91cGVkTWRjdFNwZWN0cnVtOwotICBwc3lPdXRDaC0+c2ZiRW5lcmd5ICAgICAgICAgPSBncm91cGVkU2ZiRW5lcmd5LT5zZmJMb25nOwotICBwc3lPdXRDaC0+c2ZiVGhyZXNob2xkICAgICAgPSBncm91cGVkU2ZiVGhyZXNob2xkLT5zZmJMb25nOwotICBwc3lPdXRDaC0+c2ZiU3ByZWFkZWRFbmVyZ3kgPSBncm91cGVkU2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYkxvbmc7Ci0KLSAgdG1wViA9IHBzeU91dENoLT5zZmJPZmZzZXRzOwotICBmb3Ioaj0wOyBqPGdyb3VwZWRTZmJDbnQgKyAxOyBqKyspIHsKLSAgICAgICp0bXBWKysgPSBncm91cGVkU2ZiT2Zmc2V0W2pdOwotICB9Ci0KLSAgdG1wViA9IHBzeU91dENoLT5zZmJNaW5TbnI7Ci0gIGZvcihqPTA7ajxncm91cGVkU2ZiQ250OyBqKyspIHsKLQkgICp0bXBWKysgPSAgIGdyb3VwZWRTZmJNaW5TbnJbal07Ci0gIH0KLQotICAvKiBnZW5lcmF0ZSBncm91cGluZyBtYXNrICovCi0gIG1hc2sgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgbWFzayA9IG1hc2sgPDwgMTsKLSAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKLSAgICAgIG1hc2sgPSBtYXNrIDw8IDE7Ci0gICAgICBtYXNrIHw9IDE7Ci0gICAgfQotICB9Ci0gIHBzeU91dENoLT5ncm91cGluZ01hc2sgPSBtYXNrOwotCi0gIGlmICh3aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKLSAgICBwc3lPdXRDaC0+c2ZiRW5TdW1MUiA9ICBzZmJFbmVyZ3lTdW1MUi5zZmJMb25nOwotICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gIHNmYkVuZXJneVN1bU1TLnNmYkxvbmc7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgV29yZDMyIGk7Ci0gICAgV29yZDMyIGFjY3VTdW1NUz0wOwotICAgIFdvcmQzMiBhY2N1U3VtTFI9MDsKLSAgICBjb25zdCBXb3JkMzIgKnBTdW1NUyA9IHNmYkVuZXJneVN1bU1TLnNmYlNob3J0OwotICAgIGNvbnN0IFdvcmQzMiAqcFN1bUxSID0gc2ZiRW5lcmd5U3VtTFIuc2ZiU2hvcnQ7Ci0KLSAgICBmb3IgKGk9VFJBTlNfRkFDOyBpOyBpLS0pIHsKLSAgICAgIGFjY3VTdW1MUiA9IExfYWRkKGFjY3VTdW1MUiwgKnBTdW1MUik7IHBTdW1MUisrOwotICAgICAgYWNjdVN1bU1TID0gTF9hZGQoYWNjdVN1bU1TLCAqcFN1bU1TKTsgcFN1bU1TKys7Ci0gICAgfQotICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gYWNjdVN1bU1TOwotICAgIHBzeU91dENoLT5zZmJFblN1bUxSID0gYWNjdVN1bUxSOwotICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9saW5lX3BlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9saW5lX3BlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MGRjMjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbGluZV9wZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJbGluZV9wZS5jCi0KLQlDb250ZW50OglQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAibGluZV9wZS5oIgotCi0KLXN0YXRpYyBjb25zdCBXb3JkMTYgIEMxX0kgPSAxMjsgICAgLyogbG9nKDguMCkvbG9nKDIpICo0ICAgICAgICAgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgIEMyX0kgPSAxMDgzMDsgLyogbG9nKDIuNSkvbG9nKDIpICogMTAyNCAqIDQgKiAyICovCi1zdGF0aWMgY29uc3QgV29yZDE2ICBDM19JID0gNTczOyAgIC8qICgxLUMyL0MxKSAqMTAyNCAgICAgICAgICAgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHByZXBhcmVTZmJQZQotKiBkZXNjcmlwdGlvbjogIGNvbnN0YW50cyB0aGF0IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHN1Y2Nlc3NpdmUgcGUgY2FsY3VsYXRpb25zCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwcmVwYXJlU2ZiUGUoUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICBXb3JkMTYgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHBlT2Zmc2V0KQotewotICBXb3JkMzIgc2ZiR3JwLCBzZmI7Ci0gIFdvcmQzMiBjaDsKLQotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YT0mcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKLSAgICBmb3Ioc2ZiR3JwPTA7c2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0JICAgIHBlQ2hhbkRhdGEtPnNmYk5MaW5lczRbc2ZiR3JwK3NmYl0gPSBzZmJOUmVsZXZhbnRMaW5lc1tjaF1bc2ZiR3JwK3NmYl07Ci0gICAgICAgIHNmYk5SZWxldmFudExpbmVzW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5SZWxldmFudExpbmVzW2NoXVtzZmJHcnArc2ZiXSA+PiAyOwotCSAgICBwZUNoYW5EYXRhLT5zZmJMZEVuZXJneVtzZmJHcnArc2ZiXSA9IGxvZ1NmYkVuZXJneVtjaF1bc2ZiR3JwK3NmYl07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHBlRGF0YS0+b2Zmc2V0ID0gcGVPZmZzZXQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNTZmJQZQotKiBkZXNjcmlwdGlvbjogIGNvbnN0UGFydCBpcyBzZmJQZSB3aXRob3V0IHRoZSB0aHJlc2hvbGQgcGFydCBuKmxkKHRocikgb3IgbipDMypsZCh0aHIpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBjYWxjU2ZiUGUoUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCi17Ci0gIFdvcmQzMiBjaDsKLSAgV29yZDMyIHNmYkdycCwgc2ZiOwotICBXb3JkMzIgbkxpbmVzNDsKLSAgV29yZDMyIGxkVGhyLCBsZFJhdGlvOwotICBXb3JkMzIgcGUsIGNvbnN0UGFydCwgbkFjdGl2ZUxpbmVzOwotCi0gIHBlRGF0YS0+cGUgPSBwZURhdGEtPm9mZnNldDsKLSAgcGVEYXRhLT5jb25zdFBhcnQgPSAwOwotICBwZURhdGEtPm5BY3RpdmVMaW5lcyA9IDA7Ci0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07Ci0gICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3kgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3k7Ci0gICAgY29uc3QgV29yZDMyICpzZmJUaHJlc2hvbGQgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQ7Ci0KLSAgICBwZSA9IDA7Ci0gICAgY29uc3RQYXJ0ID0gMDsKLSAgICBuQWN0aXZlTGluZXMgPSAwOwotCi0gICAgZm9yKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIFdvcmQzMiBucmcgPSBzZmJFbmVyZ3lbc2ZiR3JwK3NmYl07Ci0gICAgICAgIFdvcmQzMiB0aHJlcyA9IHNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXTsKLSAgICAgICAgV29yZDMyIHNmYkxERW4gPSBwZUNoYW5EYXRhLT5zZmJMZEVuZXJneVtzZmJHcnArc2ZiXTsKLQotICAgICAgICBpZiAobnJnID4gdGhyZXMpIHsKLSAgICAgICAgICBsZFRociA9IGlMb2c0KHRocmVzKTsKLQotICAgICAgICAgIGxkUmF0aW8gPSBzZmJMREVuIC0gbGRUaHI7Ci0KLSAgICAgICAgICBuTGluZXM0ID0gcGVDaGFuRGF0YS0+c2ZiTkxpbmVzNFtzZmJHcnArc2ZiXTsKLQotICAgICAgICAgIC8qIHNmYlBlID0gbmwqbG9nMihlbi90aHIpKi8KLQkJICBpZiAobGRSYXRpbyA+PSBDMV9JKSB7Ci0gICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IChuTGluZXM0KmxkUmF0aW8gKyA4KSA+PiA0OwotICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0gKChuTGluZXM0KnNmYkxERW4pKSA+PiA0OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLQkJICAvKiBzZmJQZSA9IG5sKihjMiArIGMzKmxvZzIoZW4vdGhyKSkqLwotICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSBleHRyYWN0X2woKExfbXB5X3d4KAotICAgICAgICAgICAgICAgICAgICAoQzJfSSArIEMzX0kgKiBsZFJhdGlvICogMikgPDwgNCwgbkxpbmVzNCkgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9IGV4dHJhY3RfbCgoIExfbXB5X3d4KAotICAgICAgICAgICAgICAgICAgICAoQzJfSSArIEMzX0kgKiBzZmJMREVuICogMikgPDwgNCwgbkxpbmVzNCkgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgIG5MaW5lczQgPSAobkxpbmVzNCAqIEMzX0kgKyAoMTAyNDw8MSkpID4+IDEwOwotICAgICAgICAgIH0KLSAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPSBuTGluZXM0ID4+IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSAwOwotICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9IDA7Ci0gICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gMDsKLSAgICAgICAgfQotICAgICAgICBwZSA9IHBlICsgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07Ci0gICAgICAgIGNvbnN0UGFydCA9IGNvbnN0UGFydCArIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXTsKLSAgICAgICAgbkFjdGl2ZUxpbmVzID0gbkFjdGl2ZUxpbmVzICsgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdOwotICAgICAgfQotICAgIH0KLQotCXBlQ2hhbkRhdGEtPnBlID0gc2F0dXJhdGUocGUpOwotICAgIHBlQ2hhbkRhdGEtPmNvbnN0UGFydCA9IHNhdHVyYXRlKGNvbnN0UGFydCk7Ci0gICAgcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzID0gc2F0dXJhdGUobkFjdGl2ZUxpbmVzKTsKLQotCi0JcGUgKz0gcGVEYXRhLT5wZTsKLQlwZURhdGEtPnBlID0gc2F0dXJhdGUocGUpOwotICAgIGNvbnN0UGFydCArPSBwZURhdGEtPmNvbnN0UGFydDsKLQlwZURhdGEtPmNvbnN0UGFydCA9IHNhdHVyYXRlKGNvbnN0UGFydCk7Ci0gICAgbkFjdGl2ZUxpbmVzICs9IHBlRGF0YS0+bkFjdGl2ZUxpbmVzOwotCXBlRGF0YS0+bkFjdGl2ZUxpbmVzID0gc2F0dXJhdGUobkFjdGl2ZUxpbmVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21lbWFsaWduLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjY2ZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJbWVtX2FsaWduLmMKLQotCUNvbnRlbnQ6CU1lbW9yeSBhbGxvYyBhbGlnbm1lbnRzIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlCSJtZW1hbGlnbi5oIgotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZQk8c3RkZGVmLmg+Ci0jZWxzZQotI2luY2x1ZGUJPHN0ZGludC5oPgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBtZW1fbWFsbG9jCi0qIGRlc2NyaXB0aW9uOiAgbWFsbG9jIHRoZSBhbGlnbm1lbnRzIG1lbW9yeQotKiByZXR1cm5zOiAgICAgIHRoZSBwb2ludCBvZiB0aGUgbWVtb3J5Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqCi1tZW1fbWFsbG9jKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciBhbGlnbm1lbnQsIHVuc2lnbmVkIGludCBDb2RlY0lEKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciAqbWVtX3B0cjsKLQlWT19NRU1fSU5GTyBNZW1JbmZvOwotCi0JaWYgKCFhbGlnbm1lbnQpIHsKLQotCQlNZW1JbmZvLkZsYWcgPSAwOwotCQlNZW1JbmZvLlNpemUgPSBzaXplICsgMTsKLQkJcmV0ID0gcE1lbW9wLT5BbGxvYyhDb2RlY0lELCAmTWVtSW5mbyk7Ci0JCWlmKHJldCAhPSAwKQotCQkJcmV0dXJuIDA7Ci0JCW1lbV9wdHIgPSAodW5zaWduZWQgY2hhciAqKU1lbUluZm8uVkJ1ZmZlcjsKLQotCQlwTWVtb3AtPlNldChDb2RlY0lELCBtZW1fcHRyLCAwLCBzaXplICsgMSk7Ci0KLQkJKm1lbV9wdHIgPSAodW5zaWduZWQgY2hhcikxOwotCi0JCXJldHVybiAoKHZvaWQgKikobWVtX3B0cisxKSk7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgY2hhciAqdG1wOwotCi0JCU1lbUluZm8uRmxhZyA9IDA7Ci0JCU1lbUluZm8uU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnQ7Ci0JCXJldCA9IHBNZW1vcC0+QWxsb2MoQ29kZWNJRCwgJk1lbUluZm8pOwotCQlpZihyZXQgIT0gMCkKLQkJCXJldHVybiAwOwotCi0JCXRtcCA9ICh1bnNpZ25lZCBjaGFyICopTWVtSW5mby5WQnVmZmVyOwotCi0JCXBNZW1vcC0+U2V0KENvZGVjSUQsIHRtcCwgMCwgc2l6ZSArIGFsaWdubWVudCk7Ci0KLQkJbWVtX3B0ciA9Ci0JCQkodW5zaWduZWQgY2hhciAqKSAoKGludHB0cl90KSAodG1wICsgYWxpZ25tZW50IC0gMSkgJgotCQkJCQkofigoaW50cHRyX3QpIChhbGlnbm1lbnQgLSAxKSkpKTsKLQotCQlpZiAobWVtX3B0ciA9PSB0bXApCi0JCQltZW1fcHRyICs9IGFsaWdubWVudDsKLQotCQkqKG1lbV9wdHIgLSAxKSA9ICh1bnNpZ25lZCBjaGFyKSAobWVtX3B0ciAtIHRtcCk7Ci0KLQkJcmV0dXJuICgodm9pZCAqKW1lbV9wdHIpOwotCX0KLQotCXJldHVybigwKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogbWVtX2ZyZWUKLSogZGVzY3JpcHRpb246ICBmcmVlIHRoZSBtZW1vcnkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1tZW1fZnJlZShWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdm9pZCAqbWVtX3B0ciwgdW5zaWduZWQgaW50IENvZGVjSUQpCi17Ci0KLQl1bnNpZ25lZCBjaGFyICpwdHI7Ci0KLQlpZiAobWVtX3B0ciA9PSAwKQotCQlyZXR1cm47Ci0KLQlwdHIgPSBtZW1fcHRyOwotCi0JcHRyIC09ICoocHRyIC0gMSk7Ci0KLQlwTWVtb3AtPkZyZWUoQ29kZWNJRCwgcHRyKTsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDI4ZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQltc19zdGVyZW8uYwotCi0JQ29udGVudDoJTVMgc3RlcmVvIHByb2Nlc3NpbmcgZnVuY3Rpb24KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJtc19zdGVyZW8uaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogTXNTdGVyZW9Qcm9jZXNzaW5nCi0qIGRlc2NyaXB0aW9uOiAgZGV0ZWN0IHVzZSBtcyBzdGVyZW8gb3Igbm90Ci0qCQkJCWlmICgobWluKHRockxuLCB0aHJSbikqbWluKHRockxuLCB0aHJSbikpLyhlbk1uKmVuU24pKQotKgkJCQk+PSAoKHRockxuICp0aHJSbikvKGVuTG4qZW5SbikpIHRoZW4gbXMgc3RlcmVvCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNc1N0ZXJlb1Byb2Nlc3NpbmcoV29yZDMyICAgICAgICpzZmJFbmVyZ3lMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJFbmVyZ3lSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqc2ZiRW5lcmd5TWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3lTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICptZGN0U3BlY3RydW1MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICptZGN0U3BlY3RydW1SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiVGhyZXNob2xkTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlNwcmVhZGVkRW5MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJTcHJlYWRlZEVuUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKm1zRGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICptc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQpIHsKLSAgV29yZDMyIHNmYixzZmJvZmZzLCBqOwotICBXb3JkMzIgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDA7Ci0gIFdvcmQzMiBtc01hc2tGYWxzZVNvbWV3aGVyZSA9IDA7Ci0KLSAgZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKz1zZmJQZXJHcm91cCkgewotICAgIGZvciAoc2Zib2Zmcz0wO3NmYm9mZnM8bWF4U2ZiUGVyR3JvdXA7c2Zib2ZmcysrKSB7Ci0KLSAgICAgIFdvcmQzMiB0ZW1wOwotICAgICAgV29yZDMyIHBubHIscG5tczsKLSAgICAgIFdvcmQzMiBtaW5UaHJlc2hvbGQ7Ci0gICAgICBXb3JkMzIgdGhyTCwgdGhyUiwgbnJnTCwgbnJnUjsKLSAgICAgIFdvcmQzMiBpZHgsIHNoaWZ0OwotCi0gICAgICBpZHggPSBzZmIgKyBzZmJvZmZzOwotCi0gICAgICB0aHJMID0gc2ZiVGhyZXNob2xkTGVmdFtpZHhdOwotICAgICAgdGhyUiA9IHNmYlRocmVzaG9sZFJpZ2h0W2lkeF07Ci0gICAgICBucmdMID0gc2ZiRW5lcmd5TGVmdFtpZHhdOwotICAgICAgbnJnUiA9IHNmYkVuZXJneVJpZ2h0W2lkeF07Ci0KLSAgICAgIG1pblRocmVzaG9sZCA9IG1pbih0aHJMLCB0aHJSKTsKLQotICAgICAgbnJnTCA9IG1heChucmdMLHRockwpICsgMTsKLSAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ0wpOwotCSAgbnJnTCA9IERpdl8zMih0aHJMIDw8IHNoaWZ0LCBucmdMIDw8IHNoaWZ0KTsKLSAgICAgIG5yZ1IgPSBtYXgobnJnUix0aHJSKSArIDE7Ci0gICAgICBzaGlmdCA9IG5vcm1fbChucmdSKTsKLQkgIG5yZ1IgPSBEaXZfMzIodGhyUiA8PCBzaGlmdCwgbnJnUiA8PCBzaGlmdCk7Ci0KLQkgIHBubHIgPSBmaXhtdWwobnJnTCwgbnJnUik7Ci0KLSAgICAgIG5yZ0wgPSBzZmJFbmVyZ3lNaWRbaWR4XTsKLSAgICAgIG5yZ1IgPSBzZmJFbmVyZ3lTaWRlW2lkeF07Ci0KLSAgICAgIG5yZ0wgPSBtYXgobnJnTCxtaW5UaHJlc2hvbGQpICsgMTsKLSAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ0wpOwotCSAgbnJnTCA9IERpdl8zMihtaW5UaHJlc2hvbGQgPDwgc2hpZnQsIG5yZ0wgPDwgc2hpZnQpOwotCi0gICAgICBucmdSID0gbWF4KG5yZ1IsbWluVGhyZXNob2xkKSArIDE7Ci0gICAgICBzaGlmdCA9IG5vcm1fbChucmdSKTsKLQkgIG5yZ1IgPSBEaXZfMzIobWluVGhyZXNob2xkIDw8IHNoaWZ0LCBucmdSIDw8IHNoaWZ0KTsKLQotICAgICAgcG5tcyA9IGZpeG11bChucmdMLCBucmdSKTsKLQotICAgICAgdGVtcCA9IHBubXMgLSBwbmxyOwotICAgICAgaWYoIHRlbXAgPiAwICl7Ci0KLSAgICAgICAgbXNNYXNrW2lkeF0gPSAxOwotICAgICAgICBtc01hc2tUcnVlU29tZXdoZXJlID0gMTsKLQotICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W2lkeF07IGo8c2ZiT2Zmc2V0W2lkeCsxXTsgaisrKSB7Ci0gICAgICAgICAgV29yZDMyIGxlZnQsIHJpZ2h0OwotICAgICAgICAgIGxlZnQgID0gKG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gIDEpOwotICAgICAgICAgIHJpZ2h0ID0gKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID4+IDEpOwotICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAgbGVmdCArIHJpZ2h0OwotICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gIGxlZnQgLSByaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIHNmYlRocmVzaG9sZExlZnRbaWR4XSA9IG1pblRocmVzaG9sZDsKLSAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRbaWR4XSA9IG1pblRocmVzaG9sZDsKLSAgICAgICAgc2ZiRW5lcmd5TGVmdFtpZHhdID0gc2ZiRW5lcmd5TWlkW2lkeF07Ci0gICAgICAgIHNmYkVuZXJneVJpZ2h0W2lkeF0gPSBzZmJFbmVyZ3lTaWRlW2lkeF07Ci0KLSAgICAgICAgc2ZiU3ByZWFkZWRFblJpZ2h0W2lkeF0gPSBtaW4oc2ZiU3ByZWFkZWRFbkxlZnRbaWR4XSxzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XSkgPj4gMTsKLSAgICAgICAgc2ZiU3ByZWFkZWRFbkxlZnRbaWR4XSA9IHNmYlNwcmVhZGVkRW5SaWdodFtpZHhdOwotCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbXNNYXNrW2lkeF0gID0gMDsKLSAgICAgICAgbXNNYXNrRmFsc2VTb21ld2hlcmUgPSAxOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIG1zTWFza1RydWVTb21ld2hlcmUgKSB7Ci0gICAgICBpZihtc01hc2tGYWxzZVNvbWV3aGVyZSApIHsKLSAgICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19TT01FOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19BTEw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfTk9ORTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA2ZTExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXByZV9lY2hvX2NvbnRyb2wuYwotCi0JQ29udGVudDoJUHJlIGVjaG8gY29udHJvbCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLQotI2luY2x1ZGUgIm9wZXJfMzJiLmgiCi0jaW5jbHVkZSAicHJlX2VjaG9fY29udHJvbC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOkluaXRQcmVFY2hvQ29udHJvbAotKiBkZXNjcmlwdGlvbjogaW5pdCBwcmUgZWNobyBjb250cm9sIHBhcmFtZXRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEluaXRQcmVFY2hvQ29udHJvbChXb3JkMzIgKnBiVGhyZXNob2xkTm0xLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcGJUaHJlc2hvbGRRdWlldCkKLXsKLSAgV29yZDE2IHBiOwotCi0gIGZvcihwYj0wOyBwYjxudW1QYjsgcGIrKykgewotICAgIHBiVGhyZXNob2xkTm0xW3BiXSA9IHBiVGhyZXNob2xkUXVpZXRbcGJdOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOlByZUVjaG9Db250cm9sCi0qIGRlc2NyaXB0aW9uOiB1cGRhdGUgc2hyZXNob2xkIHRvIGF2b2lkIHByZSBlY2hvCi0qCQkJICAgdGhyKG4pID0gbWF4KHJwbWluKnRocnEobiksIG1pbih0aHJxKG4pLCBycGVsZXYqdGhycTEobikpKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRObTEsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWRjdFNjYWxlbm0xKQotewotICBXb3JkMzIgaTsKLSAgV29yZDMyIHRtcFRocmVzaG9sZDEsIHRtcFRocmVzaG9sZDI7Ci0gIFdvcmQzMiBzY2FsaW5nOwotCi0gIC8qIG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciBpcyBoYXJkIGNvZGVkIHRvIDIgKi8KLSAgKHZvaWQpbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yOwotCi0gIHNjYWxpbmcgPSAoKG1kY3RTY2FsZSAtIG1kY3RTY2FsZW5tMSkgPDwgMSk7Ci0KLSAgaWYgKCBzY2FsaW5nID4gMCApIHsKLSAgICBmb3IoaSA9IDA7IGkgPCBudW1QYjsgaSsrKSB7Ci0gICAgICB0bXBUaHJlc2hvbGQxID0gcGJUaHJlc2hvbGRObTFbaV0gPj4gKHNjYWxpbmctMSk7Ci0gICAgICB0bXBUaHJlc2hvbGQyID0gTF9tcHlfbHMocGJUaHJlc2hvbGRbaV0sIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3Rvcik7Ci0KLSAgICAgIC8qIGNvcHkgdGhyZXNob2xkcyB0byBpbnRlcm5hbCBtZW1vcnkgKi8KLSAgICAgIHBiVGhyZXNob2xkTm0xW2ldID0gcGJUaHJlc2hvbGRbaV07Ci0KLQotICAgICAgaWYocGJUaHJlc2hvbGRbaV0gPiB0bXBUaHJlc2hvbGQxKSB7Ci0gICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMTsKLSAgICAgIH0KLQotICAgICAgaWYodG1wVGhyZXNob2xkMiA+IHBiVGhyZXNob2xkW2ldKSB7Ci0gICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMjsKLSAgICAgIH0KLQotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBzY2FsaW5nID0gLXNjYWxpbmc7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgewotCi0gICAgICB0bXBUaHJlc2hvbGQxID0gcGJUaHJlc2hvbGRObTFbaV0gPDwgMTsKLSAgICAgIHRtcFRocmVzaG9sZDIgPSBMX21weV9scyhwYlRocmVzaG9sZFtpXSwgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yKTsKLQotICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLwotICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSBwYlRocmVzaG9sZFtpXTsKLQotCi0gICAgICBpZigoKHBiVGhyZXNob2xkW2ldID4+IHNjYWxpbmcpID4gdG1wVGhyZXNob2xkMSkpIHsKLSAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQxIDw8IHNjYWxpbmc7Ci0gICAgICB9Ci0KLSAgICAgIGlmKHRtcFRocmVzaG9sZDIgPiBwYlRocmVzaG9sZFtpXSkgewotICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDI7Ci0gICAgICB9Ci0KLSAgICB9Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDBmOWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXBzeV9jb25maWd1cmF0aW9uLmMKLQotCUNvbnRlbnQ6CVBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAiYWRqX3Roci5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotCi0KLSNkZWZpbmUgQkFSQ19TQ0FMRQkxMDAgLyogaW50ZWdlciBiYXJjIHZhbHVlcyBhcmUgc2NhbGVkIHdpdGggMTAwICovCi0jZGVmaW5lIExPRzJfMTAwMAkzMDEgLyogbG9nMioxMDAwICovCi0jZGVmaW5lIFBJMl8xMDAwCTE1NzEgLyogcGkvMioxMDAwKi8KLSNkZWZpbmUgQVRBTl9DT0VGMQkzNTYwIC8qIDEwMDAvMC4yODA4NzJmKi8KLSNkZWZpbmUgQVRBTl9DT0VGMgkyODEgLyogMTAwMCowLjI4MDg3MmYqLwotCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgc2FtcGxlUmF0ZTsKLSAgY29uc3QgVVdvcmQ4ICpwYXJhbUxvbmc7Ci0gIGNvbnN0IFVXb3JkOCAqcGFyYW1TaG9ydDsKLX1TRkJfSU5GT19UQUI7Ci0KLXN0YXRpYyBjb25zdCBXb3JkMTYgQUJTX0xFViA9IDIwOwotc3RhdGljIGNvbnN0IFdvcmQxNiBCQVJDX1RIUl9RVUlFVFtdID0gezE1LCAxMCwgIDcsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAgNSwgMTAsIDIwLCAzMH07Ci0KLQotCi1zdGF0aWMgY29uc3QgV29yZDE2IG1heF9iYXJrID0gMjQ7IC8qIG1heGltdW0gYmFyay12YWx1ZSAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrTG93ICA9IDMwOyAvKiBpbiAxZEIvYmFyayAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrSGlnaCA9IDE1OyAvKiBpbiAxKmRCL2JhcmsgKi8KLXN0YXRpYyBjb25zdCBXb3JkMTYgY19yYXRpbyAgPSAweDAwMjk7IC8qIHBvdygxMC4wZiwgLSgyOS4wZi8xMC4wZikpICovCi0KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWFza0xvd1NwckVuTG9uZyA9IDMwOyAgICAgICAvKiBpbiAxZEIvYmFyayAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrSGlnaFNwckVuTG9uZyA9IDIwOyAgICAgIC8qIGluIDFkQi9iYXJrICovCi1zdGF0aWMgY29uc3QgV29yZDE2IG1hc2tIaWdoU3ByRW5Mb25nTG93QnIgPSAxNTsgLyogaW4gMWRCL2JhcmsgKi8KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWFza0xvd1NwckVuU2hvcnQgPSAyMDsgICAgICAvKiBpbiAxZEIvYmFyayAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrSGlnaFNwckVuU2hvcnQgPSAxNTsgICAgIC8qIGluIDFkQi9iYXJrICovCi1zdGF0aWMgY29uc3QgV29yZDE2IGNfbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gMHgwMTQ4OyAgICAvKiAwLjAxICooMSA8PCAxNSkqLwotc3RhdGljIGNvbnN0IFdvcmQzMiBjX21heHNuciA9IDB4NjY2NjY2NjY7CQkgLyogdXBwZXIgbGltaXQgaXMgLTEgZEIgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgY19taW5zbnIgPSAweDAwNjI0ZGQzOwkJIC8qIGxvd2VyIGxpbWl0IGlzIC0yNSBkQiAqLwotCi1zdGF0aWMgY29uc3QgV29yZDMyIGNfbWF4Q2xpcEVuZXJneUxvbmcgPSAweDc3MzU5NDAwOyAgLyogMi4wZTlmKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgY19tYXhDbGlwRW5lcmd5U2hvcnQgPSAweDAxZGNkNjUwOyAvKiAyLjBlOWYvKEFBQ0VOQ19UUkFOU19GQUMqQUFDRU5DX1RSQU5TX0ZBQykqLwotCi0KLVdvcmQzMiBHZXRTUkluZGV4KFdvcmQzMiBzYW1wbGVSYXRlKQotewotICAgIGlmICg5MjAxNyA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMDsKLSAgICBpZiAoNzUxMzIgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDE7Ci0gICAgaWYgKDU1NDI2IDw9IHNhbXBsZVJhdGUpIHJldHVybiAyOwotICAgIGlmICg0NjAwOSA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMzsKLSAgICBpZiAoMzc1NjYgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDQ7Ci0gICAgaWYgKDI3NzEzIDw9IHNhbXBsZVJhdGUpIHJldHVybiA1OwotICAgIGlmICgyMzAwNCA8PSBzYW1wbGVSYXRlKSByZXR1cm4gNjsKLSAgICBpZiAoMTg3ODMgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDc7Ci0gICAgaWYgKDEzODU2IDw9IHNhbXBsZVJhdGUpIHJldHVybiA4OwotICAgIGlmICgxMTUwMiA8PSBzYW1wbGVSYXRlKSByZXR1cm4gOTsKLSAgICBpZiAoOTM5MSA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMTA7Ci0KLSAgICByZXR1cm4gMTE7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBhdGFuXzEwMDAKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIDEwMDAqYXRhbih4LzEwMDApCi0qICAgICAgICAgICAgICAgYmFzZWQgb24gYXRhbiBhcHByb3ggZm9yIHggPiAwCi0qCQkJCWF0YW4oeCkgPSB4LygoZmxvYXQpMS4wZisoZmxvYXQpMC4yODA4NzJmKngqeCkgIGlmIHggPCAxCi0qCQkJCQkJPSBwaS8yIC0geC8oKGZsb2F0KTAuMjgwODcyZiAreCp4KQkgICAgaWYgeCA+PSAxCi0qIHJldHVybjogICAgICAgMTAwMCphdGFuKHgvMTAwMCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGF0YW5fMTAwMChXb3JkMzIgdmFsKQotewotICBXb3JkMzIgeTsKLQotCi0gIGlmKExfc3ViKHZhbCwgMTAwMCkgPCAwKSB7Ci0gICAgeSA9IGV4dHJhY3RfbCgoKDEwMDAgKiB2YWwpIC8gKDEwMDAgKyAoKHZhbCAqIHZhbCkgLyBBVEFOX0NPRUYxKSkpKTsKLSAgfQotICBlbHNlIHsKLSAgICB5ID0gUEkyXzEwMDAgLSAoKDEwMDAgKiB2YWwpIC8gKEFUQU5fQ09FRjIgKyAoKHZhbCAqIHZhbCkgLyAxMDAwKSkpOwotICB9Ci0KLSAgcmV0dXJuIGV4dHJhY3RfbCh5KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQmFyY0xpbmVWYWx1ZQotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgYmFyYyB2YWx1ZSBmb3Igb25lIGZyZXF1ZW5jeSBsaW5lCi0qIHJldHVybnM6ICAgICAgYmFyYyB2YWx1ZSBvZiBsaW5lICogQkFSQ19TQ0FMRQotKiBpbnB1dDogICAgICAgIG51bWJlciBvZiBsaW5lcyBpbiB0cmFuc2Zvcm0sIGluZGV4IG9mIGxpbmUgdG8gY2hlY2ssIEZzCi0qIG91dHB1dDoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBCYXJjTGluZVZhbHVlKFdvcmQxNiBub09mTGluZXMsIFdvcmQxNiBmZnRMaW5lLCBXb3JkMzIgc2FtcGxpbmdGcmVxKQotewotICBXb3JkMzIgY2VudGVyX2ZyZXEsIHRlbXAsIGJ2YWxGRlRMaW5lOwotCi0gIC8qIGNlbnRlciBmcmVxdWVuY3kgb2YgZmZ0IGxpbmUgKi8KLSAgY2VudGVyX2ZyZXEgPSAoZmZ0TGluZSAqIHNhbXBsaW5nRnJlcSkgLyAobm9PZkxpbmVzIDw8IDEpOwotICB0ZW1wID0gIGF0YW5fMTAwMCgoY2VudGVyX2ZyZXEgPDwgMikgLyAoMyoxMCkpOwotICBidmFsRkZUTGluZSA9Ci0gICAgKDI2NjAwICogYXRhbl8xMDAwKChjZW50ZXJfZnJlcSo3NikgLyAxMDApICsgNyp0ZW1wKnRlbXApIC8gKDIqMTAwMCoxMDAwIC8gQkFSQ19TQ0FMRSk7Ci0KLSAgcmV0dXJuIHNhdHVyYXRlKGJ2YWxGRlRMaW5lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGluaXRUaHJRdWlldAotKiBkZXNjcmlwdGlvbjogIGluaXQgdGhyZWRob2xkIGluIHF1aWV0Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGluaXRUaHJRdWlldChXb3JkMTYgIG51bVBiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcGJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYkJhcmNWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZFF1aWV0KSB7Ci0gIFdvcmQxNiBpOwotICBXb3JkMTYgYmFyY1RoclF1aWV0OwotCi0gIGZvcihpPTA7IGk8bnVtUGI7IGkrKykgewotICAgIFdvcmQxNiBidjEsIGJ2MjsKLQotCi0gICAgaWYgKGk+MCkKLSAgICAgIGJ2MSA9IChwYkJhcmNWYWxbaV0gKyBwYkJhcmNWYWxbaS0xXSkgPj4gMTsKLSAgICBlbHNlCi0gICAgICBidjEgPSBwYkJhcmNWYWxbaV0gPj4gMTsKLQotCi0gICAgaWYgKGkgPCAobnVtUGIgLSAxKSkKLSAgICAgIGJ2MiA9IChwYkJhcmNWYWxbaV0gKyBwYkJhcmNWYWxbaSsxXSkgPj4gMTsKLSAgICBlbHNlIHsKLSAgICAgIGJ2MiA9IHBiQmFyY1ZhbFtpXTsKLSAgICB9Ci0KLSAgICBidjEgPSBtaW4oKGJ2MSAvIEJBUkNfU0NBTEUpLCBtYXhfYmFyayk7Ci0gICAgYnYyID0gbWluKChidjIgLyBCQVJDX1NDQUxFKSwgbWF4X2JhcmspOwotCi0gICAgYmFyY1RoclF1aWV0ID0gbWluKEJBUkNfVEhSX1FVSUVUW2J2MV0sIEJBUkNfVEhSX1FVSUVUW2J2Ml0pOwotCi0KLSAgICAvKgotICAgICAgd2UgY2FsY3VsYXRlCi0gICAgICBwb3coMTAuMGYsKGZsb2F0KShiYXJjVGhyUXVpZXQgLSBBQlNfTEVWKSowLjEpKihmbG9hdClBQlNfTE9XKihwYk9mZnNldFtpKzFdIC0gcGJPZmZzZXRbaV0pOwotICAgICovCi0KLSAgICBwYlRocmVzaG9sZFF1aWV0W2ldID0gcG93Ml94eSgoKChiYXJjVGhyUXVpZXQgLSBBQlNfTEVWKSAqIDEwMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cyXzEwMDAqKDE0KzIqTE9HX05PUk1fUENNKSksIExPRzJfMTAwMCkgKiAocGJPZmZzZXRbaSsxXSAtIHBiT2Zmc2V0W2ldKTsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBpbml0U3ByZWFkaW5nCi0qIGRlc2NyaXB0aW9uOiAgaW5pdCBlbmVyZ3kgc3ByZWFkaW5nIHBhcmFtZXRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpbml0U3ByZWFkaW5nKFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJCYXJjVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrTG9GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrSGlGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrTG9GYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYk1hc2tIaUZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGJsb2NrVHlwZSkKLXsKLSAgV29yZDE2IGk7Ci0gIFdvcmQxNiBtYXNrTG93U3ByRW4sIG1hc2tIaWdoU3ByRW47Ci0KLQotICBpZiAoc3ViKGJsb2NrVHlwZSwgU0hPUlRfV0lORE9XKSAhPSAwKSB7Ci0gICAgbWFza0xvd1NwckVuID0gbWFza0xvd1NwckVuTG9uZzsKLQotICAgIGlmIChiaXRyYXRlID4gMjIwMDApCi0gICAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFbkxvbmc7Ci0gICAgZWxzZQotICAgICAgbWFza0hpZ2hTcHJFbiA9IG1hc2tIaWdoU3ByRW5Mb25nTG93QnI7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbWFza0xvd1NwckVuID0gbWFza0xvd1NwckVuU2hvcnQ7Ci0gICAgbWFza0hpZ2hTcHJFbiA9IG1hc2tIaWdoU3ByRW5TaG9ydDsKLSAgfQotCi0gIGZvcihpPTA7IGk8bnVtUGI7IGkrKykgewotCi0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICBXb3JkMzIgZGJWYWw7Ci0gICAgICBXb3JkMTYgZGJhcmsgPSBwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2ktMV07Ci0KLSAgICAgIC8qCi0gICAgICAgIHdlIGNhbHVsYXRlIHBvdygxMC4wZiwgLTAuMSpkYlZhbC9CQVJDX1NDQUxFKQotICAgICAgKi8KLSAgICAgIGRiVmFsID0gKG1hc2tIaWdoICogZGJhcmspOwotICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gPSByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLCAoV29yZDMyKUxPRzJfMTAwMCkpOyAgICAgICAgICAgICAvKiAwLjMwMSBsb2cxMCgyKSAqLwotCi0gICAgICBkYlZhbCA9IChtYXNrTG93ICogZGJhcmspOwotICAgICAgcGJNYXNrTG9GYWN0b3JbaS0xXSA9IHJvdW5kMTYocG93Ml94eShMX25lZ2F0ZShkYlZhbCksKFdvcmQzMilMT0cyXzEwMDApKTsKLQotCi0gICAgICBkYlZhbCA9IChtYXNrSGlnaFNwckVuICogZGJhcmspOwotICAgICAgcGJNYXNrSGlGYWN0b3JTcHJFbltpXSA9ICByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLChXb3JkMzIpTE9HMl8xMDAwKSk7Ci0gICAgICBkYlZhbCA9IChtYXNrTG93U3ByRW4gKiBkYmFyayk7Ci0gICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW2ktMV0gPSByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLChXb3JkMzIpTE9HMl8xMDAwKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gPSAwOwotICAgICAgcGJNYXNrTG9GYWN0b3JbbnVtUGItMV0gPSAwOwotCi0gICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldID0gMDsKLSAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5bbnVtUGItMV0gPSAwOwotICAgIH0KLSAgfQotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGluaXRCYXJjVmFsdWVzCi0qIGRlc2NyaXB0aW9uOiAgaW5pdCBiYXJrIHZhbHVlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGluaXRCYXJjVmFsdWVzKFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnBiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1MaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgc2FtcGxpbmdGcmVxdWVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiQnZhbCkKLXsKLSAgV29yZDE2IGk7Ci0gIFdvcmQxNiBwYkJ2YWwwLCBwYkJ2YWwxOwotCi0gIHBiQnZhbDAgPSAwOwotCi0gIGZvcihpPTA7IGk8bnVtUGI7IGkrKyl7Ci0gICAgcGJCdmFsMSA9IEJhcmNMaW5lVmFsdWUobnVtTGluZXMsIHBiT2Zmc2V0W2krMV0sIHNhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICBwYkJ2YWxbaV0gPSAocGJCdmFsMCArIHBiQnZhbDEpID4+IDE7Ci0gICAgcGJCdmFsMCA9IHBiQnZhbDE7Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogaW5pdE1pblNucgotKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSBtaW4gc25yIHBhcmFtZXRlcgotKgkJCQltaW5TbnIobikgPSAxLygyXnNmYlBlbWluKG4pL3cobikgLSAxLjUpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGluaXRNaW5TbnIoY29uc3QgV29yZDMyICBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbnVtTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnBiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqc2ZiTWluU25yKQotewotICBXb3JkMTYgc2ZiOwotICBXb3JkMTYgYmFyY1dpZHRoOwotICBXb3JkMTYgcGVQZXJXaW5kb3c7Ci0gIFdvcmQzMiBwZVBhcnQ7Ci0gIFdvcmQzMiBzbnI7Ci0gIFdvcmQxNiBwYlZhbDAsIHBiVmFsMSwgc2hpZnQ7Ci0KLSAgLyogcmVsYXRpdmUgbnVtYmVyIG9mIGFjdGl2ZSBiYXJrcyAqLwotCi0KLSAgcGVQZXJXaW5kb3cgPSBiaXRzMnBlKGV4dHJhY3RfbCgoYml0cmF0ZSAqIG51bUxpbmVzKSAvIHNhbXBsZXJhdGUpKTsKLQotICBwYlZhbDAgPSAwOwotCi0gIGZvciAoc2ZiPTA7IHNmYjxzZmJBY3RpdmU7IHNmYisrKSB7Ci0KLSAgICBwYlZhbDEgPSAocGJCYXJjVmFsW3NmYl0gPDwgMSkgLSBwYlZhbDA7Ci0gICAgYmFyY1dpZHRoID0gcGJWYWwxIC0gcGJWYWwwOwotICAgIHBiVmFsMCA9IHBiVmFsMTsKLQotICAgIC8qIGFsbG93IGF0IGxlYXN0IDIuNCUgb2YgcGUgZm9yIGVhY2ggYWN0aXZlIGJhcmMgKi8KLQlwZVBhcnQgPSAoKHBlUGVyV2luZG93ICogMjQpICogKG1heF9iYXJrICogYmFyY1dpZHRoKSkgLwotICAgICAgICAocGJCYXJjVmFsW3NmYkFjdGl2ZS0xXSAqIChzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYl0pKTsKLQotCi0gICAgcGVQYXJ0ID0gbWluKHBlUGFydCwgODQwMCk7Ci0gICAgcGVQYXJ0ID0gbWF4KHBlUGFydCwgMTQwMCk7Ci0KLSAgICAvKiBtaW5TbnIobikgPSAxLygyXnNmYlBlbWluKG4pL3cobikgLSAxLjUpKi8KLQkvKiB3ZSBhZGQgYW4gb2Zmc2V0IG9mIDJeMTYgdG8gdGhlIHBvdyBmdW5jdGlvbnMgKi8KLQkvKiAweGMwMDAgPSAxLjUqKDEgPDwgMTUpKi8KLQotICAgIHNuciA9IHBvdzJfeHkoKHBlUGFydCAtIDE2KjEwMDApLDEwMDApIC0gMHgwMDAwYzAwMDsKLQotICAgIGlmKHNuciA+IDB4MDAwMDgwMDApCi0JewotCQlzaGlmdCA9IG5vcm1fbChzbnIpOwotCQlzbnIgPSBEaXZfMzIoMHgwMDAwODAwMCA8PCBzaGlmdCwgc25yIDw8IHNoaWZ0KTsKLQl9Ci0JZWxzZQotCXsKLQkJc25yID0gMHg3ZmZmZmZmZjsKLQl9Ci0KLSAgICAvKiB1cHBlciBsaW1pdCBpcyAtMSBkQiAqLwotICAgIHNuciA9IG1pbihzbnIsIGNfbWF4c25yKTsKLSAgICAvKiBsb3dlciBsaW1pdCBpcyAtMjUgZEIgKi8KLSAgICBzbnIgPSBtYXgoc25yLCBjX21pbnNucik7Ci0gICAgc2ZiTWluU25yW3NmYl0gPSByb3VuZDE2KHNucik7Ci0gIH0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogSW5pdFBzeUNvbmZpZ3VyYXRpb25Mb25nCi0qIGRlc2NyaXB0aW9uOiAgaW5pdCBsb25nIGJsb2NrIHBzeWNob2Fjb3VzdGljIGNvbmZpZ3VyYXRpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uTG9uZyhXb3JkMzIgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBzeUNvbmYpCi17Ci0gIFdvcmQzMiBzYW1wbGVyYXRlaW5kZXg7Ci0gIFdvcmQxNiBzZmJCYXJjVmFsW01BWF9TRkJfTE9OR107Ci0gIFdvcmQxNiBzZmI7Ci0KLSAgLyoKLSAgICBpbml0IHNmYiB0YWJsZQotICAqLwotICBzYW1wbGVyYXRlaW5kZXggPSBHZXRTUkluZGV4KHNhbXBsZXJhdGUpOwotICBwc3lDb25mLT5zZmJDbnQgPSBzZkJhbmRUb3RhbExvbmdbc2FtcGxlcmF0ZWluZGV4XTsKLSAgcHN5Q29uZi0+c2ZiT2Zmc2V0ID0gc2ZCYW5kVGFiTG9uZyArIHNmQmFuZFRhYkxvbmdPZmZzZXRbc2FtcGxlcmF0ZWluZGV4XTsKLSAgcHN5Q29uZi0+c2FtcFJhdGVJZHggPSBzYW1wbGVyYXRlaW5kZXg7Ci0KLSAgLyoKLSAgICBjYWxjdWxhdGUgYmFyYyB2YWx1ZXMgZm9yIGVhY2ggcGIKLSAgKi8KLSAgaW5pdEJhcmNWYWx1ZXMocHN5Q29uZi0+c2ZiQ250LAotICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLAotICAgICAgICAgICAgICAgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsKTsKLQotICAvKgotICAgIGluaXQgdGhyZXNob2xkcyBpbiBxdWlldAotICAqLwotICBpbml0VGhyUXVpZXQocHN5Q29uZi0+c2ZiQ250LAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYlRocmVzaG9sZFF1aWV0KTsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBzcHJlYWRpbmcgZnVuY3Rpb24KLSAgKi8KLSAgaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgTE9OR19XSU5ET1cpOwotCi0gIC8qCi0gICAgaW5pdCByYXRpbwotICAqLwotICBwc3lDb25mLT5yYXRpbyA9IGNfcmF0aW87Ci0KLSAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsKLSAgcHN5Q29uZi0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7ICAgIC8qIDAuMDEgKigxIDw8IDE1KSovCi0KLSAgcHN5Q29uZi0+Y2xpcEVuZXJneSA9IGNfbWF4Q2xpcEVuZXJneUxvbmc7Ci0gIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0gZXh0cmFjdF9sKChiYW5kd2lkdGg8PDEpICogRlJBTUVfTEVOX0xPTkcgLyBzYW1wbGVyYXRlKTsKLQotICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspIHsKLSAgICBpZiAoc3ViKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdLCBwc3lDb25mLT5sb3dwYXNzTGluZSkgPj0gMCkKLSAgICAgIGJyZWFrOwotICB9Ci0gIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IHNmYjsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBtaW5TbnIKLSAgKi8KLSAgaW5pdE1pblNucihiaXRyYXRlLAotICAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgIHNmYkJhcmNWYWwsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1pblNucik7Ci0KLQotICByZXR1cm4oMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0Ci0qIGRlc2NyaXB0aW9uOiAgaW5pdCBzaG9ydCBibG9jayBwc3ljaG9hY291c3RpYyBjb25maWd1cmF0aW9uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0KFdvcmQzMiBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKnBzeUNvbmYpCi17Ci0gIFdvcmQzMiBzYW1wbGVyYXRlaW5kZXg7Ci0gIFdvcmQxNiBzZmJCYXJjVmFsW01BWF9TRkJfU0hPUlRdOwotICBXb3JkMTYgc2ZiOwotICAvKgotICAgIGluaXQgc2ZiIHRhYmxlCi0gICovCi0gIHNhbXBsZXJhdGVpbmRleCA9IEdldFNSSW5kZXgoc2FtcGxlcmF0ZSk7Ci0gIHBzeUNvbmYtPnNmYkNudCA9IHNmQmFuZFRvdGFsU2hvcnRbc2FtcGxlcmF0ZWluZGV4XTsKLSAgcHN5Q29uZi0+c2ZiT2Zmc2V0ID0gc2ZCYW5kVGFiU2hvcnQgKyBzZkJhbmRUYWJTaG9ydE9mZnNldFtzYW1wbGVyYXRlaW5kZXhdOwotICBwc3lDb25mLT5zYW1wUmF0ZUlkeCA9IHNhbXBsZXJhdGVpbmRleDsKLSAgLyoKLSAgICBjYWxjdWxhdGUgYmFyYyB2YWx1ZXMgZm9yIGVhY2ggcGIKLSAgKi8KLSAgaW5pdEJhcmNWYWx1ZXMocHN5Q29uZi0+c2ZiQ250LAotICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLAotICAgICAgICAgICAgICAgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsKTsKLQotICAvKgotICAgIGluaXQgdGhyZXNob2xkcyBpbiBxdWlldAotICAqLwotICBpbml0VGhyUXVpZXQocHN5Q29uZi0+c2ZiQ250LAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYlRocmVzaG9sZFF1aWV0KTsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBzcHJlYWRpbmcgZnVuY3Rpb24KLSAgKi8KLSAgaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgU0hPUlRfV0lORE9XKTsKLQotICAvKgotICAgIGluaXQgcmF0aW8KLSAgKi8KLSAgcHN5Q29uZi0+cmF0aW8gPSBjX3JhdGlvOwotCi0gIHBzeUNvbmYtPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciA9IDI7Ci0gIHBzeUNvbmYtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciA9IGNfbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yOwotCi0gIHBzeUNvbmYtPmNsaXBFbmVyZ3kgPSBjX21heENsaXBFbmVyZ3lTaG9ydDsKLQotICBwc3lDb25mLT5sb3dwYXNzTGluZSA9IGV4dHJhY3RfbCgoKGJhbmR3aWR0aCA8PCAxKSAqIEZSQU1FX0xFTl9TSE9SVCkgLyBzYW1wbGVyYXRlKTsKLQotICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspIHsKLQotICAgIGlmIChwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSA+PSBwc3lDb25mLT5sb3dwYXNzTGluZSkKLSAgICAgIGJyZWFrOwotICB9Ci0gIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IHNmYjsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBtaW5TbnIKLSAgKi8KLSAgaW5pdE1pblNucihiaXRyYXRlLAotICAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgIHNmYkJhcmNWYWwsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1pblNucik7Ci0KLSAgcmV0dXJuKDApOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwNjc5Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODE1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcHN5X21haW4uYwotCi0JQ29udGVudDoJUHN5Y2hvYWNvdXN0aWMgbWFqb3IgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgotI2luY2x1ZGUgInRyYW5zZm9ybS5oIgotI2luY2x1ZGUgInNwcmVhZGluZy5oIgotI2luY2x1ZGUgInByZV9lY2hvX2NvbnRyb2wuaCIKLSNpbmNsdWRlICJiYW5kX25yZy5oIgotI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAicHN5X2RhdGEuaCIKLSNpbmNsdWRlICJtc19zdGVyZW8uaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJwc3lfbWFpbi5oIgotI2luY2x1ZGUgImdycF9kYXRhLmgiCi0jaW5jbHVkZSAidG5zX2Z1bmMuaCIKLSNpbmNsdWRlICJtZW1hbGlnbi5oIgotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHN0YXJ0ICAgICAgIHNob3J0ICAgICAgIHN0b3AgKi8KLXN0YXRpYyBXb3JkMTYgYmxvY2tUeXBlMndpbmRvd1NoYXBlW10gPSB7S0JEX1dJTkRPVyxTSU5FX1dJTkRPVyxTSU5FX1dJTkRPVyxLQkRfV0lORE9XfTsKLQotLyoKLSAgZm9yd2FyZCBkZWZpbml0aW9ucwotKi8KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZyhQU1lfREFUQSogcHN5RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpoUHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCk7Ci0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZ01TIChQU1lfREFUQSAgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZyk7Ci0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnQoUFNZX0RBVEEqIHBzeURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCk7Ci0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnRNUyAoUFNZX0RBVEEgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBQc3lOZXcKLSogZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3ljaG9hY291c3RpYwotKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKLSogaW5wdXQ6ICAgICAgICBwb2ludGVyIHRvIGEgcHN5Y2ggaGFuZGxlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBQc3lOZXcoUFNZX0tFUk5FTCAqaFBzeSwgV29yZDMyIG5DaGFuLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgV29yZDE2IGk7Ci0gIFdvcmQzMiAqbWRjdFNwZWN0cnVtOwotICBXb3JkMzIgKnNjcmF0Y2hUTlM7Ci0gIFdvcmQxNiAqbWRjdERlbGF5QnVmZmVyOwotCi0gIG1kY3RTcGVjdHJ1bSA9IChXb3JkMzIgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW4gKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMzIpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gbWRjdFNwZWN0cnVtKQotCSAgcmV0dXJuIDE7Ci0KLSAgc2NyYXRjaFROUyA9IChXb3JkMzIgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW4gKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMzIpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gc2NyYXRjaFROUykKLSAgewotCSAgcmV0dXJuIDE7Ci0gIH0KLQotICBtZGN0RGVsYXlCdWZmZXIgPSAoV29yZDE2ICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFuICogQkxPQ0tfU1dJVENISU5HX09GRlNFVCAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gbWRjdERlbGF5QnVmZmVyKQotICB7Ci0JICByZXR1cm4gMTsKLSAgfQotCi0gIGZvciAoaT0wOyBpPG5DaGFuOyBpKyspewotICAgIGhQc3ktPnBzeURhdGFbaV0ubWRjdERlbGF5QnVmZmVyID0gbWRjdERlbGF5QnVmZmVyICsgaSpCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUOwotICAgIGhQc3ktPnBzeURhdGFbaV0ubWRjdFNwZWN0cnVtID0gbWRjdFNwZWN0cnVtICsgaSpGUkFNRV9MRU5fTE9ORzsKLSAgfQotCi0gIGhQc3ktPnBTY3JhdGNoVG5zID0gc2NyYXRjaFROUzsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUHN5RGVsZXRlCi0qIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcHN5Y2hvYWNvdXN0aWMKLSogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBQc3lEZWxldGUoUFNZX0tFUk5FTCAgKmhQc3ksIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBXb3JkMzIgbmNoOwotCi0gIGlmKGhQc3kpCi0gIHsKLQlpZihoUHN5LT5wc3lEYXRhWzBdLm1kY3REZWxheUJ1ZmZlcikKLQkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wc3lEYXRhWzBdLm1kY3REZWxheUJ1ZmZlciwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLSAgICBpZihoUHN5LT5wc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSkKLQkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLSAgICBmb3IgKG5jaD0wOyBuY2g8TUFYX0NIQU5ORUxTOyBuY2grKyl7Ci0JICBoUHN5LT5wc3lEYXRhW25jaF0ubWRjdERlbGF5QnVmZmVyID0gTlVMTDsKLQkgIGhQc3ktPnBzeURhdGFbbmNoXS5tZGN0U3BlY3RydW0gPSBOVUxMOwotCX0KLQotCWlmKGhQc3ktPnBTY3JhdGNoVG5zKQotCXsKLQkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wU2NyYXRjaFRucywgVk9fSU5ERVhfRU5DX0FBQyk7Ci0JCWhQc3ktPnBTY3JhdGNoVG5zID0gTlVMTDsKLQl9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUHN5T3V0TmV3Ci0qIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcHN5T3V0IHN0cnVjCi0qIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQotKiBpbnB1dDogICAgICAgIHBvaW50ZXIgdG8gYSBwc3ljaCBoYW5kbGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFBzeU91dE5ldyhQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgcE1lbU9QLT5TZXQoVk9fSU5ERVhfRU5DX0FBQywgaFBzeU91dCwgMCwgc2l6ZW9mKFBTWV9PVVQpKTsKLSAgLyoKLSAgICBhbGxvYyBzb21lIG1vcmUgc3R1ZmYsIHRiZAotICAqLwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFBzeU91dERlbGV0ZQotKiBkZXNjcmlwdGlvbjogIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBzeWNob2Fjb3VzdGljCi0qIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgUHN5T3V0RGVsZXRlKFBTWV9PVVQgKmhQc3lPdXQsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBVTlVTRUQoaFBzeU91dCk7Ci0gIFVOVVNFRChwTWVtT1ApOwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBwc3lNYWluSW5pdAotKiBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHBzeWNob2Fjb3VzdGljCi0qIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVdvcmQxNiBwc3lNYWluSW5pdChQU1lfS0VSTkVMICpoUHN5LAotICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG5zTWFzaywKLSAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoKQotewotICBXb3JkMTYgY2gsIGVycjsKLSAgV29yZDMyIGNoYW5uZWxCaXRSYXRlID0gYml0UmF0ZS9jaGFubmVsczsKLQotICBlcnIgPSBJbml0UHN5Q29uZmlndXJhdGlvbkxvbmcoY2hhbm5lbEJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoUHN5LT5wc3lDb25mTG9uZykpOwotCi0gIGlmICghZXJyKSB7Ci0gICAgICBoUHN5LT5zYW1wbGVSYXRlSWR4ID0gaFBzeS0+cHN5Q29uZkxvbmcuc2FtcFJhdGVJZHg7Ci0JICBlcnIgPSBJbml0VG5zQ29uZmlndXJhdGlvbkxvbmcoYml0UmF0ZSwgc2FtcGxlUmF0ZSwgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lDb25mTG9uZy50bnNDb25mLCAmaFBzeS0+cHN5Q29uZkxvbmcsIHRuc01hc2smMik7Ci0gIH0KLQotICBpZiAoIWVycikKLSAgICBlcnIgPSBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0KGNoYW5uZWxCaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lDb25mU2hvcnQpOwotICBpZiAoIWVycikgewotICAgIGVyciA9IEluaXRUbnNDb25maWd1cmF0aW9uU2hvcnQoYml0UmF0ZSwgc2FtcGxlUmF0ZSwgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFBzeS0+cHN5Q29uZlNob3J0LnRuc0NvbmYsICZoUHN5LT5wc3lDb25mU2hvcnQsIHRuc01hc2smMSk7Ci0gIH0KLQotICBpZiAoIWVycikKLSAgICBmb3IoY2g9MDtjaCA8IGNoYW5uZWxzO2NoKyspewotCi0gICAgICBJbml0QmxvY2tTd2l0Y2hpbmcoJmhQc3ktPnBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlLCBjaGFubmVscyk7Ci0KLSAgICAgIEluaXRQcmVFY2hvQ29udHJvbChoUHN5LT5wc3lEYXRhW2NoXS5zZmJUaHJlc2hvbGRubTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZkxvbmcuc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZMb25nLnNmYlRocmVzaG9sZFF1aWV0KTsKLSAgICAgIGhQc3ktPnBzeURhdGFbY2hdLm1kY3RTY2FsZW5tMSA9IDA7Ci0gICAgfQotCi0JcmV0dXJuKGVycik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBwc3lNYWluCi0qIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMgbWFpbiBmdW5jdGlvbgotKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKLSoKLSogICAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZW5vdWdoIGlucHV0IGRhdGEgaXMgaW4gdGhlIG1vZHVsbyBidWZmZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotV29yZDE2IHBzeU1haW4oV29yZDE2ICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyAgICAgICAgICAgICplbGVtSW5mbywKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgICAgICp0aW1lU2lnbmFsLAotICAgICAgICAgICAgICAgUFNZX0RBVEEgICAgICAgICAgICAgICAgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIFROU19EQVRBICAgICAgICAgICAgICAgICB0bnNEYXRhW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICAqaFBzeUNvbmZMb25nLAotICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQsCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICAgICAgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2hUbnMsCi0JCQkgICBXb3JkMzIJCQkJICAgc2FtcGxlUmF0ZSkKLXsKLSAgV29yZDE2IG1heFNmYlBlckdyb3VwW01BWF9DSEFOTkVMU107Ci0gIFdvcmQxNiBtZGN0U2NhbGluZ0FycmF5W01BWF9DSEFOTkVMU107Ci0KLSAgV29yZDE2IGNoOyAgIC8qIGNvdW50cyB0aHJvdWdoIGNoYW5uZWxzICAgICAgICAgICovCi0gIFdvcmQxNiBzZmI7ICAvKiBjb3VudHMgdGhyb3VnaCBzY2FsZWZhY3RvciBiYW5kcyAqLwotICBXb3JkMTYgbGluZTsgLyogY291bnRzIHRocm91Z2ggbGluZXMgICAgICAgICAgICAgKi8KLSAgV29yZDE2IGNoYW5uZWxzOwotICBXb3JkMTYgbWF4U2NhbGU7Ci0KLSAgY2hhbm5lbHMgPSBlbGVtSW5mby0+bkNoYW5uZWxzSW5FbDsKLSAgbWF4U2NhbGUgPSAwOwotCi0gIC8qIGJsb2NrIHN3aXRjaGluZyAqLwotICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgQmxvY2tTd2l0Y2hpbmcoJnBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICB0aW1lU2lnbmFsK2VsZW1JbmZvLT5DaGFubmVsSW5kZXhbY2hdLAotCQkJCSAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzKTsKLSAgfQotCi0gIC8qIHN5bmNoIGxlZnQgYW5kIHJpZ2h0IGJsb2NrIHR5cGUgKi8KLSAgU3luY0Jsb2NrU3dpdGNoaW5nKCZwc3lEYXRhWzBdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzFdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKLQotICAvKiB0cmFuc2Zvcm0KLSAgICAgYW5kIGdldCBtYXhTY2FsZSAobWF4IG1kY3RTY2FsaW5nKSBmb3IgYWxsIGNoYW5uZWxzICovCi0gIGZvcihjaD0wOyBjaDxjaGFubmVsczsgY2grKykgewotICAgIFRyYW5zZm9ybV9SZWFsKHBzeURhdGFbY2hdLm1kY3REZWxheUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICB0aW1lU2lnbmFsK2VsZW1JbmZvLT5DaGFubmVsSW5kZXhbY2hdLAotICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgJihtZGN0U2NhbGluZ0FycmF5W2NoXSksCi0gICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKLSAgICBtYXhTY2FsZSA9IG1heChtYXhTY2FsZSwgbWRjdFNjYWxpbmdBcnJheVtjaF0pOwotICB9Ci0KLSAgLyogY29tbW9uIHNjYWxpbmcgZm9yIGFsbCBjaGFubmVscyAqLwotICBmb3IgKGNoPTA7IGNoPGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgV29yZDE2IHNjYWxlRGlmZiA9IG1heFNjYWxlIC0gbWRjdFNjYWxpbmdBcnJheVtjaF07Ci0KLSAgICBpZiAoc2NhbGVEaWZmID4gMCkgewotICAgICAgV29yZDMyICpTcGVjdHJ1bSA9IHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bTsKLQkgIGZvcihsaW5lPTA7IGxpbmU8RlJBTUVfTEVOX0xPTkc7IGxpbmUrKykgewotICAgICAgICAqU3BlY3RydW0gPSAoKlNwZWN0cnVtKSA+PiBzY2FsZURpZmY7Ci0JCVNwZWN0cnVtKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHBzeURhdGFbY2hdLm1kY3RTY2FsZSA9IG1heFNjYWxlOwotICB9Ci0KLSAgZm9yIChjaD0wOyBjaDxjaGFubmVsczsgY2grKykgewotCi0gICAgaWYocHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgewotICAgICAgLyogdXBkYXRlIGxvbmcgYmxvY2sgcGFyYW1ldGVyICovCi0JICBhZHZhbmNlUHN5Y2hMb25nKCZwc3lEYXRhW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICZ0bnNEYXRhWzEgLSBjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgIGNoKTsKLQotICAgICAgLyogZGV0ZXJtaW5lIG1heFNmYiAqLwotICAgICAgZm9yIChzZmI9aFBzeUNvbmZMb25nLT5zZmJDbnQtMTsgc2ZiPj0wOyBzZmItLSkgewotICAgICAgICBmb3IgKGxpbmU9aFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiKzFdIC0gMTsgbGluZT49aFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXTsgbGluZS0tKSB7Ci0KLSAgICAgICAgICBpZiAocHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtW2xpbmVdICE9IDApIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaW5lID49IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYl0pIGJyZWFrOwotICAgICAgfQotICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gc2ZiICsgMTsKLQotICAgICAgLyogQ2FsYyBiYW5kd2lzZSBlbmVyZ2llcyBmb3IgbWlkIGFuZCBzaWRlIGNoYW5uZWwKLSAgICAgICAgIERvIGl0IG9ubHkgaWYgMiBjaGFubmVscyBleGlzdCAqLwotCi0gICAgICBpZiAoY2ggPT0gMSkKLSAgICAgICAgYWR2YW5jZVBzeWNoTG9uZ01TKHBzeURhdGEsIGhQc3lDb25mTG9uZyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYWR2YW5jZVBzeWNoU2hvcnQoJnBzeURhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbMSAtIGNoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoKTsKLQotICAgICAgLyogQ2FsYyBiYW5kd2lzZSBlbmVyZ2llcyBmb3IgbWlkIGFuZCBzaWRlIGNoYW5uZWwKLSAgICAgICAgIERvIGl0IG9ubHkgaWYgMiBjaGFubmVscyBleGlzdCAqLwotCi0gICAgICBpZiAoY2ggPT0gMSkKLSAgICAgICAgYWR2YW5jZVBzeWNoU2hvcnRNUyAocHN5RGF0YSwgaFBzeUNvbmZTaG9ydCk7Ci0gICAgfQotICB9Ci0KLSAgLyogZ3JvdXAgc2hvcnQgZGF0YSAqLwotICBmb3IoY2g9MDsgY2g8Y2hhbm5lbHM7IGNoKyspIHsKLQotICAgIGlmIChwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICBncm91cFNob3J0RGF0YShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFRucywKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYkVuZXJneU1TLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlNwcmVhZGVkRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWluU25yLAotICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk9mZnNldFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAmbWF4U2ZiUGVyR3JvdXBbY2hdLAotICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk1pblNucltjaF0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbik7Ci0gICAgfQotICB9Ci0KLQotI2lmIChNQVhfQ0hBTk5FTFM+MSkKLSAgLyoKLSAgICBzdGVyZW8gUHJvY2Vzc2luZwotICAqLwotICBpZiAoY2hhbm5lbHMgPT0gMikgewotICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCA9IE1TX05PTkU7Ci0gICAgbWF4U2ZiUGVyR3JvdXBbMF0gPSBtYXhTZmJQZXJHcm91cFsxXSA9IG1heChtYXhTZmJQZXJHcm91cFswXSwgbWF4U2ZiUGVyR3JvdXBbMV0pOwotCi0KLSAgICBpZiAocHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQotICAgICAgTXNTdGVyZW9Qcm9jZXNzaW5nKHBzeURhdGFbMF0uc2ZiRW5lcmd5LnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYkVuZXJneU1TLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3lNUy5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiVGhyZXNob2xkLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JkMTYqKSZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFdvcmQxNiopcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KiloUHN5Q29uZkxvbmctPnNmYk9mZnNldCk7Ci0gICAgICBlbHNlCi0gICAgICAgIE1zU3RlcmVvUHJvY2Vzc2luZyhwc3lEYXRhWzBdLnNmYkVuZXJneS5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYlRocmVzaG9sZC5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JkMTYqKSZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoV29yZDE2Kilwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKXBzeU91dEVsZW1lbnQtPmdyb3VwZWRTZmJPZmZzZXRbMF0pOwotICB9Ci0KLSNlbmRpZiAvKiAoTUFYX0NIQU5ORUxTPjEpICovCi0KLSAgLyoKLSAgICBidWlsZCBvdXRwdXQKLSAgKi8KLSAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykgewotCi0gICAgaWYgKHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCi0gICAgICBCdWlsZEludGVyZmFjZShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJTcHJlYWRlZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bU1TLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlMndpbmRvd1NoYXBlW3BzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZV0sCi0gICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdLAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJNaW5TbnIsCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSk7Ci0gICAgZWxzZQotICAgICAgQnVpbGRJbnRlcmZhY2UocHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0ubWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5zZmJFbmVyZ3lTdW0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5zZmJFbmVyZ3lTdW1NUywKLSAgICAgICAgICAgICAgICAgICAgIFNIT1JUX1dJTkRPVywKLSAgICAgICAgICAgICAgICAgICAgIFNJTkVfV0lORE9XLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5ncm91cGVkU2ZiT2Zmc2V0W2NoXSwKLSAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPmdyb3VwZWRTZmJNaW5TbnJbY2hdLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMsCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sCi0gICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0pOwotICB9Ci0KLSAgcmV0dXJuKDApOyAvKiBubyBlcnJvciAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoTG9uZwotKiBkZXNjcmlwdGlvbjogIHBzeWNob2Fjb3VzdGljIGZvciBsb25nIGJsb2NrcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZyhQU1lfREFUQSogcHN5RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpoUHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEqIHRuc0RhdGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCkKLXsKLSAgV29yZDMyIGk7Ci0gIFdvcmQzMiBub3JtRW5lcmd5U2hpZnQgPSAocHN5RGF0YS0+bWRjdFNjYWxlICsgMSkgPDwgMTsgLyogaW4gcmVmZXJlbmNlIGNvZGUsIG1kY3Qgc3BlY3RydW0gbXVzdCBiZSBtdWx0aXBpZWQgd2l0aCAyLCBzbyArMSAqLwotICBXb3JkMzIgY2xpcEVuZXJneSA9IGhQc3lDb25mTG9uZy0+Y2xpcEVuZXJneSA+PiBub3JtRW5lcmd5U2hpZnQ7Ci0gIFdvcmQzMiAqZGF0YTAsICpkYXRhMSwgdGRhdGE7Ci0KLSAgLyogbG93IHBhc3MgKi8KLSAgZGF0YTAgPSBwc3lEYXRhLT5tZGN0U3BlY3RydW0gKyBoUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lOwotICBmb3IoaT1oUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lOyBpPEZSQU1FX0xFTl9MT05HOyBpKyspIHsKLSAgICAqZGF0YTArKyA9IDA7Ci0gIH0KLQotICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCi0gIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYkxvbmcpOwotCi0gIC8qCi0gICAgVE5TIGRldGVjdAotICAqLwotICBUbnNEZXRlY3QodG5zRGF0YSwKLSAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZiwKLSAgICAgICAgICAgIHBTY3JhdGNoVG5zLAotICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmcpOwotCi0gIC8qICBUbnNTeW5jICovCi0gIGlmIChjaCA9PSAxKSB7Ci0gICAgVG5zU3luYyh0bnNEYXRhLAotICAgICAgICAgICAgdG5zRGF0YTIsCi0gICAgICAgICAgICBoUHN5Q29uZkxvbmctPnRuc0NvbmYsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKLSAgfQotCi0gIC8qICBUbnMgRW5jb2RlciAqLwotICBUbnNFbmNvZGUoJnBzeU91dENoYW5uZWwtPnRuc0luZm8sCi0gICAgICAgICAgICB0bnNEYXRhLAotICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJDbnQsCi0gICAgICAgICAgICBoUHN5Q29uZkxvbmctPnRuc0NvbmYsCi0gICAgICAgICAgICBoUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lLAotICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7Ci0KLSAgLyogZmlyc3QgcGFydCBvZiB0aHJlc2hvbGQgY2FsY3VsYXRpb24gKi8KLSAgZGF0YTAgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiTG9uZzsKLSAgZGF0YTEgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZzsKLSAgZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKLSAgICB0ZGF0YSA9IExfbXB5X2xzKCpkYXRhMCsrLCBoUHN5Q29uZkxvbmctPnJhdGlvKTsKLSAgICAqZGF0YTErKyA9IG1pbih0ZGF0YSwgY2xpcEVuZXJneSk7Ci0gIH0KLQotICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGFnYWluICovCi0gIGlmICh0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSE9MCkgewotICAgIFdvcmQxNiB0bnNTdGFydEJhbmQgPSBoUHN5Q29uZkxvbmctPnRuc0NvbmYudG5zU3RhcnRCYW5kOwotICAgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0K3Ruc1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJBY3RpdmUgLSB0bnNTdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nK3Ruc1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgJnBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJMb25nKTsKLQotCWRhdGEwID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmc7Ci0JdGRhdGEgPSBwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiTG9uZzsKLQlmb3IgKGk9MDsgaTx0bnNTdGFydEJhbmQ7IGkrKykKLSAgICAgIHRkYXRhICs9ICpkYXRhMCsrOwotCi0JcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYkxvbmcgPSB0ZGF0YTsKLSAgfQotCi0KLSAgLyogc3ByZWFkaW5nIGVuZXJneSAqLwotICBTcHJlYWRpbmdNYXgoaFBzeUNvbmZMb25nLT5zZmJDbnQsCi0gICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tMb3dGYWN0b3IsCi0gICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYkxvbmcpOwotCi0gIC8qIHRocmVzaG9sZCBpbiBxdWlldCAqLwotICBkYXRhMCA9IHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nOwotICBkYXRhMSA9IGhQc3lDb25mTG9uZy0+c2ZiVGhyZXNob2xkUXVpZXQ7Ci0gIGZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKQotICB7Ci0JICAqZGF0YTAgPSBtYXgoKmRhdGEwLCAoKmRhdGExID4+IG5vcm1FbmVyZ3lTaGlmdCkpOwotCSAgZGF0YTArKzsgZGF0YTErKzsKLSAgfQotCi0gIC8qIHByZWVjaG8gY29udHJvbCAqLwotICBpZiAocHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlID09IFNUT1BfV0lORE9XKSB7Ci0gICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGRubTE7Ci0JZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKLSAgICAgICpkYXRhMCsrID0gTUFYXzMyOwotICAgIH0KLSAgICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSAwOwotICB9Ci0KLSAgUHJlRWNob0NvbnRyb2woIHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMSwKLSAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xKTsKLSAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gcHN5RGF0YS0+bWRjdFNjYWxlOwotCi0KLSAgaWYgKHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZT09IFNUQVJUX1dJTkRPVykgewotICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkbm0xOwotCWZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKSB7Ci0gICAgICAqZGF0YTArKyA9IE1BWF8zMjsKLSAgICB9Ci0gICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gMDsKLSAgfQotCi0gIC8qIGFwcGx5IHRucyBtdWx0IHRhYmxlIG9uIGNiIHRocmVzaG9sZHMgKi8KLSAgQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcyhoUHN5Q29uZkxvbmctPnRuc0NvbmYudG5zUmF0aW9QYXRjaExvd2VzdENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNTdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZyk7Ci0KLQotICAvKiBzcHJlYWRlZCBlbmVyZ3kgKi8KLSAgZGF0YTAgPSBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nOwotICBkYXRhMSA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nOwotICBmb3IgKGk9aFBzeUNvbmZMb25nLT5zZmJDbnQ7IGk7IGktLSkgewotICAgIC8vcHN5RGF0YS0+c2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZ1tpXSA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nW2ldOwotCSAgKmRhdGEwKysgPSAqZGF0YTErKzsKLSAgfQotCi0gIC8qIHNwcmVhZGluZyBlbmVyZ3kgKi8KLSAgU3ByZWFkaW5nTWF4KGhQc3lDb25mTG9uZy0+c2ZiQ250LAotICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGFkdmFuY2VQc3ljaExvbmdNUwotKiBkZXNjcmlwdGlvbjogICB1cGRhdGUgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbAotKgkJCQlmb3IgbG9uZyBibG9jawotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaExvbmdNUyAoUFNZX0RBVEEgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZykKLXsKLSAgQ2FsY0JhbmRFbmVyZ3lNUyhwc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYkVuZXJneU1TLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMF0uc2ZiRW5lcmd5U3VtTVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYkVuZXJneU1TLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMV0uc2ZiRW5lcmd5U3VtTVMuc2ZiTG9uZyk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGFkdmFuY2VQc3ljaFNob3J0Ci0qIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMgZm9yIHNob3J0IGJsb2NrcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnQoUFNZX0RBVEEqIHBzeURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCkKLXsKLSAgV29yZDMyIHc7Ci0gIFdvcmQzMiBub3JtRW5lcmd5U2hpZnQgPSAocHN5RGF0YS0+bWRjdFNjYWxlICsgMSkgPDwgMTsgLyogaW4gcmVmZXJlbmNlIGNvZGUsIG1kY3Qgc3BlY3RydW0gbXVzdCBiZSBtdWx0aXBpZWQgd2l0aCAyLCBzbyArMSAqLwotICBXb3JkMzIgY2xpcEVuZXJneSA9IGhQc3lDb25mU2hvcnQtPmNsaXBFbmVyZ3kgPj4gbm9ybUVuZXJneVNoaWZ0OwotICBXb3JkMzIgd09mZnNldCA9IDA7Ci0gIFdvcmQzMiAqZGF0YTA7Ci0gIGNvbnN0IFdvcmQzMiAqZGF0YTE7Ci0KLSAgZm9yKHcgPSAwOyB3IDwgVFJBTlNfRkFDOyB3KyspIHsKLSAgICBXb3JkMzIgaSwgdGRhdGE7Ci0KLSAgICAvKiBsb3cgcGFzcyAqLwotICAgIGRhdGEwID0gcHN5RGF0YS0+bWRjdFNwZWN0cnVtICsgd09mZnNldCArIGhQc3lDb25mU2hvcnQtPmxvd3Bhc3NMaW5lOwotCWZvcihpPWhQc3lDb25mU2hvcnQtPmxvd3Bhc3NMaW5lOyBpPEZSQU1FX0xFTl9TSE9SVDsgaSsrKXsKLSAgICAgICpkYXRhMCsrID0gMDsKLSAgICB9Ci0KLSAgICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCi0gICAgQ2FsY0JhbmRFbmVyZ3koIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddLAotICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddKTsKLSAgICAvKgotICAgICAgIFROUwotICAgICovCi0gICAgVG5zRGV0ZWN0KHRuc0RhdGEsCi0gICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYsCi0gICAgICAgICAgICAgIHBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KiloUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICB3LAotICAgICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XSk7Ci0KLSAgICAvKiAgVG5zU3luYyAqLwotICAgIGlmIChjaCA9PSAxKSB7Ci0gICAgICBUbnNTeW5jKHRuc0RhdGEsCi0gICAgICAgICAgICAgIHRuc0RhdGEyLAotICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT50bnNDb25mLAotICAgICAgICAgICAgICB3LAotICAgICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UpOwotICAgIH0KLQotICAgIFRuc0VuY29kZSgmcHN5T3V0Q2hhbm5lbC0+dG5zSW5mbywKLSAgICAgICAgICAgICAgdG5zRGF0YSwKLSAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT50bnNDb25mLAotICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5sb3dwYXNzTGluZSwKLSAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgIHcsCi0gICAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7Ci0KLSAgICAvKiBmaXJzdCBwYXJ0IG9mIHRocmVzaG9sZCBjYWxjdWxhdGlvbiAqLwotICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddOwotCWRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddOwotCWZvciAoaT1oUHN5Q29uZlNob3J0LT5zZmJDbnQ7IGk7IGktLSkgewotICAgICAgdGRhdGEgPSBMX21weV9scygqZGF0YTErKywgaFBzeUNvbmZTaG9ydC0+cmF0aW8pOwotICAgICAgKmRhdGEwKysgPSBtaW4odGRhdGEsIGNsaXBFbmVyZ3kpOwotICAgIH0KLQotICAgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYWdhaW4gKi8KLSAgICBpZiAodG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlICE9IDApIHsKLSAgICAgIFdvcmQxNiB0bnNTdGFydEJhbmQgPSBoUHN5Q29uZlNob3J0LT50bnNDb25mLnRuc1N0YXJ0QmFuZDsKLSAgICAgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQrdG5zU3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAgIChoUHN5Q29uZlNob3J0LT5zZmJBY3RpdmUgLSB0bnNTdGFydEJhbmQpLAotICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XSt0bnNTdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJTaG9ydFt3XSk7Ci0KLSAgICAgIHRkYXRhID0gcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddOwotCSAgZGF0YTAgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiU2hvcnRbd107Ci0JICBmb3IgKGk9dG5zU3RhcnRCYW5kOyBpOyBpLS0pCi0gICAgICAgIHRkYXRhICs9ICpkYXRhMCsrOwotCi0JICBwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiU2hvcnRbd10gPSB0ZGF0YTsKLSAgICB9Ci0KLSAgICAvKiBzcHJlYWRpbmcgKi8KLSAgICBTcHJlYWRpbmdNYXgoaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrSGlnaEZhY3RvciwKLSAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddKTsKLQotCi0gICAgLyogdGhyZXNob2xkIGluIHF1aWV0ICovCi0gICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd107Ci0JZGF0YTEgPSBoUHN5Q29uZlNob3J0LT5zZmJUaHJlc2hvbGRRdWlldDsKLQlmb3IgKGk9aFBzeUNvbmZTaG9ydC0+c2ZiQ250OyBpOyBpLS0pCi0gICAgewotCQkqZGF0YTAgPSBtYXgoKmRhdGEwLCAoKmRhdGExID4+IG5vcm1FbmVyZ3lTaGlmdCkpOwotCi0JCWRhdGEwKys7IGRhdGExKys7Ci0JfQotCi0KLSAgICAvKiBwcmVlY2hvICovCi0gICAgUHJlRWNob0NvbnRyb2woIHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMSwKLSAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddLAotICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5tZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIHc9PTAgPyBwc3lEYXRhLT5tZGN0U2NhbGVubTEgOiBwc3lEYXRhLT5tZGN0U2NhbGUpOwotCi0gICAgLyogYXBwbHkgdG5zIG11bHQgdGFibGUgb24gY2IgdGhyZXNob2xkcyAqLwotICAgIEFwcGx5VG5zTXVsdFRhYmxlVG9SYXRpb3MoIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zUmF0aW9QYXRjaExvd2VzdENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zU3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3ddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJTaG9ydFt3XSk7Ci0KLSAgICAvKiBzcHJlYWRlZCBlbmVyZ3kgKi8KLSAgICBkYXRhMCA9IHBzeURhdGEtPnNmYlNwcmVhZGVkRW5lcmd5LnNmYlNob3J0W3ddOwotCWRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddOwotCWZvciAoaT1oUHN5Q29uZlNob3J0LT5zZmJDbnQ7IGk7IGktLSkgewotCSAgKmRhdGEwKysgPSAqZGF0YTErKzsKLSAgICB9Ci0gICAgU3ByZWFkaW5nTWF4KGhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJTaG9ydFt3XSk7Ci0KLSAgICB3T2Zmc2V0ICs9IEZSQU1FX0xFTl9TSE9SVDsKLSAgfSAvKiBmb3IgVFJBTlNfRkFDICovCi0KLSAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gcHN5RGF0YS0+bWRjdFNjYWxlOwotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoU2hvcnRNUwotKiBkZXNjcmlwdGlvbjogICB1cGRhdGUgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbAotKgkJCQlmb3Igc2hvcnQgYmxvY2sKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hTaG9ydE1TIChQU1lfREFUQSBwc3lEYXRhW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpoUHN5Q29uZlNob3J0KQotewotICBXb3JkMzIgdywgd09mZnNldDsKLSAgd09mZnNldCA9IDA7Ci0gIGZvcih3PTA7IHc8VFJBTlNfRkFDOyB3KyspIHsKLSAgICBDYWxjQmFuZEVuZXJneU1TKHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJFbmVyZ3lNUy5zZmJTaG9ydFt3XSwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzBdLnNmYkVuZXJneVN1bU1TLnNmYlNob3J0W3ddLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3lNUy5zZmJTaG9ydFt3XSwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzFdLnNmYkVuZXJneVN1bU1TLnNmYlNob3J0W3ddKTsKLSAgICB3T2Zmc2V0ICs9IEZSQU1FX0xFTl9TSE9SVDsKLSAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQ3OGFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXFjX21haW4uYwotCi0JQ29udGVudDoJUXVhbnRpemluZyAmIGNvZGluZyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJxY19tYWluLmgiCi0jaW5jbHVkZSAicXVhbnRpemUuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGpfdGhyLmgiCi0jaW5jbHVkZSAic2ZfZXN0aW0uaCIKLSNpbmNsdWRlICJzdGF0X2JpdHMuaCIKLSNpbmNsdWRlICJiaXRfY250LmgiCi0jaW5jbHVkZSAiZHluX2JpdHMuaCIKLSNpbmNsdWRlICJjaGFubmVsX21hcC5oIgotI2luY2x1ZGUgIm1lbWFsaWduLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi10eXBlZGVmIGVudW17Ci0gIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gPSAgMSwKLSAgRlJBTUVfTEVOX0JZVEVTX0lOVCAgICA9ICAyCi19RlJBTUVfTEVOX1JFU1VMVF9NT0RFOwotCi1zdGF0aWMgY29uc3QgV29yZDE2IG1heEZpbGxFbGVtQml0cyA9IDcgKyAyNzAqODsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIFdvcmQxNiBjYWxjTWF4VmFsdWVJblNmYihXb3JkMTYgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk9mZnNldFtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgcXVhbnRTcGVjdHJ1bVtGUkFNRV9MRU5fTE9OR10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgbWF4VmFsdWVbTUFYX0dST1VQRURfU0ZCXSk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNGcmFtZUxlbgotKiBkZXNjcmlwdGlvbjogZXN0aW1hdGUgdGhlIGZyYW1lIGxlbmd0aCBhY2NvcmRpbmcgdGhlIGJpdHJhdGVzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgY2FsY0ZyYW1lTGVuKFdvcmQzMiBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fUkVTVUxUX01PREUgbW9kZSkKLXsKLQotICBXb3JkMzIgcmVzdWx0OwotICBXb3JkMzIgcXVvdDsKLQotICByZXN1bHQgPSAoRlJBTUVfTEVOX0xPTkcgPj4gMykgKiBiaXRSYXRlOwotICBxdW90ID0gcmVzdWx0IC8gc2FtcGxlUmF0ZTsKLQotCi0gIGlmIChtb2RlID09IEZSQU1FX0xFTl9CWVRFU19NT0RVTE8pIHsKLSAgICByZXN1bHQgLT0gcXVvdCAqIHNhbXBsZVJhdGU7Ci0gIH0KLSAgZWxzZSB7IC8qIEZSQU1FX0xFTl9CWVRFU19JTlQgKi8KLSAgICByZXN1bHQgPSBxdW90OwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICBmdW5jdGlvbiBuYW1lOmZyYW1lUGFkZGluZwotKiAgZGVzY3JpcHRpb246IENhbGN1bGF0ZXMgaWYgcGFkZGluZyBpcyBuZWVkZWQgZm9yIGFjdHVhbCBmcmFtZQotKiAgcmV0dXJuczogcGFkZGluZ09uIG9yIG5vdAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGZyYW1lUGFkZGluZyhXb3JkMzIgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYWRkaW5nUmVzdCkKLXsKLSAgV29yZDE2IHBhZGRpbmdPbjsKLSAgV29yZDE2IGRpZmZlcmVuY2U7Ci0KLSAgcGFkZGluZ09uID0gMDsKLQotICBkaWZmZXJlbmNlID0gY2FsY0ZyYW1lTGVuKCBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fQllURVNfTU9EVUxPICk7Ci0gICpwYWRkaW5nUmVzdCA9ICpwYWRkaW5nUmVzdCAtIGRpZmZlcmVuY2U7Ci0KLQotICBpZiAoKnBhZGRpbmdSZXN0IDw9IDAgKSB7Ci0gICAgcGFkZGluZ09uID0gMTsKLSAgICAqcGFkZGluZ1Jlc3QgPSAqcGFkZGluZ1Jlc3QgKyBzYW1wbGVSYXRlOwotICB9Ci0KLSAgcmV0dXJuIHBhZGRpbmdPbjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDT3V0TmV3Ci0qIGRlc2NyaXB0aW9uOiBpbml0IHFjb3V0IHBhcmFtZXRlcgotKiByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1Xb3JkMTYgUUNPdXROZXcoUUNfT1VUICpoUUMsIFdvcmQxNiBuQ2hhbm5lbHMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBXb3JkMzIgaTsKLSAgV29yZDE2ICpxdWFudFNwZWM7Ci0gIFdvcmQxNiAqc2NmOwotICBVV29yZDE2ICptYXhWYWx1ZUluU2ZiOwotCi0gIHF1YW50U3BlYyA9IChXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW5uZWxzICogRlJBTUVfTEVOX0xPTkcgKiBzaXplb2YoV29yZDE2KSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOwotICBpZihOVUxMID09IHF1YW50U3BlYykKLQkgIHJldHVybiAxOwotICBzY2YgPSAoV29yZDE2ICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFubmVscyAqIE1BWF9HUk9VUEVEX1NGQiAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gc2NmKQotICB7Ci0JICByZXR1cm4gMTsKLSAgfQotICBtYXhWYWx1ZUluU2ZiID0gKFVXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW5uZWxzICogTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKFVXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gbWF4VmFsdWVJblNmYikKLSAgewotCSAgcmV0dXJuIDE7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxuQ2hhbm5lbHM7IGkrKykgewotICAgIGhRQy0+cWNDaGFubmVsW2ldLnF1YW50U3BlYyA9IHF1YW50U3BlYyArIGkqRlJBTUVfTEVOX0xPTkc7Ci0KLSAgICBoUUMtPnFjQ2hhbm5lbFtpXS5tYXhWYWx1ZUluU2ZiID0gbWF4VmFsdWVJblNmYiArIGkqTUFYX0dST1VQRURfU0ZCOwotCi0gICAgaFFDLT5xY0NoYW5uZWxbaV0uc2NmID0gc2NmICsgaSpNQVhfR1JPVVBFRF9TRkI7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDT3V0RGVsZXRlCi0qIGRlc2NyaXB0aW9uOiB1bmludCBxY291dCBwYXJhbWV0ZXIKLSogcmV0dXJuczogICAgICAwIGlmIHN1Y2Nlc3MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFFDT3V0RGVsZXRlKFFDX09VVCogaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgIFdvcmQzMiBpOwotICAgaWYoaFFDKQotICAgewotICAgICAgaWYoaFFDLT5xY0NoYW5uZWxbMF0ucXVhbnRTcGVjKQotCQkgbWVtX2ZyZWUocE1lbU9QLCBoUUMtPnFjQ2hhbm5lbFswXS5xdWFudFNwZWMsIFZPX0lOREVYX0VOQ19BQUMpOwotCi0gICAgICBpZihoUUMtPnFjQ2hhbm5lbFswXS5tYXhWYWx1ZUluU2ZiKQotCQkgIG1lbV9mcmVlKHBNZW1PUCwgaFFDLT5xY0NoYW5uZWxbMF0ubWF4VmFsdWVJblNmYiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLQkgIGlmKGhRQy0+cWNDaGFubmVsWzBdLnNjZikKLQkJICBtZW1fZnJlZShwTWVtT1AsIGhRQy0+cWNDaGFubmVsWzBdLnNjZiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLQkgIGZvciAoaT0wOyBpPE1BWF9DSEFOTkVMUzsgaSsrKSB7Ci0JCSAgaFFDLT5xY0NoYW5uZWxbaV0ucXVhbnRTcGVjID0gTlVMTDsKLQotCQkgIGhRQy0+cWNDaGFubmVsW2ldLm1heFZhbHVlSW5TZmIgPSBOVUxMOwotCi0JCSAgaFFDLT5xY0NoYW5uZWxbaV0uc2NmID0gTlVMTDsKLQkgIH0KLSAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBRQ05ldwotKiBkZXNjcmlwdGlvbjogc2V0IFFDIHRvIHplcm8KLSogcmV0dXJuczogICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBRQ05ldyhRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgcE1lbU9QLT5TZXQoVk9fSU5ERVhfRU5DX0FBQywgaFFDLDAsc2l6ZW9mKFFDX1NUQVRFKSk7Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBRQ0RlbGV0ZQotKiBkZXNjcmlwdGlvbjogdW5pbnQgcWNvdXQgcGFyYW1ldGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBRQ0RlbGV0ZShRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgVU5VU0VEKGhRQyk7Ci0gIFVOVVNFRChwTWVtT1ApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDSW5pdAotKiBkZXNjcmlwdGlvbjogaW5pdCBRRCBwYXJhbWV0ZXIKLSogcmV0dXJuczogICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBRQ0luaXQoUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgc3RydWN0IFFDX0lOSVQgKmluaXQpCi17Ci0gIGhRQy0+bkNoYW5uZWxzICAgICAgID0gaW5pdC0+ZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOwotICBoUUMtPm1heEJpdHNUb3QgICAgICA9IGluaXQtPm1heEJpdHM7Ci0gIGhRQy0+Yml0UmVzVG90ICAgICAgID0gc3ViKGluaXQtPmJpdFJlcywgaW5pdC0+YXZlcmFnZUJpdHMpOwotICBoUUMtPmF2ZXJhZ2VCaXRzVG90ICA9IGluaXQtPmF2ZXJhZ2VCaXRzOwotICBoUUMtPm1heEJpdEZhYyAgICAgICA9IGluaXQtPm1heEJpdEZhYzsKLQotICBoUUMtPnBhZGRpbmcucGFkZGluZ1Jlc3QgPSBpbml0LT5wYWRkaW5nLnBhZGRpbmdSZXN0OwotCi0gIGhRQy0+Z2xvYlN0YXRCaXRzICAgID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBJRF9FTkQgKi8KLQotICAvKiBjaGFubmVsIGVsZW1lbnRzIGluaXQgKi8KLSAgSW5pdEVsZW1lbnRCaXRzKCZoUUMtPmVsZW1lbnRCaXRzLAotICAgICAgICAgICAgICAgICAgKmluaXQtPmVsSW5mbywKLSAgICAgICAgICAgICAgICAgIGluaXQtPmJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICBpbml0LT5hdmVyYWdlQml0cywKLSAgICAgICAgICAgICAgICAgIGhRQy0+Z2xvYlN0YXRCaXRzKTsKLQotICAvKiB0aHJlc2hvbGQgcGFyYW1ldGVyIGluaXQgKi8KLSAgQWRqVGhySW5pdCgmaFFDLT5hZGpUaHIsCi0gICAgICAgICAgICAgaW5pdC0+bWVhblBlLAotICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHMuY2hCaXRyYXRlKTsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDTWFpbgotKiBkZXNjcmlwdGlvbjogIHF1YW50aXphdGlvbiBhbmQgY29kaW5nIHRoZSBzcGVjdHJ1bQotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBRQ01haW4oUUNfU1RBVEUqIGhRQywKLSAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsCi0gICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAgLyogbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlICovCi0gICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgIHFjT3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAgICAvKiBvdXQgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIHFjT3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywKLQkJCSAgV29yZDE2IGFuY2lsbGFyeURhdGFCeXRlcykKLXsKLSAgV29yZDE2IG1heENoRHluQml0c1tNQVhfQ0hBTk5FTFNdOwotICBXb3JkMTYgY2hCaXREaXN0cmlidXRpb25bTUFYX0NIQU5ORUxTXTsKLSAgV29yZDMyIGNoOwotCi0gIGlmIChlbEJpdHMtPmJpdFJlc0xldmVsIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChlbEJpdHMtPmJpdFJlc0xldmVsID4gZWxCaXRzLT5tYXhCaXRSZXNCaXRzKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCA9IGNvdW50U3RhdGljQml0ZGVtYW5kKHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotCQkJCQkJCQkJCQkJCSAgcWNPdXRFbGVtZW50LT5hZHRzVXNlZCk7Ci0KLQotICBpZiAoYW5jaWxsYXJ5RGF0YUJ5dGVzKSB7Ci0gICAgcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZCA9IDcgKyAoYW5jaWxsYXJ5RGF0YUJ5dGVzIDw8IDMpOwotCi0gICAgaWYgKGFuY2lsbGFyeURhdGFCeXRlcyA+PSAxNSkKLSAgICAgIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQgPSBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkICsgODsKLSAgfQotICBlbHNlIHsKLSAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gMDsKLSAgfQotCi0gIENhbGNGb3JtRmFjdG9yKGhRQy0+bG9nU2ZiRm9ybUZhY3RvciwgaFFDLT5zZmJOUmVsZXZhbnRMaW5lcywgaFFDLT5sb2dTZmJFbmVyZ3ksIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0KLSAgLyphZGp1c3QgdGhyZXNob2xkcyBmb3IgdGhlIGRlc2lyZWQgYml0cmF0ZSAqLwotICBBZGp1c3RUaHJlc2hvbGRzKCZoUUMtPmFkalRociwKLSAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgIGNoQml0RGlzdHJpYnV0aW9uLAotICAgICAgICAgICAgICAgICAgIGhRQy0+bG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgIGhRQy0+c2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LAotCQkJCSAgIGVsQml0cywKLQkJCQkgICBuQ2hhbm5lbHMsCi0JCQkJICAgaFFDLT5tYXhCaXRGYWMpOwotCi0gIC8qZXN0aW1hdGUgc2NhbGUgZmFjdG9ycyAqLwotICBFc3RpbWF0ZVNjYWxlRmFjdG9ycyhwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmxvZ1NmYkZvcm1GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGhRQy0+c2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscyk7Ci0KLSAgLyogY29uZGl0aW9uIHRvIHByZXZlbnQgZW1wdHkgYml0cmVzZXJ2b2lyICovCi0gIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgewotICAgIFdvcmQzMiBtYXhEeW5CaXRzOwotICAgIG1heER5bkJpdHMgPSBlbEJpdHMtPmF2ZXJhZ2VCaXRzICsgZWxCaXRzLT5iaXRSZXNMZXZlbCAtIDc7IC8qIC03IGJlYy4gb2YgYWxpZ24gYml0cyAqLwotICAgIG1heER5bkJpdHMgPSBtYXhEeW5CaXRzIC0gcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCArIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQ7Ci0gICAgbWF4Q2hEeW5CaXRzW2NoXSA9IGV4dHJhY3RfbChjaEJpdERpc3RyaWJ1dGlvbltjaF0gKiBtYXhEeW5CaXRzIC8gMTAwMCk7Ci0gIH0KLQotICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkID0gMDsKLSAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgV29yZDMyIGNoRHluQml0czsKLSAgICBGbGFnICAgY29uc3RyYWludHNGdWxmaWxsZWQ7Ci0gICAgV29yZDMyIGl0ZXI7Ci0gICAgaXRlciA9IDA7Ci0gICAgZG8gewotICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAxOwotCi0gICAgICBRdWFudGl6ZVNwZWN0cnVtKHBzeU91dENoYW5uZWxbY2hdLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0ubWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5zY2YsCi0gICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ucXVhbnRTcGVjKTsKLQotICAgICAgaWYgKGNhbGNNYXhWYWx1ZUluU2ZiKHBzeU91dENoYW5uZWxbY2hdLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ucXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWF4VmFsdWVJblNmYikgPiBNQVhfUVVBTlQpIHsKLSAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAwOwotICAgICAgfQotCi0gICAgICBjaER5bkJpdHMgPSBkeW5CaXRDb3VudChxY091dENoYW5uZWxbY2hdLnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0ud2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoYW5uZWxbY2hdLnNlY3Rpb25EYXRhKTsKLQotICAgICAgaWYgKGNoRHluQml0cyA+PSBtYXhDaER5bkJpdHNbY2hdKSB7Ci0gICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkID0gMDsKLSAgICAgIH0KLQotICAgICAgaWYgKCFjb25zdHJhaW50c0Z1bGZpbGxlZCkgewotICAgICAgICBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4gPSBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4gKyAxOwotICAgICAgfQotCi0gICAgICBpdGVyID0gaXRlciArIDE7Ci0KLSAgICB9IHdoaWxlKCFjb25zdHJhaW50c0Z1bGZpbGxlZCk7Ci0KLSAgICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkID0gcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIGNoRHluQml0czsKLQotICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWRjdFNjYWxlICAgID0gcHN5T3V0Q2hhbm5lbFtjaF0ubWRjdFNjYWxlOwotICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ3JvdXBpbmdNYXNrID0gcHN5T3V0Q2hhbm5lbFtjaF0uZ3JvdXBpbmdNYXNrOwotICAgIHFjT3V0Q2hhbm5lbFtjaF0ud2luZG93U2hhcGUgID0gcHN5T3V0Q2hhbm5lbFtjaF0ud2luZG93U2hhcGU7Ci0gIH0KLQotICAvKiBzYXZlIGR5bkJpdHNVc2VkIGZvciBjb3JyZWN0aW9uIG9mIGJpdHMycGUgcmVsYXRpb24gKi8KLSAgQWRqVGhyVXBkYXRlKGFkalRoclN0YXRlRWxlbWVudCwgcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCk7Ci0KLSAgewotICAgIFdvcmQxNiBiaXRSZXNTcGFjZSA9IGVsQml0cy0+bWF4Qml0UmVzQml0cyAtIGVsQml0cy0+Yml0UmVzTGV2ZWw7Ci0gICAgV29yZDE2IGRlbHRhQml0UmVzID0gZWxCaXRzLT5hdmVyYWdlQml0cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAocWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQpOwotCi0gICAgcWNPdXRFbGVtZW50LT5maWxsQml0cyA9IG1heCgwLCAoZGVsdGFCaXRSZXMgLSBiaXRSZXNTcGFjZSkpOwotICB9Ci0KLSAgcmV0dXJuIDA7IC8qIE9LICovCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjYWxjTWF4VmFsdWVJblNmYgotKiBkZXNjcmlwdGlvbjogIHNlYXJjaCB0aGUgbWF4IFNwZWN0cnVtIGluIG9uZSBzZmIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNhbGNNYXhWYWx1ZUluU2ZiKFdvcmQxNiBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiT2Zmc2V0W01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBxdWFudFNwZWN0cnVtW0ZSQU1FX0xFTl9MT05HXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiBtYXhWYWx1ZVtNQVhfR1JPVVBFRF9TRkJdKQotewotICBXb3JkMTYgc2ZiT2Zmcywgc2ZiOwotICBXb3JkMTYgbWF4VmFsdWVBbGw7Ci0KLSAgbWF4VmFsdWVBbGwgPSAwOwotCi0gIGZvcihzZmJPZmZzPTA7c2ZiT2ZmczxzZmJDbnQ7c2ZiT2Zmcys9c2ZiUGVyR3JvdXApIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgV29yZDE2IGxpbmU7Ci0gICAgICBXb3JkMTYgbWF4VGhpc1NmYjsKLSAgICAgIG1heFRoaXNTZmIgPSAwOwotCi0gICAgICBmb3IgKGxpbmUgPSBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdOyBsaW5lIDwgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiKzFdOyBsaW5lKyspIHsKLSAgICAgICAgV29yZDE2IGFic1ZhbDsKLSAgICAgICAgYWJzVmFsID0gYWJzX3MocXVhbnRTcGVjdHJ1bVtsaW5lXSk7Ci0gICAgICAgIG1heFRoaXNTZmIgPSBtYXgobWF4VGhpc1NmYiwgYWJzVmFsKTsKLSAgICAgIH0KLQotICAgICAgbWF4VmFsdWVbc2ZiT2ZmcytzZmJdID0gbWF4VGhpc1NmYjsKLSAgICAgIG1heFZhbHVlQWxsID0gbWF4KG1heFZhbHVlQWxsLCBtYXhUaGlzU2ZiKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG1heFZhbHVlQWxsOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogdXBkYXRlQml0cmVzCi0qIGRlc2NyaXB0aW9uOiB1cGRhdGUgYml0cmVzZXJ2b2lyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB1cGRhdGVCaXRyZXMoUUNfU1RBVEUqIHFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgIHFjT3V0KQotCi17Ci0gIEVMRU1FTlRfQklUUyAqZWxCaXRzOwotCi0gIHFjS2VybmVsLT5iaXRSZXNUb3QgPSAwOwotCi0gIGVsQml0cyA9ICZxY0tlcm5lbC0+ZWxlbWVudEJpdHM7Ci0KLQotICBpZiAoZWxCaXRzLT5hdmVyYWdlQml0cyA+IDApIHsKLSAgICAvKiBjb25zdGFudCBiaXRyYXRlICovCi0gICAgV29yZDE2IGJpdHNVc2VkOwotICAgIGJpdHNVc2VkID0gKHFjT3V0LT5xY0VsZW1lbnQuc3RhdGljQml0c1VzZWQgKyBxY091dC0+cWNFbGVtZW50LmR5bkJpdHNVc2VkKSArCi0gICAgICAgICAgICAgICAgICAgKHFjT3V0LT5xY0VsZW1lbnQuYW5jQml0c1VzZWQgKyBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzKTsKLSAgICBlbEJpdHMtPmJpdFJlc0xldmVsID0gZWxCaXRzLT5iaXRSZXNMZXZlbCArIChlbEJpdHMtPmF2ZXJhZ2VCaXRzIC0gYml0c1VzZWQpOwotICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgPSBxY0tlcm5lbC0+Yml0UmVzVG90ICsgZWxCaXRzLT5iaXRSZXNMZXZlbDsKLSAgfQotICBlbHNlIHsKLSAgICAvKiB2YXJpYWJsZSBiaXRyYXRlICovCi0gICAgZWxCaXRzLT5iaXRSZXNMZXZlbCA9IGVsQml0cy0+bWF4Qml0czsKLSAgICBxY0tlcm5lbC0+Yml0UmVzVG90ID0gcWNLZXJuZWwtPm1heEJpdHNUb3Q7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBGaW5hbGl6ZUJpdENvbnN1bXB0aW9uCi0qIGRlc2NyaXB0aW9uOiBjb3VudCBiaXRzIHVzZWQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgRmluYWxpemVCaXRDb25zdW1wdGlvbihRQ19TVEFURSAqcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0KQotewotICBXb3JkMzIgbkZ1bGxGaWxsRWxlbTsKLSAgV29yZDMyIHRvdEZpbGxCaXRzOwotICBXb3JkMTYgZGlmZkJpdHM7Ci0gIFdvcmQxNiBiaXRzVXNlZDsKLQotICB0b3RGaWxsQml0cyA9IDA7Ci0KLSAgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkID0gcWNLZXJuZWwtPmdsb2JTdGF0Qml0czsKLSAgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkICs9IHFjT3V0LT5xY0VsZW1lbnQuc3RhdGljQml0c1VzZWQ7Ci0gIHFjT3V0LT50b3REeW5CaXRzVXNlZCAgICA9IHFjT3V0LT5xY0VsZW1lbnQuZHluQml0c1VzZWQ7Ci0gIHFjT3V0LT50b3RBbmNCaXRzVXNlZCAgICA9IHFjT3V0LT5xY0VsZW1lbnQuYW5jQml0c1VzZWQ7Ci0gIHFjT3V0LT50b3RGaWxsQml0cyAgICAgICA9IHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHM7Ci0KLSAgaWYgKHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHMpIHsKLSAgICB0b3RGaWxsQml0cyArPSBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzOwotICB9Ci0KLSAgbkZ1bGxGaWxsRWxlbSA9IChtYXgoKHFjT3V0LT50b3RGaWxsQml0cyAtIDEpLCAwKSAvIG1heEZpbGxFbGVtQml0cykgKiBtYXhGaWxsRWxlbUJpdHM7Ci0KLSAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzIC0gbkZ1bGxGaWxsRWxlbTsKLQotICAvKiBjaGVjayBmaWxsIGVsZW1lbnRzICovCi0KLSAgaWYgKHFjT3V0LT50b3RGaWxsQml0cyA+IDApIHsKLSAgICAvKiBtaW5pbXVtIEZpbGxlbGVtZW50IGNvbnRhaW5zIDcgKFRBRyArIGJ5dGUgY250KSBiaXRzICovCi0gICAgcWNPdXQtPnRvdEZpbGxCaXRzID0gbWF4KDcsIHFjT3V0LT50b3RGaWxsQml0cyk7Ci0gICAgLyogZmlsbCBlbGVtZW50IHNpemUgZXF1YWxzIG4qOCArIDcgKi8KLSAgICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgKyAoKDggLSAoKHFjT3V0LT50b3RGaWxsQml0cyAtIDcpICYgMHgwMDA3KSkgJiAweDAwMDcpOwotICB9Ci0KLSAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzICsgbkZ1bGxGaWxsRWxlbTsKLQotICAvKiBub3cgZGlzdHJpYnV0ZSBleHRyYSBmaWxsYml0cyBhbmQgYWxpZ25iaXRzIG92ZXIgY2hhbm5lbCBlbGVtZW50cyAqLwotICBxY091dC0+YWxpZ25CaXRzID0gNyAtICgocWNPdXQtPnRvdER5bkJpdHNVc2VkICsgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RBbmNCaXRzVXNlZCArIHFjT3V0LT50b3RGaWxsQml0cyAtIDEpICYgMHgwMDA3KTsKLQotCi0gIGlmICggKHFjT3V0LT5hbGlnbkJpdHMgKyBxY091dC0+dG90RmlsbEJpdHMgLSB0b3RGaWxsQml0cyA9PSA4KSAmJgotICAgICAgIChxY091dC0+dG90RmlsbEJpdHMgPiA4KSkKLSAgICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgLSA4OwotCi0KLSAgZGlmZkJpdHMgPSBxY091dC0+YWxpZ25CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzIC0gdG90RmlsbEJpdHM7Ci0KLSAgaWYoZGlmZkJpdHM+PTApIHsKLSAgICBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzICs9IGRpZmZCaXRzOwotICB9Ci0KLSAgYml0c1VzZWQgPSBxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90U3RhdGljQml0c1VzZWQgKyBxY091dC0+dG90QW5jQml0c1VzZWQ7Ci0gIGJpdHNVc2VkID0gYml0c1VzZWQgKyBxY091dC0+dG90RmlsbEJpdHMgKyBxY091dC0+YWxpZ25CaXRzOwotCi0gIGlmIChiaXRzVXNlZCA+IHFjS2VybmVsLT5tYXhCaXRzVG90KSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiBiaXRzVXNlZDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFkanVzdEJpdHJhdGUKLSogZGVzY3JpcHRpb246ICBhZGp1c3RzIGZyYW1lbGVuZ3RoIHZpYSBwYWRkaW5nIG9uIGEgZnJhbWUgdG8gZnJhbWUgYmFzaXMsCi0qICAgICAgICAgICAgICAgdG8gYWNoaWV2ZSBhIGJpdHJhdGUgdGhhdCBkZW1hbmRzIGEgbm9uIGJ5dGUgYWxpZ25lZAotKiAgICAgICAgICAgICAgIGZyYW1lbGVuZ3RoCi0qIHJldHVybjogICAgICAgZXJyb3Jjb2RlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IEFkanVzdEJpdHJhdGUoUUNfU1RBVEUgICAgICAgICpoUUMsCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgIGJpdFJhdGUsICAgIC8qIHRvdGFsIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgc2FtcGxlUmF0ZSkgLyogb3V0cHV0IHNhbXBsaW5nIHJhdGUgKi8KLXsKLSAgV29yZDE2IHBhZGRpbmdPbjsKLSAgV29yZDE2IGZyYW1lTGVuOwotICBXb3JkMTYgY29kZUJpdHM7Ci0gIFdvcmQxNiBjb2RlQml0c0xhc3Q7Ci0KLSAgLyogRG8gd2UgbmVlZCBhIGV4dHJhIHBhZGRpbmcgYnl0ZT8gKi8KLSAgcGFkZGluZ09uID0gZnJhbWVQYWRkaW5nKGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCk7Ci0KLSAgLyogZnJhbWUgbGVuZ3RoICovCi0gIGZyYW1lTGVuID0gcGFkZGluZ09uICsgY2FsY0ZyYW1lTGVuKGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19JTlQpOwotCi0gIGZyYW1lTGVuID0gZnJhbWVMZW4gPDwgMzsKLSAgY29kZUJpdHNMYXN0ID0gaFFDLT5hdmVyYWdlQml0c1RvdCAtIGhRQy0+Z2xvYlN0YXRCaXRzOwotICBjb2RlQml0cyAgICAgPSBmcmFtZUxlbiAtIGhRQy0+Z2xvYlN0YXRCaXRzOwotCi0gIC8qIGNhbGN1bGF0ZSBiaXRzIGZvciBldmVyeSBjaGFubmVsIGVsZW1lbnQgKi8KLSAgaWYgKGNvZGVCaXRzICE9IGNvZGVCaXRzTGFzdCkgewotICAgIFdvcmQxNiB0b3RhbEJpdHMgPSAwOwotCi0gICAgaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0cyA9IChoUUMtPmVsZW1lbnRCaXRzLnJlbGF0aXZlQml0cyAqIGNvZGVCaXRzKSA+PiAxNjsgLyogcmVsYXRpdmVCaXRzIHdhcyBzY2FsZWQgZG93biBieSAyICovCi0gICAgdG90YWxCaXRzICs9IGhRQy0+ZWxlbWVudEJpdHMuYXZlcmFnZUJpdHM7Ci0KLSAgICBoUUMtPmVsZW1lbnRCaXRzLmF2ZXJhZ2VCaXRzID0gaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0cyArIChjb2RlQml0cyAtIHRvdGFsQml0cyk7Ci0gIH0KLQotICBoUUMtPmF2ZXJhZ2VCaXRzVG90ID0gZnJhbWVMZW47Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcXVhbnRpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwZjU1MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcXVhbnRpemUuYwotCi0JQ29udGVudDoJcXVhbnRpemF0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJxdWFudGl6ZS5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotI2RlZmluZSBNQU5UX0RJR0lUUyA5Ci0jZGVmaW5lIE1BTlRfU0laRSAgICgxPDxNQU5UX0RJR0lUUykKLQotc3RhdGljIGNvbnN0IFdvcmQzMiBYUk9VTkQgPSAweDMzZTQyNWFmOyAvKiBmaW5hbCByb3VuZGluZyBjb25zdGFudCAoLTAuMDk0NmYrIDAuNWYpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6cG93MzQKLSogZGVzY3JpcHRpb246IGNhbGN1bGF0ZSAkeF57XGZyYWN7M317NH19LCBmb3IgMC41IDwgeCA8IDEuMCQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9faW5saW5lIFdvcmQzMiBwb3czNChXb3JkMzIgeCkKLXsKLSAgLyogaW5kZXggdGFibGUgdXNpbmcgTUFOVF9ESUdJVFMgYml0cywgYnV0IG1hc2sgb3V0IHRoZSBzaWduIGJpdCBhbmQgdGhlIE1TQgotICAgICB3aGljaCBpcyBhbHdheXMgb25lICovCi0gIHJldHVybiBtVGFiXzNfNFsoeCA+PiAoSU5UX0JJVFMtMi1NQU5UX0RJR0lUUykpICYgKE1BTlRfU0laRS0xKV07Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6cXVhbnRpemVTaW5nbGVMaW5lCi0qIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgc3BlY3RydW0KLSogICAgICAgICAgICAgIHF1YVNwZWN0cnVtID0gbWRjdFNwZWN0cnVtXjMvNCoyXigtKDMvMTYpKmdhaW4pCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgcXVhbnRpemVTaW5nbGVMaW5lKGNvbnN0IFdvcmQxNiBnYWluLCBjb25zdCBXb3JkMzIgYWJzU3BlY3RydW0pCi17Ci0gIFdvcmQzMiBlLCBtaW51c0ZpbmFsRXhwLCBmaW5hbFNoaWZ0OwotICBXb3JkMzIgeDsKLSAgV29yZDE2IHF1YSA9IDA7Ci0KLQotICBpZiAoYWJzU3BlY3RydW0pIHsKLSAgICBlID0gbm9ybV9sKGFic1NwZWN0cnVtKTsKLSAgICB4ID0gcG93MzQoYWJzU3BlY3RydW0gPDwgZSk7Ci0KLSAgICAvKiBjYWxjdWxhdGUgdGhlIGZpbmFsIGZyYWN0aW9uYWwgZXhwb25lbnQgdGltZXMgMTYgKHdhcyAzKig0KmUgKyBnYWluKSArIChJTlRfQklUUy0xKSoxNikgKi8KLSAgICBtaW51c0ZpbmFsRXhwID0gKGUgPDwgMikgKyBnYWluOwotICAgIG1pbnVzRmluYWxFeHAgPSAobWludXNGaW5hbEV4cCA8PCAxKSArIG1pbnVzRmluYWxFeHA7Ci0gICAgbWludXNGaW5hbEV4cCA9IG1pbnVzRmluYWxFeHAgKyAoKElOVF9CSVRTLTEpIDw8IDQpOwotCi0gICAgLyogc2VwYXJhdGUgdGhlIGV4cG9uZW50IGludG8gYSBzaGlmdCwgYW5kIGEgbXVsdGlwbHkgKi8KLSAgICBmaW5hbFNoaWZ0ID0gbWludXNGaW5hbEV4cCA+PiA0OwotCi0gICAgaWYgKGZpbmFsU2hpZnQgPCBJTlRfQklUUykgewotICAgICAgeCA9IExfbXB5X3d4KHgsIHBvdzJ0b21pbnVzTm92ZXIxNlttaW51c0ZpbmFsRXhwICYgMTVdKTsKLQotICAgICAgeCArPSBYUk9VTkQgPj4gKElOVF9CSVRTIC0gZmluYWxTaGlmdCk7Ci0KLSAgICAgIC8qIHNoaWZ0IGFuZCBxdWFudGl6ZSAqLwotCSAgZmluYWxTaGlmdC0tOwotCi0JICBpZihmaW5hbFNoaWZ0ID49IDApCi0JCSAgeCA+Pj0gZmluYWxTaGlmdDsKLQkgIGVsc2UKLQkJICB4IDw8PSAoLWZpbmFsU2hpZnQpOwotCi0JICBxdWEgPSBzYXR1cmF0ZSh4KTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcXVhOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpxdWFudGl6ZUxpbmVzCi0qIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgc3BlY3RydW0gbGluZXMKLSogICAgICAgICAgICAgIHF1YVNwZWN0cnVtID0gbWRjdFNwZWN0cnVtXjMvNCoyXigtKDMvMTYpKmdhaW4pCi0qICBpbnB1dDogZ2xvYmFsIGdhaW4sIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLCBzcGVjdHJhbCBkYXRhCi0qICBvdXRwdXQ6IHF1YW50aXplZCBzcGVjdHJ1bQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBxdWFudGl6ZUxpbmVzKGNvbnN0IFdvcmQxNiBnYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpxdWFTcGVjdHJ1bSkKLXsKLSAgV29yZDMyIGxpbmU7Ci0gIFdvcmQzMiBtID0gZ2FpbiYzOwotICBXb3JkMzIgZyA9IChnYWluID4+IDIpICsgNDsKLSAgV29yZDMyIG1kY3RTcGVMOwotICBjb25zdCBXb3JkMTYgKnBxdWF0OwotICAgIC8qIGdhaW4mMyAqLwotCi0gIHBxdWF0ID0gcXVhbnRCb3JkZXJzW21dOwotCi0gIGcgKz0gMTY7Ci0KLSAgaWYoZyA+PSAwKQotICB7Ci0JZm9yIChsaW5lPTA7IGxpbmU8bm9PZkxpbmVzOyBsaW5lKyspIHsKLQkgIFdvcmQzMiBxdWE7Ci0JICBxdWEgPSAwOwotCi0JICBtZGN0U3BlTCA9IG1kY3RTcGVjdHJ1bVtsaW5lXTsKLQotCSAgaWYgKG1kY3RTcGVMKSB7Ci0JCVdvcmQzMiBzYTsKLQkJV29yZDMyIHNhU2hmdDsKLQotICAgICAgICBzYSA9IExfYWJzKG1kY3RTcGVMKTsKLSAgICAgICAgLy9zYVNoZnQgPSBMX3NocihzYSwgMTYgKyBnKTsKLQkgICAgc2FTaGZ0ID0gc2EgPj4gZzsKLQotICAgICAgICBpZiAoc2FTaGZ0ID4gcHF1YXRbMF0pIHsKLQotICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCi0gICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMSA6IC0xOwotCQkgIH0KLSAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzJdKSB7Ci0KLSAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDIgOiAtMjsKLQkJCX0KLSAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgewotCi0gICAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDMgOiAtMzsKLQkJCSAgfQotICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOwotICAgICAgICAgICAgICAgIC8qIGFkanVzdCB0aGUgc2lnbi4gU2luY2UgMCA8IHF1YSA8IDEsIHRoaXMgY2Fubm90IG92ZXJmbG93LiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKG1kY3RTcGVMIDwgMCkKLSAgICAgICAgICAgICAgICAgIHF1YSA9IC1xdWE7Ci0JCQkgIH0KLQkJCX0KLQkJICB9Ci0JCX0KLQkgIH0KLSAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gcXVhIDsKLQl9Ci0gIH0KLSAgZWxzZQotICB7Ci0JZm9yIChsaW5lPTA7IGxpbmU8bm9PZkxpbmVzOyBsaW5lKyspIHsKLQkgIFdvcmQzMiBxdWE7Ci0JICBxdWEgPSAwOwotCi0JICBtZGN0U3BlTCA9IG1kY3RTcGVjdHJ1bVtsaW5lXTsKLQotCSAgaWYgKG1kY3RTcGVMKSB7Ci0JCVdvcmQzMiBzYTsKLQkJV29yZDMyIHNhU2hmdDsKLQotICAgICAgICBzYSA9IExfYWJzKG1kY3RTcGVMKTsKLSAgICAgICAgc2FTaGZ0ID0gc2EgPDwgZzsKLQotICAgICAgICBpZiAoc2FTaGZ0ID4gcHF1YXRbMF0pIHsKLQotICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCi0gICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMSA6IC0xOwotCQkgIH0KLSAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzJdKSB7Ci0KLSAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDIgOiAtMjsKLQkJCX0KLSAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgewotCi0gICAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDMgOiAtMzsKLQkJCSAgfQotICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOwotICAgICAgICAgICAgICAgIC8qIGFkanVzdCB0aGUgc2lnbi4gU2luY2UgMCA8IHF1YSA8IDEsIHRoaXMgY2Fubm90IG92ZXJmbG93LiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKG1kY3RTcGVMIDwgMCkKLSAgICAgICAgICAgICAgICAgIHF1YSA9IC1xdWE7Ci0JCQkgIH0KLQkJCX0KLQkJICB9Ci0JCX0KLQkgIH0KLSAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gcXVhIDsKLQl9Ci0gIH0KLQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmlxdWFudGl6ZUxpbmVzCi0qIGRlc2NyaXB0aW9uOiBpcXVhbnRpemVzIHNwZWN0cnVtIGxpbmVzIHdpdGhvdXQgc2lnbgotKiAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtID0gaXF1YVNwZWN0cnVtXjQvMyAqMl4oMC4yNSpnYWluKQotKiBpbnB1dDogZ2xvYmFsIGdhaW4sIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLHF1YW50aXplZCBzcGVjdHJ1bQotKiBvdXRwdXQ6IHNwZWN0cmFsIGRhdGEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaXF1YW50aXplTGluZXMoY29uc3QgV29yZDE2IGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICptZGN0U3BlY3RydW0pCi17Ci0gIFdvcmQzMiAgIGlxdWFudGl6ZXJtb2Q7Ci0gIFdvcmQzMiAgIGlxdWFudGl6ZXJzaGlmdDsKLSAgV29yZDMyICAgbGluZTsKLQotICBpcXVhbnRpemVybW9kID0gZ2FpbiAmIDM7Ci0gIGlxdWFudGl6ZXJzaGlmdCA9IGdhaW4gPj4gMjsKLQotICBmb3IgKGxpbmU9MDsgbGluZTxub09mTGluZXM7IGxpbmUrKykgewotCi0gICAgaWYoIHF1YW50U3BlY3RydW1bbGluZV0gIT0gMCApIHsKLSAgICAgIFdvcmQzMiBhY2N1OwotICAgICAgV29yZDMyIGV4OwotCSAgV29yZDMyIHRhYkluZGV4OwotICAgICAgV29yZDMyIHNwZWNFeHA7Ci0gICAgICBXb3JkMzIgcyx0OwotCi0gICAgICBhY2N1ID0gcXVhbnRTcGVjdHJ1bVtsaW5lXTsKLQotICAgICAgZXggPSBub3JtX2woYWNjdSk7Ci0gICAgICBhY2N1ID0gYWNjdSA8PCBleDsKLSAgICAgIHNwZWNFeHAgPSBJTlRfQklUUy0xIC0gZXg7Ci0KLSAgICAgIHRhYkluZGV4ID0gKGFjY3UgPj4gKElOVF9CSVRTLTItTUFOVF9ESUdJVFMpKSAmICh+TUFOVF9TSVpFKTsKLQotICAgICAgLyogY2FsY3VsYXRlICJtYW50aXNzYSIgXjQvMyAqLwotICAgICAgcyA9IG1UYWJfNF8zW3RhYkluZGV4XTsKLQotICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBtdWx0aXBsaWVyIGZvciBzcGVjRXhwXjMvNCBjb21iaW5lZCB3aXRoIHNjZk1vZCAqLwotICAgICAgdCA9IHNwZWNFeHBNYW50VGFibGVDb21iX2VuY1tpcXVhbnRpemVybW9kXVtzcGVjRXhwXTsKLQotICAgICAgLyogbXVsdGlwbHkgIm1hbnRpc3NhIiBeNC8zIHdpdGggZXhwb25lbnQgbXVsdGlwbGllciAqLwotICAgICAgYWNjdSA9IE1VTEhJR0gocywgdCk7Ci0KLSAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgc2hpZnRlciAqLwotICAgICAgc3BlY0V4cCA9IHNwZWNFeHBUYWJsZUNvbWJfZW5jW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdOwotCi0gICAgICBzcGVjRXhwICs9IGlxdWFudGl6ZXJzaGlmdCArIDE7Ci0JICBpZihzcGVjRXhwID49IDApCi0JCSAgbWRjdFNwZWN0cnVtW2xpbmVdID0gYWNjdSA8PCBzcGVjRXhwOwotCSAgZWxzZQotCQkgIG1kY3RTcGVjdHJ1bVtsaW5lXSA9IGFjY3UgPj4gKC1zcGVjRXhwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBtZGN0U3BlY3RydW1bbGluZV0gPSAwOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUXVhbnRpemVTcGVjdHJ1bQotKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIHRoZSBlbnRpcmUgc3BlY3RydW0KLSogcmV0dXJuczoKLSogaW5wdXQ6IG51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyB0byBiZSBxdWFudGl6ZWQsIC4uLgotKiBvdXRwdXQ6IHF1YW50aXplZCBzcGVjdHJ1bQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFF1YW50aXplU3BlY3RydW0oV29yZDE2IHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBnbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NhbGVmYWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcXVhbnRpemVkU3BlY3RydW0pCi17Ci0gIFdvcmQzMiBzZmJPZmZzLCBzZmI7Ci0KLSAgZm9yKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkgewotICAgIFdvcmQzMiBzZmJOZXh0IDsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIgPSBzZmJOZXh0KSB7Ci0gICAgICBXb3JkMTYgc2NhbGVmYWN0b3IgPSBzY2FsZWZhY3RvcnNbc2ZiT2ZmcytzZmJdOwotICAgICAgLyogY29hbGVzY2Ugc2ZicyB3aXRoIHRoZSBzYW1lIHNjYWxlZmFjdG9yICovCi0gICAgICBmb3IgKHNmYk5leHQgPSBzZmIrMTsKLSAgICAgICAgICAgc2ZiTmV4dCA8IG1heFNmYlBlckdyb3VwICYmIHNjYWxlZmFjdG9yID09IHNjYWxlZmFjdG9yc1tzZmJPZmZzK3NmYk5leHRdOwotICAgICAgICAgICBzZmJOZXh0KyspIDsKLQotICAgICAgcXVhbnRpemVMaW5lcyhnbG9iYWxHYWluIC0gc2NhbGVmYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmJPZmZzK3NmYk5leHRdIC0gc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtICsgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkU3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpjYWxjU2ZiRGlzdAotKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIGFuZCByZXF1YW50aXplcyBsaW5lcyB0byBjYWxjdWxhdGUgZGlzdG9ydGlvbgotKiBpbnB1dDogIG51bWJlciBvZiBsaW5lcyB0byBiZSBxdWFudGl6ZWQsIC4uLgotKiBvdXRwdXQ6IGRpc3RvcnRpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDMyIGNhbGNTZmJEaXN0KGNvbnN0IFdvcmQzMiAqc3BlYywKLSAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNmYldpZHRoLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgZ2FpbikKLXsKLSAgV29yZDMyIGxpbmU7Ci0gIFdvcmQzMiBkaXN0OwotICBXb3JkMzIgbSA9IGdhaW4mMzsKLSAgV29yZDMyIGcgPSAoZ2FpbiA+PiAyKSArIDQ7Ci0gIFdvcmQzMiBnMiA9IChnIDw8IDEpICsgMTsKLSAgY29uc3QgV29yZDE2ICpwcXVhdCwgKnJlcHF1YXQ7Ci0gICAgLyogZ2FpbiYzICovCi0KLSAgcHF1YXQgPSBxdWFudEJvcmRlcnNbbV07Ci0gIHJlcHF1YXQgPSBxdWFudFJlY29uW21dOwotCi0gIGRpc3QgPSAwOwotICBnICs9IDE2OwotICBpZihnMiA8IDAgJiYgZyA+PSAwKQotICB7Ci0JICBnMiA9IC1nMjsKLQkgIGZvcihsaW5lPTA7IGxpbmU8c2ZiV2lkdGg7IGxpbmUrKykgewotCQkgIGlmIChzcGVjW2xpbmVdKSB7Ci0JCQkgIFdvcmQzMiBkaWZmOwotCQkJICBXb3JkMzIgZGlzdFNpbmdsZTsKLQkJCSAgV29yZDMyIHNhOwotCQkJICBXb3JkMzIgc2FTaGZ0OwotCQkJICBzYSA9IExfYWJzKHNwZWNbbGluZV0pOwotCQkJICAvL3NhU2hmdCA9IHJvdW5kMTYoTF9zaHIoc2EsIGcpKTsKLQkJCSAgLy9zYVNoZnQgPSBMX3NocihzYSwgMTYrZyk7Ci0JCQkgIHNhU2hmdCA9IHNhID4+IGc7Ci0KLQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzBdKSB7Ci0JCQkJICBkaXN0U2luZ2xlID0gKHNhU2hmdCAqIHNhU2hmdCkgPj4gZzI7Ci0JCQkgIH0KLQkJCSAgZWxzZSB7Ci0KLQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzBdOwotCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOwotCQkJCSAgfQotCQkJCSAgZWxzZSB7Ci0KLQkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsKLQkJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMV07Ci0JCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOwotCQkJCQkgIH0KLQkJCQkJICBlbHNlIHsKLQotCQkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbM10pIHsKLQkJCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzJdOwotCQkJCQkJCSAgZGlzdFNpbmdsZSA9IChkaWZmICogZGlmZikgPj4gZzI7Ci0JCQkJCQkgIH0KLQkJCQkJCSAgZWxzZSB7Ci0JCQkJCQkJICBXb3JkMTYgcXVhID0gcXVhbnRpemVTaW5nbGVMaW5lKGdhaW4sIHNhKTsKLQkJCQkJCQkgIFdvcmQzMiBpcXZhbCwgZGlmZjMyOwotCQkJCQkJCSAgLyogbm93IHRoYXQgd2UgaGF2ZSBxdWFudGl6ZWQgeCwgcmUtcXVhbnRpemUgaXQuICovCi0JCQkJCQkJICBpcXVhbnRpemVMaW5lcyhnYWluLCAxLCAmcXVhLCAmaXF2YWwpOwotCQkJCQkJCSAgZGlmZjMyID0gc2EgLSBpcXZhbDsKLQkJCQkJCQkgIGRpc3RTaW5nbGUgPSBmaXhtdWwoZGlmZjMyLCBkaWZmMzIpOwotCQkJCQkJICB9Ci0JCQkJCSAgfQotCQkJCSAgfQotCQkJICB9Ci0KLQkJCSAgZGlzdCA9IExfYWRkKGRpc3QsIGRpc3RTaW5nbGUpOwotCQkgIH0KLQkgIH0KLSAgfQotICBlbHNlCi0gIHsKLQkgIGZvcihsaW5lPTA7IGxpbmU8c2ZiV2lkdGg7IGxpbmUrKykgewotCQkgIGlmIChzcGVjW2xpbmVdKSB7Ci0JCQkgIFdvcmQzMiBkaWZmOwotCQkJICBXb3JkMzIgZGlzdFNpbmdsZTsKLQkJCSAgV29yZDMyIHNhOwotCQkJICBXb3JkMzIgc2FTaGZ0OwotCQkJICBzYSA9IExfYWJzKHNwZWNbbGluZV0pOwotCQkJICAvL3NhU2hmdCA9IHJvdW5kMTYoTF9zaHIoc2EsIGcpKTsKLQkJCSAgc2FTaGZ0ID0gTF9zaHIoc2EsIGcpOwotCi0JCQkgIGlmIChzYVNoZnQgPCBwcXVhdFswXSkgewotCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChzYVNoZnQgKiBzYVNoZnQpLCBnMik7Ci0JCQkgIH0KLQkJCSAgZWxzZSB7Ci0KLQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzBdOwotCQkJCQkgIGRpc3RTaW5nbGUgPSBMX3NobCgoZGlmZiAqIGRpZmYpLCBnMik7Ci0JCQkJICB9Ci0JCQkJICBlbHNlIHsKLQotCQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsyXSkgewotCQkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFsxXTsKLQkJCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChkaWZmICogZGlmZiksIGcyKTsKLQkJCQkJICB9Ci0JCQkJCSAgZWxzZSB7Ci0KLQkJCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7Ci0JCQkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFsyXTsKLQkJCQkJCQkgIGRpc3RTaW5nbGUgPSBMX3NobCgoZGlmZiAqIGRpZmYpLCBnMik7Ci0JCQkJCQkgIH0KLQkJCQkJCSAgZWxzZSB7Ci0JCQkJCQkJICBXb3JkMTYgcXVhID0gcXVhbnRpemVTaW5nbGVMaW5lKGdhaW4sIHNhKTsKLQkJCQkJCQkgIFdvcmQzMiBpcXZhbCwgZGlmZjMyOwotCQkJCQkJCSAgLyogbm93IHRoYXQgd2UgaGF2ZSBxdWFudGl6ZWQgeCwgcmUtcXVhbnRpemUgaXQuICovCi0JCQkJCQkJICBpcXVhbnRpemVMaW5lcyhnYWluLCAxLCAmcXVhLCAmaXF2YWwpOwotCQkJCQkJCSAgZGlmZjMyID0gc2EgLSBpcXZhbDsKLQkJCQkJCQkgIGRpc3RTaW5nbGUgPSBmaXhtdWwoZGlmZjMyLCBkaWZmMzIpOwotCQkJCQkJICB9Ci0JCQkJCSAgfQotCQkJCSAgfQotCQkJICB9Ci0JCQkgIGRpc3QgPSBMX2FkZChkaXN0LCBkaXN0U2luZ2xlKTsKLQkJICB9Ci0JICB9Ci0gIH0KLQotICByZXR1cm4gZGlzdDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk0N2UxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlzZl9lc3RpbS5jCi0KLQlDb250ZW50OglTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbiBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJzZl9lc3RpbS5oIgotI2luY2x1ZGUgInF1YW50aXplLmgiCi0jaW5jbHVkZSAiYml0X2NudC5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotc3RhdGljIGNvbnN0IFdvcmQxNiBNQVhfU0NGX0RFTFRBID0gNjA7Ci0KLS8qIQotY29uc3RhbnRzIHJlZmVyZW5jZSBpbiBjb21tZW50cwotCi0gQzAgPSA2Ljc1ZjsKLSBDMSA9IC02OS4zMzI5NWY7ICAgLTE2LzMqbG9nKE1BWF9RVUFOVCswLjUtbG9nQ29uKS9sb2coMikKLSBDMiA9IDQuMGY7Ci0gQzMgPSAyLjY2NjY2NjY2ZjsKLQotICBQRV9DMSA9IDMuMGY7ICAgICAgICBsb2coOC4wKS9sb2coMikKLSAgUEVfQzIgPSAxLjMyMTkyODFmOyAgbG9nKDIuNSkvbG9nKDIpCi0gIFBFX0MzID0gMC41NTkzNTczZjsgIDEtQzIvQzEKLQotKi8KLQotI2RlZmluZSBGRl9TUVJUX0JJVFMgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgRkZfU1FSVF9UQUJMRV9TSVpFICAgICAgICAgICAgICAoMTw8RkZfU1FSVF9CSVRTIC0gMTw8KEZGX1NRUlRfQklUUy0yKSkKLSNkZWZpbmUgQ09FRjA4XzMxCQkweDY2NjY2NjY2CQkvKiAwLjgqKDEgPDwgMzEpICovCi0jZGVmaW5lIFBFX0MxXzgJCQkyNAkJCQkvKiBQRV9DMSo4ICovCi0jZGVmaW5lIFBFX0MyXzE2CQkyMQkJCQkvKiBQRV9DMio4L1BFX0MzICovCi0jZGVmaW5lIFBFX1NDQUxFCQkweDA1OWEJCQkvKiAwLjcgKiAoMSA8PCAoMTUgLSAxIC0gMykpKi8KLQotI2RlZmluZSBTQ0FMRV9FU1RJTUFURV9DT0VGCTB4NTU1NQkJLyogKDguODU4NS8oNCpsb2cyKDEwKSkpICogKDEgPDwgMTUpKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBmb3JtZmFjX3NxcnQKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIHNxcnQoeCkvMjU2Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX19pbmxpbmUgV29yZDMyIGZvcm1mYWNfc3FydChXb3JkMzIgeCkKLXsKLQlXb3JkMzIgeTsKLQlXb3JkMzIgcHJlc2hpZnQsIHBvc3RzaGlmdDsKLQotCi0JaWYgKHg9PTApIHJldHVybiAwOwotCXByZXNoaWZ0ICA9IG5vcm1fbCh4KSAtIChJTlRfQklUUy0xLUZGX1NRUlRfQklUUyk7Ci0JcG9zdHNoaWZ0ID0gcHJlc2hpZnQgPj4gMTsKLQlwcmVzaGlmdCAgPSBwb3N0c2hpZnQgPDwgMTsKLQlwb3N0c2hpZnQgPSBwb3N0c2hpZnQgKyA4OwkgIC8qIHNxcnQvMjU2ICovCi0JaWYocHJlc2hpZnQgPj0gMCkKLQkJeSA9IHggPDwgcHJlc2hpZnQ7ICAgICAgICAvKiBub3cgMS80IDw9IHkgPCAxICovCi0JZWxzZQotCQl5ID0geCA+PiAoLXByZXNoaWZ0KTsKLQl5ID0gZm9ybWZhY19zcXJ0dGFibGVbeS0zMl07Ci0KLQlpZihwb3N0c2hpZnQgPj0gMCkKLQkJeSA9IHkgPj4gcG9zdHNoaWZ0OwotCWVsc2UKLQkJeSA9IHkgPDwgKC1wb3N0c2hpZnQpOwotCi0JcmV0dXJuIHk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDYWxjRm9ybUZhY3RvckNoYW5uZWwKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgdGhlIGZvcm0gZmFjdG9yIG9uZSBjaGFubmVsCi0qCQkJCWZmYWMobikgPSBzcXJ0KGFicyhYKGspKSArIHNxcnQoYWJzKFgoaysxKSkgKyAuLi4uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLUNhbGNGb3JtRmFjdG9yQ2hhbm5lbChXb3JkMTYgKmxvZ1NmYkZvcm1GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJOUmVsZXZhbnRMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4pCi17Ci0JV29yZDMyIHNmYncsIHNmYncxOwotCVdvcmQzMiBpLCBqOwotCVdvcmQzMiBzZmJPZmZzLCBzZmI7Ci0KLQlzZmJ3ID0gc2ZidzEgPSAwOwotCWZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotCQlmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0JCQlpID0gc2ZiT2ZmcytzZmI7Ci0KLQkJCWlmIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV0gPiBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbaV0pIHsKLQkJCQlXb3JkMzIgYWNjdSwgYXZnRm9ybUZhY3RvcixpU2ZiV2lkdGg7Ci0JCQkJV29yZDMyICptZGN0U3BlYzsKLQkJCQlzZmJ3ID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdIC0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsKLQkJCQlpU2ZiV2lkdGggPSBpbnZTQkZbKHNmYncgPj4gMikgLSAxXTsKLQkJCQltZGN0U3BlYyA9IHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSArIHBzeU91dENoYW4tPnNmYk9mZnNldHNbaV07Ci0JCQkJYWNjdSA9IDA7Ci0JCQkJLyogY2FsYyBzdW0gb2Ygc3FydChzcGVjKSAqLwotCQkJCWZvciAoaj1zZmJ3OyBqOyBqLS0pIHsKLQkJCQkJYWNjdSArPSBmb3JtZmFjX3NxcnQoTF9hYnMoKm1kY3RTcGVjKSk7IG1kY3RTcGVjKys7Ci0JCQkJfQotCQkJCWxvZ1NmYkZvcm1GYWN0b3JbaV0gPSBpTG9nNChhY2N1KTsKLQkJCQlsb2dTZmJFbmVyZ3lbaV0gPSBpTG9nNChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV0pOwotCQkJCWF2Z0Zvcm1GYWN0b3IgPSBmaXhtdWwocnNxcnQocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W2ldLElOVF9CSVRTKSwgaVNmYldpZHRoKTsKLQkJCQlhdmdGb3JtRmFjdG9yID0gcnNxcnQoKFdvcmQzMilhdmdGb3JtRmFjdG9yLElOVF9CSVRTKSA+PiAxMDsKLQkJCQkvKiByZXN1bHQgaXMgbXVsdGlwbGllZCBieSA0ICovCi0JCQkJaWYoYXZnRm9ybUZhY3RvcikKLQkJCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSBhY2N1IC8gYXZnRm9ybUZhY3RvcjsKLQkJCQllbHNlCi0JCQkJCXNmYk5SZWxldmFudExpbmVzW2ldID0gMHg3ZmZmOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogc2V0IG51bWJlciBvZiBsaW5lcyB0byB6ZXJvICovCi0JCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSAwOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGltcHJvdmVTY2YKLSogZGVzY3JpcHRpb246ICBmaW5kIGJldHRlciBzY2FsZWZhY3RvciB3aXRoIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgaW1wcm92ZVNjZihXb3JkMzIgKnNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgIHRocmVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1pblNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKmRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptaW5TY2ZDYWxjdWxhdGVkKQotewotCVdvcmQzMiBjbnQ7Ci0JV29yZDMyIHNmYkRpc3Q7Ci0JV29yZDMyIHNjZkJlc3Q7Ci0JV29yZDMyIHRocmVzaDEyNSA9IExfYWRkKHRocmVzaCwgKHRocmVzaCA+PiAyKSk7Ci0KLQlzY2ZCZXN0ID0gc2NmOwotCi0JLyogY2FsYyByZWFsIGRpc3RvcnRpb24gKi8KLQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0JKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2Y7Ci0JaWYoIXNmYkRpc3QpCi0JICByZXR1cm4gc2NmQmVzdDsKLQotCWlmIChzZmJEaXN0ID4gdGhyZXNoMTI1KSB7Ci0JCVdvcmQzMiBzY2ZFc3RpbWF0ZWQ7Ci0JCVdvcmQzMiBzZmJEaXN0QmVzdDsKLQkJc2NmRXN0aW1hdGVkID0gc2NmOwotCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7Ci0KLQkJY250ID0gMDsKLQkJd2hpbGUgKHNmYkRpc3QgPiB0aHJlc2gxMjUgJiYgKGNudCA8IDMpKSB7Ci0KLQkJCXNjZiA9IHNjZiArIDE7Ci0JCQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0KLQkJCWlmIChzZmJEaXN0IDwgc2ZiRGlzdEJlc3QpIHsKLQkJCQlzY2ZCZXN0ID0gc2NmOwotCQkJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKLQkJCX0KLQkJCWNudCA9IGNudCArIDE7Ci0JCX0KLQkJY250ID0gMDsKLQkJc2NmID0gc2NmRXN0aW1hdGVkOwotCQlzZmJEaXN0ID0gc2ZiRGlzdEJlc3Q7Ci0JCXdoaWxlICgoc2ZiRGlzdCA+IHRocmVzaDEyNSkgJiYgKGNudCA8IDEpICYmIChzY2YgPiBtaW5TY2YpKSB7Ci0KLQkJCXNjZiA9IHNjZiAtIDE7Ci0JCQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0KLQkJCWlmIChzZmJEaXN0IDwgc2ZiRGlzdEJlc3QpIHsKLQkJCQlzY2ZCZXN0ID0gc2NmOwotCQkJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKLQkJCX0KLQkJCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOwotCQkJY250ID0gY250ICsgMTsKLQkJfQotCQkqZGlzdCA9IHNmYkRpc3RCZXN0OwotCX0KLQllbHNlIHsKLQkJV29yZDMyIHNmYkRpc3RCZXN0OwotCQlXb3JkMzIgc2ZiRGlzdEFsbG93ZWQ7Ci0JCVdvcmQzMiB0aHJlc2gwOCA9IGZpeG11bChDT0VGMDhfMzEsIHRocmVzaCk7Ci0JCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKLQotCQlpZiAoc2ZiRGlzdCA8IHRocmVzaDA4KQotCQkJc2ZiRGlzdEFsbG93ZWQgPSBzZmJEaXN0OwotCQllbHNlCi0JCQlzZmJEaXN0QWxsb3dlZCA9IHRocmVzaDA4OwotCQlmb3IgKGNudD0wOyBjbnQ8MzsgY250KyspIHsKLQkJCXNjZiA9IHNjZiArIDE7Ci0JCQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0KLQkJCWlmIChmaXhtdWwoQ09FRjA4XzMxLHNmYkRpc3QpIDwgc2ZiRGlzdEFsbG93ZWQpIHsKLQkJCQkqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZkJlc3QgKyAxOwotCQkJCXNjZkJlc3QgPSBzY2Y7Ci0JCQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OwotCQkJfQotCQl9Ci0JCSpkaXN0ID0gc2ZiRGlzdEJlc3Q7Ci0JfQotCi0JLyogcmV0dXJuIGJlc3Qgc2NhbGVmYWN0b3IgKi8KLQlyZXR1cm4gc2NmQmVzdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudFNpbmdsZVNjZkJpdHMKLSogZGVzY3JpcHRpb246ICBjb3VudCBzaW5nbGUgc2NmIGJpdHMgaW4gaHVmZnVtCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjb3VudFNpbmdsZVNjZkJpdHMoV29yZDE2IHNjZiwgV29yZDE2IHNjZkxlZnQsIFdvcmQxNiBzY2ZSaWdodCkKLXsKLQlXb3JkMTYgc2NmQml0czsKLQotCXNjZkJpdHMgPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTGVmdCAtIHNjZikgKwotCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmIC0gc2NmUmlnaHQpOwotCi0JcmV0dXJuIHNjZkJpdHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY2FsY1NpbmdsZVNwZWNQZQotKiBkZXNjcmlwdGlvbjogIGxkUmF0aW8gPSBsb2cyKGVuKG4pKSAtIDAsMzc1KnNjZkdhaW4obikKLSoJCQkJbmJpdHMgPSAwLjcqbkxpbmVzKmxkUmF0aW9uIGZvciBsZFJhdGlvbiA+PSBjMQotKgkJCQluYml0cyA9IDAuNypuTGluZXMqKGMyICsgYzMqbGRSYXRpbykgZm9yIGxkUmF0aW9uIDwgYzEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNhbGNTaW5nbGVTcGVjUGUoV29yZDE2IHNjZiwgV29yZDE2IHNmYkNvbnN0UGVQYXJ0LCBXb3JkMTYgbkxpbmVzKQotewotCVdvcmQzMiBzcGVjUGU7Ci0JV29yZDMyIGxkUmF0aW87Ci0JV29yZDMyIHNjZjM7Ci0KLQlsZFJhdGlvID0gc2ZiQ29uc3RQZVBhcnQgPDwgMzsgLyogIChzZmJDb25zdFBlUGFydCAtMC4zNzUqc2NmKSo4ICovCi0Jc2NmMyA9IHNjZiArIHNjZiArIHNjZjsKLQlsZFJhdGlvID0gbGRSYXRpbyAtIHNjZjM7Ci0KLQlpZiAobGRSYXRpbyA8IFBFX0MxXzgpIHsKLQkJLyogMjEgOiAyKjgqUEVfQzIsIDIqUEVfQzMgfiAxKi8KLQkJbGRSYXRpbyA9IChsZFJhdGlvICsgUEVfQzJfMTYpID4+IDE7Ci0JfQotCXNwZWNQZSA9IG5MaW5lcyAqIGxkUmF0aW87Ci0Jc3BlY1BlID0gKHNwZWNQZSAqIFBFX1NDQUxFKSA+PiAxNDsKLQotCXJldHVybiBzYXR1cmF0ZShzcGVjUGUpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnRTY2ZCaXRzRGlmZgotKiBkZXNjcmlwdGlvbjogIGNvdW50IGRpZmZlcmVudCBzY2YgYml0cyB1c2VkCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjb3VudFNjZkJpdHNEaWZmKFdvcmQxNiAqc2NmT2xkLCBXb3JkMTYgKnNjZk5ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiQ250LCBXb3JkMTYgc3RhcnRTZmIsIFdvcmQxNiBzdG9wU2ZiKQotewotCVdvcmQzMiBzY2ZCaXRzRGlmZjsKLQlXb3JkMzIgc2ZiLCBzZmJMYXN0OwotCVdvcmQzMiBzZmJQcmV2LCBzZmJOZXh0OwotCi0Jc2NmQml0c0RpZmYgPSAwOwotCXNmYiA9IDA7Ci0KLQkvKiBzZWFyY2ggZm9yIGZpcnN0IHJlbGV2YW50IHNmYiAqLwotCXNmYkxhc3QgPSBzdGFydFNmYjsKLQl3aGlsZSAoc2ZiTGFzdCA8IHN0b3BTZmIgJiYgc2NmT2xkW3NmYkxhc3RdID09IFZPQUFDX1NIUlRfTUlOKSB7Ci0KLQkJc2ZiTGFzdCA9IHNmYkxhc3QgKyAxOwotCX0KLQkvKiBzZWFyY2ggZm9yIHByZXZpb3VzIHJlbGV2YW50IHNmYiBhbmQgY291bnQgZGlmZiAqLwotCXNmYlByZXYgPSBzdGFydFNmYiAtIDE7Ci0Jd2hpbGUgKChzZmJQcmV2Pj0wKSAmJiBzY2ZPbGRbc2ZiUHJldl0gPT0gVk9BQUNfU0hSVF9NSU4pIHsKLQotCQlzZmJQcmV2ID0gc2ZiUHJldiAtIDE7Ci0JfQotCi0JaWYgKHNmYlByZXY+PTApIHsKLQkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJQcmV2XSAtIHNjZk5ld1tzZmJMYXN0XSkgLQotCQkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJQcmV2XSAtIHNjZk9sZFtzZmJMYXN0XSk7Ci0JfQotCS8qIG5vdyBsb29wIHRocm91Z2ggYWxsIHNmYnMgYW5kIGNvdW50IGRpZmZzIG9mIHJlbGV2YW50IHNmYnMgKi8KLQlmb3IgKHNmYj1zZmJMYXN0KzE7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotCi0JCWlmIChzY2ZPbGRbc2ZiXSAhPSBWT0FBQ19TSFJUX01JTikgewotCQkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XSAtIHNjZk5ld1tzZmJdKSAtCi0JCQkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XSAtIHNjZk9sZFtzZmJdKTsKLQkJCXNmYkxhc3QgPSBzZmI7Ci0JCX0KLQl9Ci0JLyogc2VhcmNoIGZvciBuZXh0IHJlbGV2YW50IHNmYiBhbmQgY291bnQgZGlmZiAqLwotCXNmYk5leHQgPSBzdG9wU2ZiOwotCXdoaWxlIChzZmJOZXh0IDwgc2ZiQ250ICYmIHNjZk9sZFtzZmJOZXh0XSA9PSBWT0FBQ19TSFJUX01JTikgewotCi0JCXNmYk5leHQgPSBzZmJOZXh0ICsgMTsKLQl9Ci0KLQlpZiAoc2ZiTmV4dCA8IHNmYkNudCkKLQkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XSAtIHNjZk5ld1tzZmJOZXh0XSkgLQotCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYkxhc3RdIC0gc2NmT2xkW3NmYk5leHRdKTsKLQotCXJldHVybiBzYXR1cmF0ZShzY2ZCaXRzRGlmZik7Ci19Ci0KLXN0YXRpYyBXb3JkMTYgY2FsY1NwZWNQZURpZmYoV29yZDE2ICpzY2ZPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NmTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJGb3JtRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc3RhcnRTZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wU2ZiKQotewotCVdvcmQzMiBzcGVjUGVEaWZmOwotCVdvcmQzMiBzZmI7Ci0KLQlzcGVjUGVEaWZmID0gMDsKLQotCS8qIGxvb3AgdGhyb3VnaCBhbGwgc2ZicyBhbmQgY291bnQgcGUgZGlmZmVyZW5jZSAqLwotCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLQotCi0JCWlmIChzY2ZPbGRbc2ZiXSAhPSBWT0FBQ19TSFJUX01JTikgewotCQkJV29yZDMyIGxkUmF0aW9PbGQsIGxkUmF0aW9OZXc7Ci0JCQlXb3JkMzIgc2NmMzsKLQotCi0JCQlpZiAoc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9PSBNSU5fMTYpIHsKLQkJCQlzZmJDb25zdFBlUGFydFtzZmJdID0gKChsb2dTZmJFbmVyZ3lbc2ZiXSAtCi0JCQkJCWxvZ1NmYkZvcm1GYWN0b3Jbc2ZiXSkgKyAxMS04KjQrMykgPj4gMjsKLQkJCX0KLQotCi0JCQlsZFJhdGlvT2xkID0gc2ZiQ29uc3RQZVBhcnRbc2ZiXSA8PCAzOwotCQkJc2NmMyA9IHNjZk9sZFtzZmJdICsgc2NmT2xkW3NmYl0gKyBzY2ZPbGRbc2ZiXTsKLQkJCWxkUmF0aW9PbGQgPSBsZFJhdGlvT2xkIC0gc2NmMzsKLQkJCWxkUmF0aW9OZXcgPSBzZmJDb25zdFBlUGFydFtzZmJdIDw8IDM7Ci0JCQlzY2YzID0gc2NmTmV3W3NmYl0gKyBzY2ZOZXdbc2ZiXSArIHNjZk5ld1tzZmJdOwotCQkJbGRSYXRpb05ldyA9IGxkUmF0aW9OZXcgLSBzY2YzOwotCi0JCQlpZiAobGRSYXRpb09sZCA8IFBFX0MxXzgpIHsKLQkJCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLwotCQkJCWxkUmF0aW9PbGQgPSAobGRSYXRpb09sZCArIFBFX0MyXzE2KSA+PiAxOwotCQkJfQotCi0JCQlpZiAobGRSYXRpb05ldyA8IFBFX0MxXzgpIHsKLQkJCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLwotCQkJCWxkUmF0aW9OZXcgPSAobGRSYXRpb05ldyArIFBFX0MyXzE2KSA+PiAxOwotCQkJfQotCi0JCQlzcGVjUGVEaWZmICs9ICBzZmJOUmVsZXZhbnRMaW5lc1tzZmJdICogKGxkUmF0aW9OZXcgLSBsZFJhdGlvT2xkKTsKLQkJfQotCX0KLQotCXNwZWNQZURpZmYgPSAoc3BlY1BlRGlmZiAqIFBFX1NDQUxFKSA+PiAxNDsKLQotCXJldHVybiBzYXR1cmF0ZShzcGVjUGVEaWZmKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGFzc2ltaWxhdGVTaW5nbGVTY2YKLSogZGVzY3JpcHRpb246ICBzZWFyY2hlZCBmb3Igc2luZ2xlIHNjYWxlZmFjdG9yIGJhbmRzLCB3aGVyZSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2FpbmVkCi0qCQkJCWJ5IHVzaW5nIGEgc21hbGxlciBzY2ZnYWluKG4pIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZXN0aW1hdGVkIGluY3JlYXNlZAotKgkJCQliaXQgZGVtYW5kCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXNzaW1pbGF0ZVNpbmdsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1pblNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzZmJEaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJGb3JtRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1pblNjZkNhbGN1bGF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWcgICAgcmVzdGFydE9uU3VjY2VzcykKLXsKLQlXb3JkMTYgc2ZiTGFzdCwgc2ZiQWN0LCBzZmJOZXh0LCBzY2ZBY3QsIHNjZk1pbjsKLQlXb3JkMTYgKnNjZkxhc3QsICpzY2ZOZXh0OwotCVdvcmQzMiBzZmJQZU9sZCwgc2ZiUGVOZXc7Ci0JV29yZDMyIHNmYkRpc3ROZXc7Ci0JV29yZDMyIGo7Ci0JRmxhZyAgIHN1Y2Nlc3M7Ci0JV29yZDE2IGRlbHRhUGUsIGRlbHRhUGVOZXcsIGRlbHRhUGVUbXA7Ci0JV29yZDE2ICpwcmV2U2NmTGFzdCA9IHBzeU91dENoYW4tPnByZXZTY2ZMYXN0OwotCVdvcmQxNiAqcHJldlNjZk5leHQgPSBwc3lPdXRDaGFuLT5wcmV2U2NmTmV4dDsKLQlXb3JkMTYgKmRlbHRhUGVMYXN0ID0gcHN5T3V0Q2hhbi0+ZGVsdGFQZUxhc3Q7Ci0JRmxhZyAgIHVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQ7Ci0KLQlzdWNjZXNzID0gMDsKLQlkZWx0YVBlID0gMDsKLQotCWZvcihqPTA7ajxwc3lPdXRDaGFuLT5zZmJDbnQ7aisrKXsKLQkJcHJldlNjZkxhc3Rbal0gPSBNQVhfMTY7Ci0JCXByZXZTY2ZOZXh0W2pdID0gTUFYXzE2OwotCQlkZWx0YVBlTGFzdFtqXSA9IE1BWF8xNjsKLQl9Ci0KLQlzZmJMYXN0ID0gLTE7Ci0Jc2ZiQWN0ID0gLTE7Ci0Jc2ZiTmV4dCA9IC0xOwotCXNjZkxhc3QgPSAwOwotCXNjZk5leHQgPSAwOwotCXNjZk1pbiA9IE1BWF8xNjsKLQlkbyB7Ci0JCS8qIHNlYXJjaCBmb3IgbmV3IHJlbGV2YW50IHNmYiAqLwotCQlzZmJOZXh0ID0gc2ZiTmV4dCArIDE7Ci0JCXdoaWxlIChzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250ICYmIHNjZltzZmJOZXh0XSA9PSBNSU5fMTYpIHsKLQotCQkJc2ZiTmV4dCA9IHNmYk5leHQgKyAxOwotCQl9Ci0KLQkJaWYgKChzZmJMYXN0Pj0wKSAmJiAoc2ZiQWN0Pj0wKSAmJiBzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250KSB7Ci0JCQkvKiByZWxldmFudCBzY2ZzIHRvIHRoZSBsZWZ0IGFuZCB0byB0aGUgcmlnaHQgKi8KLQkJCXNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKLQkJCXNjZkxhc3QgPSBzY2YgKyBzZmJMYXN0OwotCQkJc2NmTmV4dCA9IHNjZiArIHNmYk5leHQ7Ci0JCQlzY2ZNaW4gID0gbWluKCpzY2ZMYXN0LCAqc2NmTmV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCWlmIChzZmJMYXN0ID09IC0xICYmIChzZmJBY3Q+PTApICYmIHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKLQkJCQkvKiBmaXJzdCByZWxldmFudCBzY2YgKi8KLQkJCQlzY2ZBY3QgID0gc2NmW3NmYkFjdF07Ci0JCQkJc2NmTGFzdCA9ICZzY2ZBY3Q7Ci0JCQkJc2NmTmV4dCA9IHNjZiArIHNmYk5leHQ7Ci0JCQkJc2NmTWluICA9ICpzY2ZOZXh0OwotCQkJfQotCQkJZWxzZSB7Ci0KLQkJCQlpZiAoKHNmYkxhc3Q+PTApICYmIChzZmJBY3Q+PTApICYmIHNmYk5leHQgPT0gcHN5T3V0Q2hhbi0+c2ZiQ250KSB7Ci0JCQkJCS8qIGxhc3QgcmVsZXZhbnQgc2NmICovCi0JCQkJCXNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKLQkJCQkJc2NmTGFzdCA9IHNjZiArIHNmYkxhc3Q7Ci0JCQkJCXNjZk5leHQgPSAmc2NmQWN0OwotCQkJCQlzY2ZNaW4gID0gKnNjZkxhc3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHNmYkFjdD49MCkKLQkJCXNjZk1pbiA9IG1heChzY2ZNaW4sIG1pblNjZltzZmJBY3RdKTsKLQotCQlpZiAoKHNmYkFjdCA+PSAwKSAmJgotCQkJKHNmYkxhc3Q+PTAgfHwgc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkgJiYKLQkJCXNjZkFjdCA+IHNjZk1pbiAmJgotCQkJKCpzY2ZMYXN0ICE9IHByZXZTY2ZMYXN0W3NmYkFjdF0gfHwKLQkJCSpzY2ZOZXh0ICE9IHByZXZTY2ZOZXh0W3NmYkFjdF0gfHwKLQkJCWRlbHRhUGUgPCBkZWx0YVBlTGFzdFtzZmJBY3RdKSkgewotCQkJc3VjY2VzcyA9IDA7Ci0KLQkJCS8qIGVzdGltYXRlIHJlcXVpcmVkIGJpdHMgZm9yIGFjdHVhbCBzY2YgKi8KLQkJCWlmIChzZmJDb25zdFBlUGFydFtzZmJBY3RdID09IE1JTl8xNikgewotCQkJCXNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSBsb2dTZmJFbmVyZ3lbc2ZiQWN0XSAtCi0JCQkJCWxvZ1NmYkZvcm1GYWN0b3Jbc2ZiQWN0XSArIDExLTgqNDsgLyogNCpsb2cyKDYuNzUpIC0gMzIgKi8KLQotCQkJCWlmIChzZmJDb25zdFBlUGFydFtzZmJBY3RdIDwgMCkKLQkJCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gKyAzOwotCQkJCXNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSBzZmJDb25zdFBlUGFydFtzZmJBY3RdID4+IDI7Ci0JCQl9Ci0KLQkJCXNmYlBlT2xkID0gY2FsY1NpbmdsZVNwZWNQZShzY2ZBY3QsIHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0sIHNmYk5SZWxldmFudExpbmVzW3NmYkFjdF0pICsKLQkJCQljb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOwotCQkJZGVsdGFQZU5ldyA9IGRlbHRhUGU7Ci0JCQl1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkID0gMTsKLQkJCWRvIHsKLQkJCQlzY2ZBY3QgPSBzY2ZBY3QgLSAxOwotCQkJCS8qIGNoZWNrIG9ubHkgaWYgdGhlIHNhbWUgY2hlY2sgd2FzIG5vdCBkb25lIGJlZm9yZSAqLwotCi0JCQkJaWYgKHNjZkFjdCA8IG1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSkgewotCQkJCQlzZmJQZU5ldyA9IGNhbGNTaW5nbGVTcGVjUGUoc2NmQWN0LCBzZmJDb25zdFBlUGFydFtzZmJBY3RdLCBzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKSArCi0JCQkJCQljb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOwotCQkJCQkvKiB1c2UgbmV3IHNjZiBpZiBubyBpbmNyZWFzZSBpbiBwZSBhbmQKLQkJCQkJcXVhbnRpemF0aW9uIGVycm9yIGlzIHNtYWxsZXIgKi8KLQkJCQkJZGVsdGFQZVRtcCA9IGRlbHRhUGUgKyBzZmJQZU5ldyAtIHNmYlBlT2xkOwotCi0JCQkJCWlmIChkZWx0YVBlVG1wIDwgMTApIHsKLQkJCQkJCXNmYkRpc3ROZXcgPSBjYWxjU2ZiRGlzdChwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0rCi0JCQkJCQkJcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3RdLAotCQkJCQkJCShwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdCsxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0XSksCi0JCQkJCQkJc2NmQWN0KTsKLQkJCQkJCWlmIChzZmJEaXN0TmV3IDwgc2ZiRGlzdFtzZmJBY3RdKSB7Ci0JCQkJCQkJLyogc3VjY2VzcywgcmVwbGFjZSBzY2YgYnkgbmV3IG9uZSAqLwotCQkJCQkJCXNjZltzZmJBY3RdID0gc2NmQWN0OwotCQkJCQkJCXNmYkRpc3Rbc2ZiQWN0XSA9IHNmYkRpc3ROZXc7Ci0JCQkJCQkJZGVsdGFQZU5ldyA9IGRlbHRhUGVUbXA7Ci0JCQkJCQkJc3VjY2VzcyA9IDE7Ci0JCQkJCQl9Ci0JCQkJCQkvKiBtYXJrIGFzIGFscmVhZHkgY2hlY2tlZCAqLwotCi0JCQkJCQlpZiAodXBkYXRlTWluU2NmQ2FsY3VsYXRlZCkgewotCQkJCQkJCW1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSA9IHNjZkFjdDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAwOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IHdoaWxlIChzY2ZBY3QgPiBzY2ZNaW4pOwotCQkJZGVsdGFQZSA9IGRlbHRhUGVOZXc7Ci0JCQkvKiBzYXZlIHBhcmFtZXRlcnMgdG8gYXZvaWQgbXVsdGlwbGUgY29tcHV0YXRpb25zIG9mIHRoZSBzYW1lIHNmYiAqLwotCQkJcHJldlNjZkxhc3Rbc2ZiQWN0XSA9ICpzY2ZMYXN0OwotCQkJcHJldlNjZk5leHRbc2ZiQWN0XSA9ICpzY2ZOZXh0OwotCQkJZGVsdGFQZUxhc3Rbc2ZiQWN0XSA9IGRlbHRhUGU7Ci0JCX0KLQotCQlpZiAoc3VjY2VzcyAmJiByZXN0YXJ0T25TdWNjZXNzKSB7Ci0JCQkvKiBzdGFydCBhZ2FpbiBhdCBmaXJzdCBzZmIgKi8KLQkJCXNmYkxhc3QgPSAtMTsKLQkJCXNmYkFjdCAgPSAtMTsKLQkJCXNmYk5leHQgPSAtMTsKLQkJCXNjZkxhc3QgPSAwOwotCQkJc2NmTmV4dCA9IDA7Ci0JCQlzY2ZNaW4gID0gTUFYXzE2OwotCQkJc3VjY2VzcyA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBzaGlmdCBzZmJzIGZvciBuZXh0IGJhbmQgKi8KLQkJCXNmYkxhc3QgPSBzZmJBY3Q7Ci0JCQlzZmJBY3QgID0gc2ZiTmV4dDsKLQkJfQotCi0gIH0gd2hpbGUgKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYXNzaW1pbGF0ZU11bHRpcGxlU2NmCi0qIGRlc2NyaXB0aW9uOiAgc2NhbGVmYWN0b3IgZGlmZmVyZW5jZSByZWR1Y3Rpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhc3NpbWlsYXRlTXVsdGlwbGVTY2YoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqc2ZiRGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRm9ybUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzKQotewotCVdvcmQzMiBzZmIsIHN0YXJ0U2ZiLCBzdG9wU2ZiLCBzY2ZNaW4sIHNjZk1heCwgc2NmQWN0OwotCUZsYWcgICBwb3NzaWJsZVJlZ2lvbkZvdW5kOwotCVdvcmQzMiBkZWx0YVNjZkJpdHM7Ci0JV29yZDMyIGRlbHRhU3BlY1BlOwotCVdvcmQzMiBkZWx0YVBlLCBkZWx0YVBlTmV3OwotCVdvcmQzMiBzZmJDbnQ7Ci0JV29yZDMyICpzZmJEaXN0TmV3ID0gcHN5T3V0Q2hhbi0+c2ZiRGlzdE5ldzsKLQlXb3JkMTYgKnNjZlRtcCA9IHBzeU91dENoYW4tPnByZXZTY2ZMYXN0OwotCi0JZGVsdGFQZSA9IDA7Ci0Jc2ZiQ250ID0gcHN5T3V0Q2hhbi0+c2ZiQ250OwotCi0JLyogY2FsYyBtaW4gYW5kIG1heCBzY2FsZmFjdG9ycyAqLwotCXNjZk1pbiA9IE1BWF8xNjsKLQlzY2ZNYXggPSBNSU5fMTY7Ci0JZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKyspIHsKLQotCQlpZiAoc2NmW3NmYl0gIT0gTUlOXzE2KSB7Ci0JCQlzY2ZNaW4gPSBtaW4oc2NmTWluLCBzY2Zbc2ZiXSk7Ci0JCQlzY2ZNYXggPSBtYXgoc2NmTWF4LCBzY2Zbc2ZiXSk7Ci0JCX0KLQl9Ci0KLQlpZiAoc2NmTWF4ICE9ICBNSU5fMTYpIHsKLQotCQlzY2ZBY3QgPSBzY2ZNYXg7Ci0KLQkJZG8gewotCQkJc2NmQWN0ID0gc2NmQWN0IC0gMTsKLQkJCWZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYisrKSB7Ci0JCQkJc2NmVG1wW3NmYl0gPSBzY2Zbc2ZiXTsKLQkJCX0KLQkJCXN0b3BTZmIgPSAwOwotCQkJZG8gewotCQkJCXNmYiA9IHN0b3BTZmI7Ci0KLQkJCQl3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmIChzY2Zbc2ZiXSA9PSBNSU5fMTYgfHwgc2NmW3NmYl0gPD0gc2NmQWN0KSkgewotCQkJCQlzZmIgPSBzZmIgKyAxOwotCQkJCX0KLQkJCQlzdGFydFNmYiA9IHNmYjsKLQkJCQlzZmIgPSBzZmIgKyAxOwotCi0JCQkJd2hpbGUgKHNmYiA8IHNmYkNudCAmJiAoc2NmW3NmYl0gPT0gTUlOXzE2IHx8IHNjZltzZmJdID4gc2NmQWN0KSkgewotCQkJCQlzZmIgPSBzZmIgKyAxOwotCQkJCX0KLQkJCQlzdG9wU2ZiID0gc2ZiOwotCi0JCQkJcG9zc2libGVSZWdpb25Gb3VuZCA9IDA7Ci0KLQkJCQlpZiAoc3RhcnRTZmIgPCBzZmJDbnQpIHsKLQkJCQkJcG9zc2libGVSZWdpb25Gb3VuZCA9IDE7Ci0JCQkJCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLQotCQkJCQkJaWYgKHNjZltzZmJdIT1NSU5fMTYpIHsKLQotCQkJCQkJCWlmIChzY2ZBY3QgPCBtaW5TY2Zbc2ZiXSkgewotCQkJCQkJCQlwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0KLQkJCQlpZiAocG9zc2libGVSZWdpb25Gb3VuZCkgeyAvKiByZWdpb24gZm91bmQgKi8KLQotCQkJCQkvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZkFjdCAqLwotCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KLQkJCQkJCWlmIChzY2ZUbXBbc2ZiXSE9TUlOXzE2KQotCQkJCQkJCXNjZlRtcFtzZmJdID0gc2NmQWN0OwotCQkJCQl9Ci0KLQkJCQkJLyogZXN0aW1hdGUgY2hhbmdlIGluIGJpdCBkZW1hbmQgZm9yIG5ldyBzY2ZzICovCi0JCQkJCWRlbHRhU2NmQml0cyA9IGNvdW50U2NmQml0c0RpZmYoc2NmLHNjZlRtcCxzZmJDbnQsc3RhcnRTZmIsc3RvcFNmYik7Ci0JCQkJCWRlbHRhU3BlY1BlID0gY2FsY1NwZWNQZURpZmYoc2NmLCBzY2ZUbXAsIHNmYkNvbnN0UGVQYXJ0LAotCQkJCQkJbG9nU2ZiRW5lcmd5LCBsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcywKLQkJCQkJCXN0YXJ0U2ZiLCBzdG9wU2ZiKTsKLQkJCQkJZGVsdGFQZU5ldyA9IGRlbHRhUGUgKyBkZWx0YVNjZkJpdHMgKyBkZWx0YVNwZWNQZTsKLQotCi0JCQkJCWlmIChkZWx0YVBlTmV3IDwgMTApIHsKLQkJCQkJCVdvcmQzMiBkaXN0T2xkU3VtLCBkaXN0TmV3U3VtOwotCi0JCQkJCQkvKiBxdWFudGl6ZSBhbmQgY2FsYyBzdW0gb2YgbmV3IGRpc3RvcnRpb24gKi8KLQkJCQkJCWRpc3RPbGRTdW0gPSAwOwotCQkJCQkJZGlzdE5ld1N1bSA9IDA7Ci0JCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KLQkJCQkJCQlpZiAoc2NmVG1wW3NmYl0gIT0gTUlOXzE2KSB7Ci0JCQkJCQkJCWRpc3RPbGRTdW0gPSBMX2FkZChkaXN0T2xkU3VtLCBzZmJEaXN0W3NmYl0pOwotCi0JCQkJCQkJCXNmYkRpc3ROZXdbc2ZiXSA9IGNhbGNTZmJEaXN0KHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSArCi0JCQkJCQkJCQlwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl0sCi0JCQkJCQkJCQkocHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmIrMV0gLSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl0pLAotCQkJCQkJCQkJc2NmQWN0KTsKLQotCi0JCQkJCQkJCWlmIChzZmJEaXN0TmV3W3NmYl0gPiBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiXSkgewotCQkJCQkJCQkJZGlzdE5ld1N1bSA9IGRpc3RPbGRTdW0gPDwgMTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWRpc3ROZXdTdW0gPSBMX2FkZChkaXN0TmV3U3VtLCBzZmJEaXN0TmV3W3NmYl0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKGRpc3ROZXdTdW0gPCBkaXN0T2xkU3VtKSB7Ci0JCQkJCQkJZGVsdGFQZSA9IGRlbHRhUGVOZXc7Ci0JCQkJCQkJZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotCi0JCQkJCQkJCWlmIChzY2Zbc2ZiXSE9TUlOXzE2KSB7Ci0JCQkJCQkJCQlzY2Zbc2ZiXSA9IHNjZkFjdDsKLQkJCQkJCQkJCXNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gd2hpbGUgKHN0b3BTZmIgPD0gc2ZiQ250KTsKLQkJfSB3aGlsZSAoc2NmQWN0ID4gc2NmTWluKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsCi0qIGRlc2NyaXB0aW9uOiAgZXN0aW1hdGUgc2NhbGUgZmFjdG9ycyBmb3Igb25lIGNoYW5uZWwKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKmdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpsb2dTZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpsb2dTZmJGb3JtRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqc2ZiTlJlbGV2YW50TGluZXMpCi17Ci0JV29yZDMyIGksIGo7Ci0JV29yZDMyIHRocmVzaCwgZW5lcmd5OwotCVdvcmQzMiBlbmVyZ3lQYXJ0LCB0aHJlc2hvbGRQYXJ0OwotCVdvcmQzMiBzY2ZJbnQsIG1pblNjZiwgbWF4U2NmLCBtYXhBbGxvd2VkU2NmLCBsYXN0U2Y7Ci0JV29yZDMyIG1heFNwZWM7Ci0JV29yZDMyICpzZmJEaXN0ID0gcHN5T3V0Q2hhbi0+c2ZiRGlzdDsKLQlXb3JkMTYgKm1pblNmTWF4UXVhbnQgPSBwc3lPdXRDaGFuLT5taW5TZk1heFF1YW50OwotCVdvcmQxNiAqbWluU2NmQ2FsY3VsYXRlZCA9IHBzeU91dENoYW4tPm1pblNjZkNhbGN1bGF0ZWQ7Ci0KLQotCWZvciAoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7Ci0JCVdvcmQzMiBzYmZ3aXRoLCBzYmZTdGFydDsKLQkJV29yZDMyICptZGN0U3BlYzsKLQkJdGhyZXNoID0gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW2ldOwotCQllbmVyZ3kgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV07Ci0KLQkJc2JmU3RhcnQgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOwotCQlzYmZ3aXRoID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdIC0gc2JmU3RhcnQ7Ci0JCW1kY3RTcGVjID0gcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtK3NiZlN0YXJ0OwotCi0JCW1heFNwZWMgPSAwOwotCQkvKiBtYXhpbXVtIG9mIHNwZWN0cnVtICovCi0JCWZvciAoaj1zYmZ3aXRoOyBqOyBqLS0gKSB7Ci0JCQlXb3JkMzIgYWJzU3BlYyA9IExfYWJzKCptZGN0U3BlYyk7IG1kY3RTcGVjKys7Ci0JCQltYXhTcGVjIHw9IGFic1NwZWM7Ci0JCX0KLQotCQkvKiBzY2ZzIHdpdGhvdXQgZW5lcmd5IG9yIHdpdGggdGhyZXNoPmVuZXJneSBhcmUgbWFya2VkIHdpdGggTUlOXzE2ICovCi0JCXNjZltpXSA9IE1JTl8xNjsKLQkJbWluU2ZNYXhRdWFudFtpXSA9IE1JTl8xNjsKLQotCQlpZiAoKG1heFNwZWMgPiAwKSAmJiAoZW5lcmd5ID4gdGhyZXNoKSkgewotCi0JCQllbmVyZ3lQYXJ0ID0gbG9nU2ZiRm9ybUZhY3RvcltpXTsKLQkJCXRocmVzaG9sZFBhcnQgPSBpTG9nNCh0aHJlc2gpOwotCQkJLyogLTIwID0gNCpsb2cyKDYuNzUpIC0gMzIgKi8KLQkJCXNjZkludCA9ICgodGhyZXNob2xkUGFydCAtIGVuZXJneVBhcnQgLSAyMCkgKiBTQ0FMRV9FU1RJTUFURV9DT0VGKSA+PiAxNTsKLQotCQkJbWluU2ZNYXhRdWFudFtpXSA9IGlMb2c0KG1heFNwZWMpIC0gNjg7IC8qIDY4ICAtMTYvMypsb2coTUFYX1FVQU5UKzAuNS1sb2dDb24pL2xvZygyKSArIDEgKi8KLQotCi0JCQlpZiAobWluU2ZNYXhRdWFudFtpXSA+IHNjZkludCkgewotCQkJCXNjZkludCA9IG1pblNmTWF4UXVhbnRbaV07Ci0JCQl9Ci0KLQkJCS8qIGZpbmQgYmV0dGVyIHNjYWxlZmFjdG9yIHdpdGggYW5hbHlzaXMgYnkgc3ludGhlc2lzICovCi0JCQlzY2ZJbnQgPSBpbXByb3ZlU2NmKHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bStzYmZTdGFydCwKLQkJCQlzYmZ3aXRoLAotCQkJCXRocmVzaCwgc2NmSW50LCBtaW5TZk1heFF1YW50W2ldLAotCQkJCSZzZmJEaXN0W2ldLCAmbWluU2NmQ2FsY3VsYXRlZFtpXSk7Ci0KLQkJCXNjZltpXSA9IHNjZkludDsKLQkJfQotCX0KLQotCi0JLyogc2NhbGVmYWN0b3IgZGlmZmVyZWNlIHJlZHVjdGlvbiAgKi8KLQl7Ci0JCVdvcmQxNiBzZmJDb25zdFBlUGFydFtNQVhfR1JPVVBFRF9TRkJdOwotCQlmb3IoaT0wO2k8cHN5T3V0Q2hhbi0+c2ZiQ250O2krKykgewotCQkJc2ZiQ29uc3RQZVBhcnRbaV0gPSBNSU5fMTY7Ci0JCX0KLQotCQlhc3NpbWlsYXRlU2luZ2xlU2NmKHBzeU91dENoYW4sIHNjZiwKLQkJCW1pblNmTWF4UXVhbnQsIHNmYkRpc3QsIHNmYkNvbnN0UGVQYXJ0LCBsb2dTZmJFbmVyZ3ksCi0JCQlsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcywgbWluU2NmQ2FsY3VsYXRlZCwgMSk7Ci0KLQkJYXNzaW1pbGF0ZU11bHRpcGxlU2NmKHBzeU91dENoYW4sIHNjZiwKLQkJCW1pblNmTWF4UXVhbnQsIHNmYkRpc3QsIHNmYkNvbnN0UGVQYXJ0LCBsb2dTZmJFbmVyZ3ksCi0JCQlsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcyk7Ci0JfQotCi0JLyogZ2V0IG1heCBzY2FsZWZhYyBmb3IgZ2xvYmFsIGdhaW4gKi8KLQltYXhTY2YgPSBNSU5fMTY7Ci0JbWluU2NmID0gTUFYXzE2OwotCWZvciAoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7Ci0KLQkJaWYgKG1heFNjZiA8IHNjZltpXSkgewotCQkJbWF4U2NmID0gc2NmW2ldOwotCQl9Ci0KLQkJaWYgKChzY2ZbaV0gIT0gTUlOXzE2KSAmJiAobWluU2NmID4gc2NmW2ldKSkgewotCQkJbWluU2NmID0gc2NmW2ldOwotCQl9Ci0JfQotCS8qIGxpbWl0IHNjZiBkZWx0YSAqLwotCW1heEFsbG93ZWRTY2YgPSBtaW5TY2YgKyBNQVhfU0NGX0RFTFRBOwotCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQotCQlpZiAoKHNjZltpXSAhPSBNSU5fMTYpICYmIChtYXhBbGxvd2VkU2NmIDwgc2NmW2ldKSkgewotCQkJc2NmW2ldID0gbWF4QWxsb3dlZFNjZjsKLQkJfQotCX0KLQkvKiBuZXcgbWF4U2NmIGlmIGFueSBzY2YgaGFzIGJlZW4gbGltaXRlZCAqLwotCi0JaWYgKG1heEFsbG93ZWRTY2YgPCBtYXhTY2YpIHsKLQkJbWF4U2NmID0gbWF4QWxsb3dlZFNjZjsKLQl9Ci0KLQkvKiBjYWxjIGxvb3Agc2NhbGVmYWN0b3JzICovCi0KLQlpZiAobWF4U2NmID4gTUlOXzE2KSB7Ci0JCSpnbG9iYWxHYWluID0gbWF4U2NmOwotCQlsYXN0U2YgPSAwOwotCi0JCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQotCQkJaWYgKHNjZltpXSA9PSBNSU5fMTYpIHsKLQkJCQlzY2ZbaV0gPSBsYXN0U2Y7Ci0JCQkJLyogc2V0IGJhbmQgZXhwbGljaXRlbHkgdG8gemVybyAqLwotCQkJCWZvciAoaj1wc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOyBqPHBzeU91dENoYW4tPnNmYk9mZnNldHNbaSsxXTsgaisrKSB7Ci0JCQkJCXBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bVtqXSA9IDA7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2NmW2ldID0gbWF4U2NmIC0gc2NmW2ldOwotCQkJCWxhc3RTZiA9IHNjZltpXTsKLQkJCX0KLQkJfQotCX0KLQllbHNlewotCQkqZ2xvYmFsR2FpbiA9IDA7Ci0JCS8qIHNldCBzcGVjdHJ1bSBleHBsaWNpdGVseSB0byB6ZXJvICovCi0JCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQkJCXNjZltpXSA9IDA7Ci0JCQlmb3IgKGo9cHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsgajxwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2krMV07IGorKykgewotCQkJCXBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bVtqXSA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ2FsY0Zvcm1GYWN0b3IKLSogZGVzY3JpcHRpb246ICBlc3RpbWF0ZSBGb3JtIGZhY3RvcnMgZm9yIGFsbCBjaGFubmVsCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotQ2FsY0Zvcm1GYWN0b3IoV29yZDE2IGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCi17Ci0JV29yZDE2IGo7Ci0KLQlmb3IgKGo9MDsgajxuQ2hhbm5lbHM7IGorKykgewotCQlDYWxjRm9ybUZhY3RvckNoYW5uZWwobG9nU2ZiRm9ybUZhY3RvcltqXSwgc2ZiTlJlbGV2YW50TGluZXNbal0sIGxvZ1NmYkVuZXJneVtqXSwgJnBzeU91dENoYW5uZWxbal0pOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBFc3RpbWF0ZVNjYWxlRmFjdG9ycwotKiBkZXNjcmlwdGlvbjogIGVzdGltYXRlIHNjYWxlIGZhY3RvcnMgZm9yIGFsbCBjaGFubmVsCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRXN0aW1hdGVTY2FsZUZhY3RvcnMoUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICBuQ2hhbm5lbHMpCi17Ci0JV29yZDE2IGo7Ci0KLQlmb3IgKGo9MDsgajxuQ2hhbm5lbHM7IGorKykgewotCQlFc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwoJnBzeU91dENoYW5uZWxbal0sCi0JCQlxY091dENoYW5uZWxbal0uc2NmLAotCQkJJihxY091dENoYW5uZWxbal0uZ2xvYmFsR2FpbiksCi0JCQlsb2dTZmJFbmVyZ3lbal0sCi0JCQlsb2dTZmJGb3JtRmFjdG9yW2pdLAotCQkJc2ZiTlJlbGV2YW50TGluZXNbal0pOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3ByZWFkaW5nLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zcHJlYWRpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmMmZmZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zcHJlYWRpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc3ByZWFkaW5nLmMKLQotCUNvbnRlbnQ6CVNwcmVhZGluZyBvZiBlbmVyZ3kgZnVuY3Rpb24KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJzcHJlYWRpbmcuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBTcHJlYWRpbmdNYXgKLSogZGVzY3JpcHRpb246ICBzcHJlYWRpbmcgdGhlIGVuZXJneQotKgkJCQkgaGlnaGVyIGZyZXF1ZW5jaWVzIHRocihuKSA9IG1heCh0aHIobiksIHNoKG4pKnRocihuLTEpKQotKgkJCQkgbG93ZXIgZnJlcXVlbmNpZXMgIHRocihuKSA9IG1heCh0aHIobiksIHNsKG4pKnRocihuKzEpKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgU3ByZWFkaW5nTWF4KGNvbnN0IFdvcmQxNiBwYkNudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqbWFza0xvd0ZhY3RvciwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqbWFza0hpZ2hGYWN0b3IsCi0gICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnBiU3ByZWFkZWRFbmVyZ3kpCi17Ci0gIFdvcmQzMiBpOwotCi0gIC8qIHNsb3BlIHRvIGhpZ2hlciBmcmVxdWVuY2llcyAqLwotICBmb3IgKGk9MTsgaTxwYkNudDsgaSsrKSB7Ci0gICAgcGJTcHJlYWRlZEVuZXJneVtpXSA9IG1heChwYlNwcmVhZGVkRW5lcmd5W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMX21weV9scyhwYlNwcmVhZGVkRW5lcmd5W2ktMV0sIG1hc2tIaWdoRmFjdG9yW2ldKSk7Ci0gIH0KLSAgLyogc2xvcGUgdG8gbG93ZXIgZnJlcXVlbmNpZXMgKi8KLSAgZm9yIChpPXBiQ250IC0gMjsgaT49MDsgaS0tKSB7Ci0gICAgcGJTcHJlYWRlZEVuZXJneVtpXSA9IG1heChwYlNwcmVhZGVkRW5lcmd5W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMX21weV9scyhwYlNwcmVhZGVkRW5lcmd5W2krMV0sIG1hc2tMb3dGYWN0b3JbaV0pKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3RhdF9iaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiZDhiZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXN0YXRfYml0cy5jCi0KLQlDb250ZW50OglTdGF0aWMgYml0IGNvdW50ZXIgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzdGF0X2JpdHMuaCIKLSNpbmNsdWRlICJiaXRlbmMuaCIKLSNpbmNsdWRlICJ0bnMuaCIKLQotCi10eXBlZGVmIGVudW0gewotICBTSV9JRF9CSVRTICAgICAgICAgICAgICAgID0oMyksCi0gIFNJX0ZJTExfQ09VTlRfQklUUyAgICAgICAgPSg0KSwKLSAgU0lfRklMTF9FU0NfQ09VTlRfQklUUyAgICA9KDgpLAotICBTSV9GSUxMX0VYVEVOVElPTl9CSVRTICAgID0oNCksCi0gIFNJX0ZJTExfTklCQkxFX0JJVFMgICAgICAgPSg0KSwKLSAgU0lfU0NFX0JJVFMgICAgICAgICAgICAgICA9KDQpLAotICBTSV9DUEVfQklUUyAgICAgICAgICAgICAgID0oNSksCi0gIFNJX0NQRV9NU19NQVNLX0JJVFMgICAgICAgPSgyKSAsCi0gIFNJX0lDU19JTkZPX0JJVFNfTE9ORyAgICAgPSgxKzIrMSs2KzEpLAotICBTSV9JQ1NfSU5GT19CSVRTX1NIT1JUICAgID0oMSsyKzErNCs3KSwKLSAgU0lfSUNTX0JJVFMgICAgICAgICAgICAgICA9KDgrMSsxKzEpCi19IFNJX0JJVFM7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudE1zTWFza0JpdHMKLSogZGVzY3JpcHRpb246ICAgY291bnQgbXMgc3RlcmVvIGJpdHMgZGVtYW5kCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjb3VudE1zTWFza0JpdHMoV29yZDE2ICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbykKLXsKLSAgV29yZDE2IG1zQml0cywgc2ZiT2ZmLCBzZmI7Ci0gIG1zQml0cyA9IDA7Ci0KLQotICBzd2l0Y2godG9vbHNJbmZvLT5tc0RpZ2VzdCkgewotICAgIGNhc2UgTVNfTk9ORToKLSAgICBjYXNlIE1TX0FMTDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNU19TT01FOgotICAgICAgZm9yKHNmYk9mZj0wOyBzZmJPZmY8c2ZiQ250OyBzZmJPZmYrPXNmYlBlckdyb3VwKQotICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxtYXhTZmJQZXJHcm91cDsgc2ZiKyspCi0gICAgICAgICAgbXNCaXRzICs9IDE7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4obXNCaXRzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiB0bnNDb3VudAotKiBkZXNjcmlwdGlvbjogICBjb3VudCB0bnMgYml0IGRlbWFuZCAgY29yZSBmdW5jdGlvbgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgdG5zQ291bnQoVE5TX0lORk8gKnRuc0luZm8sIFdvcmQxNiBibG9ja1R5cGUpCi17Ci0KLSAgV29yZDMyIGksIGs7Ci0gIEZsYWcgdG5zUHJlc2VudDsKLSAgV29yZDMyIG51bU9mV2luZG93czsKLSAgV29yZDMyIGNvdW50OwotICBXb3JkMzIgY29lZkJpdHM7Ci0gIFdvcmQxNiAqcHRjb2VmOwotCi0gIGNvdW50ID0gMDsKLQotICBpZiAoYmxvY2tUeXBlID09IDIpCi0gICAgbnVtT2ZXaW5kb3dzID0gODsKLSAgZWxzZQotICAgIG51bU9mV2luZG93cyA9IDE7Ci0gIHRuc1ByZXNlbnQgPSAwOwotCi0gIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KLSAgICBpZiAodG5zSW5mby0+dG5zQWN0aXZlW2ldIT0wKSB7Ci0gICAgICB0bnNQcmVzZW50ID0gMTsKLSAgICB9Ci0gIH0KLQotICBpZiAodG5zUHJlc2VudCkgewotICAgIC8qIHRoZXJlIGlzIGRhdGEgdG8gYmUgd3JpdHRlbiovCi0gICAgLypjb3VudCArPSAxOyAqLwotICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KLSAgICAgIGlmIChibG9ja1R5cGUgPT0gMikKLSAgICAgICAgY291bnQgKz0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgY291bnQgKz0gMjsKLQotICAgICAgaWYgKHRuc0luZm8tPnRuc0FjdGl2ZVtpXSkgewotICAgICAgICBjb3VudCArPSAxOwotCi0gICAgICAgIGlmIChibG9ja1R5cGUgPT0gMikgewotICAgICAgICAgIGNvdW50ICs9IDQ7Ci0gICAgICAgICAgY291bnQgKz0gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBjb3VudCArPSA2OwotICAgICAgICAgIGNvdW50ICs9IDU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodG5zSW5mby0+b3JkZXJbaV0pIHsKLSAgICAgICAgICBjb3VudCArPSAxOyAvKmRpcmVjdGlvbiovCi0gICAgICAgICAgY291bnQgKz0gMTsgLypjb2VmX2NvbXByZXNzaW9uICovCi0KLSAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZlJlc1tpXSA9PSA0KSB7Ci0gICAgICAgICAgICBwdGNvZWYgPSB0bnNJbmZvLT5jb2VmICsgaSpUTlNfTUFYX09SREVSX1NIT1JUOwotCQkJY29lZkJpdHMgPSAzOwotICAgICAgICAgICAgZm9yKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXTsgaysrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKChwdGNvZWZba10gPiAzKSB8fCAocHRjb2VmW2tdIDwgLTQpKSB7Ci0gICAgICAgICAgICAgICAgY29lZkJpdHMgPSA0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29lZkJpdHMgPSAyOwotICAgICAgICAgICAgcHRjb2VmID0gdG5zSW5mby0+Y29lZiArIGkqVE5TX01BWF9PUkRFUl9TSE9SVDsKLQkJCWZvcihrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV07IGsrKykgewotCi0gICAgICAgICAgICAgIGlmICgocHRjb2VmW2tdID4gMSkgfHwgKHB0Y29lZltrXSA8IC0yKSkgewotICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXTsgaysrICkgewotICAgICAgICAgICAgY291bnQgKz0gY29lZkJpdHM7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudFRuc0JpdHMKLSogZGVzY3JpcHRpb246ICAgY291bnQgdG5zIGJpdCBkZW1hbmQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNvdW50VG5zQml0cyhUTlNfSU5GTyAqdG5zSW5mbyxXb3JkMTYgYmxvY2tUeXBlKQotewotICByZXR1cm4odG5zQ291bnQodG5zSW5mbywgYmxvY2tUeXBlKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnRTdGF0aWNCaXRkZW1hbmQKLSogZGVzY3JpcHRpb246ICAgY291bnQgc3RhdGljIGJpdCBkZW1hbmQgaW5jbHVkZSB0bnMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgY291bnRTdGF0aWNCaXRkZW1hbmQoUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAotCQkJCQkJCVdvcmQxNiBhZHRzVXNlZCkKLXsKLSAgV29yZDMyIHN0YXRCaXRzOwotICBXb3JkMzIgY2g7Ci0KLSAgc3RhdEJpdHMgPSAwOwotCi0gIC8qIGlmIGFkdHMgdXNlZCwgYWRkIDU2IGJpdHMgKi8KLSAgaWYoYWR0c1VzZWQpIHN0YXRCaXRzICs9IDU2OwotCi0KLSAgc3dpdGNoIChjaGFubmVscykgewotICAgIGNhc2UgMToKLSAgICAgIHN0YXRCaXRzICs9IFNJX0lEX0JJVFMrU0lfU0NFX0JJVFMrU0lfSUNTX0JJVFM7Ci0gICAgICBzdGF0Qml0cyArPSBjb3VudFRuc0JpdHMoJihwc3lPdXRDaGFubmVsWzBdLnRuc0luZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2UpOwotCi0gICAgICBzd2l0Y2gocHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSl7Ci0gICAgICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgotICAgICAgICBjYXNlIFNUT1BfV0lORE9XOgotICAgICAgICAgIHN0YXRCaXRzICs9IFNJX0lDU19JTkZPX0JJVFNfTE9ORzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICAgICAgc3RhdEJpdHMgKz0gU0lfSUNTX0lORk9fQklUU19TSE9SVDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHN0YXRCaXRzICs9IFNJX0lEX0JJVFMrU0lfQ1BFX0JJVFMrMipTSV9JQ1NfQklUUzsKLQotICAgICAgc3RhdEJpdHMgKz0gU0lfQ1BFX01TX01BU0tfQklUUzsKLSAgICAgIHN0YXRCaXRzICs9IGNvdW50TXNNYXNrQml0cyhwc3lPdXRDaGFubmVsWzBdLnNmYkNudCwKLQkJCQkJCQkJICBwc3lPdXRDaGFubmVsWzBdLnNmYlBlckdyb3VwLAotCQkJCQkJCQkgIHBzeU91dENoYW5uZWxbMF0ubWF4U2ZiUGVyR3JvdXAsCi0JCQkJCQkJCSAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mbyk7Ci0KLSAgICAgIHN3aXRjaCAocHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSkgewotICAgICAgICBjYXNlIExPTkdfV0lORE9XOgotICAgICAgICBjYXNlIFNUQVJUX1dJTkRPVzoKLSAgICAgICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgICAgICBzdGF0Qml0cyArPSBTSV9JQ1NfSU5GT19CSVRTX0xPTkc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0hPUlRfV0lORE9XOgotICAgICAgICAgIHN0YXRCaXRzICs9IFNJX0lDU19JTkZPX0JJVFNfU0hPUlQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBmb3IoY2g9MDsgY2g8MjsgY2grKykKLSAgICAgICAgc3RhdEJpdHMgKz0gY291bnRUbnNCaXRzKCYocHN5T3V0Q2hhbm5lbFtjaF0udG5zSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBzdGF0Qml0czsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMzk3MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYworKysgL2Rldi9udWxsCkBAIC0xLDkwNiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRucy5jCi0KLQlDb250ZW50OglEZWZpbml0aW9uIFROUyB0b29scyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJhc3NlcnQuaCIKLSNpbmNsdWRlICJhYWNfcm9tLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAidG5zLmgiCi0jaW5jbHVkZSAidG5zX3BhcmFtLmgiCi0jaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJ0bnNfZnVuYy5oIgotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotI2RlZmluZSBUTlNfTU9ESUZZX0JFR0lOICAgICAgICAgMjYwMCAgLyogSHogKi8KLSNkZWZpbmUgUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSIDM4MCAgIC8qIEh6ICovCi0jZGVmaW5lIFROU19HQUlOX1RIUkVTSAkJCSAxNDEgICAvKiAxLjQxKjEwMCAqLwotI2RlZmluZSBOT1JNX0NPRUYJCQkJIDB4MDI4ZjVjMjgKLQotc3RhdGljIGNvbnN0IFdvcmQzMiBUTlNfUEFSQ09SX1RIUkVTSCA9IDB4MGNjY2NjY2Q7IC8qIDAuMSooMSA8PCAzMSkgKi8KLS8qIExpbWl0IGJhbmRzIHRvID4gMi4wIGtIeiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IHRuc01pbkJhbmROdW1iZXJMb25nWzEyXSA9Ci17IDExLCAxMiwgMTUsIDE2LCAxNywgMjAsIDI1LCAyNiwgMjQsIDI4LCAzMCwgMzEgfTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bnNNaW5CYW5kTnVtYmVyU2hvcnRbMTJdID0KLXsgMiwgMiwgMiwgMywgMywgNCwgNiwgNiwgOCwgMTAsIDEwLCAxMiB9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBNYWluL0xvdyBQcm9maWxlIFROUyBQYXJhbWV0ZXJzICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdG5zTWF4QmFuZHNMb25nTWFpbkxvd1sxMl0gPQoteyAzMSwgMzEsIDM0LCA0MCwgNDIsIDUxLCA0NiwgNDYsIDQyLCA0MiwgNDIsIDM5IH07Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bnNNYXhCYW5kc1Nob3J0TWFpbkxvd1sxMl0gPQoteyA5LCA5LCAxMCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCB9OwotCi0KLXN0YXRpYyB2b2lkIENhbGNXZWlnaHRlZFNwZWN0cnVtKGNvbnN0IFdvcmQzMiBzcGVjdHJ1bVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdlaWdodGVkU3BlY3RydW1bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiogc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2KiBzZmJPZmZzZXQsIFdvcmQxNiBscGNTdGFydExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbHBjU3RvcExpbmUsIFdvcmQxNiBscGNTdGFydEJhbmQsV29yZDE2IGxwY1N0b3BCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwV29yazMyKTsKLQotCi0KLXZvaWQgQXV0b0NvcnJlbGF0aW9uKGNvbnN0IFdvcmQxNiBpbnB1dFtdLCBXb3JkMzIgY29ycltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzYW1wbGVzLCBXb3JkMTYgY29yckNvZWZmKTsKLXN0YXRpYyBXb3JkMTYgQXV0b1RvUGFyY29yKFdvcmQzMiB3b3JrQnVmZmVyW10sIFdvcmQzMiByZWZsQ29lZmZbXSwgV29yZDE2IG51bU9mQ29lZmYpOwotCi1zdGF0aWMgV29yZDE2IENhbGNUbnNGaWx0ZXIoY29uc3QgV29yZDE2KiBzaWduYWwsIGNvbnN0IFdvcmQzMiB3aW5kb3dbXSwgV29yZDE2IG51bU9mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRuc09yZGVyLCBXb3JkMzIgcGFyY29yW10pOwotCi0KLXN0YXRpYyB2b2lkIFBhcmNvcjJJbmRleChjb25zdCBXb3JkMzIgcGFyY29yW10sIFdvcmQxNiBpbmRleFtdLCBXb3JkMTYgb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJpdHNQZXJDb2VmZik7Ci0KLXN0YXRpYyB2b2lkIEluZGV4MlBhcmNvcihjb25zdCBXb3JkMTYgaW5kZXhbXSwgV29yZDMyIHBhcmNvcltdLCBXb3JkMTYgb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJpdHNQZXJDb2VmZik7Ci0KLQotCi1zdGF0aWMgdm9pZCBBbmFseXNpc0ZpbHRlckxhdHRpY2UoY29uc3QgV29yZDMyIHNpZ25hbFtdLCBXb3JkMTYgbnVtT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgcGFyQ29lZmZbXSwgV29yZDE2IG9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBvdXRwdXRbXSk7Ci0KLQotLyoqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcKLSogZGVzY3JpcHRpb246ICBSZXRyaWV2ZSBpbmRleCBvZiBuZWFyZXN0IGJhbmQgYm9yZGVyCi0qIHJldHVybnQ6CQlpbmRleAotKgotKi8KLXN0YXRpYyBXb3JkMTYgRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhXb3JkMzIgZnJlcSwgICAgICAgICAgICAgICAgICAgLyohPCBmcmVxdWVuY3kgaW4gSGVydHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgZnMsICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgaW4gSGVydHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZCYW5kcywgICAgICAgICAgICAgLyohPCB0b3RhbCBudW1iZXIgb2YgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRTdGFydE9mZnNldCkgLyohPCB0YWJsZSBvZiBiYW5kIGJvcmRlcnMgKi8KLXsKLSAgV29yZDMyIGxpbmVOdW1iZXIsIGJhbmQ7Ci0gIFdvcmQzMiB0ZW1wLCBzaGlmdDsKLQotICAvKiAgYXNzZXJ0KGZyZXEgPj0gMCk7ICAqLwotICBzaGlmdCA9IG5vcm1fbChmcyk7Ci0gIGxpbmVOdW1iZXIgPSAoZXh0cmFjdF9sKGZpeG11bCgoYmFuZFN0YXJ0T2Zmc2V0W251bU9mQmFuZHNdIDw8IDIpLERpdl8zMihmcmVxIDw8IHNoaWZ0LGZzIDw8IHNoaWZ0KSkpICsgMSkgPj4gMTsKLQotICAvKiBmcmVxID4gZnMvMiAqLwotICB0ZW1wID0gbGluZU51bWJlciAtIGJhbmRTdGFydE9mZnNldFtudW1PZkJhbmRzXSA7Ci0gIGlmICh0ZW1wID49IDApCi0gICAgcmV0dXJuIG51bU9mQmFuZHM7Ci0KLSAgLyogZmluZCBiYW5kIHRoZSBsaW5lIG51bWJlciBsaWVzIGluICovCi0gIGZvciAoYmFuZD0wOyBiYW5kPG51bU9mQmFuZHM7IGJhbmQrKykgewotICAgIHRlbXAgPSBiYW5kU3RhcnRPZmZzZXRbYmFuZCArIDFdIC0gbGluZU51bWJlcjsKLSAgICBpZiAodGVtcCA+IDApIGJyZWFrOwotICB9Ci0KLSAgdGVtcCA9IChsaW5lTnVtYmVyIC0gYmFuZFN0YXJ0T2Zmc2V0W2JhbmRdKTsKLSAgdGVtcCA9ICh0ZW1wIC0gKGJhbmRTdGFydE9mZnNldFtiYW5kICsgMV0gLSBsaW5lTnVtYmVyKSk7Ci0gIGlmICggdGVtcCA+IDAgKQotICB7Ci0gICAgYmFuZCA9IGJhbmQgKyAxOwotICB9Ci0KLSAgcmV0dXJuIGV4dHJhY3RfbChiYW5kKTsKLX0KLQotCi0vKioKLSoKLSogZnVuY3Rpb24gbmFtZTogSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nCi0qIGRlc2NyaXB0aW9uOiAgRmlsbCBUTlNfQ09ORklHIHN0cnVjdHVyZSB3aXRoIHNlbnNpYmxlIGNvbnRlbnQgZm9yIGxvbmcgYmxvY2tzCi0qIHJldHVybnM6CQkwIGlmIHN1Y2Nlc3MKLSoKLSovCi1Xb3JkMTYgSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nKFdvcmQzMiBiaXRSYXRlLCAgICAgICAgICAvKiE8IGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0QywgICAgICAgICAgICAgLyohPCBUTlMgQ29uZmlnIHN0cnVjdCAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBDLCAvKiE8IHBzeSBjb25maWcgc3RydWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhY3RpdmUpICAgICAgICAgICAgICAvKiE8IHRucyBhY3RpdmUgZmxhZyAqLwotewotCi0gIFdvcmQzMiBiaXRyYXRlUGVyQ2hhbm5lbCBfX3VudXNlZDsKLSAgdEMtPm1heE9yZGVyICAgICA9IFROU19NQVhfT1JERVI7Ci0gIHRDLT50bnNTdGFydEZyZXEgPSAxMjc1OwotICB0Qy0+Y29lZlJlcyAgICAgID0gNDsKLQotICAvKiB0byBhdm9pZCBpbnRlZ2VyIGRpdmlzaW9uICovCi0gIGlmICggc3ViKGNoYW5uZWxzLDIpID09IDAgKSB7Ci0gICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlID4+IDE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlOwotICB9Ci0KLSAgdEMtPnRuc01heFNmYiA9IHRuc01heEJhbmRzTG9uZ01haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKLQotICB0Qy0+dG5zQWN0aXZlID0gYWN0aXZlOwotCi0gIC8qIG5vdyBjYWxjIGJhbmQgYW5kIGxpbmUgYm9yZGVycyAqLwotICB0Qy0+dG5zU3RvcEJhbmQgPSBtaW4ocEMtPnNmYkNudCwgdEMtPnRuc01heFNmYik7Ci0gIHRDLT50bnNTdG9wTGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0b3BCYW5kXTsKLQotICB0Qy0+dG5zU3RhcnRCYW5kID0gRnJlcVRvQmFuZFdpdGhSb3VuZGluZyh0Qy0+dG5zU3RhcnRGcmVxLCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LCAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotICB0Qy0+dG5zTW9kaWZ5QmVnaW5DYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoVE5TX01PRElGWV9CRUdJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7Ci0KLSAgdEMtPnRuc1JhdGlvUGF0Y2hMb3dlc3RDYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotCi0gIHRDLT50bnNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdGFydEJhbmRdOwotCi0gIHRDLT5scGNTdG9wQmFuZCA9IHRuc01heEJhbmRzTG9uZ01haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKLSAgdEMtPmxwY1N0b3BCYW5kID0gbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7Ci0KLSAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOwotCi0gIHRDLT5scGNTdGFydEJhbmQgPSB0bnNNaW5CYW5kTnVtYmVyTG9uZ1twQy0+c2FtcFJhdGVJZHhdOwotCi0gIHRDLT5scGNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRdOwotCi0gIHRDLT50aHJlc2hvbGQgPSBUTlNfR0FJTl9USFJFU0g7Ci0KLQotICByZXR1cm4oMCk7Ci19Ci0KLS8qKgotKgotKiBmdW5jdGlvbiBuYW1lOiBJbml0VG5zQ29uZmlndXJhdGlvblNob3J0Ci0qIGRlc2NyaXB0aW9uOiAgRmlsbCBUTlNfQ09ORklHIHN0cnVjdHVyZSB3aXRoIHNlbnNpYmxlIGNvbnRlbnQgZm9yIHNob3J0IGJsb2NrcwotKiByZXR1cm5zOgkJMCBpZiBzdWNjZXNzCi0qCi0qLwotV29yZDE2IEluaXRUbnNDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdFJhdGUsICAgICAgICAgICAgICAvKiE8IGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLCAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRDLCAgICAgICAgICAgICAgLyohPCBUTlMgQ29uZmlnIHN0cnVjdCAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcEMsIC8qITwgcHN5IGNvbmZpZyBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhY3RpdmUpICAgICAgICAgICAgICAgLyohPCB0bnMgYWN0aXZlIGZsYWcgKi8KLXsKLSAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsIF9fdW51c2VkOwotICB0Qy0+bWF4T3JkZXIgICAgID0gVE5TX01BWF9PUkRFUl9TSE9SVDsKLSAgdEMtPnRuc1N0YXJ0RnJlcSA9IDI3NTA7Ci0gIHRDLT5jb2VmUmVzICAgICAgPSAzOwotCi0gIC8qIHRvIGF2b2lkIGludGVnZXIgZGl2aXNpb24gKi8KLSAgaWYgKCBzdWIoY2hhbm5lbHMsMikgPT0gMCApIHsKLSAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IExfc2hyKGJpdFJhdGUsMSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlOwotICB9Ci0KLSAgdEMtPnRuc01heFNmYiA9IHRuc01heEJhbmRzU2hvcnRNYWluTG93W3BDLT5zYW1wUmF0ZUlkeF07Ci0KLSAgdEMtPnRuc0FjdGl2ZSA9IGFjdGl2ZTsKLQotICAvKiBub3cgY2FsYyBiYW5kIGFuZCBsaW5lIGJvcmRlcnMgKi8KLSAgdEMtPnRuc1N0b3BCYW5kID0gbWluKHBDLT5zZmJDbnQsIHRDLT50bnNNYXhTZmIpOwotICB0Qy0+dG5zU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdG9wQmFuZF07Ci0KLSAgdEMtPnRuc1N0YXJ0QmFuZD1GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKHRDLT50bnNTdGFydEZyZXEsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LCAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotICB0Qy0+dG5zTW9kaWZ5QmVnaW5DYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoVE5TX01PRElGWV9CRUdJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7Ci0KLSAgdEMtPnRuc1JhdGlvUGF0Y2hMb3dlc3RDYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotCi0gIHRDLT50bnNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdGFydEJhbmRdOwotCi0gIHRDLT5scGNTdG9wQmFuZCA9IHRuc01heEJhbmRzU2hvcnRNYWluTG93W3BDLT5zYW1wUmF0ZUlkeF07Ci0KLSAgdEMtPmxwY1N0b3BCYW5kID0gbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7Ci0KLSAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOwotCi0gIHRDLT5scGNTdGFydEJhbmQgPSB0bnNNaW5CYW5kTnVtYmVyU2hvcnRbcEMtPnNhbXBSYXRlSWR4XTsKLQotICB0Qy0+bHBjU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kXTsKLQotICB0Qy0+dGhyZXNob2xkID0gVE5TX0dBSU5fVEhSRVNIOwotCi0gIHJldHVybigwKTsKLX0KLQotLyoqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFRuc0RldGVjdAotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSBUTlMgZmlsdGVyIGFuZCBkZWNpZGUgb24gVE5TIHVzYWdlCi0qIHJldHVybnM6CQkwIGlmIHN1Y2Nlc3MKLSoKLSovCi1Xb3JkMzIgVG5zRGV0ZWN0KFROU19EQVRBKiB0bnNEYXRhLCAgICAgICAgLyohPCB0bnMgZGF0YSBzdHJ1Y3R1cmUgKG1vZGlmaWVkKSAqLwotICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLCAgICAgICAgICAgIC8qITwgdG5zIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgV29yZDMyKiBwU2NyYXRjaFRucywgICAgICAvKiE8IHBvaW50ZXIgdG8gc2NyYXRjaCBzcGFjZSAqLwotICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc2ZiT2Zmc2V0W10sIC8qITwgc2NhbGVmYWN0b3Igc2l6ZSBhbmQgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgV29yZDMyKiBzcGVjdHJ1bSwgICAgICAgICAvKiE8IHNwZWN0cmFsIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLCAgICAvKiE8IHN1YmJsb2NrIG51bSAqLwotICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlLCAgICAgICAgIC8qITwgYmxvY2t0eXBlIChsb25nIG9yIHNob3J0KSAqLwotICAgICAgICAgICAgICAgICBXb3JkMzIgKiBzZmJFbmVyZ3kpICAgICAgIC8qITwgc2ZiLXdpc2UgZW5lcmd5ICovCi17Ci0KLSAgV29yZDMyICBwcmVkaWN0aW9uR2FpbjsKLSAgV29yZDMyICB0ZW1wOwotICBXb3JkMzIqIHBXb3JrMzIgPSAmcFNjcmF0Y2hUbnNbc3ViQmxvY2tOdW1iZXIgPj4gOF07Ci0gIFdvcmQxNiogcFdlaWdodGVkU3BlY3RydW0gPSAoV29yZDE2ICopJnBTY3JhdGNoVG5zW3N1YkJsb2NrTnVtYmVyID4+IDhdOwotCi0KLSAgaWYgKHRDLnRuc0FjdGl2ZSkgewotICAgIENhbGNXZWlnaHRlZFNwZWN0cnVtKHNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBXZWlnaHRlZFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5scGNTdG9wQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwV29yazMyKTsKLQotICAgIHRlbXAgPSBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7Ci0gICAgaWYgKCB0ZW1wICE9IDAgKSB7Ci0gICAgICAgIHByZWRpY3Rpb25HYWluID0gQ2FsY1Ruc0ZpbHRlciggJnBXZWlnaHRlZFNwZWN0cnVtW3RDLmxwY1N0YXJ0TGluZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMuYWNmV2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BMaW5lIC0gdEMubHBjU3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8ucGFyY29yKTsKLQotCi0gICAgICAgIHRlbXAgPSBwcmVkaWN0aW9uR2FpbiAtIHRDLnRocmVzaG9sZDsKLSAgICAgICAgaWYgKCB0ZW1wID4gMCApIHsKLSAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby5wcmVkaWN0aW9uR2FpbiA9IHByZWRpY3Rpb25HYWluOwotICAgIH0KLSAgICBlbHNlewotCi0gICAgICAgIHByZWRpY3Rpb25HYWluID0gQ2FsY1Ruc0ZpbHRlciggJnBXZWlnaHRlZFNwZWN0cnVtW3RDLmxwY1N0YXJ0TGluZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMuYWNmV2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BMaW5lIC0gdEMubHBjU3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wYXJjb3IpOwotCi0gICAgICAgIHRlbXAgPSBwcmVkaWN0aW9uR2FpbiAtIHRDLnRocmVzaG9sZDsKLSAgICAgICAgaWYgKCB0ZW1wID4gMCApIHsKLSAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wcmVkaWN0aW9uR2FpbiA9IHByZWRpY3Rpb25HYWluOwotICAgIH0KLQotICB9Ci0gIGVsc2V7Ci0KLSAgICB0ZW1wID0gYmxvY2tUeXBlIC0gU0hPUlRfV0lORE9XOwotICAgIGlmICggdGVtcCAhPSAwICkgewotICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA9IDA7Ci0gICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW4gPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnRuc0FjdGl2ZSA9IDA7Ci0gICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wcmVkaWN0aW9uR2FpbiA9IDA7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuKDApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBUbnNTeW5jCi0qIGRlc2NyaXB0aW9uOiB1cGRhdGUgdG5zIHBhcmFtZXRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFRuc1N5bmMoVE5TX0RBVEEgKnRuc0RhdGFEZXN0LAotICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhU3JjLAotICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgdEMsCi0gICAgICAgICAgICAgY29uc3QgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUpCi17Ci0gICBUTlNfU1VCQkxPQ0tfSU5GTyAqc2JJbmZvRGVzdDsKLSAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpzYkluZm9TcmM7Ci0gICBXb3JkMzIgaSwgdGVtcDsKLQotICAgdGVtcCA9ICBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7Ci0gICBpZiAoIHRlbXAgIT0gMCApIHsKLSAgICAgIHNiSW5mb0Rlc3QgPSAmdG5zRGF0YURlc3QtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm87Ci0gICAgICBzYkluZm9TcmMgID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm87Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIHNiSW5mb0Rlc3QgPSAmdG5zRGF0YURlc3QtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXTsKLSAgICAgIHNiSW5mb1NyYyAgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdOwotICAgfQotCi0gICBpZiAoMTAwKmFic19zKHNiSW5mb0Rlc3QtPnByZWRpY3Rpb25HYWluIC0gc2JJbmZvU3JjLT5wcmVkaWN0aW9uR2FpbikgPAotICAgICAgICgzICogc2JJbmZvRGVzdC0+cHJlZGljdGlvbkdhaW4pKSB7Ci0gICAgICBzYkluZm9EZXN0LT50bnNBY3RpdmUgPSBzYkluZm9TcmMtPnRuc0FjdGl2ZTsKLSAgICAgIGZvciAoIGk9MDsgaTwgdEMubWF4T3JkZXI7IGkrKykgewotICAgICAgICBzYkluZm9EZXN0LT5wYXJjb3JbaV0gPSBzYkluZm9TcmMtPnBhcmNvcltpXTsKLSAgICAgIH0KLSAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFRuc0VuY29kZQotKiBkZXNjcmlwdGlvbjogZG8gVE5TIGZpbHRlcmluZwotKiByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBUbnNFbmNvZGUoVE5TX0lORk8qIHRuc0luZm8sICAgICAvKiE8IHRucyBpbmZvIHN0cnVjdHVyZSAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLCAgICAgLyohPCB0bnMgZGF0YSBzdHJ1Y3R1cmUgKG1vZGlmaWVkKSAqLwotICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZTZmIsICAgICAgIC8qITwgbnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcyAqLwotICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLCAgICAgICAgIC8qITwgdG5zIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgV29yZDE2IGxvd1Bhc3NMaW5lLCAgICAvKiE8IGxvd3Bhc3MgbGluZSAqLwotICAgICAgICAgICAgICAgICBXb3JkMzIqIHNwZWN0cnVtLCAgICAgIC8qITwgc3BlY3RyYWwgZGF0YSAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBzdWJCbG9ja051bWJlciwgLyohPCBzdWJibG9jayBudW0gKi8KLSAgICAgICAgICAgICAgICAgV29yZDE2IGJsb2NrVHlwZSkgICAgICAvKiE8IGJsb2NrdHlwZSAobG9uZyBvciBzaG9ydCkgKi8KLXsKLSAgV29yZDMyIGk7Ci0gIFdvcmQzMiB0ZW1wX3M7Ci0gIFdvcmQzMiB0ZW1wOwotICBUTlNfU1VCQkxPQ0tfSU5GTyAqcHN1YkJsb2NrSW5mbzsKLQotICB0ZW1wX3MgPSBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7Ci0gIGlmICggdGVtcF9zICE9IDApIHsKLSAgICBwc3ViQmxvY2tJbmZvID0gJnRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm87Ci0JaWYgKHBzdWJCbG9ja0luZm8tPnRuc0FjdGl2ZSA9PSAwKSB7Ci0gICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMDsKLSAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgIFBhcmNvcjJJbmRleChwc3ViQmxvY2tJbmZvLT5wYXJjb3IsCi0gICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZiwKLSAgICAgICAgICAgICAgICAgICB0Qy5tYXhPcmRlciwKLSAgICAgICAgICAgICAgICAgICB0Qy5jb2VmUmVzKTsKLQotICAgICAgSW5kZXgyUGFyY29yKHRuc0luZm8tPmNvZWYsCi0gICAgICAgICAgICAgICAgICAgcHN1YkJsb2NrSW5mby0+cGFyY29yLAotICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOwotCi0gICAgICBmb3IgKGk9dEMubWF4T3JkZXIgLSAxOyBpPj0wOyBpLS0pICB7Ci0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gLSBUTlNfUEFSQ09SX1RIUkVTSDsKLSAgICAgICAgaWYgKCB0ZW1wID4gMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gKyBUTlNfUEFSQ09SX1RIUkVTSDsKLSAgICAgICAgaWYgKCB0ZW1wIDwgMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0gPSBpICsgMTsKLQotCi0gICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMTsKLSAgICAgIGZvciAoaT1zdWJCbG9ja051bWJlcisxOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtpXSA9IDA7Ci0gICAgICB9Ci0gICAgICB0bnNJbmZvLT5jb2VmUmVzW3N1YkJsb2NrTnVtYmVyXSA9IHRDLmNvZWZSZXM7Ci0gICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdID0gbnVtT2ZTZmIgLSB0Qy50bnNTdGFydEJhbmQ7Ci0KLQotICAgICAgQW5hbHlzaXNGaWx0ZXJMYXR0aWNlKCYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pbih0Qy50bnNTdG9wTGluZSxsb3dQYXNzTGluZSkgLSB0Qy50bnNTdGFydExpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzdWJCbG9ja0luZm8tPnBhcmNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzcGVjdHJ1bVt0Qy50bnNTdGFydExpbmVdKSk7Ci0KLSAgICB9Ci0gIH0gICAgIC8qIGlmIChibG9ja1R5cGUhPVNIT1JUX1dJTkRPVykgKi8KLSAgZWxzZSAvKnNob3J0IGJsb2NrKi8gewotICAgIHBzdWJCbG9ja0luZm8gPSAmdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdOwotCWlmIChwc3ViQmxvY2tJbmZvLT50bnNBY3RpdmUgPT0gMCkgewotICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDA7Ci0gICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICBQYXJjb3IySW5kZXgocHN1YkJsb2NrSW5mby0+cGFyY29yLAotICAgICAgICAgICAgICAgICAgICZ0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyKlROU19NQVhfT1JERVJfU0hPUlRdLAotICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOwotCi0gICAgICBJbmRleDJQYXJjb3IoJnRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXIqVE5TX01BWF9PUkRFUl9TSE9SVF0sCi0gICAgICAgICAgICAgICAgICAgcHN1YkJsb2NrSW5mby0+cGFyY29yLAotICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOwotICAgICAgZm9yIChpPSh0Qy5tYXhPcmRlciAtIDEpOyBpPj0wOyBpLS0pICB7Ci0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gLSBUTlNfUEFSQ09SX1RIUkVTSDsKLSAgICAgICAgIGlmICggdGVtcCA+IDAgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gKyBUTlNfUEFSQ09SX1RIUkVTSDsKLSAgICAgICAgaWYgKCB0ZW1wIDwgMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0gPSBpICsgMTsKLQotICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDE7Ci0gICAgICB0bnNJbmZvLT5jb2VmUmVzW3N1YkJsb2NrTnVtYmVyXSA9IHRDLmNvZWZSZXM7Ci0gICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdID0gbnVtT2ZTZmIgLSB0Qy50bnNTdGFydEJhbmQ7Ci0KLQotICAgICAgQW5hbHlzaXNGaWx0ZXJMYXR0aWNlKCYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSksICh0Qy50bnNTdG9wTGluZSAtIHRDLnRuc1N0YXJ0TGluZSksCi0gICAgICAgICAgICAgICAgIHBzdWJCbG9ja0luZm8tPnBhcmNvciwKLSAgICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdLAotICAgICAgICAgICAgICAgICAmKHNwZWN0cnVtW3RDLnRuc1N0YXJ0TGluZV0pKTsKLQotICAgIH0KLSAgfQotCi0gIHJldHVybigwKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ2FsY1dlaWdodGVkU3BlY3RydW0KLSogZGVzY3JpcHRpb246IENhbGN1bGF0ZSB3ZWlnaHRlZCBzcGVjdHJ1bSBmb3IgTFBDIGNhbGN1bGF0aW9uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIENhbGNXZWlnaHRlZFNwZWN0cnVtKGNvbnN0IFdvcmQzMiAgc3BlY3RydW1bXSwgICAgICAgICAvKiE8IGlucHV0IHNwZWN0cnVtICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIHdlaWdodGVkU3BlY3RydW1bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiRW5lcmd5LCAgICAgICAgICAvKiE8IHNmYiBlbmVyZ2llcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIGxwY1N0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbHBjU3RvcExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIGxwY1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbHBjU3RvcEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnBXb3JrMzIpCi17Ci0gICAgI2RlZmluZSBJTlRfQklUU19TQ0FMIDE8PChJTlRfQklUUy8yKQotCi0gICAgV29yZDMyIGksIHNmYiwgc2hpZnQ7Ci0gICAgV29yZDMyIG1heFNoaWZ0OwotICAgIFdvcmQzMiB0bXBfcywgdG1wMl9zOwotICAgIFdvcmQzMiB0bXAsIHRtcDI7Ci0gICAgV29yZDMyIG1heFdTOwotICAgIFdvcmQzMiB0bnNTZmJNZWFuW01BWF9TRkJdOyAgICAvKiBsZW5ndGggW2xwY1N0b3BCYW5kLWxwY1N0YXJ0QmFuZF0gc2hvdWxkIGJlIHN1ZmZpY2llbnQgaGVyZSAqLwotCi0gICAgbWF4V1MgPSAwOwotCi0gICAgLyogY2FsYyAxLjAqMl4tSU5UX0JJVFMvMi9zcXJ0KGVuKSAqLwotICAgIGZvciggc2ZiID0gbHBjU3RhcnRCYW5kOyBzZmIgPCBscGNTdG9wQmFuZDsgc2ZiKyspIHsKLQotICAgICAgdG1wMiA9IHNmYkVuZXJneVtzZmJdIC0gMjsKLSAgICAgIGlmKCB0bXAyID4gMCkgewotICAgICAgICB0bXAgPSByc3FydChzZmJFbmVyZ3lbc2ZiXSwgSU5UX0JJVFMpOwotCQlpZih0bXAgPiBJTlRfQklUU19TQ0FMKQotCQl7Ci0JCQlzaGlmdCA9ICBub3JtX2wodG1wKTsKLQkJCXRtcCA9IERpdl8zMiggSU5UX0JJVFNfU0NBTCA8PCBzaGlmdCwgdG1wIDw8IHNoaWZ0ICk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl0bXAgPSAweDdmZmZmZmZmOwotCQl9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgIHRuc1NmYk1lYW5bc2ZiXSA9IHRtcDsKLSAgICB9Ci0KLSAgICAvKiBzcHJlYWQgbm9ybWFsaXplZCB2YWx1ZXMgZnJvbSBzZmJzIHRvIGxpbmVzICovCi0gICAgc2ZiID0gbHBjU3RhcnRCYW5kOwotICAgIHRtcCA9IHRuc1NmYk1lYW5bc2ZiXTsKLSAgICBmb3IgKCBpPWxwY1N0YXJ0TGluZTsgaTxscGNTdG9wTGluZTsgaSsrKXsKLSAgICAgIHRtcF9zID0gc2ZiT2Zmc2V0W3NmYiArIDFdIC0gaTsKLSAgICAgIGlmICggdG1wX3MgPT0gMCApIHsKLSAgICAgICAgc2ZiID0gc2ZiICsgMTsKLSAgICAgICAgdG1wMl9zID0gc2ZiICsgMSAtIGxwY1N0b3BCYW5kOwotICAgICAgICBpZiAodG1wMl9zIDw9IDApIHsKLSAgICAgICAgICB0bXAgPSB0bnNTZmJNZWFuW3NmYl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHBXb3JrMzJbaV0gPSB0bXA7Ci0gICAgfQotICAgIC8qZmlsdGVyIGRvd24qLwotICAgIGZvciAoaT0obHBjU3RvcExpbmUgLSAyKTsgaT49bHBjU3RhcnRMaW5lOyBpLS0pewotICAgICAgICBwV29yazMyW2ldID0gKHBXb3JrMzJbaV0gKyBwV29yazMyW2kgKyAxXSkgPj4gMTsKLSAgICB9Ci0gICAgLyogZmlsdGVyIHVwICovCi0gICAgZm9yIChpPShscGNTdGFydExpbmUgKyAxKTsgaTxscGNTdG9wTGluZTsgaSsrKXsKLSAgICAgICBwV29yazMyW2ldID0gKHBXb3JrMzJbaV0gKyBwV29yazMyW2kgLSAxXSkgPj4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZWlnaHQgYW5kIG5vcm1hbGl6ZSAqLwotICAgIGZvciAoaT1scGNTdGFydExpbmU7IGk8bHBjU3RvcExpbmU7IGkrKyl7Ci0gICAgICBwV29yazMyW2ldID0gTVVMSElHSChwV29yazMyW2ldLCBzcGVjdHJ1bVtpXSk7Ci0gICAgICBtYXhXUyB8PSBMX2FicyhwV29yazMyW2ldKTsKLSAgICB9Ci0gICAgbWF4U2hpZnQgPSBub3JtX2wobWF4V1MpOwotCi0JbWF4U2hpZnQgPSAxNiAtIG1heFNoaWZ0OwotICAgIGlmKG1heFNoaWZ0ID49IDApCi0JewotCQlmb3IgKGk9bHBjU3RhcnRMaW5lOyBpPGxwY1N0b3BMaW5lOyBpKyspewotCQkJd2VpZ2h0ZWRTcGVjdHJ1bVtpXSA9IHBXb3JrMzJbaV0gPj4gbWF4U2hpZnQ7Ci0JCX0KLSAgICB9Ci0JZWxzZQotCXsKLQkJbWF4U2hpZnQgPSAtbWF4U2hpZnQ7Ci0JCWZvciAoaT1scGNTdGFydExpbmU7IGk8bHBjU3RvcExpbmU7IGkrKyl7Ci0JCQl3ZWlnaHRlZFNwZWN0cnVtW2ldID0gc2F0dXJhdGUocFdvcmszMltpXSA8PCBtYXhTaGlmdCk7Ci0JCX0KLQl9Ci19Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDYWxjVG5zRmlsdGVyCi0qIGRlc2NyaXB0aW9uOiAgTFBDIGNhbGN1bGF0aW9uIGZvciBvbmUgVE5TIGZpbHRlcgotKiByZXR1cm5zOiAgICAgIHByZWRpY3Rpb24gZ2FpbgotKiBpbnB1dDogICAgICAgIHNpZ25hbCBzcGVjdHJ1bSwgYWNmIHdpbmRvdywgbm8uIG9mIHNwZWN0cmFsIGxpbmVzLAotKiAgICAgICAgICAgICAgICBtYXguIFROUyBvcmRlciwgcHRyLiB0byByZWZsZWN0aW9uIG9jZWZmaWNpZW50cwotKiBvdXRwdXQ6ICAgICAgIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0qKGhhbGYpIHdpbmRvdyBzaXplIG11c3QgYmUgbGFyZ2VyIHRoYW4gdG5zT3JkZXIgISEqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBXb3JkMTYgQ2FsY1Ruc0ZpbHRlcihjb25zdCBXb3JkMTYgKnNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgd2luZG93W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bU9mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRuc09yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBwYXJjb3JbXSkKLXsKLSAgV29yZDMyIHBhcmNvcldvcmtCdWZmZXJbMipUTlNfTUFYX09SREVSKzFdOwotICBXb3JkMzIgcHJlZGljdGlvbkdhaW47Ci0gIFdvcmQzMiBpOwotICBXb3JkMzIgdG5zT3JkZXJQbHVzMSA9IHRuc09yZGVyICsgMTsKLQotICBVTlVTRUQod2luZG93KTsKLQotICBhc3NlcnQodG5zT3JkZXIgPD0gVE5TX01BWF9PUkRFUik7ICAgICAgLyogcmVtb3ZlIGFzc2VydHMgbGF0ZXI/IChidGcpICovCi0KLSAgZm9yKGk9MDtpPHRuc09yZGVyO2krKykgewotICAgIHBhcmNvcltpXSA9IDA7Ci0gIH0KLQotICBBdXRvQ29ycmVsYXRpb24oc2lnbmFsLCBwYXJjb3JXb3JrQnVmZmVyLCBudW1PZkxpbmVzLCB0bnNPcmRlclBsdXMxKTsKLQotICAvKiBlYXJseSByZXR1cm4gaWYgc2lnbmFsIGlzIHZlcnkgbG93OiBzaWduYWwgcHJlZGljdGlvbiBvZmYsIHdpdGggemVybyBwYXJjb3IgY29lZmZzICovCi0gIGlmIChwYXJjb3JXb3JrQnVmZmVyWzBdID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgcHJlZGljdGlvbkdhaW4gPSBBdXRvVG9QYXJjb3IocGFyY29yV29ya0J1ZmZlciwgcGFyY29yLCB0bnNPcmRlcik7Ci0KLSAgcmV0dXJuKHByZWRpY3Rpb25HYWluKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEF1dG9Db3JyZWxhdGlvbgotKiBkZXNjcmlwdGlvbjogIGNhbGMuIGF1dG9jb3JyZWxhdGlvbiAoYWNmKQotKiByZXR1cm5zOiAgICAgIC0KLSogaW5wdXQ6ICAgICAgICBpbnB1dCB2YWx1ZXMsIG5vLiBvZiBpbnB1dCB2YWx1ZXMsIG5vLiBvZiBhY2YgdmFsdWVzCi0qIG91dHB1dDogICAgICAgYWNmIHZhbHVlcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEFSTVY1RQotdm9pZCBBdXRvQ29ycmVsYXRpb24oY29uc3QgV29yZDE2CQkgaW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgY29ycltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICBzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICBjb3JyQ29lZmYpIHsKLSAgV29yZDMyIGksIGosIGlzYW1wbGVzOwotICBXb3JkMzIgYWNjdTsKLSAgV29yZDMyIHNjZjsKLQotICBzY2YgPSAxMCAtIDE7Ci0KLSAgaXNhbXBsZXMgPSBzYW1wbGVzOwotICAvKiBjYWxjIGZpcnN0IGNvcnJDb2VmOiAgUlswXSA9IHN1bSB7IHRbaV0gKiB0W2ldIH0gOyBpID0gMC4uTi0xICovCi0gIGFjY3UgPSAwOwotICBmb3Ioaj0wOyBqPGlzYW1wbGVzOyBqKyspIHsKLSAgICBhY2N1ID0gTF9hZGQoYWNjdSwgKChpbnB1dFtqXSAqIGlucHV0W2pdKSA+PiBzY2YpKTsKLSAgfQotICBjb3JyWzBdID0gYWNjdTsKLQotICAvKiBlYXJseSB0ZXJtaW5hdGlvbiBpZiBhbGwgY29yciBjb2VmZnMgYXJlIGxpa2VseSBnb2luZyB0byBiZSB6ZXJvICovCi0gIGlmKGNvcnJbMF0gPT0gMCkgcmV0dXJuIDsKLQotICAvKiBjYWxjIGFsbCBvdGhlciBjb3JyQ29lZjogIFJbal0gPSBzdW0geyB0W2ldICogdFtpK2pdIH0gOyBpID0gMC4uKE4tai0xKSwgaj0xLi5wICovCi0gIGZvcihpPTE7IGk8Y29yckNvZWZmOyBpKyspIHsKLSAgICBpc2FtcGxlcyA9IGlzYW1wbGVzIC0gMTsKLSAgICBhY2N1ID0gMDsKLSAgICBmb3Ioaj0wOyBqPGlzYW1wbGVzOyBqKyspIHsKLSAgICAgIGFjY3UgPSBMX2FkZChhY2N1LCAoKGlucHV0W2pdICogaW5wdXRbaitpXSkgPj4gc2NmKSk7Ci0gICAgfQotICAgIGNvcnJbaV0gPSBhY2N1OwotICB9Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEF1dG9Ub1BhcmNvcgotKiBkZXNjcmlwdGlvbjogIGNvbnZlcnNpb24gYXV0b2NvcnJlbGF0aW9uIHRvIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0qIHJldHVybnM6ICAgICAgcHJlZGljdGlvbiBnYWluCi0qIGlucHV0OiAgICAgICAgPG9yZGVyKzE+IGlucHV0IHZhbHVlcywgbm8uIG9mIG91dHB1dCB2YWx1ZXMgKD1vcmRlciksCi0qICAgICAgICAgICAgICAgcHRyLiB0byB3b3JrYnVmZmVyIChyZXF1aXJlZCBzaXplOiAyKm9yZGVyKQotKiBvdXRwdXQ6ICAgICAgIDxvcmRlcj4gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBBdXRvVG9QYXJjb3IoV29yZDMyIHdvcmtCdWZmZXJbXSwgV29yZDMyIHJlZmxDb2VmZltdLCBXb3JkMTYgbnVtT2ZDb2VmZikgewotCi0gIFdvcmQzMiBpLCBqLCBzaGlmdDsKLSAgV29yZDMyICpwV29ya0J1ZmZlcjsgLyogdGVtcCBwb2ludGVyICovCi0gIFdvcmQzMiBwcmVkaWN0aW9uR2FpbiA9IDA7Ci0gIFdvcmQzMiBudW0sIGRlbm9tOwotICBXb3JkMzIgdGVtcCwgd29ya0J1ZmZlcjA7Ci0KLQotICBudW0gPSB3b3JrQnVmZmVyWzBdOwotICB0ZW1wID0gd29ya0J1ZmZlcltudW1PZkNvZWZmXTsKLQotICBmb3IoaT0wOyBpPG51bU9mQ29lZmYtMTsgaSsrKSB7Ci0gICAgd29ya0J1ZmZlcltpICsgbnVtT2ZDb2VmZl0gPSB3b3JrQnVmZmVyW2kgKyAxXTsKLSAgfQotICB3b3JrQnVmZmVyW2kgKyBudW1PZkNvZWZmXSA9IHRlbXA7Ci0KLSAgZm9yKGk9MDsgaTxudW1PZkNvZWZmOyBpKyspIHsKLSAgICBXb3JkMzIgcmVmYzsKLQotCi0gICAgaWYgKHdvcmtCdWZmZXJbMF0gPCBMX2Ficyh3b3JrQnVmZmVyW2kgKyBudW1PZkNvZWZmXSkpIHsKLSAgICAgIHJldHVybiAwIDsKLSAgICB9Ci0Jc2hpZnQgPSBub3JtX2wod29ya0J1ZmZlclswXSk7Ci0Jd29ya0J1ZmZlcjAgPSBEaXZfMzIoMSA8PCBzaGlmdCwgd29ya0J1ZmZlclswXSA8PCBzaGlmdCk7Ci0gICAgLyogY2FsY3VsYXRlIHJlZmMgPSAtd29ya0J1ZmZlcltudW1PZkNvZWZmK2ldIC8gd29ya0J1ZmZlclswXTsgLTEgPD0gcmVmYyA8IDEgKi8KLQlyZWZjID0gTF9uZWdhdGUoZml4bXVsKHdvcmtCdWZmZXJbbnVtT2ZDb2VmZiArIGldLCB3b3JrQnVmZmVyMCkpOwotCi0gICAgcmVmbENvZWZmW2ldID0gcmVmYzsKLQotICAgIHBXb3JrQnVmZmVyID0gJih3b3JrQnVmZmVyW251bU9mQ29lZmZdKTsKLQotICAgIGZvcihqPWk7IGo8bnVtT2ZDb2VmZjsgaisrKSB7Ci0gICAgICBXb3JkMzIgYWNjdTEsIGFjY3UyOwotICAgICAgYWNjdTEgPSBMX2FkZChwV29ya0J1ZmZlcltqXSwgZml4bXVsKHJlZmMsIHdvcmtCdWZmZXJbaiAtIGldKSk7Ci0gICAgICBhY2N1MiA9IExfYWRkKHdvcmtCdWZmZXJbaiAtIGldLCBmaXhtdWwocmVmYywgcFdvcmtCdWZmZXJbal0pKTsKLSAgICAgIHBXb3JrQnVmZmVyW2pdID0gYWNjdTE7Ci0gICAgICB3b3JrQnVmZmVyW2ogLSBpXSA9IGFjY3UyOwotICAgIH0KLSAgfQotCi0gIGRlbm9tID0gTVVMSElHSCh3b3JrQnVmZmVyWzBdLCBOT1JNX0NPRUYpOwotCi0gIGlmIChkZW5vbSAhPSAwKSB7Ci0gICAgV29yZDMyIHRlbXA7Ci0Jc2hpZnQgPSBub3JtX2woZGVub20pOwotCXRlbXAgPSBEaXZfMzIoMSA8PCBzaGlmdCwgZGVub20gPDwgc2hpZnQpOwotICAgIHByZWRpY3Rpb25HYWluID0gZml4bXVsKG51bSwgdGVtcCk7Ci0gIH0KLQotICByZXR1cm4gZXh0cmFjdF9sKHByZWRpY3Rpb25HYWluKTsKLX0KLQotCi0KLXN0YXRpYyBXb3JkMTYgU2VhcmNoMyhXb3JkMzIgcGFyY29yKQotewotICBXb3JkMzIgaW5kZXggPSAwOwotICBXb3JkMzIgaTsKLSAgV29yZDMyIHRlbXA7Ci0KLSAgZm9yIChpPTA7aTw4O2krKykgewotICAgIHRlbXAgPSBMX3N1YiggcGFyY29yLCB0bnNDb2VmZjNCb3JkZXJzW2ldKTsKLSAgICBpZiAodGVtcCA+IDApCi0gICAgICBpbmRleD1pOwotICB9Ci0gIHJldHVybiBleHRyYWN0X2woaW5kZXggLSA0KTsKLX0KLQotc3RhdGljIFdvcmQxNiBTZWFyY2g0KFdvcmQzMiBwYXJjb3IpCi17Ci0gIFdvcmQzMiBpbmRleCA9IDA7Ci0gIFdvcmQzMiBpOwotICBXb3JkMzIgdGVtcDsKLQotCi0gIGZvciAoaT0wO2k8MTY7aSsrKSB7Ci0gICAgdGVtcCA9IExfc3ViKHBhcmNvciwgdG5zQ29lZmY0Qm9yZGVyc1tpXSk7Ci0gICAgaWYgKHRlbXAgPiAwKQotICAgICAgaW5kZXg9aTsKLSAgfQotICByZXR1cm4gZXh0cmFjdF9sKGluZGV4IC0gOCk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb25uYW1lOiBQYXJjb3IySW5kZXgKLSogZGVzY3JpcHRpb246ICBxdWFudGl6YXRpb24gaW5kZXggZm9yIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFBhcmNvcjJJbmRleChjb25zdCBXb3JkMzIgcGFyY29yW10sICAgLyohPCBwYXJjb3IgY29lZmZpY2llbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGluZGV4W10sICAgICAgICAgIC8qITwgcXVhbnRpemVkIGNvZWZmIGluZGljZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb3JkZXIsICAgICAgICAgICAgLyohPCBmaWx0ZXIgb3JkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKSB7ICAgLyohPCBxdWFudGl6ZXIgcmVzb2x1dGlvbiAqLwotICBXb3JkMzIgaTsKLSAgV29yZDMyIHRlbXA7Ci0KLSAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKSB7Ci0gICAgdGVtcCA9IGJpdHNQZXJDb2VmZiAtIDM7Ci0gICAgaWYgKHRlbXAgPT0gMCkgewotICAgICAgaW5kZXhbaV0gPSBTZWFyY2gzKHBhcmNvcltpXSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaW5kZXhbaV0gPSBTZWFyY2g0KHBhcmNvcltpXSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbm5hbWU6IEluZGV4MlBhcmNvcgotKiBkZXNjcmlwdGlvbjogIEludmVyc2UgcXVhbnRpemF0aW9uIGZvciByZWZsZWN0aW9uIGNvZWZmaWNpZW50cwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBJbmRleDJQYXJjb3IoY29uc3QgV29yZDE2IGluZGV4W10sICAvKiE8IHF1YW50aXplZCB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgcGFyY29yW10sICAgICAgIC8qITwgcHRyLiB0byByZWZsZWN0aW9uIGNvZWZmaWNpZW50cyAob3V0cHV0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBvcmRlciwgICAgICAgICAgLyohPCBuby4gb2YgY29lZmZpY2llbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJpdHNQZXJDb2VmZikgICAvKiE8IHF1YW50aXplciByZXNvbHV0aW9uICovCi17Ci0gIFdvcmQzMiBpOwotICBXb3JkMzIgdGVtcDsKLQotICBmb3IgKGk9MDsgaTxvcmRlcjsgaSsrKSB7Ci0gICAgdGVtcCA9IGJpdHNQZXJDb2VmZiAtIDQ7Ci0gICAgaWYgKCB0ZW1wID09IDAgKSB7Ci0gICAgICAgIHBhcmNvcltpXSA9IHRuc0NvZWZmNFtpbmRleFtpXSArIDhdOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcGFyY29yW2ldID0gdG5zQ29lZmYzW2luZGV4W2ldICsgNF07Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbm5hbWU6IEZJUkxhdHRpY2UKLSogZGVzY3JpcHRpb246ICBpbiBwbGFjZSBsYXR0aWNlIGZpbHRlcmluZyBvZiBzcGVjdHJhbCBkYXRhCi0qIHJldHVybnM6CQlwb2ludGVyIHRvIG1vZGlmaWVkIGRhdGEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQzMiBGSVJMYXR0aWNlKFdvcmQxNiBvcmRlciwgICAgICAgICAgIC8qITwgZmlsdGVyIG9yZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHgsICAgICAgICAgICAgICAgLyohPCBzcGVjdHJhbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzdGF0ZV9wYXIsICAgICAgLyohPCBmaWx0ZXIgc3RhdGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpjb2VmX3BhcikgLyohPCBmaWx0ZXIgY29lZmZpY2llbnRzICovCi17Ci0gICBXb3JkMzIgaTsKLSAgIFdvcmQzMiBhY2N1LHRtcCx0bXBTYXZlOwotCi0gICB4ID0geCA+PiAxOwotICAgdG1wU2F2ZSA9IHg7Ci0KLSAgIGZvciAoaT0wOyBpPChvcmRlciAtIDEpOyBpKyspIHsKLQotICAgICB0bXAgPSBMX2FkZChmaXhtdWwoY29lZl9wYXJbaV0sIHgpLCBzdGF0ZV9wYXJbaV0pOwotICAgICB4ICAgPSBMX2FkZChmaXhtdWwoY29lZl9wYXJbaV0sIHN0YXRlX3BhcltpXSksIHgpOwotCi0gICAgIHN0YXRlX3BhcltpXSA9IHRtcFNhdmU7Ci0gICAgIHRtcFNhdmUgPSB0bXA7Ci0gIH0KLQotICAvKiBsYXN0IHN0YWdlOiBvbmx5IG5lZWQgaGFsZiBvcGVyYXRpb25zICovCi0gIGFjY3UgPSBmaXhtdWwoc3RhdGVfcGFyW29yZGVyIC0gMV0sIGNvZWZfcGFyWyhvcmRlciAtIDEpXSk7Ci0gIHN0YXRlX3Bhclsob3JkZXIgLSAxKV0gPSB0bXBTYXZlOwotCi0gIHggPSBMX2FkZChhY2N1LCB4KTsKLSAgeCA9IExfYWRkKHgsIHgpOwotCi0gIHJldHVybiB4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb25uYW1lOiBBbmFseXNpc0ZpbHRlckxhdHRpY2UKLSogZGVzY3JpcHRpb246ICBmaWx0ZXJzIHNwZWN0cmFsIGxpbmVzIHdpdGggVE5TIGZpbHRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBBbmFseXNpc0ZpbHRlckxhdHRpY2UoY29uc3QgIFdvcmQzMiBzaWduYWxbXSwgIC8qITwgaW5wdXQgc3BlY3RydW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZMaW5lcywgICAgICAgLyohPCBuby4gb2YgbGluZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgV29yZDMyIHBhckNvZWZmW10sLyohPCBQQVJDIGNvZWZmaWNpZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBvcmRlciwgICAgICAgICAgICAvKiE8IGZpbHRlciBvcmRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBvdXRwdXRbXSkgICAgICAgICAvKiE8IGZpbHRlcmVkIHNpZ25hbCB2YWx1ZXMgKi8KLXsKLQotICBXb3JkMzIgc3RhdGVfcGFyW1ROU19NQVhfT1JERVJdOwotICBXb3JkMzIgajsKLQotICBmb3IgKCBqPTA7IGo8VE5TX01BWF9PUkRFUjsgaisrICkgewotICAgIHN0YXRlX3BhcltqXSA9IDA7Ci0gIH0KLQotICBmb3Ioaj0wOyBqPG51bU9mTGluZXM7IGorKykgewotICAgIG91dHB1dFtqXSA9IEZJUkxhdHRpY2Uob3JkZXIsc2lnbmFsW2pdLHN0YXRlX3BhcixwYXJDb2VmZik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9ubmFtZTogQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcwotKiBkZXNjcmlwdGlvbjogIENoYW5nZSB0aHJlc2hvbGRzIGFjY29yZGluZyB0byB0bnMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBcHBseVRuc011bHRUYWJsZVRvUmF0aW9zKFdvcmQxNiBzdGFydENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX1NVQkJMT0NLX0lORk8gc3ViSW5mbywgLyohPCBUTlMgc3ViYmxvY2sgaW5mbyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqdGhyZXNob2xkcykgICAgICAgIC8qITwgdGhyZXNob2xkcyAobW9kaWZpZWQpICovCi17Ci0gIFdvcmQzMiBpOwotICBpZiAoc3ViSW5mby50bnNBY3RpdmUpIHsKLSAgICBmb3IoaT1zdGFydENiOyBpPHN0b3BDYjsgaSsrKSB7Ci0gICAgICAvKiB0aHJlc2hvbGRzW2ldICogMC4yNSAqLwotICAgICAgdGhyZXNob2xkc1tpXSA9ICh0aHJlc2hvbGRzW2ldID4+IDIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdHJhbnNmb3JtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlMmI5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRyYW5zZm9ybS5jCi0KLQlDb250ZW50OglNRENUIFRyYW5zZm9ybSBmdW5jdGlvbnNzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInRyYW5zZm9ybS5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotCi0jZGVmaW5lIExTX1RSQU5TICgoRlJBTUVfTEVOX0xPTkctRlJBTUVfTEVOX1NIT1JUKS8yKSAvKiA0NDggKi8KLSNkZWZpbmUgU1FSVDFfMiAweDVhODI3OTlhCS8qIHNxcnQoMS8yKSBpbiBRMzEgKi8KLSNkZWZpbmUgc3dhcDIocDAscDEpIFwKLQl0ID0gcDA7IHQxID0gKigmKHAwKSsxKTsJXAotCShwMCkgPSBwMTsgKigmKHAwKSsxKSA9ICooJihwMSkrMSk7CVwKLQkocDEpID0gdDsgKigmKHAxKSsxKSA9IHQxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogU2h1ZmZsZQotKiBkZXNjcmlwdGlvbjogIFNodWZmbGUgcG9pbnRzIHByZXBhcmVkIGZ1bmN0aW9uIGZvciBmZnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBTaHVmZmxlKGludCAqYnVmLCBpbnQgbnVtLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBiaXRUYWIpCi17Ci0gICAgaW50ICpwYXJ0MCwgKnBhcnQxOwotCWludCBpLCBqOwotCWludCB0LCB0MTsKLQotCXBhcnQwID0gYnVmOwotICAgIHBhcnQxID0gYnVmICsgbnVtOwotCi0Jd2hpbGUgKChpID0gKmJpdFRhYisrKSAhPSAwKSB7Ci0gICAgICAgIGogPSAqYml0VGFiKys7Ci0KLSAgICAgICAgc3dhcDIocGFydDBbNCppKzBdLCBwYXJ0MFs0KmorMF0pOwotICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMl0sIHBhcnQxWzQqaiswXSk7Ci0gICAgICAgIHN3YXAyKHBhcnQxWzQqaSswXSwgcGFydDBbNCpqKzJdKTsKLSAgICAgICAgc3dhcDIocGFydDFbNCppKzJdLCBwYXJ0MVs0KmorMl0pOwotICAgIH0KLQotICAgIGRvIHsKLSAgICAgICAgc3dhcDIocGFydDBbNCppKzJdLCBwYXJ0MVs0KmkrMF0pOwotICAgIH0gd2hpbGUgKChpID0gKmJpdFRhYisrKSAhPSAwKTsKLX0KLQotI2lmICFkZWZpbmVkKEFSTVY1RSkgJiYgIWRlZmluZWQoQVJNVjdOZW9uKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUmFkaXg0Rmlyc3QKLSogZGVzY3JpcHRpb246ICBSYWRpeCA0IHBvaW50IHByZXBhcmVkIGZ1bmN0aW9uIGZvciBmZnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSYWRpeDRGaXJzdChpbnQgKmJ1ZiwgaW50IG51bSkKLXsKLSAgICBpbnQgcjAsIHIxLCByMiwgcjM7Ci0JaW50IHI0LCByNSwgcjYsIHI3OwotCi0JZm9yICg7IG51bSAhPSAwOyBudW0tLSkKLQl7Ci0JCXIwID0gYnVmWzBdICsgYnVmWzJdOwotCQlyMSA9IGJ1ZlsxXSArIGJ1ZlszXTsKLQkJcjIgPSBidWZbMF0gLSBidWZbMl07Ci0JCXIzID0gYnVmWzFdIC0gYnVmWzNdOwotCQlyNCA9IGJ1Zls0XSArIGJ1Zls2XTsKLQkJcjUgPSBidWZbNV0gKyBidWZbN107Ci0JCXI2ID0gYnVmWzRdIC0gYnVmWzZdOwotCQlyNyA9IGJ1Zls1XSAtIGJ1Zls3XTsKLQotCQlidWZbMF0gPSByMCArIHI0OwotCQlidWZbMV0gPSByMSArIHI1OwotCQlidWZbNF0gPSByMCAtIHI0OwotCQlidWZbNV0gPSByMSAtIHI1OwotCQlidWZbMl0gPSByMiArIHI3OwotCQlidWZbM10gPSByMyAtIHI2OwotCQlidWZbNl0gPSByMiAtIHI3OwotCQlidWZbN10gPSByMyArIHI2OwotCi0JCWJ1ZiArPSA4OwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFJhZGl4OEZpcnN0Ci0qIGRlc2NyaXB0aW9uOiAgUmFkaXggOCBwb2ludCBwcmVwYXJlZCBmdW5jdGlvbiBmb3IgZmZ0Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmFkaXg4Rmlyc3QoaW50ICpidWYsIGludCBudW0pCi17Ci0gICBpbnQgcjAsIHIxLCByMiwgcjM7Ci0gICBpbnQgaTAsIGkxLCBpMiwgaTM7Ci0gICBpbnQgcjQsIHI1LCByNiwgcjc7Ci0gICBpbnQgaTQsIGk1LCBpNiwgaTc7Ci0gICBpbnQgdDAsIHQxLCB0MiwgdDM7Ci0KLQlmb3IgKCA7IG51bSAhPSAwOyBudW0tLSkKLQl7Ci0JCXIwID0gYnVmWzBdICsgYnVmWzJdOwotCQlpMCA9IGJ1ZlsxXSArIGJ1ZlszXTsKLQkJcjEgPSBidWZbMF0gLSBidWZbMl07Ci0JCWkxID0gYnVmWzFdIC0gYnVmWzNdOwotCQlyMiA9IGJ1Zls0XSArIGJ1Zls2XTsKLQkJaTIgPSBidWZbNV0gKyBidWZbN107Ci0JCXIzID0gYnVmWzRdIC0gYnVmWzZdOwotCQlpMyA9IGJ1Zls1XSAtIGJ1Zls3XTsKLQotCQlyNCA9IChyMCArIHIyKSA+PiAxOwotCQlpNCA9IChpMCArIGkyKSA+PiAxOwotCQlyNSA9IChyMCAtIHIyKSA+PiAxOwotCQlpNSA9IChpMCAtIGkyKSA+PiAxOwotCQlyNiA9IChyMSAtIGkzKSA+PiAxOwotCQlpNiA9IChpMSArIHIzKSA+PiAxOwotCQlyNyA9IChyMSArIGkzKSA+PiAxOwotCQlpNyA9IChpMSAtIHIzKSA+PiAxOwotCi0JCXIwID0gYnVmWyA4XSArIGJ1ZlsxMF07Ci0JCWkwID0gYnVmWyA5XSArIGJ1ZlsxMV07Ci0JCXIxID0gYnVmWyA4XSAtIGJ1ZlsxMF07Ci0JCWkxID0gYnVmWyA5XSAtIGJ1ZlsxMV07Ci0JCXIyID0gYnVmWzEyXSArIGJ1ZlsxNF07Ci0JCWkyID0gYnVmWzEzXSArIGJ1ZlsxNV07Ci0JCXIzID0gYnVmWzEyXSAtIGJ1ZlsxNF07Ci0JCWkzID0gYnVmWzEzXSAtIGJ1ZlsxNV07Ci0KLQkJdDAgPSAocjAgKyByMikgPj4gMTsKLQkJdDEgPSAoaTAgKyBpMikgPj4gMTsKLQkJdDIgPSAocjAgLSByMikgPj4gMTsKLQkJdDMgPSAoaTAgLSBpMikgPj4gMTsKLQotCQlidWZbIDBdID0gcjQgKyB0MDsKLQkJYnVmWyAxXSA9IGk0ICsgdDE7Ci0JCWJ1ZlsgOF0gPSByNCAtIHQwOwotCQlidWZbIDldID0gaTQgLSB0MTsKLQkJYnVmWyA0XSA9IHI1ICsgdDM7Ci0JCWJ1ZlsgNV0gPSBpNSAtIHQyOwotCQlidWZbMTJdID0gcjUgLSB0MzsKLQkJYnVmWzEzXSA9IGk1ICsgdDI7Ci0KLQkJcjAgPSByMSAtIGkzOwotCQlpMCA9IGkxICsgcjM7Ci0JCXIyID0gcjEgKyBpMzsKLQkJaTIgPSBpMSAtIHIzOwotCi0JCXQwID0gTVVMSElHSChTUVJUMV8yLCByMCAtIGkwKTsKLQkJdDEgPSBNVUxISUdIKFNRUlQxXzIsIHIwICsgaTApOwotCQl0MiA9IE1VTEhJR0goU1FSVDFfMiwgcjIgLSBpMik7Ci0JCXQzID0gTVVMSElHSChTUVJUMV8yLCByMiArIGkyKTsKLQotCQlidWZbIDZdID0gcjYgLSB0MDsKLQkJYnVmWyA3XSA9IGk2IC0gdDE7Ci0JCWJ1ZlsxNF0gPSByNiArIHQwOwotCQlidWZbMTVdID0gaTYgKyB0MTsKLQkJYnVmWyAyXSA9IHI3ICsgdDM7Ci0JCWJ1ZlsgM10gPSBpNyAtIHQyOwotCQlidWZbMTBdID0gcjcgLSB0MzsKLQkJYnVmWzExXSA9IGk3ICsgdDI7Ci0KLQkJYnVmICs9IDE2OwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFJhZGl4NEZGVAotKiBkZXNjcmlwdGlvbjogIFJhZGl4IDQgcG9pbnQgZmZ0IGNvcmUgZnVuY3Rpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSYWRpeDRGRlQoaW50ICpidWYsIGludCBudW0sIGludCBiZ24sIGludCAqdHdpZFRhYikKLXsKLQlpbnQgcjAsIHIxLCByMiwgcjM7Ci0JaW50IHI0LCByNSwgcjYsIHI3OwotCWludCB0MCwgdDE7Ci0JaW50IHNpbngsIGNvc3g7Ci0JaW50IGksIGosIHN0ZXA7Ci0JaW50ICp4cHRyLCAqY3NwdHI7Ci0KLQlmb3IgKG51bSA+Pj0gMjsgbnVtICE9IDA7IG51bSA+Pj0gMikKLQl7Ci0JCXN0ZXAgPSAyKmJnbjsKLQkJeHB0ciA9IGJ1ZjsKLQotICAgIAlmb3IgKGkgPSBudW07IGkgIT0gMDsgaS0tKQotCQl7Ci0JCQljc3B0ciA9IHR3aWRUYWI7Ci0KLQkJCWZvciAoaiA9IGJnbjsgaiAhPSAwOyBqLS0pCi0JCQl7Ci0JCQkJcjAgPSB4cHRyWzBdOwotCQkJCXIxID0geHB0clsxXTsKLQkJCQl4cHRyICs9IHN0ZXA7Ci0KLQkJCQl0MCA9IHhwdHJbMF07Ci0JCQkJdDEgPSB4cHRyWzFdOwotCQkJCWNvc3ggPSBjc3B0clswXTsKLQkJCQlzaW54ID0gY3NwdHJbMV07Ci0JCQkJcjIgPSBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpOwkJLyogY29zKmJyICsgc2luKmJpICovCi0JCQkJcjMgPSBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApOwkJLyogY29zKmJpIC0gc2luKmJyICovCi0JCQkJeHB0ciArPSBzdGVwOwotCi0JCQkJdDAgPSByMCA+PiAyOwotCQkJCXQxID0gcjEgPj4gMjsKLQkJCQlyMCA9IHQwIC0gcjI7Ci0JCQkJcjEgPSB0MSAtIHIzOwotCQkJCXIyID0gdDAgKyByMjsKLQkJCQlyMyA9IHQxICsgcjM7Ci0KLQkJCQl0MCA9IHhwdHJbMF07Ci0JCQkJdDEgPSB4cHRyWzFdOwotCQkJCWNvc3ggPSBjc3B0clsyXTsKLQkJCQlzaW54ID0gY3NwdHJbM107Ci0JCQkJcjQgPSBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpOwkJLyogY29zKmNyICsgc2luKmNpICovCi0JCQkJcjUgPSBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApOwkJLyogY29zKmNpIC0gc2luKmNyICovCi0JCQkJeHB0ciArPSBzdGVwOwotCi0JCQkJdDAgPSB4cHRyWzBdOwotCQkJCXQxID0geHB0clsxXTsKLQkJCQljb3N4ID0gY3NwdHJbNF07Ci0JCQkJc2lueCA9IGNzcHRyWzVdOwotCQkJCXI2ID0gTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKTsJCS8qIGNvcypjciArIHNpbipjaSAqLwotCQkJCXI3ID0gTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKTsJCS8qIGNvcypjaSAtIHNpbipjciAqLwotCQkJCWNzcHRyICs9IDY7Ci0KLQkJCQl0MCA9IHI0OwotCQkJCXQxID0gcjU7Ci0JCQkJcjQgPSB0MCArIHI2OwotCQkJCXI1ID0gcjcgLSB0MTsKLQkJCQlyNiA9IHQwIC0gcjY7Ci0JCQkJcjcgPSByNyArIHQxOwotCi0JCQkJeHB0clswXSA9IHIwICsgcjU7Ci0JCQkJeHB0clsxXSA9IHIxICsgcjY7Ci0JCQkJeHB0ciAtPSBzdGVwOwotCi0JCQkJeHB0clswXSA9IHIyIC0gcjQ7Ci0JCQkJeHB0clsxXSA9IHIzIC0gcjc7Ci0JCQkJeHB0ciAtPSBzdGVwOwotCi0JCQkJeHB0clswXSA9IHIwIC0gcjU7Ci0JCQkJeHB0clsxXSA9IHIxIC0gcjY7Ci0JCQkJeHB0ciAtPSBzdGVwOwotCi0JCQkJeHB0clswXSA9IHIyICsgcjQ7Ci0JCQkJeHB0clsxXSA9IHIzICsgcjc7Ci0JCQkJeHB0ciArPSAyOwotCQkJfQotCQkJeHB0ciArPSAzKnN0ZXA7Ci0JCX0KLQkJdHdpZFRhYiArPSAzKnN0ZXA7Ci0JCWJnbiA8PD0gMjsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUHJlTURDVAotKiBkZXNjcmlwdGlvbjogIHByZXBhcmUgTURDVCBwcm9jZXNzIGZvciBuZXh0IEZGVCBjb21wdXRlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUHJlTURDVChpbnQgKmJ1ZjAsIGludCBudW0sIGNvbnN0IGludCAqY3NwdHIpCi17Ci0JaW50IGk7Ci0JaW50IHRyMSwgdGkxLCB0cjIsIHRpMjsKLQlpbnQgY29zYSwgc2luYSwgY29zYiwgc2luYjsKLQlpbnQgKmJ1ZjE7Ci0KLQlidWYxID0gYnVmMCArIG51bSAtIDE7Ci0KLQlmb3IoaSA9IG51bSA+PiAyOyBpICE9IDA7IGktLSkKLQl7Ci0JCWNvc2EgPSAqY3NwdHIrKzsKLQkJc2luYSA9ICpjc3B0cisrOwotCQljb3NiID0gKmNzcHRyKys7Ci0JCXNpbmIgPSAqY3NwdHIrKzsKLQotCQl0cjEgPSAqKGJ1ZjAgKyAwKTsKLQkJdGkyID0gKihidWYwICsgMSk7Ci0JCXRyMiA9ICooYnVmMSAtIDEpOwotCQl0aTEgPSAqKGJ1ZjEgKyAwKTsKLQotCQkqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpOwotCQkqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0aTEpIC0gTVVMSElHSChzaW5hLCB0cjEpOwotCi0JCSpidWYxLS0gPSBNVUxISUdIKGNvc2IsIHRpMikgLSBNVUxISUdIKHNpbmIsIHRyMik7Ci0JCSpidWYxLS0gPSBNVUxISUdIKGNvc2IsIHRyMikgKyBNVUxISUdIKHNpbmIsIHRpMik7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFBvc3RNRENUCi0qIGRlc2NyaXB0aW9uOiAgIHBvc3QgTURDVCBwcm9jZXNzIGFmdGVyIG5leHQgRkZUIGZvciBNRENUCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUG9zdE1EQ1QoaW50ICpidWYwLCBpbnQgbnVtLCBjb25zdCBpbnQgKmNzcHRyKQotewotCWludCBpOwotCWludCB0cjEsIHRpMSwgdHIyLCB0aTI7Ci0JaW50IGNvc2EsIHNpbmEsIGNvc2IsIHNpbmI7Ci0JaW50ICpidWYxOwotCi0JYnVmMSA9IGJ1ZjAgKyBudW0gLSAxOwotCi0JZm9yKGkgPSBudW0gPj4gMjsgaSAhPSAwOyBpLS0pCi0JewotCQljb3NhID0gKmNzcHRyKys7Ci0JCXNpbmEgPSAqY3NwdHIrKzsKLQkJY29zYiA9ICpjc3B0cisrOwotCQlzaW5iID0gKmNzcHRyKys7Ci0KLQkJdHIxID0gKihidWYwICsgMCk7Ci0JCXRpMSA9ICooYnVmMCArIDEpOwotCQl0aTIgPSAqKGJ1ZjEgKyAwKTsKLQkJdHIyID0gKihidWYxIC0gMSk7Ci0KLQkJKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKTsKLQkJKmJ1ZjEtLSA9IE1VTEhJR0goc2luYSwgdHIxKSAtIE1VTEhJR0goY29zYSwgdGkxKTsKLQotCQkqYnVmMCsrID0gTVVMSElHSChzaW5iLCB0cjIpIC0gTVVMSElHSChjb3NiLCB0aTIpOwotCQkqYnVmMS0tID0gTVVMSElHSChjb3NiLCB0cjIpICsgTVVMSElHSChzaW5iLCB0aTIpOwotCX0KLX0KLSNlbHNlCi12b2lkIFJhZGl4NEZpcnN0KGludCAqYnVmLCBpbnQgbnVtKTsKLXZvaWQgUmFkaXg4Rmlyc3QoaW50ICpidWYsIGludCBudW0pOwotdm9pZCBSYWRpeDRGRlQoaW50ICpidWYsIGludCBudW0sIGludCBiZ24sIGludCAqdHdpZFRhYik7Ci12b2lkIFByZU1EQ1QoaW50ICpidWYwLCBpbnQgbnVtLCBjb25zdCBpbnQgKmNzcHRyKTsKLXZvaWQgUG9zdE1EQ1QoaW50ICpidWYwLCBpbnQgbnVtLCBjb25zdCBpbnQgKmNzcHRyKTsKLSNlbmRpZgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IE1kY3RfTG9uZwotKiBkZXNjcmlwdGlvbjogIHRoZSBsb25nIGJsb2NrIG1kY3QsIGluY2x1ZGUgbG9uZ19zdGFydCBibG9jaywgZW5kX2xvbmcgYmxvY2sKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE1kY3RfTG9uZyhpbnQgKmJ1ZikKLXsKLQlQcmVNRENUKGJ1ZiwgMTAyNCwgY29zc2ludGFiICsgMTI4KTsKLQotCVNodWZmbGUoYnVmLCA1MTIsIGJpdHJldlRhYiArIDE3KTsKLQlSYWRpeDhGaXJzdChidWYsIDUxMiA+PiAzKTsKLQlSYWRpeDRGRlQoYnVmLCA1MTIgPj4gMywgOCwgKGludCAqKXR3aWRUYWI1MTIpOwotCi0JUG9zdE1EQ1QoYnVmLCAxMDI0LCBjb3NzaW50YWIgKyAxMjgpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IE1kY3RfU2hvcnQKLSogZGVzY3JpcHRpb246ICB0aGUgc2hvcnQgYmxvY2sgbWRjdAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTWRjdF9TaG9ydChpbnQgKmJ1ZikKLXsKLQlQcmVNRENUKGJ1ZiwgMTI4LCBjb3NzaW50YWIpOwotCi0JU2h1ZmZsZShidWYsIDY0LCBiaXRyZXZUYWIpOwotCVJhZGl4NEZpcnN0KGJ1ZiwgNjQgPj4gMik7Ci0JUmFkaXg0RkZUKGJ1ZiwgNjQgPj4gMiwgNCwgKGludCAqKXR3aWRUYWI2NCk7Ci0KLQlQb3N0TURDVChidWYsIDEyOCwgY29zc2ludGFiKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogc2hpZnRNZGN0RGVsYXlCdWZmZXIKLSogZGVzY3JpcHRpb246ICAgIHRoZSBtZGN0IGRlbGF5IGJ1ZmZlciBoYXMgYSBzaXplIG9mIDE2MDAsCi0qICBzbyB0aGUgY2FsY3VsYXRpb24gb2YgTE9ORyxTVE9QIG11c3QgYmUgIHNwaWx0IGluIHR3bwotKiAgcGFzc2VzIHdpdGggMTAyNCBzYW1wbGVzIGFuZCBhIG1pZCBzaGlmdCwKLSogIHRoZSBTSE9SVCB0cmFuc2Zvcm1zIGNhbiBiZSBjb21wbGV0ZWQgaW4gdGhlIGRlbGF5IGJ1ZmZlciwKLSogIGFuZCBhZnRlcndhcmRzIGEgc2hpZnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzaGlmdE1kY3REZWxheUJ1ZmZlcihXb3JkMTYgKm1kY3REZWxheUJ1ZmZlciwgLyohIHN0YXJ0IG9mIG1kY3QgZGVsYXkgYnVmZmVyICovCi0JCQkJCQkJCSBXb3JkMTYgKnRpbWVTaWduYWwsICAgICAgLyohIHBvaW50ZXIgdG8gbmV3IHRpbWUgc2lnbmFsIHNhbXBsZXMsIGludGVybGVhdmVkICovCi0JCQkJCQkJCSBXb3JkMTYgY2hJbmNyZW1lbnQgICAgICAgLyohIG51bWJlciBvZiBjaGFubmVscyAqLwotCQkJCQkJCQkgKQotewotCVdvcmQzMiBpOwotCVdvcmQxNiAqc3JCdWYgPSBtZGN0RGVsYXlCdWZmZXI7Ci0JV29yZDE2ICpkc0J1ZiA9IG1kY3REZWxheUJ1ZmZlcitGUkFNRV9MRU5fTE9ORzsKLQotCWZvcihpID0gMDsgaSA8IEJMT0NLX1NXSVRDSElOR19PRkZTRVQtRlJBTUVfTEVOX0xPTkc7IGkrPSA4KQotCXsKLQkJKnNyQnVmKysgPSAqZHNCdWYrKzsJICpzckJ1ZisrID0gKmRzQnVmKys7Ci0JCSpzckJ1ZisrID0gKmRzQnVmKys7CSAqc3JCdWYrKyA9ICpkc0J1ZisrOwotCQkqc3JCdWYrKyA9ICpkc0J1ZisrOwkgKnNyQnVmKysgPSAqZHNCdWYrKzsKLQkJKnNyQnVmKysgPSAqZHNCdWYrKzsJICpzckJ1ZisrID0gKmRzQnVmKys7Ci0JfQotCi0Jc3JCdWYgPSBtZGN0RGVsYXlCdWZmZXIgKyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULUZSQU1FX0xFTl9MT05HOwotCWRzQnVmID0gdGltZVNpZ25hbDsKLQotCWZvcihpPTA7IGk8RlJBTUVfTEVOX0xPTkc7IGkrPTgpCi0JewotCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OwotCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OwotCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQl9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZQotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSBtYXggcG9zc2libGUgc2NhbGUgZmFjdG9yIGZvciBpbnB1dCB2ZWN0b3Igb2Ygc2hvcnRzCi0qIHJldHVybnM6ICAgICAgTWF4aW11bSBzY2FsZSBmYWN0b3IKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShjb25zdCBXb3JkMTYgKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLwotCQkJCQkJCQkJCQkJV29yZDE2IGxlbiwgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIGlucHV0IHZlY3RvciAqLwotCQkJCQkJCQkJCQkJV29yZDE2IHN0cmlkZSkgICAgICAgIC8qITwgU3RyaWRlIG9mIGlucHV0IHZlY3RvciAqLwotewotCVdvcmQxNiBtYXhWYWwgPSAwOwotCVdvcmQxNiBhYnNWYWw7Ci0JV29yZDE2IGk7Ci0KLQlmb3IoaT0wOyBpPGxlbjsgaSsrKXsKLQkJYWJzVmFsID0gYWJzX3ModmVjdG9yW2kqc3RyaWRlXSk7Ci0JCW1heFZhbCB8PSBhYnNWYWw7Ci0JfQotCi0JcmV0dXJuKCBtYXhWYWwgPyBub3JtX3MobWF4VmFsKSA6IDE1KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogVHJhbnNmb3JtX1JlYWwKLSogZGVzY3JpcHRpb246ICBDYWxjdWxhdGUgdHJhbnNmb3JtIGZpbHRlciBmb3IgaW5wdXQgdmVjdG9yIG9mIHNob3J0cwotKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgVHJhbnNmb3JtX1JlYWwoV29yZDE2ICptZGN0RGVsYXlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnJlYWxPdXQsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlCi0gICAgICAgICAgICAgICAgICAgICkKLXsKLQlXb3JkMzIgaSx3OwotCVdvcmQzMiB0aW1lU2lnbmFsU2FtcGxlOwotCVdvcmQzMiB3czEsd3MyOwotCVdvcmQxNiAqZGN0SW4wLCAqZGN0SW4xOwotCVdvcmQzMiAqb3V0RGF0YTAsICpvdXREYXRhMTsKLQlXb3JkMzIgKndpblB0cjsKLQotCVdvcmQzMiBkZWxheUJ1ZmZlclNmLHRpbWVTaWduYWxTZixtaW5TZjsKLQotCXN3aXRjaChibG9ja1R5cGUpewotCi0KLQljYXNlIExPTkdfV0lORE9XOgotCQkvKgotCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVCAoMTYwMCApIGRlbGF5IGJ1ZmZlciBzYW1wbGVzICsgNDQ4IG5ldyB0aW1lU2lnbmFsIHNhbXBsZXMKLQkJYW5kIGdldCB0aGUgYmlnZ2VzdCBzY2FsZSBmYWN0b3IgZm9yIG5leHQgY2FsY3VsYXRlIG1vcmUgcHJlY2lzZQotCQkqLwotCQlkZWxheUJ1ZmZlclNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcixCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULDEpOwotCQl0aW1lU2lnbmFsU2YgID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKHRpbWVTaWduYWwsMipGUkFNRV9MRU5fTE9ORy1CTE9DS19TV0lUQ0hJTkdfT0ZGU0VULGNoSW5jcmVtZW50KTsKLQkJbWluU2YgPSBtaW4oZGVsYXlCdWZmZXJTZix0aW1lU2lnbmFsU2YpOwotCQltaW5TZiA9IG1pbihtaW5TZiwxNCk7Ci0KLQkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyOwotCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7Ci0KLQkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbGFzdCBidWZmZXIqLwotCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKLQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKLQkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKLQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7Ci0JCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOwotCQkJd2luUHRyICsrOwotCQkJLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCQkqb3V0RGF0YTArKyA9ICh3czEgPj4gMikgLSAod3MyID4+IDIpOwotCQl9Ci0KLQkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOwotCi0JCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIG5ldyBidWZmZXIqLwotCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXI7Ci0JCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKLQkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDE7Ci0JCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOwotCQlmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkcvMjtpKyspewotCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4wKyspIDw8IG1pblNmOwotCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKLQkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKLQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQl3aW5QdHIrKzsKLQkJCS8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLwotCQkJKm91dERhdGEwLS0gPSAtKCh3czEgPj4gMikgKyAod3MyID4+IDIpKTsKLQkJfQotCi0JCU1kY3RfTG9uZyhyZWFsT3V0KTsKLQkJLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLwotCQltaW5TZiA9IDE0IC0gbWluU2Y7Ci0JCSptZGN0U2NhbGU9bWluU2Y7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFSVF9XSU5ET1c6Ci0JCS8qCi0JCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICgxNjAwICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyBubyB0aW1lU2lnbmFsIHNhbXBsZXMKLQkJYW5kIGdldCB0aGUgYmlnZ2VzdCBzY2FsZSBmYWN0b3IgZm9yIG5leHQgY2FsY3VsYXRlIG1vcmUgcHJlY2lzZQotCQkqLwotCQltaW5TZiA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShtZGN0RGVsYXlCdWZmZXIsQkxPQ0tfU1dJVENISU5HX09GRlNFVCwxKTsKLQkJbWluU2YgPSBtaW4obWluU2YsMTQpOwotCi0JCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOwotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yOwotCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKLQotCQkvKiBhZGQgd2luZG93cyBhbmQgcHJlIGFkZCBmb3IgbWRjdCB0byBsYXN0IGJ1ZmZlciovCi0JCWZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORy8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjArKykgPDwgbWluU2Y7Ci0JCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOwotCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4xLS0pIDw8IG1pblNmOwotCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKLQkJCXdpblB0ciArKzsKLQkJCSpvdXREYXRhMCsrID0gKHdzMSA+PiAyKSAtICh3czIgPj4gMik7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQkJfQotCi0JCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKLQotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsKLQkJZm9yKGk9MDtpPExTX1RSQU5TO2krKyl7Ci0JCQkqb3V0RGF0YTAtLSA9IC1tZGN0RGVsYXlCdWZmZXJbaV0gPDwgKDE1IC0gMiArIG1pblNmKTsKLQkJfQotCi0JCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIG5ldyBidWZmZXIqLwotCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIgKyBMU19UUkFOUzsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxIC0gTFNfVFJBTlM7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgLSAxIC1MU19UUkFOUzsKLQkJd2luUHRyID0gKGludCAqKVNob3J0V2luZG93U2luZTsKLQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9TSE9SVC8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKLQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKLQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQl3aW5QdHIrKzsKLQkJCSpvdXREYXRhMC0tID0gIC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCX0KLQotCQlNZGN0X0xvbmcocmVhbE91dCk7Ci0JCS8qIHVwZGF0ZSBzY2FsZSBmYWN0b3IgKi8KLQkJbWluU2YgPSAxNCAtIG1pblNmOwotCQkqbWRjdFNjYWxlPSBtaW5TZjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNUT1BfV0lORE9XOgotCQkvKgotCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVC1MU19UUkFOUyAoMTYwMC00NDggKSBkZWxheSBidWZmZXIgc2FtcGxlcyArIDQ0OCBuZXcgdGltZVNpZ25hbCBzYW1wbGVzCi0JCWFuZCBnZXQgdGhlIGJpZ2dlc3Qgc2NhbGUgZmFjdG9yIGZvciBuZXh0IGNhbGN1bGF0ZSBtb3JlIHByZWNpc2UKLQkJKi8KLQkJZGVsYXlCdWZmZXJTZiA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShtZGN0RGVsYXlCdWZmZXIrTFNfVFJBTlMsQkxPQ0tfU1dJVENISU5HX09GRlNFVC1MU19UUkFOUywxKTsKLQkJdGltZVNpZ25hbFNmICA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZSh0aW1lU2lnbmFsLDIqRlJBTUVfTEVOX0xPTkctQkxPQ0tfU1dJVENISU5HX09GRlNFVCxjaEluY3JlbWVudCk7Ci0JCW1pblNmID0gbWluKGRlbGF5QnVmZmVyU2YsdGltZVNpZ25hbFNmKTsKLQkJbWluU2YgPSBtaW4obWluU2YsMTMpOwotCi0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7Ci0JCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKLQkJZm9yKGk9MDtpPExTX1RSQU5TO2krKyl7Ci0JCQkqb3V0RGF0YTArKyA9IC0oKmRjdEluMS0tKSA8PCAoMTUgLSAyICsgbWluU2YpOwotCQl9Ci0KLQkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbGFzdCBidWZmZXIqLwotCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIgKyBMU19UUkFOUzsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxIC0gTFNfVFJBTlM7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgKyBMU19UUkFOUzsKLQkJd2luUHRyID0gKGludCAqKVNob3J0V2luZG93U2luZTsKLQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9TSE9SVC8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjArKykgPDwgbWluU2Y7Ci0JCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOwotCQkJdGltZVNpZ25hbFNhbXBsZT0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7Ci0JCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOwotCQkJd2luUHRyKys7Ci0JCQkqb3V0RGF0YTArKyA9ICh3czEgPj4gMikgLSAod3MyID4+IDIpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCX0KLQotCQlzaGlmdE1kY3REZWxheUJ1ZmZlcihtZGN0RGVsYXlCdWZmZXIsdGltZVNpZ25hbCxjaEluY3JlbWVudCk7Ci0KLQkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbmV3IGJ1ZmZlciovCi0JCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOwotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsKLQkJd2luUHRyID0gKGludCAqKUxvbmdXaW5kb3dLQkQ7Ci0JCWZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORy8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKLQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKigqd2luUHRyICYgMHhmZmZmKTsKLQkJCXRpbWVTaWduYWxTYW1wbGU9ICgqZGN0SW4xLS0pIDw8IG1pblNmOwotCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKLQkJCSpvdXREYXRhMC0tID0gIC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCQl3aW5QdHIrKzsKLQkJfQotCi0JCU1kY3RfTG9uZyhyZWFsT3V0KTsKLQkJbWluU2YgPSAxNCAtIG1pblNmOwotCQkqbWRjdFNjYWxlPSBtaW5TZjsgLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLwotCQlicmVhazsKLQotCWNhc2UgU0hPUlRfV0lORE9XOgotCQkvKgotCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVCAoMTYwMCApIGRlbGF5IGJ1ZmZlciBzYW1wbGVzICsgbm8gbmV3IHRpbWVTaWduYWwgc2FtcGxlcwotCQlhbmQgZ2V0IHRoZSBiaWdnZXN0IHNjYWxlIGZhY3RvciBmb3IgbmV4dCBjYWxjdWxhdGUgbW9yZSBwcmVjaXNlCi0JCSovCi0JCW1pblNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcitUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JULDkqRlJBTUVfTEVOX1NIT1JULDEpOwotCQltaW5TZiA9IG1pbihtaW5TZiwxMCk7Ci0KLQotCQlmb3Iodz0wO3c8VFJBTlNfRkFDO3crKyl7Ci0JCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIrdypGUkFNRV9MRU5fU0hPUlQrVFJBTlNGT1JNX09GRlNFVF9TSE9SVDsKLQkJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlcit3KkZSQU1FX0xFTl9TSE9SVCtUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JUICsgRlJBTUVfTEVOX1NIT1JULTE7Ci0JCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fU0hPUlQvMjsKLQkJCW91dERhdGExID0gcmVhbE91dCArIEZSQU1FX0xFTl9TSE9SVC8yIC0gMTsKLQotCQkJd2luUHRyID0gKGludCAqKVNob3J0V2luZG93U2luZTsKLQkJCWZvcihpPTA7aTxGUkFNRV9MRU5fU0hPUlQvMjtpKyspewotCQkJCXRpbWVTaWduYWxTYW1wbGU9ICpkY3RJbjAgPDwgbWluU2Y7Ci0JCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKLQkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqZGN0SW4xIDw8IG1pblNmOwotCQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7Ci0JCQkJKm91dERhdGEwKysgPSAod3MxID4+IDIpIC0gKHdzMiA+PiAyKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLwotCi0JCQkJdGltZVNpZ25hbFNhbXBsZT0gKihkY3RJbjAgKyBGUkFNRV9MRU5fU0hPUlQpIDw8IG1pblNmOwotCQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7Ci0JCQkJdGltZVNpZ25hbFNhbXBsZT0gKihkY3RJbjEgKyBGUkFNRV9MRU5fU0hPUlQpIDw8IG1pblNmOwotCQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQkJKm91dERhdGExLS0gPSAgLSgod3MxID4+IDIpICsgKHdzMiA+PiAyKSk7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQotCQkJCXdpblB0cisrOwotCQkJCWRjdEluMCsrOwotCQkJCWRjdEluMS0tOwotCQkJfQotCi0JCQlNZGN0X1Nob3J0KHJlYWxPdXQpOwotCQkJcmVhbE91dCArPSBGUkFNRV9MRU5fU0hPUlQ7Ci0JCX0KLQotCQltaW5TZiA9IDExIC0gbWluU2Y7Ci0JCSptZGN0U2NhbGUgPSBtaW5TZjsgLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLwotCi0JCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKLQkJYnJlYWs7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCmluZGV4IGQyNjZkYzIuLmI0OTNlMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKQEAgLTExNCw2ICsxMTQsOCBAQAogCiAgICAgc3JjczogWyJ0ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAppbmRleCA2ZGMyZGMxLi4xZThmZDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCkBAIC0xMjYsNiArMTI2LDggQEAKIAogICAgIHNyY3M6IFsidGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icAppbmRleCBiOTMyY2NjLi4xNGE3M2Q2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icApAQCAtNjksNiArNjksOCBAQAogCiAgICAgc3JjczogWyJ0ZXN0L2FtcndiZGVjX3Rlc3QuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKICAgICAgICAgImxpYnNuZGZpbGUiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAppbmRleCA4OTY4OTkxLi5iNmY2MzdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icApAQCAtNzYsNyArNzYsNyBAQAogCiAgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAogCi0gICAgICAgICAgICBhcm12N19hX25lb246IHsKKyAgICAgICAgICAgIG5lb246IHsKICAgICAgICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKICAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zIiwKICAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icAppbmRleCBkNTJmZWQzLi44MWIzZjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKQEAgLTQsNiArNCw4IEBACiAKICAgICBzcmNzOiBbIkFNUldCX0VfU0FNUExFLmMiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBhcmNoOiB7CiAgICAgICAgIGFybTogewogICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icAppbmRleCAxZjQzODAzLi4zNGRiMTliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCkBAIC04LDYgKzgsMTIgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRBVkNEZWMuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgIF0sCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9kZWNvZGVyIiwKICAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCmluZGV4IDY2NTA3YTcuLjUyMDMxMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKQEAgLTMzLDYgKzMzLDExIEBACiAgICAgICAgIH0sCiAgICAgfSwKIAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgXSwKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCiAgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IDdmYTc0ZDQuLmQ5YTVlZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icApAQCAtOCw2ICs4LDEyIEBACiAgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2RlYyJdLAogICAgIHNyY3M6IFsiU29mdEhFVkMuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgIF0sCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImV4dGVybmFsL2xpYmhldmMvZGVjb2RlciIsCiAgICAgICAgICJleHRlcm5hbC9saWJoZXZjL2NvbW1vbiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKaW5kZXggNjQwNzE4ZC4uYTk1YjgwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icApAQCAtMTEyLDYgKzExMiw4IEBACiAgICAgICAgICItRE9TQ0xfRVhQT1JUX1JFRj0iLAogICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKICAgICAgICAgIi1EQlhfUkMiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKaW5kZXggMjczZmEzMS4uYzU1NGE5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icApAQCAtMTI4LDYgKzEyOCw4IEBACiAgICAgICAgICJ0ZXN0L21wM3JlYWRlci5jcHAiLAogICAgIF0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJzcmMiLAogICAgICAgICAiaW5jbHVkZSIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IDE1ZmRkZTcuLjk1OTBlOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC04LDYgKzgsMTIgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAogICAgIHNyY3M6IFsiU29mdE1QRUcyLmNwcCJdLAogCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKKyAgICBdLAorCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKICAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icAppbmRleCA3NDE3NzRjLi41YTUyMjI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKQEAgLTExLDYgKzExLDggQEAKICAgICAgICAgIlNvZnRWUDlFbmNvZGVyLmNwcCIsCiAgICAgXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjMjA3NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGRlYyIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF91dGlsLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2Rfc3RyZWFtLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfdmxjLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfY2F2bGMuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX25laWdoYm91ci5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfZHBiLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfaW1hZ2UuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfY29uY2VhbC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3Z1aS5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMiLAotICAgICAgICAic291cmNlL0gyNjRTd0RlY0FwaS5jIiwKLSAgICAgICAgIlNvZnRBVkMuY3BwIiwKLSAgICBdLAotCi0gICAgYXJjaDogewotICAgICAgICBhcm06IHsKLSAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCi0KLSAgICAgICAgICAgIGFybXY3X2FfbmVvbjogewotICAgICAgICAgICAgICAgIGNmbGFnczogWwotICAgICAgICAgICAgICAgICAgICAiLURIMjY0REVDX05FT04iLAotICAgICAgICAgICAgICAgICAgICAiLURIMjY0REVDX09NWERMIiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAgICAgInNvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyIsCi0gICAgICAgICAgICAgICAgICAgICJzb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TIiwKLQotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jIiwKLQotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzb3VyY2UvYXJtX25lb25fYXNtX2djYyIsCi0KLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL2FwaSIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9hcGkiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpIiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmMiXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLX0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotLy8gdGVzdCB1dGlsaXR5OiBkZWNvZGVyCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0vLyMKLS8vIyBUZXN0IGFwcGxpY2F0aW9uCi0vLyMKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImRlY29kZXIiLAotCi0gICAgc3JjczogWyJzb3VyY2UvRGVjVGVzdEJlbmNoLmMiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGRlYyJdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTk9USUNFIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjFkMTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlNvZnRBVkMiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJTb2Z0QVZDLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtQcm9maWxlTGV2ZWxzW10gPSB7Ci0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAotfTsKLQotU29mdEFWQzo6U29mdEFWQygKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICBPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQotICAgIDogU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCgKLSAgICAgICAgICAgIG5hbWUsICJ2aWRlb19kZWNvZGVyLmF2YyIsIE9NWF9WSURFT19Db2RpbmdBVkMsCi0gICAgICAgICAgICBrUHJvZmlsZUxldmVscywgQVJSQVlfU0laRShrUHJvZmlsZUxldmVscyksCi0gICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKLSAgICAgIG1IYW5kbGUoTlVMTCksCi0gICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKLSAgICAgIG1GaXJzdFBpY3R1cmUoTlVMTCksCi0gICAgICBtRmlyc3RQaWN0dXJlSWQoLTEpLAotICAgICAgbVBpY0lkKDApLAotICAgICAgbUhlYWRlcnNEZWNvZGVkKGZhbHNlKSwKLSAgICAgIG1FT1NTdGF0dXMoSU5QVVRfREFUQV9BVkFJTEFCTEUpLAotICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSB7Ci0gICAgY29uc3Qgc2l6ZV90IGtNaW5Db21wcmVzc2lvblJhdGlvID0gMjsKLSAgICBjb25zdCBzaXplX3Qga01heE91dHB1dEJ1ZmZlclNpemUgPSAyMDQ4ICogMjA0OCAqIDMgLyAyOwotICAgIGluaXRQb3J0cygKLSAgICAgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMsIGtNYXhPdXRwdXRCdWZmZXJTaXplIC8ga01pbkNvbXByZXNzaW9uUmF0aW8gLyogbWluSW5wdXRCdWZmZXJTaXplICovLAotICAgICAgICAgICAga051bU91dHB1dEJ1ZmZlcnMsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywga01pbkNvbXByZXNzaW9uUmF0aW8pOwotCi0gICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKLX0KLQotU29mdEFWQzo6flNvZnRBVkMoKSB7Ci0gICAgSDI2NFN3RGVjUmVsZWFzZShtSGFuZGxlKTsKLSAgICBtSGFuZGxlID0gTlVMTDsKLQotICAgIHdoaWxlIChtUGljVG9IZWFkZXJNYXAuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC5lZGl0VmFsdWVBdCgwKTsKLSAgICAgICAgbVBpY1RvSGVhZGVyTWFwLnJlbW92ZUl0ZW1zQXQoMCk7Ci0gICAgICAgIGRlbGV0ZSBoZWFkZXI7Ci0gICAgICAgIGhlYWRlciA9IE5VTEw7Ci0gICAgfQotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7Ci0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtJbnB1dFBvcnRJbmRleCk7Ci0gICAgQ0hFQ0sob3V0UXVldWUuZW1wdHkoKSk7Ci0gICAgQ0hFQ0soaW5RdWV1ZS5lbXB0eSgpKTsKLQotICAgIGRlbGV0ZVtdIG1GaXJzdFBpY3R1cmU7Ci19Ci0KLXN0YXR1c190IFNvZnRBVkM6OmluaXREZWNvZGVyKCkgewotICAgIC8vIEZvcmNlIGRlY29kZXIgdG8gb3V0cHV0IGJ1ZmZlcnMgaW4gZGlzcGxheSBvcmRlci4KLSAgICBpZiAoSDI2NFN3RGVjSW5pdCgmbUhhbmRsZSwgMCkgPT0gSDI2NFNXREVDX09LKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci19Ci0KLXZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewotICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUVPU1N0YXR1cyA9PSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOwotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7Ci0KLSAgICBpZiAobUhlYWRlcnNEZWNvZGVkKSB7Ci0gICAgICAgIC8vIERlcXVldWUgYW55IGFscmVhZHkgZGVjb2RlZCBvdXRwdXQgZnJhbWVzIHRvIGZyZWUgdXAgc3BhY2UKLSAgICAgICAgLy8gaW4gdGhlIG91dHB1dCBxdWV1ZS4KLQotICAgICAgICBkcmFpbkFsbE91dHB1dEJ1ZmZlcnMoZmFsc2UgLyogZW9zICovKTsKLSAgICB9Ci0KLSAgICBIMjY0U3dEZWNSZXQgcmV0ID0gSDI2NFNXREVDX1BJQ19SRFk7Ci0gICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7Ci0gICAgd2hpbGUgKChtRU9TU3RhdHVzICE9IElOUFVUX0RBVEFfQVZBSUxBQkxFIHx8ICFpblF1ZXVlLmVtcHR5KCkpCi0gICAgICAgICAgICAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKLQotICAgICAgICBpZiAobUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTikgewotICAgICAgICAgICAgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKHRydWUgLyogZW9zICovKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKLSAgICAgICAgKyttUGljSWQ7Ci0KLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG5ldyBPTVhfQlVGRkVSSEVBREVSVFlQRTsKLSAgICAgICAgbWVtc2V0KGhlYWRlciwgMCwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7Ci0gICAgICAgIGhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotICAgICAgICBoZWFkZXItPm5GbGFncyA9IGluSGVhZGVyLT5uRmxhZ3M7Ci0gICAgICAgIGlmIChoZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOwotICAgICAgICB9Ci0gICAgICAgIG1QaWNUb0hlYWRlck1hcC5hZGQobVBpY0lkLCBoZWFkZXIpOwotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0KLSAgICAgICAgSDI2NFN3RGVjSW5wdXQgaW5QaWN0dXJlOwotICAgICAgICBIMjY0U3dEZWNPdXRwdXQgb3V0UGljdHVyZTsKLSAgICAgICAgbWVtc2V0KCZpblBpY3R1cmUsIDAsIHNpemVvZihpblBpY3R1cmUpKTsKLSAgICAgICAgaW5QaWN0dXJlLmRhdGFMZW4gPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKLSAgICAgICAgaW5QaWN0dXJlLnBTdHJlYW0gPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICBpblBpY3R1cmUucGljSWQgPSBtUGljSWQ7Ci0gICAgICAgIGluUGljdHVyZS5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMTsKLSAgICAgICAgSDI2NFN3RGVjUGljdHVyZSBkZWNvZGVkUGljdHVyZTsKLQotICAgICAgICB3aGlsZSAoaW5QaWN0dXJlLmRhdGFMZW4gPiAwKSB7Ci0gICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNEZWNvZGUobUhhbmRsZSwgJmluUGljdHVyZSwgJm91dFBpY3R1cmUpOwotICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkgfHwKLSAgICAgICAgICAgICAgICByZXQgPT0gSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiAtPSAodTMyKShvdXRQaWN0dXJlLnBTdHJtQ3VyclBvcyAtIGluUGljdHVyZS5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpblBpY3R1cmUucFN0cmVhbSA9IG91dFBpY3R1cmUucFN0cm1DdXJyUG9zOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1IZWFkZXJzRGVjb2RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY0luZm8gZGVjb2RlckluZm87Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKEgyNjRTd0RlY0dldEluZm8obUhhbmRsZSwgJmRlY29kZXJJbmZvKSA9PSBIMjY0U1dERUNfT0spOwotCi0gICAgICAgICAgICAgICAgICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OkNyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDcm9wUGFyYW1zKGRlY29kZXJJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0V2lsbFJlc2V0LCBkZWNvZGVySW5mby5waWNXaWR0aCwgZGVjb2RlckluZm8ucGljSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BTZXR0aW5nc01vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEgyNjRTd0RlY05leHRQaWN0dXJlKG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgID09IEgyNjRTV0RFQ19QSUNfUkRZKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhpcyBvdXRwdXQgYnVmZmVyOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvc3QgZHVyaW5nIGR5bmFtaWMgcG9ydCByZWNvbmZpZ3VyYXRpb24gYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3Blbk1BWCBjbGllbnQgd2lsbCBkZWxldGUgX2FsbF8gb3V0cHV0IGJ1ZmZlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBwcm9jZXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUZpcnN0T3V0cHV0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRQaWN0dXJlLnBpY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopZGVjb2RlZFBpY3R1cmUucE91dHB1dFBpY3R1cmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluUGljdHVyZS5kYXRhTGVuID0gMDsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBmYWlsZWQ6ICVkIiwgcmV0KTsKLQotICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk9SX01BTEZPUk1FRCwgTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLQotICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1GaXJzdFBpY3R1cmUgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmICghZHJhaW5PbmVPdXRwdXRCdWZmZXIobUZpcnN0UGljdHVyZUlkLCBtRmlyc3RQaWN0dXJlKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJEcmFpbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGVbXSBtRmlyc3RQaWN0dXJlOwotICAgICAgICAgICAgbUZpcnN0UGljdHVyZSA9IE5VTEw7Ci0gICAgICAgICAgICBtRmlyc3RQaWN0dXJlSWQgPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYWluQWxsT3V0cHV0QnVmZmVycyhmYWxzZSAvKiBlb3MgKi8pOwotICAgIH0KLX0KLQotU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Q3JvcFNldHRpbmdzTW9kZSBTb2Z0QVZDOjpoYW5kbGVDcm9wUGFyYW1zKAotICAgICAgICBjb25zdCBIMjY0U3dEZWNJbmZvJiBkZWNJbmZvKSB7Ci0gICAgaWYgKCFkZWNJbmZvLmNyb3BwaW5nRmxhZykgewotICAgICAgICByZXR1cm4ga0Nyb3BVblNldDsKLSAgICB9Ci0KLSAgICBjb25zdCBDcm9wUGFyYW1zJiBjcm9wID0gZGVjSW5mby5jcm9wUGFyYW1zOwotICAgIGlmIChtQ3JvcExlZnQgPT0gY3JvcC5jcm9wTGVmdE9mZnNldCAmJgotICAgICAgICBtQ3JvcFRvcCA9PSBjcm9wLmNyb3BUb3BPZmZzZXQgJiYKLSAgICAgICAgbUNyb3BXaWR0aCA9PSBjcm9wLmNyb3BPdXRXaWR0aCAmJgotICAgICAgICBtQ3JvcEhlaWdodCA9PSBjcm9wLmNyb3BPdXRIZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIGtDcm9wU2V0OwotICAgIH0KLQotICAgIG1Dcm9wTGVmdCA9IGNyb3AuY3JvcExlZnRPZmZzZXQ7Ci0gICAgbUNyb3BUb3AgPSBjcm9wLmNyb3BUb3BPZmZzZXQ7Ci0gICAgbUNyb3BXaWR0aCA9IGNyb3AuY3JvcE91dFdpZHRoOwotICAgIG1Dcm9wSGVpZ2h0ID0gY3JvcC5jcm9wT3V0SGVpZ2h0OwotICAgIHJldHVybiBrQ3JvcENoYW5nZWQ7Ci19Ci0KLXZvaWQgU29mdEFWQzo6c2F2ZUZpcnN0T3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QgKmRhdGEpIHsKLSAgICBDSEVDSyhtRmlyc3RQaWN0dXJlID09IE5VTEwpOwotICAgIG1GaXJzdFBpY3R1cmVJZCA9IHBpY0lkOwotCi0gICAgdWludDMyX3QgcGljdHVyZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7Ci0gICAgbUZpcnN0UGljdHVyZSA9IG5ldyB1aW50OF90W3BpY3R1cmVTaXplXTsKLSAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgcGljdHVyZVNpemUpOwotfQotCi1ib29sIFNvZnRBVkM6OmRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QqIGRhdGEpIHsKLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOwotICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLSAgICBPTVhfVTMyIGZyYW1lU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKLSAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQgPCBmcmFtZVNpemUpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBtUGljVG9IZWFkZXJNYXAudmFsdWVGb3IocGljSWQpOwotICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGhlYWRlci0+blRpbWVTdGFtcDsKLSAgICBvdXRIZWFkZXItPm5GbGFncyA9IGhlYWRlci0+bkZsYWdzOwotICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IGZyYW1lU2l6ZTsKLQotICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldDsKLSAgICBjb25zdCB1aW50OF90ICpzcmNZID0gZGF0YTsKLSAgICBjb25zdCB1aW50OF90ICpzcmNVID0gc3JjWSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgY29uc3QgdWludDhfdCAqc3JjViA9IHNyY1UgKyBtV2lkdGggKiBtSGVpZ2h0IC8gNDsKLSAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1XaWR0aDsKLSAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IG1XaWR0aCAvIDI7Ci0gICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBzcmNVU3RyaWRlOwotICAgIGNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUpOwotCi0gICAgbVBpY1RvSGVhZGVyTWFwLnJlbW92ZUl0ZW0ocGljSWQpOwotICAgIGRlbGV0ZSBoZWFkZXI7Ci0gICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU29mdEFWQzo6ZHJhaW5BbGxPdXRwdXRCdWZmZXJzKGJvb2wgZW9zKSB7Ci0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKLSAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY29kZWRQaWN0dXJlOwotCi0gICAgaWYgKG1IZWFkZXJzRGVjb2RlZCkgewotICAgICAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkKLSAgICAgICAgICAgICAgICAmJiBIMjY0U1dERUNfUElDX1JEWSA9PSBIMjY0U3dEZWNOZXh0UGljdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgJmRlY29kZWRQaWN0dXJlLCBlb3MgLyogZmx1c2ggKi8pKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHBpY0lkID0gZGVjb2RlZFBpY3R1cmUucGljSWQ7Ci0gICAgICAgICAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKikgZGVjb2RlZFBpY3R1cmUucE91dHB1dFBpY3R1cmU7Ci0gICAgICAgICAgICBpZiAoIWRyYWluT25lT3V0cHV0QnVmZmVyKHBpY0lkLCBkYXRhKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJEcmFpbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWVvcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7Ci0gICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwotCi0gICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLQotICAgICAgICBtRU9TU3RhdHVzID0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEOwotICAgIH0KLX0KLQotdm9pZCBTb2Z0QVZDOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewotICAgIGlmIChwb3J0SW5kZXggPT0ga0lucHV0UG9ydEluZGV4KSB7Ci0gICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9EQVRBX0FWQUlMQUJMRTsKLSAgICB9Ci19Ci0KLXZvaWQgU29mdEFWQzo6b25SZXNldCgpIHsKLSAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCk7Ci0gICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLWFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewotICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkOTg4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU09GVF9BVkNfSF8KLQotI2RlZmluZSBTT0ZUX0FWQ19IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotCi0jaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU29mdEFWQyA6IHB1YmxpYyBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IHsKLSAgICBTb2Z0QVZDKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCi0gICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5Tb2Z0QVZDKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7Ci0gICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKLSAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrTnVtSW5wdXRCdWZmZXJzICA9IDgsCi0gICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzID0gMiwKLSAgICB9OwotCi0gICAgZW51bSBFT1NTdGF0dXMgewotICAgICAgICBJTlBVVF9EQVRBX0FWQUlMQUJMRSwKLSAgICAgICAgSU5QVVRfRU9TX1NFRU4sCi0gICAgICAgIE9VVFBVVF9GUkFNRVNfRkxVU0hFRCwKLSAgICB9OwotCi0gICAgdm9pZCAqbUhhbmRsZTsKLQotICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKLQotICAgIHVpbnQ4X3QgKm1GaXJzdFBpY3R1cmU7Ci0gICAgaW50MzJfdCBtRmlyc3RQaWN0dXJlSWQ7Ci0KLSAgICBpbnQzMl90IG1QaWNJZDsgIC8vIFdoaWNoIG91dHB1dCBwaWN0dXJlIGlzIGZvciB3aGljaCBpbnB1dCBidWZmZXI/Ci0KLSAgICAvLyBPTVhfQlVGRkVSSEVBREVSVFlQRSBtYXkgYmUgb3ZlcmtpbGwsIGJ1dCBpdCBpcyBjb252ZW5pZW50Ci0gICAgLy8gZm9yIHRyYWNraW5nIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBuRmxhZ3MsIG5UaW1lU3RhbXAsIGV0Yy4KLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqPiBtUGljVG9IZWFkZXJNYXA7Ci0gICAgYm9vbCBtSGVhZGVyc0RlY29kZWQ7Ci0KLSAgICBFT1NTdGF0dXMgbUVPU1N0YXR1czsKLQotICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwotCi0gICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKLSAgICB2b2lkIGRyYWluQWxsT3V0cHV0QnVmZmVycyhib29sIGVvcyk7Ci0gICAgYm9vbCBkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKTsKLSAgICB2b2lkIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpZElkLCB1aW50OF90ICpkYXRhKTsKLSAgICBDcm9wU2V0dGluZ3NNb2RlIGhhbmRsZUNyb3BQYXJhbXMoY29uc3QgSDI2NFN3RGVjSW5mbyYgZGVjSW5mbyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QVZDKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU09GVF9BVkNfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvSDI2NFN3RGVjQXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTRlNzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIEhlYWRlcnMKLQotICAgIDIuIEVudW1lcmF0aW9ucyB1c2VkIGFzIGEgcmV0dXJuIHZhbHVlIG9yIGEgcGFyYW1ldGVyLgotICAgICAgICAyLjEuIEFQSSdzIHJldHVybiB2YWx1ZSBlbnVtZXJhdGlvbnMuCi0KLSAgICAzLiBVc2VyIFN0cnVjdHVyZXMKLSAgICAgICAgMy4xLiBTdHJ1Y3R1cmVzIGZvciBIMjY0U3dEZWNEZWNvZGUoKSBwYXJhbWV0ZXJzLgotICAgICAgICAzLjIuIFN0cnVjdHVyZXMgZm9yIGluZm9ybWF0aW9uIGludGVyY2hhbmdlIHdpdGgKLSAgICAgICAgICAgICBERUMgQVBJIGFuZCB1c2VyIGFwcGxpY2F0aW9uLgotCi0gICAgNC4gUHJvdG90eXBlcyBvZiBEZWNvZGVyIEFQSSBmdW5jdGlvbnMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNBUElfSAotI2RlZmluZSBIMjY0U1dERUNBUElfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgSGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgICNpbmNsdWRlICJiYXNldHlwZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuMS4gQVBJJ3MgcmV0dXJuIHZhbHVlIGVudW1lcmF0aW9ucy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB0eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgICAgIEgyNjRTV0RFQ19PSyA9IDAsCi0gICAgICAgIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRCA9IDEsCi0gICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZLAotICAgICAgICBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSwKLSAgICAgICAgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZLAotICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSID0gLTEsCi0gICAgICAgIEgyNjRTV0RFQ19TVFJNX0VSUiA9IC0yLAotICAgICAgICBIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEID0gLTMsCi0gICAgICAgIEgyNjRTV0RFQ19NRU1GQUlMID0gLTQsCi0gICAgICAgIEgyNjRTV0RFQ19JTklURkFJTCA9IC01LAotICAgICAgICBIMjY0U1dERUNfSERSU19OT1RfUkRZID0gLTYsCi0gICAgICAgIEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEID0gLTcKLSAgICB9IEgyNjRTd0RlY1JldDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLjEuIFN0cnVjdHVyZXMgZm9yIEgyNjRTd0RlY0RlY29kZSgpIHBhcmFtZXRlcnMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgLyogdHlwZWRlZiBvZiB0aGUgRGVjb2RlciBpbnN0YW5jZSAqLwotICAgIHR5cGVkZWYgdm9pZCAqSDI2NFN3RGVjSW5zdDsKLQotICAgIC8qIElucHV0IHN0cnVjdHVyZSAqLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1OCAgKnBTdHJlYW07ICAgICAgICAgICAgLyogUG9pbnRlciB0byBzdHJlYW0gdG8gYmUgZGVjb2RlZCAgICAgICAgICAqLwotICAgICAgICB1MzIgIGRhdGFMZW47ICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGRlY29kZWQgICAgICAgICAgICAqLwotICAgICAgICB1MzIgIHBpY0lkOyAgICAgICAgICAgICAgLyogSWRlbnRpZmllciBmb3IgdGhlIHBpY3R1cmUgdG8gYmUgZGVjb2RlZCAqLwotICAgICAgICB1MzIgaW50cmFDb25jZWFsbWVudE1ldGhvZDsgLyogMCA9IEdyYXkgY29uY2VhbG1lbnQgZm9yIGludHJhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gUmVmZXJlbmNlIGNvbmNlYWxtZW50IGZvciBpbnRyYSAqLwotCi0gICAgfSBIMjY0U3dEZWNJbnB1dDsKLQotCi0gICAgLyogT3V0cHV0IHN0cnVjdHVyZSAqLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1OCAgKnBTdHJtQ3VyclBvczsgICAgICAvKiBQb2ludGVyIHRvIHN0cmVhbSBwb3NpdGlvbiB3aGVyZSBkZWNvZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGVkIHVwICovCi0gICAgfSBIMjY0U3dEZWNPdXRwdXQ7Ci0KLSAgICAvKiBPdXRwdXQgc3RydWN0dXJlIGZvciBIMjY0U3dEZWNOZXh0UGljdHVyZSAqLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1MzIgKnBPdXRwdXRQaWN0dXJlOyAgICAvKiBQb2ludGVyIHRvIHRoZSBwaWN0dXJlLCBZVVYgZm9ybWF0ICAgICAgICovCi0gICAgICAgIHUzMiBwaWNJZDsgICAgICAgICAgICAgIC8qIElkZW50aWZpZXIgb2YgdGhlIHBpY3R1cmUgdG8gYmUgZGlzcGxheWVkKi8KLSAgICAgICAgdTMyIGlzSWRyUGljdHVyZTsgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgcGljdHVyZSBpcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFIgcGljdHVyZSAqLwotICAgICAgICB1MzIgbmJyT2ZFcnJNQnM7ICAgICAgICAvKiBOdW1iZXIgb2YgY29uY2VhbGVkIE1CJ3MgaW4gdGhlIHBpY3R1cmUgICovCi0gICAgfSBIMjY0U3dEZWNQaWN0dXJlOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuMi4gU3RydWN0dXJlcyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2Ugd2l0aCBERUMgQVBJCi0gICAgICAgICBhbmQgdXNlciBhcHBsaWNhdGlvbi4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTMyIGNyb3BMZWZ0T2Zmc2V0OwotICAgICAgICB1MzIgY3JvcE91dFdpZHRoOwotICAgICAgICB1MzIgY3JvcFRvcE9mZnNldDsKLSAgICAgICAgdTMyIGNyb3BPdXRIZWlnaHQ7Ci0gICAgfSBDcm9wUGFyYW1zOwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHUzMiBwcm9maWxlOwotICAgICAgICB1MzIgcGljV2lkdGg7Ci0gICAgICAgIHUzMiBwaWNIZWlnaHQ7Ci0gICAgICAgIHUzMiB2aWRlb1JhbmdlOwotICAgICAgICB1MzIgbWF0cml4Q29lZmZpY2llbnRzOwotICAgICAgICB1MzIgcGFyV2lkdGg7Ci0gICAgICAgIHUzMiBwYXJIZWlnaHQ7Ci0gICAgICAgIHUzMiBjcm9wcGluZ0ZsYWc7Ci0gICAgICAgIENyb3BQYXJhbXMgY3JvcFBhcmFtczsKLSAgICB9IEgyNjRTd0RlY0luZm87Ci0KLSAgICAvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHUzMiBtYWpvcjsgICAgLyogRGVjb2RlciBBUEkgbWFqb3IgdmVyc2lvbiAqLwotICAgICAgICB1MzIgbWlub3I7ICAgIC8qIERuY29kZXIgQVBJIG1pbm9yIHZlcnNpb24gKi8KLSAgICB9IEgyNjRTd0RlY0FwaVZlcnNpb247Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gUHJvdG90eXBlcyBvZiBEZWNvZGVyIEFQSSBmdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjRGVjb2RlKEgyNjRTd0RlY0luc3QgICAgICBkZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5wdXQgICAgICpwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNPdXRwdXQgICAgKnBPdXRwdXQpOwotCi0gICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0luaXQoSDI2NFN3RGVjSW5zdCAqZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcpOwotCi0gICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY05leHRQaWN0dXJlKEgyNjRTd0RlY0luc3QgICAgIGRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY1BpY3R1cmUgKnBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAgICAgICAgICAgICAgIGVuZE9mU3RyZWFtKTsKLQotICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNHZXRJbmZvKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbmZvICpwRGVjSW5mbyk7Ci0KLSAgICB2b2lkICBIMjY0U3dEZWNSZWxlYXNlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCk7Ci0KLSAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIEgyNjRTd0RlY0dldEFQSVZlcnNpb24odm9pZCk7Ci0KLSAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIEFQSSB0cmFjZSAqLwotICAgIHZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqKTsKLQotICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKi8KLSAgICB2b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pOwotCi0gICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBtZW1vcnkgZnJlZSAqLwotICAgIHZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpOwotCi0gICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBtZW1vcnkgY29weSAqLwotICAgIHZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KTsKLQotICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtc2V0ICovCi0gICAgdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEgyNjRTV0RFQ0FQSV9IICovCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZDU2NTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2lmbmRlZiBCQVNFVFlQRV9IX0lOQ0xVREVECi0jZGVmaW5lIEJBU0VUWVBFX0hfSU5DTFVERUQKLQotCi0jaWZkZWYgX19hcm0KLSNkZWZpbmUgVk9MQVRJTEUgdm9sYXRpbGUKLSNlbHNlCi0jZGVmaW5lIFZPTEFUSUxFCi0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdTg7Ci10eXBlZGVmIHNpZ25lZCBjaGFyICAgICBpODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHUxNjsKLXR5cGVkZWYgc2lnbmVkIHNob3J0ICAgIGkxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHUzMjsKLXR5cGVkZWYgc2lnbmVkIGludCAgICAgIGkzMjsKLQotI2lmIGRlZmluZWQoVkMxU1dERUNfMTZCSVQpIHx8IGRlZmluZWQoTVA0RU5DX0FSTTExKQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdTE2eDsKLXR5cGVkZWYgc2lnbmVkIHNob3J0ICAgIGkxNng7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdTE2eDsKLXR5cGVkZWYgc2lnbmVkIGludCAgICAgIGkxNng7Ci0jZW5kaWYKLQotCi0jaWZuZGVmIE5VTEwKLSNpZmRlZiAgX19jcGx1c3BsdXMKLSNkZWZpbmUgTlVMTCAwCi0jZWxzZQotI2RlZmluZSBOVUxMICgodm9pZCAqKTApCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYgIC8qIEJBU0VUWVBFX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZTcwY2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1UaGUgY29udGVudHMgb2YgdGhpcyB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCBieSBIZWRsZXkgRnJhbmNpcwotb2YgQVJNIG9uIDE5LUZlYi0yMDA4LgotCi1JdCBjb250YWlucyB0aGUgQVJNIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGJlbG93LgotCi1UaGlzIGRhdGEsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBpcyBBUk0gUHJvcHJpZXRhcnkgYW5kIGFjY2VzcyB0byBpdAotaXMgc3ViamVjdCB0byB0aGUgYWdyZWVtZW50cyBpbmRpY2F0ZWQgYmVsb3cuCi0KLUlmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhpcyBkYXRhLCBwbGVhc2UgY29udGFjdCBBUk0gc3VwcG9ydAotcXVvdGluZyB0cmFuc2FjdGlvbiByZWZlcmVuY2UgPDk3NDEzPi4KLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi0tIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxCi0gIFZpZGVvIGNvZGVjcyAtIG9wdGltaXNlZCBjb2RlCi0gIFY2IG9wdGltaXplZCBjb2RlIHJlbGVhc2UgZm9yIEhhbnRybyAoVmVyIDEuMC4yKQotICBpbnRlcm5hbCBhY2Nlc3MKLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi1UaGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zIGRlbGl2ZXJhYmxlcyB3aGljaCBhcmUgZGVzaWduYXRlZCBhcyBiZWluZyBvZgotYmV0YSByZWxlYXNlIHN0YXR1cyAoQkVUKS4KLQotQmV0YSByZWxlYXNlIHN0YXR1cyBoYXMgYSBwYXJ0aWN1bGFyIG1lYW5pbmcgdG8gQVJNIG9mIHdoaWNoIHRoZSByZWNpcGllbnQKLW11c3QgYmUgYXdhcmUuIEJldGEgaXMgYSBwcmUtcmVsZWFzZSBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWxpdmVyYWJsZQotc28gZGVzY3JpYmVkIGlzIGJlbGlldmVkIHRvIHJvYnVzdGx5IGRlbW9uc3RyYXRlIHNwZWNpZmllZCBiZWhhdmlvdXIsIHRvIGJlCi1jb25zaXN0ZW50IGFjcm9zcyBpdHMgaW5jbHVkZWQgYXNwZWN0cyBhbmQgYmUgcmVhZHkgZm9yIGdlbmVyYWwgZGVwbG95bWVudC4KLUJ1dCBCZXRhIGFsc28gaW5kaWNhdGVzIHRoYXQgcHJlLXJlbGVhc2UgcmVsaWFiaWxpdHkgdHJpYWxzIGFyZSBvbmdvaW5nIGFuZAotdGhhdCBpdCBpcyBwb3NzaWJsZSByZXNpZHVhbCBkZWZlY3RzIG9yIGVycm9ycyBpbiBvcGVyYXRpb24sIGNvbnNpc3RlbmN5Ci1hbmQgZG9jdW1lbnRhdGlvbiBtYXkgc3RpbGwgYmUgZW5jb3VudGVyZWQuIFRoZSByZWNpcGllbnQgc2hvdWxkIGNvbnNpZGVyCi10aGlzIHBvc2l0aW9uIHdoZW4gdXNpbmcgdGhpcyBCZXRhIG1hdGVyaWFsIHN1cHBsaWVkLiBBUk0gd2lsbCBub3JtYWxseQotYXR0ZW1wdCB0byBwcm92aWRlIGZpeGVzIG9yIGEgd29yay1hcm91bmQgZm9yIGRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUKLXJlY2lwaWVudCwgYnV0IHRoZSBwcm92aXNpb24gb3IgdGltZWxpbmVzcyBvZiB0aGlzIHN1cHBvcnQgY2Fubm90IGJlCi1ndWFyYW50ZWVkLiBBUk0gc2hhbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvciBkaXJlY3Qgb3IgY29uc2VxdWVudGlhbAotZGFtYWdlcyBhcyBhIHJlc3VsdCBvZiBlbmNvdW50ZXJpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVzaWR1YWwgZGVmZWN0cy4KLUJ5IGFjY2VwdGluZyBhIEJldGEgcmVsZWFzZSwgdGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gdGhlc2UgY29uc3RyYWludHMgYW5kCi10byBwcm92aWRpbmcgcmVhc29uYWJsZSBpbmZvcm1hdGlvbiB0byBBUk0gdG8gZW5hYmxlIHRoZSByZXBsaWNhdGlvbiBvZiB0aGUKLWRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUgcmVjaXBpZW50LiBUaGUgc3BlY2lmaWMgQmV0YSB2ZXJzaW9uIHN1cHBsaWVkCi13aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYWZ0ZXIgcmVsZWFzZSBvZiBhIGxhdGVyIG9yIGhpZ2hlciBzdGF0dXMgdmVyc2lvbi4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IFN1cHBvcnQgZm9yIHRoZSBCZXRhIHJlbGVhc2Ugb2YgdGhlIGRlbGl2ZXJhYmxlCi13aWxsIG9ubHkgYmUgcHJvdmlkZWQgYnkgQVJNIHRvIGEgcmVjaXBpZW50IHdobyBoYXMgYSBjdXJyZW50IHN1cHBvcnQgYW5kCi1tYWludGVuYW5jZSBjb250cmFjdCBmb3IgdGhlIGRlbGl2ZXJhYmxlLgotCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotSW4gYWRkaXRpb24gdG8gdGhlIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGFib3ZlLCB0aGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zCi10d28gYWRkaXRpb25hbCBmaWxlcyBhdCB0aGUgdG9wIGxldmVsLgotCi1UaGUgZmlyc3QgaXMgdGhpcyBmaWxlLCBBUk1fREVMSVZFUllfOTc0MTMuVFhULCB3aGljaCBpcyB0aGUgZGVsaXZlcnkKLW5vdGUuCi0KLVRoZSBzZWNvbmQgaXMgQVJNX01BTklGRVNUXzk3NDEzLlRYVCB3aGljaCBjb250YWlucyBhIG1hbmlmZXN0IG9mIGFsbCB0aGUKLWZpbGVzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIHRvZ2V0aGVyIHdpdGggdGhlaXIgY2hlY2tzdW1zLgotCi1UaGUgY2hlY2tzdW1zIHByb3ZpZGVkIGFyZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgotTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobS4KLQotVGhlIGNoZWNrc3VtcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGlzIGRhdGEgdXNpbmcgdGhlCi0ibWQ1c3VtIiB0b29sICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBHTlUgInRleHR1dGlscyIgcGFja2FnZSkgYnkgcnVubmluZzoKLQotICAlIG1kNXN1bSAtLWNoZWNrIEFSTV9NQU5JRkVTVF85NzQxMy5UWFQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9NQU5JRkVTVC5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX01BTklGRVNULlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyMjM4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX01BTklGRVNULlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxLwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLwotZTA0OTc5MWNmYWI2MDYwYTA4Y2JhYzdiM2FkNzY3ZDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX3MuaAotZWQ3OThmYWNlMjU0OTdiMjcwM2VkZTczNmQ2ZDUyYjYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlc19zLmgKLTRlZWJkNjNhZjA4NzM3NjgxMWQ2NzQ5ZjA2NDZiODY0ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCi00M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAotOGYyNDhjZWFhYzhmNjAyZTI3N2E1MjFiNjc5ZGNiYmUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCi01M2YyYWU4YTk4NDk1ZjA1ZTI2YTRjZjg2MmE3Zjc1MCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCi0zYTJmNDIwZGRmNmExYjk1MDQ3MGJkMGY1ZWJkNWM2MiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVF9zLmgKLTUxMWMwYmI1MzRmZTIyMzU5OWUyYzg0ZWZmMjRjOWVkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAotODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCi1mODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCi04ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKLTY5NDI4MWQxMWFmNTJmODhlNmY5ZDRjYjIyNmFjOGE3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAotZTcyZDk2YzBhNDE1NDU5NzQ4ZGY5ODA3ZjNkYWU3MmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLwotNWVlYWU2NTlhMjk0NzdmNWM1MjI5NmQyNGFmZmZkM2MgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCi1kNjRjZGNmMzhmNzc0OWRjN2Y3NzQ2NWU1YjdkMzU2ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCi1lN2UwYzMyMDk3ODU2NGE3YzliMmM3MjM3NDlhOThkNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotNGFkY2QwZGYwODE5OTBiZGZjNDcyOTA0MWEyYTkxNTIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLTg1MmUwNDA0MTQyOTY1ZGMxZjNhYTdmMDBlZTUxMjdiICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKLTcwNTQxNTFjNWJmZWE2YjVlNzRmZWVlODZiMmQ3YjAxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi0zODk0NGM1ZTBiYmEwMWUzMmZmMzQ5YzJjODdjNzFiMiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKLTMyZmY0YjhiZTYyZTJmMGYzZTc2NGI4M2MxZTVlMmZkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotOTBiMGU2YTA0ZTc2NDkwMmMwYTA5MDM2NDBjMTBiMzIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKLTI4YTE5YWU0ZmUyMjU4NjI4MDgwZDZhODliYjU0YjkxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKLTk4ZTE5NmI5ZTFmZmViYWY5MWY2MmVhOWQxN2ZiOTdkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCi0wMWJhNjBlZmY2NmVhNDlhNGY4MzNjZTYyNzlmOGUyZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi1mMzAxZDVhOTVlMDczNTRmNTkzZWE1NzQ3YzAxY2IwYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwotNDRjOWVmMjFlODQwYTEwMDMwMWY3ZDdhNDE4OTk1N2MgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCi1hMzNiMDNiYmQzMzUyZDI0ZWQ3NDQ3NjllMTJiYjg3ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwotMDBjMjBiZmRhNjdiYjg2MDk2YjYxNWZjMTdjOTRiMzUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotMmRkY2FmNjBhOGVhMWU2ZTZiNzc3MzdmNzY4YmZiOWQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwotYzMwMDJhYWQ1NjAwZjg3MmI3MGE1ZDdmZTM5MTU4NDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCi1hMjkwMGYyYzQ3ZjFjNjFkMjBiZDZjMWVkYTMzZDZkNCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwotZTRmZWNkNjZiYzQ3ZjA3NTM5YmMzMDg5MzVlODRhMWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCi03ODgxNWM5ZGY1MGJhNTMxMzFiYjIyZDJiODI5ZTNjMyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwotMTkwOWFlMzEyYWM3OWEwM2E1ZmFjMWQxZThiYzAyOTEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwotM2QyYzQ4NTgwNjU1OTI4MDY1ZGU3ODM5ODY2ZDliYzQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCi0yM2FhMmZkZjE1NWQ0ZmE2ZmY3NDVlYWI2ZTAxZjMyYiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwotOTdmMjBhOTNjNDgxZDdmNjE3M2Q5MTlmNDFlNDE1YmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwotYmVjZDUxMmRhMjAyNDM2Mjg2ODExYjZhZWMwNjFmNDcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLWRkMjRhOTlhZTNjZDg0MmRjYWNhZjMxZDQ3ZGU4OGIzICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCi1jMmQ5OTVmNzg3YjZmNDRlZjEwYzc1MWMxMmQxOTM1ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKLTM2MjhmYmRmMGNkMjE3YzI4N2I2Y2NjOTQxMzVkMDZlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwotNGE1MmIzZTllMjY4YjhhOGYwNzgyOWJmNTAwZDAzYWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKLTExMjQ5ZjhhOThjNWQ0Yjg0Y2I1NTc1YjBlMzdjYTljICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKLTM1OTliMTA3NDMzMDk2NWM4Y2EyODVkMTY0ZWZjY2ZmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCi0zMzM5ZTAyNmM3ZGU2NTVkOTQwMDk0OWViNWU1MTQ1MSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCi1jYzRhNmYzMmRiMGI3MmE5MWQzZjI3OGY2ODU1ZGY2OSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCi02ZTUzMGRkYWE3YzJiNTdmZmU4ODE2MmMwMjBjYjY2MiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLwotY2RmNDEyOTIwYzIwMzdhNzI1ZDA0MjAwMDJiNjc1MmUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKLWRiYTk4MjRlOTU5YjIxZDQwMWNhYzkyNWU2OGExMWE2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotYjU1OWI3MWQ1Yzk0NjI3ZjEwZTYxNmZiNzJjMGNlZmMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCi00ZmJhNGM0MzFhNzgzYTc4YTJlYjY0OTdhOTRhYzk2NyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotMWU0YzNiZThjNWVkZGMwMGM5ZjA1ZTgzYmNmMzE1ZWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCi0xYjBiMjk5MGMyNjY5ZGZiODdjZjZiODEwNjExYzAxYiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0xYzliODdhYmYzMjgzZTk1NzgxNmIzOTM3YzY4MDcwMSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCi00ZmUxYWZjYTY1OWE5MDU1ZmMxMTcyZTU4Zjc4YTUwNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0yZWEwNjdmMDQzNmY5MWJhMTM1MWVkYWY0MTFjYjRlYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotYWNiOTJiZTFkYmNkYjNlYmU4MjRjYmU5ZTI4ZDAzYmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwotYTZiNDFmMDFiMWRmN2RkNjU2ZWJkYmEzMDg0YmZhMmEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucwotMjkzYTQ4YTY0OGEzMDg1NDU2ZTY2NjViYjczNjZmYWQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwotZmZlNmI5NmM3NGQ0ODgxZjRkM2M4ZGU4Y2M3Mzc3OTcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCi00MzdkZmEyMDQ1MDg4NTBkNjFkNGI4NzA5MTQ0NmU5ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwotZmY1OTE1ZDE4MWJmZDJjZDJmMGJkNTg4YmQyMzAwZGMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKLTY3NzVlYjBjNTYxZGJhYjk2NWM2MGY4NWIwOGM5NmZkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwotYTBkODVmNGY1MTdjOTQ1YTRjOTMxN2FjMDIxZjJkMDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwotMzg2MDIwZGVlOGI3MjVjN2ZlMjUyNmYxZmMyMTFkN2QgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCi00NjI0ZTdjODM4ZTEwYTI0OWFiY2MzZDNmNGY0MDc0OCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi02NWUxMDU3ZDA0ZTJjYjg0NDU1OWRjOWY2ZTA5Nzk1YSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLwotZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KLTdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAotMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCi0xMTcyNmUyODZhODEyNTdjYjQ1ZjU1NDdmYjRkMzc0YyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDX3MuaAotYTViMmFmNjA1YzMxOWNkMjQ5MTMxOWU0MzA3NDEzNzcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCi01MGNjYTY5NTRjNDQ3YjAxMmFiMzljYTc4NzJlNWU4ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKLWQxYzNiY2U3N2ZjNTc3NGM4OTliNDQ3ZDEzZjAyY2QwICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKLWZkYWMxZDFiYWQzZmQyM2M4ODBiZWIzOWJjMmU4OWFhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKLTZkOWFkYzJiZTViZDAzMTE1OTEwMzBkMGM2ZGY3NzFjICBBUk1fREVMSVZFUllfOTc0MTMuVFhUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI5N2UyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTS5oCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqICAgCi0gKiBGaWxlOiBhcm1DT01NLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqCi0gKi8KLSAKLSAgCi0jaWZuZGVmIF9hcm1Db21tb25fSF8KLSNkZWZpbmUgX2FybUNvbW1vbl9IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0gICAgICAgIAotfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0gICAgICAgIAotfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KLXR5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOwotCi0KLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDb21waWxlciBleHRlbnNpb25zICovCi0jaWZkZWYgQVJNX0RFQlVHCi0vKiBkZWJ1ZyB2ZXJzaW9uICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9Ci0jZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KLSNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQotI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCi0jZWxzZSAKLS8qIHJlbGVhc2UgdmVyc2lvbiAqLwotI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKLSNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKLSNlbmRpZiAvKiBBUk1fREVCVUcgKi8KLQotLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLSNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCi0jZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQotI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKLQotLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLwotCi0jZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQotI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQotI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQotI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQotI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKLQotLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLwotCi0jZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9Ci0jZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9Ci0KLSNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKLSNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnQpKFB0cikpICUgTik9PTApCi0jZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50KShQdHIpKSAlIE4pIT0wKQotI2Vsc2UKLSNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCi0jZW5kaWYKLQotI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCi0jZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQotI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCi0KLSNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQotI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCi0jZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKLSNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotIAotT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcAotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtQ2xpcCAoCi0gICAgICAgIE9NWF9JTlQgbWluLAotICAgICAgICBPTVhfSU5UIG1heCwgCi0gICAgICAgIE9NWF9TMzIgc3JjCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXBfRjMyCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX0YzMiBhcm1DbGlwX0YzMiAoCi0gICAgICAgIE9NWF9GMzIgbWluLAotICAgICAgICBPTVhfRjMyIG1heCwgCi0gICAgICAgIE9NWF9GMzIgc3JjCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKLSAgICAgICAgT01YX0YzMiB2LCAKLSAgICAgICAgT01YX0lOVCBzaGlmdCwgCi0gICAgICAgIE9NWF9JTlQgc2F0Qml0cwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCi0gKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCi0gKi8KLU9NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQotICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQotICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1NZWRpYW5PZjMgKAotICAgIE9NWF9TMzIgZkVudHJ5LAotICAgIE9NWF9TMzIgc0VudHJ5LCAKLSAgICBPTVhfUzMyIHRFbnRyeSAKLSAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTggYXJtTG9nU2l6ZSAoCi0gICAgT01YX1UxNiB2YWx1ZSAKLSAgICApOyAgICAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRBZGRfUzMyKAotICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoCi0gICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKLSAgICAgICAgICAgICAgICApOwotCi0vKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQotICogCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFN1Yl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYwotICoKLSAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAotICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCi0gKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCi0gKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIERlYnVnZ2luZyBtYWNyb3MKLSAqCi0gKi8KLQotCi0vKgotICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKLSAqLwotI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0Ci0KLS8qCi0gKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCi0gKiBBZGQgbW9yZSBpZiBuZWVkZWQuCi0gKi8KLSNpZmRlZiBERUJVR19PTgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQotI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQotI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQotI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQotI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQotI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKLSNlbHNlIC8qIERFQlVHX09OICovCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCi0jZW5kaWYgLyogREVCVUdfT04gKi8KLQotCi0vKgotICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCi0gKgotICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCi0gKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCi0gKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KLSAqLwotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0FDCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0Ci0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9WQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lDCi0vKiBUbyBiZSBmaWxsZWQgaW4gKi8KLSNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX1NQCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fSVAKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUwotI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCi0KLQotI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KLQotLypFbmQgb2YgRmlsZSovCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdERlY19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODY2ZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdERlY19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fQml0RGVjX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vIAotOy8vIE9wZW5NQVggb3B0aW1pemVkIGJpdHN0cmVhbSBkZWNvZGUgbW9kdWxlCi07Ly8KLTsvLyBZb3UgbXVzdCBpbmNsdWRlIGFybUNPTU1fcy5oIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlCi07Ly8KLTsvLyBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYWNyb3MgdG8gcGVyZm9ybSBhc3NlbWJseSBvcHRpbWl6ZWQgZml4ZWQgYW5kCi07Ly8gdmFyaWFibGUgbGVuZ3RoIGRlY29kaW5nIGZyb20gYSByZWFkLW9ubHkgYml0c3RyZWFtLiBUaGUgdmFyaWFibGUKLTsvLyBsZW5ndGggZGVjb2RlIG1vZHVsZXMgdGFrZSBhcyBpbnB1dCBhIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiAxNi1iaXQKLTsvLyBlbnRyaWVzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgotOy8vCi07Ly8gVkxEIFRhYmxlIEVudHJ5IGZvcm1hdAotOy8vCi07Ly8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi07Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLTsvLyAgICAgICB8ICBMZW4gICB8ICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICB8IDEgfAotOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi07Ly8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKLTsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotOy8vCi07Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKLTsvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAoMCB0byA3KQotOy8vICAgIFN5bWJvbCA9IFN5bWJvbCBwYXlsb2FkICh1bnNpZ25lZCAxMiBiaXRzKQotOy8vCi07Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKLTsvLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQotOy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKLTsvLwotOy8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKLTsvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCi07Ly8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgotOy8vCi07Ly8gVVNBR0U6Ci07Ly8KLTsvLyBUbyB1c2UgYW55IG9mIHRoZSBtYWNyb3MgaW4gdGhpcyBwYWNrYWdlLCBmaXJzdCBjYWxsOgotOy8vCi07Ly8gICAgTV9CRF9JTklUIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQsIFRtcAotOy8vCi07Ly8gVGhpcyBjYWNoZXMgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFuZCBuZXh0IGF2YWlsYWJsZQotOy8vIGJpdHMgaW4gcmVnaXN0ZXJzIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudC4gVGhlc2UgcmVnaXN0ZXJzCi07Ly8gYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGJpdHN0cmVhbSBkZWNvZGUgcGFja2FnZSB1bnRpbCB5b3UKLTsvLyBjYWxsIE1fQkRfRklOSS4KLTsvLwotOy8vIE5leHQgY2FsbCB0aGUgZm9sbG93aW5nIG1hY3JvKHMpIGFzIG1hbnkgdGltZXMgYXMgeW91IG5lZWQ6Ci07Ly8KLTsvLyAgICBNX0JEX0xPT0s4ICAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfTE9PSzE2ICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgaW50byB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9SRUFEOCAgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1JFQUQxNiAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfVlJFQUQ4ICAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9WUkVBRDE2ICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1ZMRCAgICAgICAgIC0gUGVyZm9ybSB2YXJpYWJsZSBsZW5ndGggZGVjb2RlIHVzaW5nIGxvb2t1cCB0YWJsZQotOy8vCi07Ly8gRmluYWxseSBjYWxsIHRoZSBtYWNybzoKLTsvLwotOy8vICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldAotOy8vCi07Ly8gVGhpcyB3cml0ZXMgdGhlIGJpdHN0cmVhbSBzdGF0ZSBiYWNrIHRvIG1lbW9yeS4KLTsvLwotOy8vIFRoZSB0aHJlZSBiaXRzdHJlYW0gY2FjaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBmb2xsb3dpbmcgZ2xvYmFsCi07Ly8gdmFyaWFibGVzOgotOy8vCi0KLSAgICAgICAgR0JMUyAgICBwQml0U3RyZWFtICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgcEJpdFN0cmVhbQotICAgICAgICBHQkxTICAgIEJpdEJ1ZmZlciAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRCdWZmZXIKLSAgICAgICAgR0JMUyAgICBCaXRDb3VudCAgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0Q291bnQKLSAgIAotOy8vICAgICAgICAKLTsvLyBUaGVzZSByZWdpc3RlciB2YXJpYWJsZXMgbXVzdCBoYXZlIGEgY2VydGFpbiBkZWZpbmVkIHN0YXRlIG9uIGVudHJ5IHRvIGV2ZXJ5IGJpdHN0cmVhbQotOy8vIG1hY3JvIChleGNlcHQgTV9CRF9JTklUKSBhbmQgb24gZXhpdCBmcm9tIGV2ZXJ5IGJpdHN0cmVhbSBtYWNybyAoZXhjZXB0IE1fQkRfRklOSSkuCi07Ly8gVGhlIHN0YXRlIG1heSBkZXBlbmQgb24gaW1wbGVtZW50YXRpb24uCi07Ly8KLTsvLyBGb3IgdGhlIGRlZmF1bHQgKEFSTTExKSBpbXBsZW1lbnRhdGlvbiB0aGUgZm9sbG93aW5nIGhvbGQ6Ci07Ly8gICAgcEJpdFN0cmVhbSAtIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBub3QgaGVsZCBpbiB0aGUgQml0QnVmZmVyCi07Ly8gICAgQml0QnVmZmVyICAtIGlzIGEgY2FjaGUgb2YgKDQgYnl0ZXMpIDMyIGJpdHMsIGJpdCAzMSB0aGUgZmlyc3QgYml0Ci07Ly8gICAgQml0Q291bnQgICAtIGlzIG9mZnNldCAoZnJvbSB0aGUgdG9wIGJpdCkgdG8gdGhlIG5leHQgdW51c2VkIGJpdHN0cmVhbSBiaXQKLTsvLyAgICAwPD1CaXRDb3VudDw9MTUgKHNvIEJpdEJ1ZmZlciBob2xkcyBhdCBsZWFzdCAxNyB1bnVzZWQgYml0cykKLTsvLwotOy8vCi0KLSAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgaW5pdGlhbGlzZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEluaXRpYWxpc2VzIHRoZSBiaXRzdHJlYW0gZGVjb2RlIGdsb2JhbCByZWdpc3RlcnMgZnJvbQotICAgICAgICA7Ly8gYml0c3RyZWFtIHBvaW50ZXJzLiBUaGlzIG1hY3JvIGlzIHNwbGl0IGludG8gMyBwYXJ0cyB0byBlbmFibGUKLSAgICAgICAgOy8vIHNjaGVkdWxpbmcuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQotICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQotICAgICAgICA7Ly8gJFJCaXRTdHJlYW0gICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBwQml0U3RyZWFtIChjYW4gYmUgJHBwQml0U3RyZWFtKQotICAgICAgICA7Ly8gJFJCaXRCdWZmZXIgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRCdWZmZXIKLSAgICAgICAgOy8vICRSQml0Q291bnQgICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0Q291bnQgICAoY2FuIGJlICRwQml0T2Zmc2V0KQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxLCRUMiwkVDMgICAgIC0gcmVnaXN0ZXJzIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0bwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgTV9CRF9JTklUMSBhbmQgTV9CRF9JTklUMgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0lOSVQwICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0LCAkUkJpdFN0cmVhbSwgJFJCaXRCdWZmZXIsICRSQml0Q291bnQKLQotcEJpdFN0cmVhbSAgU0VUUyAiJFJCaXRTdHJlYW0iCi1CaXRCdWZmZXIgICBTRVRTICIkUkJpdEJ1ZmZlciIKLUJpdENvdW50ICAgIFNFVFMgIiRSQml0Q291bnQiICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkIGlucHV0cwotICAgICAgICBMRFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQotICAgICAgICBMRFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0lOSVQxICAkVDEsICRUMiwgJFQzCi0gICAgICAgIExEUkIgICAgJFQyLCBbJHBCaXRTdHJlYW0sICMyXQotICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtLCAjMV0KLSAgICAgICAgTERSQiAgICAkQml0QnVmZmVyLCAgWyRwQml0U3RyZWFtXSwgIzMKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9JTklUMiAgJFQxLCAkVDIsICRUMwotICAgICAgICBPUlIgICAgICRUMiwgJFQyLCAkVDEsIExTTCAjOAotICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMiwgJEJpdEJ1ZmZlciwgTFNMICMxNgotICAgICAgICBNRU5EICAgIAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTggYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cwotICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjI0IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfTE9PSzggICRTeW1ib2wsICROCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCi0gICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMTYgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vawotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9MT09LMTYgICRTeW1ib2wsICROLCAkVDEKLSAgICAgICAgQVNTRVJUICAoJE4gPj0gMSk6TEFORDooJE4gPD0gMTYpCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFNraXBzIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9TS0lQOCAkTiwgJFQxCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgIAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1JFQUQ4ICRTeW1ib2wsICROLCAkVDEKLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTE2KQotICAgICAgICBBU1NFUlQgICRTeW1ib2w8PiRUMQotICAgICAgICBJRiAoJE48PTgpCi0gICAgICAgICAgICBNX0JEX1JFQUQ4ICAkU3ltYm9sLCAkTiwgJFQxCi0gICAgICAgIEVMU0UgICAgICAgIAotICAgICAgICAgICAgOy8vIE4+OCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gcmVmaWxsIGF0IGxlYXN0IG9uZSBieXRlICAgICAgICAgICAgCi0gICAgICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDE2LSROKQotICAgICAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQotICAgICAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD04Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlNLSVA4ICROLCAkVDEKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTE2Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlNLSVAxNiAkTiwgJFQxLCAkVDIKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD04Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZSRUFEOCAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0KLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTE2Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZSRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0KLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMDAwMC4uLjAwMSB3aGVyZSB0aGVyZQotICAgICAgICA7Ly8gYXJlIE4gemVyb3MgYmVmb3JlIHRoZSAxIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQ0xaMTYgJFN5bWJvbCwgJFQxLCAkVDIKLSAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgIAotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAxMTExLi4uMTEwIHdoZXJlIHRoZXJlCi0gICAgICAgIDsvLyBhcmUgTiBvbmVzIGJlZm9yZSB0aGUgMCBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0NMTzE2ICRTeW1ib2wsICRUMSwgJFQyCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBNVk4gICAgICRTeW1ib2wsICRTeW1ib2wKLSAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgCi0KLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFZhcmlhYmxlIExlbmd0aCBEZWNvZGUgbW9kdWxlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVjb2RlcyBvbmUgVkxEIFN5bWJvbCBmcm9tIGEgYml0c3RyZWFtIGFuZCByZWZpbGwgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gYnVmZmVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcFZMRFRhYmxlICAgICAgLSBwb2ludGVyIHRvIFZMRCBkZWNvZGUgdGFibGUgb2YgMTYtYml0IGVudHJpZXMuCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBhYm92ZSBhdCB0aGUgc3RhcnQgb2YKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4KLSAgICAgICAgOy8vICRTMCAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciB0aGUgZmlyc3Qgc3RlcAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgMTw9JFMwPD04Ci0gICAgICAgIDsvLyAkUzEgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgZWFjaCBzdWJzZXF1ZW50Ci0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBzdGVwIDE8PSRTMTw9JFMwLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIGRlY29kZWQgVkxEIHN5bWJvbCB2YWx1ZQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZMRCAkU3ltYm9sLCAkVDEsICRUMiwgJHBWTERUYWJsZSwgJFMwLCAkUzEKLSAgICAgICAgQVNTRVJUICgxPD0kUzApOkxBTkQ6KCRTMDw9OCkKLSAgICAgICAgQVNTRVJUICgxPD0kUzEpOkxBTkQ6KCRTMTw9JFMwKQotICAgICAgICAKLSAgICAgICAgOy8vIE5vdGUgMDw9Qml0Q291bnQ8PTE1IG9uIGVudHJ5IGFuZCBleGl0Ci0gICAgICAgIAotICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdHMKLSAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAjKDI8PCRTMCktMiAgICAgICAgICAgICAgICAgOy8vIGNyZWF0ZSBtYXNrCi0gICAgICAgIEFORCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzApIDsvLyAyKihuZXh0ICRTMCBiaXRzKQotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gQ1MgaWYgYnVmZmVyIGNhbiBiZSBmaWxsZWQKLTAxCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgICAgIDsvLyBsb2FkIHJlZmlsbCBieXRlCi0gICAgICAgIExEUkggICAgJFN5bWJvbCwgWyRwVkxEVGFibGUsICRTeW1ib2xdICAgICAgIDsvLyBsb2FkIHRhYmxlIGVudHJ5Ci0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyByZWZpbGwgbm90IHBvc3NpYmxlCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMkUzAgICAgICAgICAgIDsvLyBhc3N1bWUgJFMwIGJpdHMgdXNlZAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICA7Ly8gbWVyZ2UgaW4gcmVmaWxsIGJ5dGUKLSAgICAgICAgTU9WUyAgICAkVDEsICRTeW1ib2wsIExTUiAjMSAgICAgICAgICAgICAgICAgOy8vIENTPWxlYWYgZW50cnkKLSAgICAgICAgQkNTICAgICAlRlQwMgotICAgICAgICAKLSAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXQKLSAgICAgICAgSUYgKDIqJFMwLSRTMTw9OCkKLSAgICAgICAgICAgIDsvLyBDYW4gY29tYmluZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBhbmQga2VlcCAkQml0Q291bnQ8PTE1Ci0gICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCsoJFMwLSRTMSkKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIFNlcGFyYXRlIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIG9mZnNldAotICAgICAgICAgICAgU1VCUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgICAgICBTVUIgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygkUzAtJFMxKQotICAgICAgICBFTkRJRgotICAgICAgICBBREQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMxKSA7Ly8gYWRkIDIqKG5leHQgJFMxIGJpdHMpIHRvCi0gICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFN5bWJvbCwgIzEgICAgICAgICAgICAgICAgIDsvLyAgIHRhYmxlIG9mZnNldAotICAgICAgICBCICAgICAgICVCVDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHRhYmxlIGVudHJ5Ci0wMgotICAgICAgICA7Ly8gQml0Q291bnQgcmFuZ2Ugbm93IGRlcGVuZCBvbiB0aGUgcm91dGUgaGVyZQotICAgICAgICA7Ly8gaWYgKGZpcnN0IHN0ZXApICAgICAgIFMwIDw9IEJpdENvdW50IDw9IDcrUzAgICAgICAgIDw9MTUKLSAgICAgICAgOy8vIGVsc2UgaWYgKDIqUzAtUzE8PTgpICBTMCA8PSBCaXRDb3VudCA8PSA3KygyKlMwLVMxKSA8PTE1Ci0gICAgICAgIDsvLyBlbHNlICAgICAgICAgICAgICAgICAgUzEgPD0gQml0Q291bnQgPD0gNytTMSAgICAgICAgPD0xNQotICAgICAgICAKLSAgICAgICAgU1VCICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbCwgTFNSIzEzCi0gICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFQxLCAjMHhGMDAwCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIEFkZCBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzIAotICAgICAgICA7Ly8gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgYml0c3RyZWFtIHBvc2l0aW9ucyB1c2luZy4gTV9CRF9DTVAuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRPZmZzZXQgICAgICAgICAtIE9mZnNldCB0byBiZSBhZGRlZCBpbiBiaXRzLgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgYWRkaW5nIHRoZSBPZmZzZXQuIAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLiBCdXQgZm9yIHVzaW5nIHdpdGggTV9CRF9DTVAgc3VidHJhY3QgaXMgbm90IG5lZWRlZC4KLSAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBhZGRpdGlvbiBvZiBPZmZzZXQgbnVtYmVyIG9mIGJpdHMKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQUREICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRPZmZzZXQKLQotICAgICAgICA7Ly8gKCRCeXRlSW5kZXgsJEJpdEluZGV4KSA9IEN1cnJlbnQgcG9zaXRpb24gKyAkT2Zmc2V0IGJpdHMKLSAgICAgICAgQUREICAgICAkT2Zmc2V0LCAkT2Zmc2V0LCAkQml0Q291bnQKLSAgICAgICAgQU5EICAgICAkQml0SW5kZXgsICRPZmZzZXQsICM3Ci0gICAgICAgIEFERCAgICAgJEJ5dGVJbmRleCwgJHBCaXRTdHJlYW0sICRPZmZzZXQsIEFTUiAjMyAgICAgICAgCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTW92ZSBiaXRzdHJlYW0gcG9pbnRlcnMgdG8gdGhlIGxvY2F0aW9uIGdpdmVuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvICAKLSAgICAgICAgOy8vIHRoZSBjdXJyZW50IGxvY2F0aW9uIGdpdmVuIChjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREKS4gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIG1vdmUuIAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLgotICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIG1vdmUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4gIAotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX01PViAgJEJ5dGVJbmRleCwgJEJpdEluZGV4Ci0KLSAgICAgICAgOy8vICgkcEJpdFN0cmVhbSwgJE9mZnNldCkgPSAoJEJ5dGVJbmRleCwkQml0SW5kZXgpCi0gICAgICAgIE1PViAgICAgJEJpdENvdW50LCAkQml0SW5kZXgKLSAgICAgICAgTU9WICAgICAkcEJpdFN0cmVhbSwgJEJ5dGVJbmRleAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIEJpdHN0cmVhbSBDb21wYXJlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQ29tcGFyZXMgYml0c3RyZWFtIHBvc2l0aW9uIHdpdGggdGhhdCBvZiBhIGRlc3RpbmF0aW9uIHBvc2l0aW9uLiBEZXN0aW5hdGlvbiBwb3NpdGlvbiAKLSAgICAgICAgOy8vIGlzIGhlbGQgaW4gdHdvIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCBtYWNybwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIsICg0IGJ5dGUgYWhlYWQgYXMgZGVzY3JpYmVkIGluIE1fQkRfQUREKQotICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRkxBR1MgICAgICAgICAgIC0gR0UgaWYgZGVzdGluYXRpb24gaXMgcmVhY2hlZCwgTFQgPSBpcyBkZXN0aW5hdGlvbiBpcyBhaGVhZAotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9DTVAgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJFQxCi0gICAgICAgIAotICAgICAgICA7Ly8gUmV0dXJuIGZsYWdzIHNldCBieSAoY3VycmVudCBwb3NpdG9uKS0oJEJ5dGVJbmRleCwkQml0SW5kZXgpCi0gICAgICAgIDsvLyBzbyBHRSBtZWFucyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uCi0KLSAgICAgICAgQUREICAgICAgICAgJFQxLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IgIzMKLSAgICAgICAgQ01QICAgICAgICAgJFQxLCAkQnl0ZUluZGV4Ci0gICAgICAgIEFORCAgICAgICAgICRUMSwgJEJpdENvdW50LCAjNwotICAgICAgICBDTVBFUSAgICAgICAkVDEsICRCaXRJbmRleCAgICAgICAgCi0gICAgICAgIE1FTkQKLQotICAgICAgICAKLSAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgZmluYWxpc2UKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBXcml0ZXMgYmFjayB0aGUgYml0c3RyZWFtIHN0YXRlIHRvIHRoZSBiaXRzdHJlYW0gcG9pbnRlcnMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKLSAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IHRoZXNlIHJlZ2lzdGVyIGFyZSBjb3JydXB0ZWQKLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9GSU5JICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8gQWR2YW5jZSBwb2ludGVyIGJ5IHRoZSBudW1iZXIgb2YgZnJlZSBiaXRzIGluIHRoZSBidWZmZXIKLSAgICAgICAgQUREICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSIzMKLSAgICAgICAgQU5EICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcKLSAgICAgICAgCi0gICAgICAgIDsvLyBOb3cgbW92ZSBiYWNrIDMyIGJpdHMgdG8gcmVhY2ggdGhlIGZpcnN0IHVzdWVkIGJpdAotICAgICAgICBTVUIgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgIzQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBvdXQgYml0c3RyZWFtIHN0YXRlCi0gICAgICAgIFNUUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCi0gICAgICAgIFNUUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2YjY2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiBhcm1DT01NX0JpdHN0cmVhbS5oCi0gKiBCcmllZjogRGVjbGFyZXMgY29tbW9uIEFQSSdzL0RhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NYXggRW5jb2RlcnMvRGVjb2RlcnMuCi0gKgotICovCi0KLSNpZm5kZWYgX2FybUNvZGVjX0hfCi0jZGVmaW5lIF9hcm1Db2RlY19IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9VOCAgIGNvZGVMZW47Ci0gICAgT01YX1UzMgkgY29kZVdvcmQ7Ci19IEFSTV9WTEMzMjsKLQotLyogVGhlIGFib3ZlIHNob3VsZCBiZSByZW5hbWVkIGFzICJBUk1fVkxDMzIiICovCi0KLS8qKgotICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLi4zMgotICoKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotICogICAgCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4zMgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0gCi1PTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KTsKLQotLyoqIAotICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLQotT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQotICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCi0gKiBwb2ludGVkIGJ5IHBDb2RlQm9vawotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIHBDb2RlQm9vawotICogCi0gKiBbb3V0XSAgICAqKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAotICogICAgICAgICA6ICJBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAweEZGRkYiIGlmIHNlYXJjaCBmYWlscy4KLSAqKi8KLQotI2RlZmluZSBBUk1fTk9fQ09ERUJPT0tfSU5ERVggKE9NWF9VMTYpKDB4RkZGRikKLQotT01YX1UxNiBhcm1VblBhY2tWTEMzMigKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCi0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwT2Zmc2V0CSAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQljb2RlV29yZAkJQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqIFtpbl0JY29kZUxlbmd0aAkJTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrQml0cyAoCi0gICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIE9NWF9VMzIgY29kZVdvcmQsIAotICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKLSk7Ci0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIEFSTV9WTEMzMiBjb2RlIAotKTsKLQotI2VuZGlmICAgICAgLypfYXJtQ29kZWNfSF8qLwotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzNjg0ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlICAgICAgICAgOiBhcm1DT01NX0lEQ1RUYWJsZS5oCi0gKiBEZXNjcmlwdGlvbiAgOiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGFibGVzIGZvciBJRENUIGNhbGN1bGF0aW9uLgotICoKLSAqLwotICAKLSNpZm5kZWYgX2FybUNPTU1fSURDVFRhYmxlX0hfCi0jZGVmaW5lIF9hcm1DT01NX0lEQ1RUYWJsZV9IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1Ci0gICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQotICAgICAgKiAgcyg2KT0yLjAKLSAgICAgICogIHMoNyk9NC4wCi0gICAgICAqICBBKDApID0gMipzcXJ0KDIpCi0gICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKLQkgICovCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF07Ci0KLSNlbmRpZiAvKiBfYXJtQ09NTV9JRENUVGFibGVfSF8gKi8KLQotCi0vKiBFbmQgb2YgRmlsZSAqLwotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVF9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVF9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2QyNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1MyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vCi07Ly8gSURDVF9zLnMKLTsvLwotOy8vIEludmVyc2UgRENUIG1vZHVsZQotOy8vCi07Ly8gCi07Ly8gQUxHT1JJVEhNIERFU0NSSVBUSU9OCi07Ly8KLTsvLyBUaGUgOHg4IDJEIElEQ1QgaXMgcGVyZm9ybWVkIGJ5IGNhbGN1bGF0aW5nIGEgMUQgSURDVCBmb3IgZWFjaAotOy8vIGNvbHVtbiBhbmQgdGhlbiBhIDFEIElEQ1QgZm9yIGVhY2ggcm93LgotOy8vCi07Ly8gVGhlIDgtcG9pbnQgMUQgSURDVCBpcyBkZWZpbmVkIGJ5Ci07Ly8gICBmKHgpID0gKEMoMCkqVCgwKSpjKDAseCkgKyAuLi4gKyBDKDcpKlQoNykqYyg3LHgpKS8yCi07Ly8KLTsvLyAgIEModSkgPSAxL3NxcnQoMikgaWYgdT0wIG9yIDEgaWYgdSE9MAotOy8vICAgYyh1LHgpID0gY29zKCAoMngrMSkqdSpwaS8xNiApCi07Ly8KLTsvLyBXZSBjb21wdXRlIHRoZSA4LXBvaW50IDFEIElEQ1QgdXNpbmcgdGhlIHJldmVyc2Ugb2YKLTsvLyB0aGUgQXJhaS1BZ3VpLU5ha2FqaW1hIGZsb3cgZ3JhcGggd2hpY2ggd2Ugc3BsaXQgaW50bwotOy8vIDUgc3RhZ2VzIG5hbWVkIGluIHJldmVyc2Ugb3JkZXIgdG8gaWRlbnRpZnkgd2l0aCB0aGUKLTsvLyBmb3J3YXJkIERDVC4gRGlyZWN0IGludmVyc2lvbiBvZiB0aGUgZm9yd2FyZCBmb3JtdWxhZQotOy8vIGluIGZpbGUgRkRDVF9zLnMgZ2l2ZXM6Ci07Ly8KLTsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpICBbIEEodSk9NCpDKHUpKmModSwwKSBdCi07Ly8gICAgICAgICAgICAgWyBBKDApID0gMipzcXJ0KDIpCi07Ly8gICAgICAgICAgICAgICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkgXQotOy8vCi07Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Ci07Ly8gICAgICAgICAgICAgaTMgPSAoajIrajYpLzIgICAgICBpMiA9IChqMi1qNikvMgotOy8vICAgICAgICAgICAgIGk3ID0gKGo1K2ozKS8yICAgICAgaTQgPSAoajUtajMpLzIKLTsvLyAgICAgICAgICAgICBpNSA9IChqMStqNykvMiAgICAgIGk2ID0gKGoxLWo3KS8yCi07Ly8KLTsvLyBJU3RhZ2UgMzogICBoMCA9IChpMCtpMSkvMiAgICAgIGgxID0gKGkwLWkxKS8yCi07Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCi07Ly8gICAgICAgICAgICAgaDQgPSAgY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2Ci07Ly8gICAgICAgICAgICAgaDYgPSAtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2Ci07Ly8gICAgICAgICAgICAgWyBUaGUgYWJvdmUgdHdvIGxpbmVzIHJvdGF0ZSBieSAtKHBpLzgpIF0KLTsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykvc3FydDIgIGg3ID0gKGk1K2k3KS8yIAotOy8vICAgICAgICAgICAgIAotOy8vIElTdGFnZSAyOiAgIGcwID0gKGgwK2gzKS8yICAgICAgZzMgPSAoaDAtaDMpLzIKLTsvLyAgICAgICAgICAgICBnMSA9IChoMStoMikvMiAgICAgIGcyID0gKGgxLWgyKS8yCi07Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKLTsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQotOy8vCi07Ly8gSVN0YWdlIDE6ICAgZjAgPSAoZzArZzcpLzIgICAgICBmNyA9IChnMC1nNykvMgotOy8vICAgICAgICAgICAgIGYxID0gKGcxK2c2KS8yICAgICAgZjYgPSAoZzEtZzYpLzIKLTsvLyAgICAgICAgICAgICBmMiA9IChnMitnNSkvMiAgICAgIGY1ID0gKGcyLWc1KS8yCi07Ly8gICAgICAgICAgICAgZjMgPSAoZzMrZzQpLzIgICAgICBmNCA9IChnMy1nNCkvMgotOy8vCi07Ly8gTm90ZSB0aGF0IG1vc3QgY29lZmZpY2llbnRzIGFyZSBoYWx2ZWQgMyB0aW1lcyBkdXJpbmcgdGhlCi07Ly8gYWJvdmUgY2FsY3VsYXRpb24uIFdlIGNhbiByZXNjYWxlIHRoZSBhbGdvcml0aG0gZGl2aWRpbmcKLTsvLyB0aGUgaW5wdXQgYnkgOCB0byByZW1vdmUgdGhlIGhhbHZpbmdzLgotOy8vCi07Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KS84Ci07Ly8KLTsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKLTsvLyAgICAgICAgICAgICBpMyA9IGoyICsgajYgICAgICAgIGkyID0gajIgLSBqNgotOy8vICAgICAgICAgICAgIGk3ID0gajUgKyBqMyAgICAgICAgaTQgPSBqNSAtIGozCi07Ly8gICAgICAgICAgICAgaTUgPSBqMSArIGo3ICAgICAgICBpNiA9IGoxIC0gajcKLTsvLwotOy8vIElTdGFnZSAzOiAgIGgwID0gaTAgKyBpMSAgICAgICAgaDEgPSBpMCAtIGkxCi07Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCi07Ly8gICAgICAgICAgICAgaDQgPSAyKiggY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2KQotOy8vICAgICAgICAgICAgIGg2ID0gMiooLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNikKLTsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykqc3FydDIgIGg3ID0gaTUgKyBpNyAKLTsvLyAgICAgICAgICAgICAKLTsvLyBJU3RhZ2UgMjogICBnMCA9IGgwICsgaDMgICAgICAgIGczID0gaDAgLSBoMwotOy8vICAgICAgICAgICAgIGcxID0gaDEgKyBoMiAgICAgICAgZzIgPSBoMSAtIGgyCi07Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKLTsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQotOy8vCi07Ly8gSVN0YWdlIDE6ICAgZjAgPSBnMCArIGc3ICAgICAgICBmNyA9IGcwIC0gZzcKLTsvLyAgICAgICAgICAgICBmMSA9IGcxICsgZzYgICAgICAgIGY2ID0gZzEgLSBnNgotOy8vICAgICAgICAgICAgIGYyID0gZzIgKyBnNSAgICAgICAgZjUgPSBnMiAtIGc1Ci07Ly8gICAgICAgICAgICAgZjMgPSBnMyArIGc0ICAgICAgICBmNCA9IGczIC0gZzQKLTsvLwotOy8vIE5vdGU6Ci07Ly8gMS4gVGhlIHNjYWxpbmcgYnkgQSh1KS84IGNhbiBvZnRlbiBiZSBjb21iaW5lZCB3aXRoIGludmVyc2UKLTsvLyAgICBxdWFudGl6YXRpb24uIFRoZSBjb2x1bW4gYW5kIHJvdyBzY2FsaW5ncyBjYW4gYmUgY29tYmluZWQuCi07Ly8gMi4gVGhlIGZsb3dncmFwaCBpbiB0aGUgQUFOIHBhcGVyIGhhcyBoNCxnNiBuZWdhdGVkIGNvbXBhcmVkCi07Ly8gICAgdG8gdGhlIGFib3ZlIGNvZGUgYnV0IGlzIG90aGVyd2lzZSBpZGVudGljYWwuCi07Ly8gMy4gVGhlIHJvdGF0aW9uIGJ5IC1waS84IGNhbiBiZSBwZWZvcm1lZCB1c2luZyB0aHJlZSBtdWx0aXBsaWVzCi07Ly8gICAgRWcgIGMqaTQrcyppNiA9IChpNi1pNCkqcyArIChjK3MpKmk0Ci07Ly8gICAgICAgLXMqaTQrYyppNiA9IChpNi1pNCkqcyArIChjLXMpKmk2Ci07Ly8gNC4gSWYgfFQodSl8PD0xIHRoZW4gZnJvbSB0aGUgSURDVCBkZWZpbml0aW9uLAotOy8vICAgIHxmKHgpfCA8PSAoKDEvc3FydDIpICsgfGMoMSx4KXwgKyAuLiArIHxjKDcseCl8KS8yCi07Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyBjb3MocGkvMTYpICsgLi4uICsgY29zKDcqcGkvMTYpKS8yCi07Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyAoY290KHBpLzMyKS0xKS8yKS8yCi07Ly8gICAgICAgICAgICA9ICgxICsgY29zKHBpLzE2KSArIGNvcygycGkvMTYpICsgY29zKDNwaS8xNikpL3NxcnQoMikKLTsvLyAgICAgICAgICAgID0gKGFwcHJveCkyLjY0Ci07Ly8gICAgU28gdGhlIG1heCBnYWluIG9mIHRoZSAyRCBJRENUIGlzIH54Ny4wID0gMyBiaXRzLgotOy8vICAgIFRoZSB0YWJsZSBiZWxvdyBzaG93cyBpbnB1dCBwYXR0ZXJucyBnZW5lcmF0aW5nIHRoZSBtYXhpbXVtCi07Ly8gICAgdmFsdWUgb2YgfGYodSl8IGZvciBpbnB1dCBpbiB0aGUgcmFuZ2UgfFQoeCl8PD0xLiBNPS0xLCBQPSsxCi07Ly8gICAgSW5wdXRQYXR0ZXJuICAgICAgTWF4IHxmKHgpfAotOy8vICAgICAgUFBQUFBQUFAgICAgICAgIHxmMHwgPSAgMi42NAotOy8vICAgICAgUFBQTU1NTU0gICAgICAgIHxmMXwgPSAgMi42NAotOy8vICAgICAgUFBNTU1QUFAgICAgICAgIHxmMnwgPSAgMi42NAotOy8vICAgICAgUFBNTVBQTU0gICAgICAgIHxmM3wgPSAgMi42NAotOy8vICAgICAgUE1NUFBNTVAgICAgICAgIHxmNHwgPSAgMi42NAotOy8vICAgICAgUE1NUE1NUE0gICAgICAgIHxmNXwgPSAgMi42NAotOy8vICAgICAgUE1QUE1QTVAgICAgICAgIHxmNnwgPSAgMi42NAotOy8vICAgICAgUE1QTVBNUE0gICAgICAgIHxmN3wgPSAgMi42NAotOy8vICAgTm90ZSB0aGF0IHRoaXMgaW5wdXQgcGF0dGVybiBpcyB0aGUgdHJhbnNwb3NlIG9mIHRoZQotOy8vICAgY29ycmVzcG9uZGluZyBtYXggaW5wdXQgcGF0dGVyIGZvciB0aGUgRkRDVC4KLQotOy8vIEFyZ3VtZW50cwotCi1wU3JjICAgIFJOIDAgICAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgotU3RyaWRlICBSTiAxICAgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKLXBEZXN0ICAgUk4gMiAgICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKLXBTY2FsZSAgUk4gMyAgICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCi0KLQotICAgICAgICA7Ly8gRENUIEludmVyc2UgTWFjcm8KLSAgICAgICAgOy8vIFRoZSBEQ1QgY29kZSBzaG91bGQgYmUgcGFyYW1ldHJpemVkIGFjY29yZGluZwotICAgICAgICA7Ly8gdG8gdGhlIGZvbGxvd2luZyBpbnB1dHM6Ci0gICAgICAgIDsvLyAkb3V0c2l6ZSA9ICJ1OCIgIDogIDgtYml0IHVuc2lnbmVkIGRhdGEgc2F0dXJhdGVkICgwIHRvICsyNTUpCi0gICAgICAgIDsvLyAgICAgICAgICAgICJzOSIgIDogMTYtYml0IHNpZ25lZCBkYXRhIHNhdHVyYXRlZCB0byA5LWJpdCAoLTI1NiB0byArMjU1KQotICAgICAgICA7Ly8gICAgICAgICAgICAiczE2IiA6IDE2LWJpdCBzaWduZWQgZGF0YSBub3Qgc2F0dXJhdGVkIChtYXggc2l6ZSB+Ky8tMTQyNzMpCi0gICAgICAgIDsvLyAkaW5zY2FsZSA9ICJzMTYiIDogc2lnbmVkIDE2LWJpdCBhYW4tc2NhbGUgdGFibGUsIFExNSBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAotICAgICAgICA7Ly8gICAgICAgICAgICAiczMyIiA6IHNpZ25lZCAzMi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMjMgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dHM6Ci0gICAgICAgIDsvLyBwU3JjICAgPSByMCA9IFBvaW50ZXIgdG8gaW5wdXQgZGF0YQotICAgICAgICA7Ly8gICAgICAgICAgICAgICBSYW5nZSBpcyAtMjU2IHRvICsyNTUgKDktYml0KQotICAgICAgICA7Ly8gU3RyaWRlID0gcjEgPSBTdHJpZGUgYmV0d2VlbiBpbnB1dCBsaW5lcwotICAgICAgICA7Ly8gcERlc3QgID0gcjIgPSBQb2ludGVyIHRvIG91dHB1dCBkYXRhCi0gICAgICAgIDsvLyBwU2NhbGUgPSByMyA9IFBvaW50ZXIgdG8gYWFuLXNjYWxlIHRhYmxlIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBieSAkaW5zY2FsZQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1QgICRvdXRzaXplLCAkaW5zY2FsZSwgJHN0cmlkZQotICAgICAgICBMQ0xBICAgIFNISUZUCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vIFJFR0lTVEVSIEFMTE9DQVRJT04KLTsvLyBUaGlzIGlzIGhhcmQgc2luY2Ugd2UgaGF2ZSA4IHZhbHVlcywgOSBmcmVlIHJlZ2lzdGVycyBhbmQgZWFjaAotOy8vIGJ1dHRlcmZseSByZXF1aXJlcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gV2UgYWxzbyB3YW50IHRvIAotOy8vIG1haW50YWluIHJlZ2lzdGVyIG9yZGVyIHNvIHdlIGNhbiB1c2UgTERNL1NUTS4gVGhlIHRhYmxlIGJlbG93Ci07Ly8gc3VtbWFyaXNlcyB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiB0aGF0IG1lZXRzIGFsbCB0aGVzZSBjcml0ZXJpYS4KLTsvLyBhPTFzdGNvbCwgYj0ybmRjb2wsIGYsZyxoLGkgYXJlIGRhdGFmbG93IHBvaW50cyBkZXNjcmliZWQgYWJvdmUuCi07Ly8KLTsvLyByMSAgYTAxICAgICBnMCAgaDAKLTsvLyByNCAgYjAxIGYwICBnMSAgaDEgIGkwCi07Ly8gcjUgIGEyMyBmMSAgZzIgICAgICBpMQotOy8vIHI2ICBiMjMgZjIgIGczICBoMiAgaTIKLTsvLyByNyAgYTQ1IGYzICAgICAgaDMgIGkzCi07Ly8gcjggIGI0NSBmNCAgZzQgIGg0ICBpNAotOy8vIHI5ICBhNjcgZjUgIGc1ICBoNSAgaTUKLTsvLyByMTAgYjY3IGY2ICBnNiAgaDYgIGk2Ci07Ly8gcjExICAgICBmNyAgZzcgIGg3ICBpNwotOy8vCi1yYTAxICAgIFJOIDEKLXJiMDEgICAgUk4gNAotcmEyMyAgICBSTiA1Ci1yYjIzICAgIFJOIDYKLXJhNDUgICAgUk4gNwotcmI0NSAgICBSTiA4Ci1yYTY3ICAgIFJOIDkKLXJiNjcgICAgUk4gMTAKLXJ0bXAgICAgUk4gMTEKLWNzUGlCeTggUk4gMTIgICA7Ly8gWyAoU2luKHBpLzgpQFExNSksIChDb3MocGkvOClAUTE1KSBdCi1Mb29wUlIyIFJOIDE0ICAgOy8vIFsgTG9vcE51bWJlcjw8MTMgLCAoMS9TcXJ0KDIpKUBRMTUgXQotOy8vIFRyYW5zcG9zZSBhbGxvY2F0aW9uCi14ZnQgICAgIFJOIHJhMDEKLXhmMCAgICAgUk4gcmIwMQoteGYxICAgICBSTiByYTIzCi14ZjIgICAgIFJOIHJiMjMKLXhmMyAgICAgUk4gcmE0NQoteGY0ICAgICBSTiByYjQ1Ci14ZjUgICAgIFJOIHJhNjcKLXhmNiAgICAgUk4gcmI2NwoteGY3ICAgICBSTiBydG1wCi07Ly8gSVN0YWdlIDEgYWxsb2NhdGlvbgoteGcwICAgICBSTiB4ZnQKLXhnMSAgICAgUk4geGYwCi14ZzIgICAgIFJOIHhmMQoteGczICAgICBSTiB4ZjIKLXhndCAgICAgUk4geGYzCi14ZzQgICAgIFJOIHhmNAoteGc1ICAgICBSTiB4ZjUKLXhnNiAgICAgUk4geGY2Ci14ZzcgICAgIFJOIHhmNwotOy8vIElTdGFnZSAyIGFsbG9jYXRpb24KLXhoMCAgICAgUk4geGcwCi14aDEgICAgIFJOIHhnMQoteGh0ICAgICBSTiB4ZzIKLXhoMiAgICAgUk4geGczCi14aDMgICAgIFJOIHhndAoteGg0ICAgICBSTiB4ZzQKLXhoNSAgICAgUk4geGc1Ci14aDYgICAgIFJOIHhnNgoteGg3ICAgICBSTiB4ZzcKLTsvLyBJU3RhZ2UgMyw0IGFsbG9jYXRpb24KLXhpdCAgICAgUk4geGgwCi14aTAgICAgIFJOIHhoMQoteGkxICAgICBSTiB4aHQKLXhpMiAgICAgUk4geGgyCi14aTMgICAgIFJOIHhoMwoteGk0ICAgICBSTiB4aDQKLXhpNSAgICAgUk4geGg1Ci14aTYgICAgIFJOIHhoNgoteGk3ICAgICBSTiB4aDcKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgcERlc3QsICBwcERlc3QKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgTV9TVFIgICBTdHJpZGUsIHBTdHJpZGUKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTV9BRFIgICBwRGVzdCwgIHBCbGsKLSAgICAgICAgTERSICAgICBjc1BpQnk4LCA9MHgzMGZjNzY0MgotICAgICAgICBMRFIgICAgIExvb3BSUjIsID0weDAwMDA1YTgyCi0gIAotdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgOy8vIExvYWQgZXZlbiB2YWx1ZXMKLSAgICAgICAgTERSICAgICB4aTQsIFtwU3JjXSwgIzQgIDsvLyBqMAotICAgICAgICBMRFIgICAgIHhpNSwgW3BTcmMsICM0KjE2LTRdICA7Ly8gajQKLSAgICAgICAgTERSICAgICB4aTYsIFtwU3JjLCAjMioxNi00XSAgOy8vIGoyCi0gICAgICAgIExEUiAgICAgeGk3LCBbcFNyYywgIzYqMTYtNF0gIDsvLyBqNgotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIEV2ZW4gVmFsdWVzCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgOy8vIDE2eDE2IG11bAotU0hJRlQgICAgICAgU0VUQSAgICAxMgotICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjNAotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICM0KjE2LTRdICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjMioxNi00XQotICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKLSAgICAgICAgICAgIFNNTEFCQiAgeGkzLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQUJCICB4aTAsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk1LCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkzLCB4aTQsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjE2LTRdCi0gICAgICAgICAgICBTTUxBQkIgIHhpMSwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTYsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTAsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBTTUxBQkIgIHhpMiwgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTcsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGkxLCB4aTEsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTEsIHhpNiwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKLVNISUZUICAgICAgIFNFVEEgICAgKDEyKzgtMTYpCi0gICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQotICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjOAotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMwKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNCozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM0KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNSwgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlLCAjMiozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMyKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNiozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk3LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNywgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgb2RkIHZhbHVlcwotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2LTRdICAgICAgOy8vIGoxCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTYtNF0gICAgICA7Ly8gajcKLSAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNi00XSAgICAgIDsvLyBqNQotICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2LTRdICAgICAgOy8vIGozCi0gICAgICAgIAotICAgICAgICBJRiAge1RSVUV9Ci0gICAgICAgICAgICA7Ly8gc2hvcnRjdXQgaWYgb2RkIHZhbHVlcyAwCi0gICAgICAgICAgICBURVEgICAgIHhpMCwgIzAKLSAgICAgICAgICAgIFRFUUVRICAgeGkxLCAjMAotICAgICAgICAgICAgVEVRRVEgICB4aTIsICMwCi0gICAgICAgICAgICBURVFFUSAgIHhpMywgIzAKLSAgICAgICAgICAgIEJFUSAgICAgdjZPZGRaZXJvJF9GCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgc2NhbGVkIGV2ZW4gdmFsdWVzCi0gICAgICAgIFNUTUlBICAgcERlc3QsIHt4aTQsIHhpNSwgeGk2LCB4aTd9Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2NhbGUgb2RkIHZhbHVlcwotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiCi0gICAgICAgICAgICA7Ly8gUGVyZm9ybSBBQU4gU2NhbGUKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSoxNi00XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM3KjE2LTRdICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNSoxNi00XQotICAgICAgICAgICAgU01MQUJCICB4aTcsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkwLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBQkIgIHhpNCwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTEsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk3LCB4aTcsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTcsIHhpMCwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMTYtNF0KLSAgICAgICAgICAgIFNNTEFCQiAgeGk1LCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMiwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIFNNTEFCQiAgeGk2LCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMywgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTUsIHhpNSwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNSwgeGkyLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAotICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzEqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM3KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzcqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkwLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMCwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTEsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkxLCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICM1KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzUqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICMzKjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkyLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMiwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTMsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkzLCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3Ci0gICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMwotICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCi0gICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKLSAgICAgICAgCi0gICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KLSAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQotICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAotICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQotICAgICAgICAgICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAotICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80Ci0gICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKLSAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdCwgIzhdICAgICAgICA7Ly8gajIsajYgc2NhbGVkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKLSAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3Ci0gICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNiAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQotICAgICAgICAgICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80Ci0gICAgICAgIAotICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIExEUkQgICAgeGkwLCBbcERlc3RdICAgICAgICAgICAgOy8vIGowLCBqNCBzY2FsZWQKLSAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCi0gICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEKLSAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBTQUREMTYgIHhmMywgeGczLCB4ZzQKLSAgICAgICAgU1NVQjE2ICB4ZjQsIHhnMywgeGc0Ci0gICAgICAgIFNBREQxNiAgeGYyLCB4ZzIsIHhnNQotICAgICAgICBTU1VCMTYgIHhmNSwgeGcyLCB4ZzUKLSAgICAgICAgU0FERDE2ICB4ZjEsIHhnMSwgeGc2Ci0gICAgICAgIFNTVUIxNiAgeGY2LCB4ZzEsIHhnNgotICAgICAgICBTQUREMTYgIHhmMCwgeGcwLCB4ZzcKLSAgICAgICAgU1NVQjE2ICB4ZjcsIHhnMCwgeGc3Ci0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAotICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKLSAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKLSAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAotICAgICAgICBFTkRJRgotICAgICAgICBCICAgICAgIHY2X2lkY3Rfcm93JF9GCi0gICAgICAgIAotdjZPZGRaZXJvJF9GCi0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMi1qNikKLSAgICAgICAgU0hBREQxNiB4aTMsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKLSAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCi0gICAgICAgIAotICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhoMCwgeGk0LCB4aTUKLSAgICAgICAgU0hTVUIxNiB4aDEsIHhpNCwgeGk1ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgTU9WICB4ZjMsIHhnMwotICAgICAgICBNT1YgIHhmNCwgeGczCi0gICAgICAgIE1PViAgeGYyLCB4ZzIKLSAgICAgICAgTU9WICB4ZjUsIHhnMgotICAgICAgICBNT1YgIHhmMSwgeGcxCi0gICAgICAgIE1PViAgeGY2LCB4ZzEKLSAgICAgICAgTU9WICB4ZjAsIHhnMAotICAgICAgICBNT1YgIHhmNywgeGcwCi0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlCi0gICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICAgICAgICAgIAotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCi0gICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCi0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKLSAgICAgICAgCi0gICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQotICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCi0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAKLSAgICAgICAgCi12Nl9pZGN0X3JvdyRfRgotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93czR0bzcgeDEvNAotICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2XSAgICAgIDsvLyBqMQotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2XSAgICAgIDsvLyA0Kmo3Ci0gICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTZdICAgICAgOy8vIGo1Ci0gICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTZdICAgICAgOy8vIGozCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyAyKmo3Ci0gICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo3ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3Ci0gICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMwotICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCi0gICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKLSAgICAgICAgCi0gICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KLSAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQotICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAotICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQotICAgICAgICAgICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAotICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80Ci0gICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgotICAgICAgICAKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMioxNl0gICAgICA7Ly8gajIKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNioxNl0gICAgICA7Ly8gMipqNgotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNwotICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKLSAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2Ci0gICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajYKLSAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM0KjE2XSAgICAgIDsvLyBqNAotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmNdLCAjNCAgICAgICAgIDsvLyBqMAotCi0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICAKLSAgICAgICAgQUREICAgICB4aTAsIHhpMCwgeGl0LCBMU0wgIzIgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0Ci0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMQotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgotICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKLSAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCi0gICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMwotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFNIQUREMTYgeGYzLCB4ZzMsIHhnNAotICAgICAgICBTSFNVQjE2IHhmNCwgeGczLCB4ZzQKLSAgICAgICAgU0hBREQxNiB4ZjIsIHhnMiwgeGc1Ci0gICAgICAgIFNIU1VCMTYgeGY1LCB4ZzIsIHhnNQotICAgICAgICBTSEFERDE2IHhmMSwgeGcxLCB4ZzYKLSAgICAgICAgU0hTVUIxNiB4ZjYsIHhnMSwgeGc2Ci0gICAgICAgIFNIQUREMTYgeGYwLCB4ZzAsIHhnNwotICAgICAgICBTSFNVQjE2IHhmNywgeGcwLCB4ZzcKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXR1cmF0ZQotICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgVVNBVDE2ICB4ZjAsICM4LCB4ZjAKLSAgICAgICAgICAgIFVTQVQxNiAgeGYxLCAjOCwgeGYxCi0gICAgICAgICAgICBVU0FUMTYgIHhmMiwgIzgsIHhmMgotICAgICAgICAgICAgVVNBVDE2ICB4ZjMsICM4LCB4ZjMKLSAgICAgICAgICAgIFVTQVQxNiAgeGY0LCAjOCwgeGY0Ci0gICAgICAgICAgICBVU0FUMTYgIHhmNSwgIzgsIHhmNQotICAgICAgICAgICAgVVNBVDE2ICB4ZjYsICM4LCB4ZjYKLSAgICAgICAgICAgIFVTQVQxNiAgeGY3LCAjOCwgeGY3ICAgICAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKLSAgICAgICAgICAgIFNTQVQxNiAgeGYwLCAjOSwgeGYwCi0gICAgICAgICAgICBTU0FUMTYgIHhmMSwgIzksIHhmMQotICAgICAgICAgICAgU1NBVDE2ICB4ZjIsICM5LCB4ZjIKLSAgICAgICAgICAgIFNTQVQxNiAgeGYzLCAjOSwgeGYzCi0gICAgICAgICAgICBTU0FUMTYgIHhmNCwgIzksIHhmNAotICAgICAgICAgICAgU1NBVDE2ICB4ZjUsICM5LCB4ZjUKLSAgICAgICAgICAgIFNTQVQxNiAgeGY2LCAjOSwgeGY2Ci0gICAgICAgICAgICBTU0FUMTYgIHhmNywgIzksIHhmNyAgICAgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRvIFJvdywgUGFjayBhbmQgc3RvcmUKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgIE9SUiAgICAgeGYwLCB4ZjAsIHhmMSwgTFNMICM4IDsvLyBbIGIxIGIwIGExIGEwIF0KLSAgICAgICAgICAgIE9SUiAgICAgeGYyLCB4ZjIsIHhmMywgTFNMICM4IDsvLyBbIGIzIGIyIGEzIGEyIF0KLSAgICAgICAgICAgIE9SUiAgICAgeGY0LCB4ZjQsIHhmNSwgTFNMICM4IDsvLyBbIGI1IGI0IGE1IGE0IF0KLSAgICAgICAgICAgIE9SUiAgICAgeGY2LCB4ZjYsIHhmNywgTFNMICM4IDsvLyBbIGI3IGI2IGE3IGE2IF0KLSAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjIsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYyLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGY0LCB4ZjYsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGY2LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzfQotICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9Ci0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpOkxPUjooIiRvdXRzaXplIj0iczE2IikgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgotICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAotICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3Rfcm93JF9GCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLQotCi0gICAgICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotU3JjMCAgICAgICAgICAgIEVRVSAgNyAgICAgICAgICAgICAgCi1TcmMxICAgICAgICAgICAgRVFVICA4ICAgICAgICAgICAgICAKLVNyYzIgICAgICAgICAgICBFUVUgIDkgICAgICAgICAgICAgIAotU3JjMyAgICAgICAgICAgIEVRVSAgMTAgICAgICAgICAgICAgIAotU3JjNCAgICAgICAgICAgIEVRVSAgMTEgICAgICAgICAgICAgIAotU3JjNSAgICAgICAgICAgIEVRVSAgMTIgICAgICAgICAgICAgIAotU3JjNiAgICAgICAgICAgIEVRVSAgMTMKLVNyYzcgICAgICAgICAgICBFUVUgIDE0Ci1UbXAgICAgICAgICAgICAgRVFVICAxNQotCi1xWGowICAgICAgICAgICAgUU4gU3JjMC5TMTYgCi1xWGoxICAgICAgICAgICAgUU4gU3JjMS5TMTYKLXFYajIgICAgICAgICAgICBRTiBTcmMyLlMxNgotcVhqMyAgICAgICAgICAgIFFOIFNyYzMuUzE2Ci1xWGo0ICAgICAgICAgICAgUU4gU3JjNC5TMTYKLXFYajUgICAgICAgICAgICBRTiBTcmM1LlMxNgotcVhqNiAgICAgICAgICAgIFFOIFNyYzYuUzE2Ci1xWGo3ICAgICAgICAgICAgUU4gU3JjNy5TMTYKLXFYanQgICAgICAgICAgICBRTiBUbXAuUzE2Ci0KLWRYajBsbyAgICAgICAgICBETiAoU3JjMCoyKS5TMTYKLWRYajBoaSAgICAgICAgICBETiAoU3JjMCoyKzEpLlMxNgotZFhqMWxvICAgICAgICAgIEROIChTcmMxKjIpLlMxNgotZFhqMWhpICAgICAgICAgIEROIChTcmMxKjIrMSkuUzE2Ci1kWGoybG8gICAgICAgICAgRE4gKFNyYzIqMikuUzE2Ci1kWGoyaGkgICAgICAgICAgRE4gKFNyYzIqMisxKS5TMTYKLWRYajNsbyAgICAgICAgICBETiAoU3JjMyoyKS5TMTYKLWRYajNoaSAgICAgICAgICBETiAoU3JjMyoyKzEpLlMxNgotZFhqNGxvICAgICAgICAgIEROIChTcmM0KjIpLlMxNgotZFhqNGhpICAgICAgICAgIEROIChTcmM0KjIrMSkuUzE2Ci1kWGo1bG8gICAgICAgICAgRE4gKFNyYzUqMikuUzE2Ci1kWGo1aGkgICAgICAgICAgRE4gKFNyYzUqMisxKS5TMTYKLWRYajZsbyAgICAgICAgICBETiAoU3JjNioyKS5TMTYKLWRYajZoaSAgICAgICAgICBETiAoU3JjNioyKzEpLlMxNgotZFhqN2xvICAgICAgICAgIEROIChTcmM3KjIpLlMxNgotZFhqN2hpICAgICAgICAgIEROIChTcmM3KjIrMSkuUzE2Ci1kWGp0bG8gICAgICAgICAgRE4gKFRtcCoyKS5TMTYKLWRYanRoaSAgICAgICAgICBETiAoVG1wKjIrMSkuUzE2Ci0KLXFYaTAgICAgICAgICAgICBRTiBxWGowCi1xWGkxICAgICAgICAgICAgUU4gcVhqNAotcVhpMiAgICAgICAgICAgIFFOIHFYajIKLXFYaTMgICAgICAgICAgICBRTiBxWGo3Ci1xWGk0ICAgICAgICAgICAgUU4gcVhqNQotcVhpNSAgICAgICAgICAgIFFOIHFYanQKLXFYaTYgICAgICAgICAgICBRTiBxWGoxCi1xWGk3ICAgICAgICAgICAgUU4gcVhqNgotcVhpdCAgICAgICAgICAgIFFOIHFYajMKLQotZFhpMGxvICAgICAgICAgIEROIGRYajBsbwotZFhpMGhpICAgICAgICAgIEROIGRYajBoaQotZFhpMWxvICAgICAgICAgIEROIGRYajRsbwotZFhpMWhpICAgICAgICAgIEROIGRYajRoaQotZFhpMmxvICAgICAgICAgIEROIGRYajJsbwotZFhpMmhpICAgICAgICAgIEROIGRYajJoaQotZFhpM2xvICAgICAgICAgIEROIGRYajdsbwotZFhpM2hpICAgICAgICAgIEROIGRYajdoaQotZFhpNGxvICAgICAgICAgIEROIGRYajVsbwotZFhpNGhpICAgICAgICAgIEROIGRYajVoaQotZFhpNWxvICAgICAgICAgIEROIGRYanRsbwotZFhpNWhpICAgICAgICAgIEROIGRYanRoaQotZFhpNmxvICAgICAgICAgIEROIGRYajFsbwotZFhpNmhpICAgICAgICAgIEROIGRYajFoaQotZFhpN2xvICAgICAgICAgIEROIGRYajZsbwotZFhpN2hpICAgICAgICAgIEROIGRYajZoaQotZFhpdGxvICAgICAgICAgIEROIGRYajNsbwotZFhpdGhpICAgICAgICAgIEROIGRYajNoaQotCi1xWGgwICAgICAgICAgICAgUU4gcVhpdAotcVhoMSAgICAgICAgICAgIFFOIHFYaTAKLXFYaDIgICAgICAgICAgICBRTiBxWGkyCi1xWGgzICAgICAgICAgICAgUU4gcVhpMwotcVhoNCAgICAgICAgICAgIFFOIHFYaTcKLXFYaDUgICAgICAgICAgICBRTiBxWGk1Ci1xWGg2ICAgICAgICAgICAgUU4gcVhpNAotcVhoNyAgICAgICAgICAgIFFOIHFYaTEKLXFYaHQgICAgICAgICAgICBRTiBxWGk2Ci0KLWRYaDBsbyAgICAgICAgICBETiBkWGl0bG8KLWRYaDBoaSAgICAgICAgICBETiBkWGl0aGkKLWRYaDFsbyAgICAgICAgICBETiBkWGkwbG8KLWRYaDFoaSAgICAgICAgICBETiBkWGkwaGkKLWRYaDJsbyAgICAgICAgICBETiBkWGkybG8KLWRYaDJoaSAgICAgICAgICBETiBkWGkyaGkKLWRYaDNsbyAgICAgICAgICBETiBkWGkzbG8KLWRYaDNoaSAgICAgICAgICBETiBkWGkzaGkKLWRYaDRsbyAgICAgICAgICBETiBkWGk3bG8KLWRYaDRoaSAgICAgICAgICBETiBkWGk3aGkKLWRYaDVsbyAgICAgICAgICBETiBkWGk1bG8KLWRYaDVoaSAgICAgICAgICBETiBkWGk1aGkKLWRYaDZsbyAgICAgICAgICBETiBkWGk0bG8KLWRYaDZoaSAgICAgICAgICBETiBkWGk0aGkKLWRYaDdsbyAgICAgICAgICBETiBkWGkxbG8KLWRYaDdoaSAgICAgICAgICBETiBkWGkxaGkKLWRYaHRsbyAgICAgICAgICBETiBkWGk2bG8KLWRYaHRoaSAgICAgICAgICBETiBkWGk2aGkKLQotcVhnMCAgICAgICAgICAgIFFOIHFYaDIKLXFYZzEgICAgICAgICAgICBRTiBxWGh0Ci1xWGcyICAgICAgICAgICAgUU4gcVhoMQotcVhnMyAgICAgICAgICAgIFFOIHFYaDAKLXFYZzQgICAgICAgICAgICBRTiBxWGg0Ci1xWGc1ICAgICAgICAgICAgUU4gcVhoNQotcVhnNiAgICAgICAgICAgIFFOIHFYaDYKLXFYZzcgICAgICAgICAgICBRTiBxWGg3Ci1xWGd0ICAgICAgICAgICAgUU4gcVhoMwotCi1xWGYwICAgICAgICAgICAgUU4gcVhnNgotcVhmMSAgICAgICAgICAgIFFOIHFYZzUKLXFYZjIgICAgICAgICAgICBRTiBxWGc0Ci1xWGYzICAgICAgICAgICAgUU4gcVhndAotcVhmNCAgICAgICAgICAgIFFOIHFYZzMKLXFYZjUgICAgICAgICAgICBRTiBxWGcyCi1xWGY2ICAgICAgICAgICAgUU4gcVhnMQotcVhmNyAgICAgICAgICAgIFFOIHFYZzAKLXFYZnQgICAgICAgICAgICBRTiBxWGc3Ci0KLQotcVh0MCAgICAgICAgICAgIFFOIDEuUzMyCi1xWHQxICAgICAgICAgICAgUU4gMi5TMzIKLXFUMGxvICAgICAgICAgICBRTiAxLlMzMiAgICAgICAgIAotcVQwaGkgICAgICAgICAgIFFOIDIuUzMyICAgICAgICAgCi1xVDFsbyAgICAgICAgICAgUU4gMy5TMzIgICAgICAgICAKLXFUMWhpICAgICAgICAgICBRTiA0LlMzMiAgICAgICAgIAotcVNjYWxlbG8gICAgICAgIFFOIDUuUzMyICAgICAgICA7Ly8gdXNlZCB0byByZWFkIHBvc3Qgc2NhbGUgdmFsdWVzCi1xU2NhbGVoaSAgICAgICAgUU4gNi5TMzIKLXFUZW1wMCAgICAgICAgICBRTiA1LlMzMiAgICAgICAgIAotcVRlbXAxICAgICAgICAgIFFOIDYuUzMyICAgIAotCi0KLVNjYWxlMSAgICAgICAgICBFUVUgNgotU2NhbGUyICAgICAgICAgIEVRVSAxNQotcVNjYWxlMSAgICAgICAgIFFOIFNjYWxlMS5TMTYgICAgIAotcVNjYWxlMiAgICAgICAgIFFOIFNjYWxlMi5TMTYgICAgIAotZFNjYWxlMWxvICAgICAgIEROIChTY2FsZTEqMikuUzE2ICAgICAKLWRTY2FsZTFoaSAgICAgICBETiAoU2NhbGUxKjIrMSkuUzE2Ci1kU2NhbGUybG8gICAgICAgRE4gKFNjYWxlMioyKS5TMTYgICAgIAotZFNjYWxlMmhpICAgICAgIEROIChTY2FsZTIqMisxKS5TMTYKLQotZENvZWZzICAgICAgICAgIEROIDAuUzE2ICAgICAgICA7Ly8gU2NhbGUgY29lZmZpY2llbnRzIGluIGZvcm1hdCB7WzBdIFtDXSBbU10gW0ludlNxcnQyXX0KLUludlNxcnQyICAgICAgICBETiBkQ29lZnNbMF0gICAgOy8vIDEvc3FydCgyKSBpbiBRMTUKLVMgICAgICAgICAgICAgICBETiBkQ29lZnNbMV0gICAgOy8vIFNpbihQSS84KSBpbiBRMTUKLUMgICAgICAgICAgICAgICBETiBkQ29lZnNbMl0gICAgOy8vIENvcyhQSS84KSBpbiBRMTUKLQotcFRlbXAgICAgICAgICAgIFJOIDEyCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgSU1QT1JUICBhcm1DT01NX0lEQ1RDb2VmCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7cVhqMCxxWGoxfSwgW3BTcmMgQDY0XSEKLSAgICAgICAgVkxEMSAgICAgICAge3FYajIscVhqM30sIFtwU3JjIEA2NF0hCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGo0LHFYajV9LCBbcFNyYyBANjRdIQotICAgICAgICBWTEQxICAgICAgICB7cVhqNixxWGo3fSwgW3BTcmMgQDY0XSEKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFByZVNjYWxlIGFuZCBtdWx0aXBseSB3aXRoIFNyYwotICAgICAgICA7Ly8gSVN0YWdlIDQKLSAgICAgICAgCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE2WDE2IE11bAotICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDMyWDMyICx1bAotICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gSVN0YWdlIDMKLSAgICAgICAgVlFSRE1VTEggICAgIHFYaTIsIHFYaTIsIEludlNxcnQyICAgICAgICAgICAgOy8vIGkyL3NxcnQoMikKLSAgICAgICAgVkhBREQgICAgICAgcVhoMCwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwK2kxKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFYaDEsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMC1pMSkvMgotICAgICAgICBWSEFERCAgICAgICBxWGg3LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgVlNVQiAgICAgICAgcVhoNSwgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIFZRUkRNVUxIICAgICBxWGg1LCBxWGg1LCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBoNS9zcXJ0KDIpCi0gICAgICAgIFZTVUIgICAgICAgIHFYaDIsIHFYaTIsIHFYaTMgICAgICAgICAgICAgICAgOy8vIGgyLCBoMwotCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTRsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTQKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFhpNmxvLCBTICAgICAgICAgICAgICAgICA7Ly8gYyppNCtzKmk2Ci0gICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTRoaSwgQwotICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWGk2aGksIFMKLSAgICAgICAgVlNIUk4gICAgICAgZFhoNGxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDQKLSAgICAgICAgVlNIUk4gICAgICAgZFhoNGhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTZsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTYKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFhpNGxvLCBTICAgICAgICAgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2Ci0gICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTZoaSwgQwotICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWGk0aGksIFMKLSAgICAgICAgVlNIUk4gICAgICAgZFhoNmxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDYKLSAgICAgICAgVlNIUk4gICAgICAgZFhoNmhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMgotICAgICAgICBWU1VCICAgICAgICBxWGc2LCBxWGg2LCBxWGg3Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZzUsIHFYaDUsIHFYZzYKLSAgICAgICAgVlNVQiAgICAgICAgcVhnNCwgcVhoNCwgcVhnNQotICAgICAgICBWSEFERCAgICAgICBxWGcxLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxK2gyKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFYZzIsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKLSAgICAgICAgVkhBREQgICAgICAgcVhnMCwgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMCtoMykvMgotICAgICAgICBWSFNVQiAgICAgICBxWGczLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwLWgzKS8yCi0KLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFZBREQgICAgICAgIHFYZjMsIHFYZzMsIHFYZzQgICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBxWGY0LCBxWGczLCBxWGc0ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMiwgcVhnMiwgcVhnNSAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIHFYZjUsIHFYZzIsIHFYZzUgICAgICAgIAotICAgICAgICBWQUREICAgICAgICBxWGYxLCBxWGcxLCBxWGc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZjYsIHFYZzEsIHFYZzYgICAgICAgIAotICAgICAgICBWQUREICAgICAgICBxWGYwLCBxWGcwLCBxWGc3Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZjcsIHFYZzAsIHFYZzcgICAgICAKLQotICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAotWFRSMCAgICAgICAgICAgIEVRVSBTcmM1Ci1YVFIxICAgICAgICAgICAgRVFVIFRtcAotWFRSMiAgICAgICAgICAgIEVRVSBTcmM2Ci1YVFIzICAgICAgICAgICAgRVFVIFNyYzcKLVhUUjQgICAgICAgICAgICBFUVUgU3JjMwotWFRSNSAgICAgICAgICAgIEVRVSBTcmMwCi1YVFI2ICAgICAgICAgICAgRVFVIFNyYzEKLVhUUjcgICAgICAgICAgICBFUVUgU3JjMgotWFRSdCAgICAgICAgICAgIEVRVSBTcmM0Ci0gICAgICAgICAgICAgICAgCi1xQTAgICAgICAgICAgICAgUU4gIFhUUjAuUzMyICA7Ly8gZm9yIFhUUnBvc2UKLXFBMSAgICAgICAgICAgICBRTiAgWFRSMS5TMzIKLXFBMiAgICAgICAgICAgICBRTiAgWFRSMi5TMzIKLXFBMyAgICAgICAgICAgICBRTiAgWFRSMy5TMzIKLXFBNCAgICAgICAgICAgICBRTiAgWFRSNC5TMzIKLXFBNSAgICAgICAgICAgICBRTiAgWFRSNS5TMzIKLXFBNiAgICAgICAgICAgICBRTiAgWFRSNi5TMzIKLXFBNyAgICAgICAgICAgICBRTiAgWFRSNy5TMzIKLQotZEIwICAgICAgICAgICAgIEROICBYVFIwKjIrMSAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAotZEIxICAgICAgICAgICAgIEROICBYVFIxKjIrMQotZEIyICAgICAgICAgICAgIEROICBYVFIyKjIrMQotZEIzICAgICAgICAgICAgIEROICBYVFIzKjIrMQotZEI0ICAgICAgICAgICAgIEROICBYVFI0KjIKLWRCNSAgICAgICAgICAgICBETiAgWFRSNSoyCi1kQjYgICAgICAgICAgICAgRE4gIFhUUjYqMgotZEI3ICAgICAgICAgICAgIEROICBYVFI3KjIKLQotICAgICAgICAgIAotICAgICAgICBWVFJOICAgICAgICBxWGYwLCBxWGYxCi0gICAgICAgIFZUUk4gICAgICAgIHFYZjIsIHFYZjMKLSAgICAgICAgVlRSTiAgICAgICAgcVhmNCwgcVhmNQotICAgICAgICBWVFJOICAgICAgICBxWGY2LCBxWGY3Ci0gICAgICAgIFZUUk4gICAgICAgIHFBMCwgcUEyCi0gICAgICAgIFZUUk4gICAgICAgIHFBMSwgcUEzCi0gICAgICAgIFZUUk4gICAgICAgIHFBNCwgcUE2Ci0gICAgICAgIFZUUk4gICAgICAgIHFBNSwgcUE3ICAgICAgICAKLSAgICAgICAgVlNXUCAgICAgICAgZEIwLCBkQjQKLSAgICAgICAgVlNXUCAgICAgICAgZEIxLCBkQjUKLSAgICAgICAgVlNXUCAgICAgICAgZEIyLCBkQjYKLSAgICAgICAgVlNXUCAgICAgICAgZEIzLCBkQjcKLSAgICAgICAgCi0KLXFZajAgICAgICAgICAgICBRTiBxWGYwCi1xWWoxICAgICAgICAgICAgUU4gcVhmMQotcVlqMiAgICAgICAgICAgIFFOIHFYZjIKLXFZajMgICAgICAgICAgICBRTiBxWGYzCi1xWWo0ICAgICAgICAgICAgUU4gcVhmNAotcVlqNSAgICAgICAgICAgIFFOIHFYZjUKLXFZajYgICAgICAgICAgICBRTiBxWGY2Ci1xWWo3ICAgICAgICAgICAgUU4gcVhmNwotcVlqdCAgICAgICAgICAgIFFOIHFYZnQKLQotZFlqMGxvICAgICAgICAgIEROIChYVFIwKjIpLlMxNgotZFlqMGhpICAgICAgICAgIEROIChYVFIwKjIrMSkuUzE2Ci1kWWoxbG8gICAgICAgICAgRE4gKFhUUjEqMikuUzE2Ci1kWWoxaGkgICAgICAgICAgRE4gKFhUUjEqMisxKS5TMTYKLWRZajJsbyAgICAgICAgICBETiAoWFRSMioyKS5TMTYKLWRZajJoaSAgICAgICAgICBETiAoWFRSMioyKzEpLlMxNgotZFlqM2xvICAgICAgICAgIEROIChYVFIzKjIpLlMxNgotZFlqM2hpICAgICAgICAgIEROIChYVFIzKjIrMSkuUzE2Ci1kWWo0bG8gICAgICAgICAgRE4gKFhUUjQqMikuUzE2Ci1kWWo0aGkgICAgICAgICAgRE4gKFhUUjQqMisxKS5TMTYKLWRZajVsbyAgICAgICAgICBETiAoWFRSNSoyKS5TMTYKLWRZajVoaSAgICAgICAgICBETiAoWFRSNSoyKzEpLlMxNgotZFlqNmxvICAgICAgICAgIEROIChYVFI2KjIpLlMxNgotZFlqNmhpICAgICAgICAgIEROIChYVFI2KjIrMSkuUzE2Ci1kWWo3bG8gICAgICAgICAgRE4gKFhUUjcqMikuUzE2Ci1kWWo3aGkgICAgICAgICAgRE4gKFhUUjcqMisxKS5TMTYKLWRZanRsbyAgICAgICAgICBETiAoWFRSdCoyKS5TMTYKLWRZanRoaSAgICAgICAgICBETiAoWFRSdCoyKzEpLlMxNgotCi1xWWkwICAgICAgICAgICAgUU4gcVlqMAotcVlpMSAgICAgICAgICAgIFFOIHFZajQKLXFZaTIgICAgICAgICAgICBRTiBxWWoyCi1xWWkzICAgICAgICAgICAgUU4gcVlqNwotcVlpNCAgICAgICAgICAgIFFOIHFZajUKLXFZaTUgICAgICAgICAgICBRTiBxWWp0Ci1xWWk2ICAgICAgICAgICAgUU4gcVlqMQotcVlpNyAgICAgICAgICAgIFFOIHFZajYKLXFZaXQgICAgICAgICAgICBRTiBxWWozCi0KLWRZaTBsbyAgICAgICAgICBETiBkWWowbG8KLWRZaTBoaSAgICAgICAgICBETiBkWWowaGkKLWRZaTFsbyAgICAgICAgICBETiBkWWo0bG8KLWRZaTFoaSAgICAgICAgICBETiBkWWo0aGkKLWRZaTJsbyAgICAgICAgICBETiBkWWoybG8KLWRZaTJoaSAgICAgICAgICBETiBkWWoyaGkKLWRZaTNsbyAgICAgICAgICBETiBkWWo3bG8KLWRZaTNoaSAgICAgICAgICBETiBkWWo3aGkKLWRZaTRsbyAgICAgICAgICBETiBkWWo1bG8KLWRZaTRoaSAgICAgICAgICBETiBkWWo1aGkKLWRZaTVsbyAgICAgICAgICBETiBkWWp0bG8KLWRZaTVoaSAgICAgICAgICBETiBkWWp0aGkKLWRZaTZsbyAgICAgICAgICBETiBkWWoxbG8KLWRZaTZoaSAgICAgICAgICBETiBkWWoxaGkKLWRZaTdsbyAgICAgICAgICBETiBkWWo2bG8KLWRZaTdoaSAgICAgICAgICBETiBkWWo2aGkKLWRZaXRsbyAgICAgICAgICBETiBkWWozbG8KLWRZaXRoaSAgICAgICAgICBETiBkWWozaGkKLQotcVloMCAgICAgICAgICAgIFFOIHFZaXQKLXFZaDEgICAgICAgICAgICBRTiBxWWkwCi1xWWgyICAgICAgICAgICAgUU4gcVlpMgotcVloMyAgICAgICAgICAgIFFOIHFZaTMKLXFZaDQgICAgICAgICAgICBRTiBxWWk3Ci1xWWg1ICAgICAgICAgICAgUU4gcVlpNQotcVloNiAgICAgICAgICAgIFFOIHFZaTQKLXFZaDcgICAgICAgICAgICBRTiBxWWkxCi1xWWh0ICAgICAgICAgICAgUU4gcVlpNgotCi1kWWgwbG8gICAgICAgICAgRE4gZFlpdGxvCi1kWWgwaGkgICAgICAgICAgRE4gZFlpdGhpCi1kWWgxbG8gICAgICAgICAgRE4gZFlpMGxvCi1kWWgxaGkgICAgICAgICAgRE4gZFlpMGhpCi1kWWgybG8gICAgICAgICAgRE4gZFlpMmxvCi1kWWgyaGkgICAgICAgICAgRE4gZFlpMmhpCi1kWWgzbG8gICAgICAgICAgRE4gZFlpM2xvCi1kWWgzaGkgICAgICAgICAgRE4gZFlpM2hpCi1kWWg0bG8gICAgICAgICAgRE4gZFlpN2xvCi1kWWg0aGkgICAgICAgICAgRE4gZFlpN2hpCi1kWWg1bG8gICAgICAgICAgRE4gZFlpNWxvCi1kWWg1aGkgICAgICAgICAgRE4gZFlpNWhpCi1kWWg2bG8gICAgICAgICAgRE4gZFlpNGxvCi1kWWg2aGkgICAgICAgICAgRE4gZFlpNGhpCi1kWWg3bG8gICAgICAgICAgRE4gZFlpMWxvCi1kWWg3aGkgICAgICAgICAgRE4gZFlpMWhpCi1kWWh0bG8gICAgICAgICAgRE4gZFlpNmxvCi1kWWh0aGkgICAgICAgICAgRE4gZFlpNmhpCi0KLXFZZzAgICAgICAgICAgICBRTiBxWWgyCi1xWWcxICAgICAgICAgICAgUU4gcVlodAotcVlnMiAgICAgICAgICAgIFFOIHFZaDEKLXFZZzMgICAgICAgICAgICBRTiBxWWgwCi1xWWc0ICAgICAgICAgICAgUU4gcVloNAotcVlnNSAgICAgICAgICAgIFFOIHFZaDUKLXFZZzYgICAgICAgICAgICBRTiBxWWg2Ci1xWWc3ICAgICAgICAgICAgUU4gcVloNwotcVlndCAgICAgICAgICAgIFFOIHFZaDMKLQotcVlmMCAgICAgICAgICAgIFFOIHFZZzYKLXFZZjEgICAgICAgICAgICBRTiBxWWc1Ci1xWWYyICAgICAgICAgICAgUU4gcVlnNAotcVlmMyAgICAgICAgICAgIFFOIHFZZ3QKLXFZZjQgICAgICAgICAgICBRTiBxWWczCi1xWWY1ICAgICAgICAgICAgUU4gcVlnMgotcVlmNiAgICAgICAgICAgIFFOIHFZZzEKLXFZZjcgICAgICAgICAgICBRTiBxWWcwCi1xWWZ0ICAgICAgICAgICAgUU4gcVlnNwotCi0gICAgICAgIFZSU0hSICAgICAgIHFZajcsIHFZajcsICMyCi0gICAgICAgIFZSU0hSICAgICAgIHFZajYsIHFZajYsICMxCi0gICAgICAgIAotICAgICAgICBWSEFERCAgICAgICBxWWk1LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTUgPSAoajErajcpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVlpNiwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk2ID0gajEtajcKLSAgICAgICAgVkhBREQgICAgICAgcVlpMywgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkzID0gKGoyK2o2KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaTIsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMiA9IGoyLWo2Ci0gICAgICAgIFZIQUREICAgICAgIHFZaTcsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNyA9IChqNStqMykvMgotICAgICAgICBWU1VCICAgICAgICBxWWk0LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTQgPSBqNS1qMwotCi0gICAgICAgIFZRUkRNVUxIICAgICBxWWkyLCBxWWkyLCBJbnZTcXJ0MiAgICA7Ly8gaTIvc3FydCgyKQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBUZW1wLCAjMHg0ICAgICAgICAgICAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAotICAgICAgICBWRFVQICAgICAgICBxU2NhbGUxLCBwVGVtcCAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAotICAgICAgICBWQUREICAgICAgICBxWWkwLCBxWWkwLCBxU2NhbGUxCi0gICAgICAgIAotICAgICAgICBWSEFERCAgICAgICBxWWgwLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwK2kxKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFZaDEsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAtaTEpLzIKLQotICAgICAgICBWSEFERCAgICAgICBxWWg3LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgIFZTVUIgICAgICAgIHFZaDUsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVloMiwgcVlpMiwgcVlpMyAgICAgICAgOy8vIGgyLCBoMwotICAgICAgICBWUVJETVVMSCAgICAgcVloNSwgcVloNSwgSW52U3FydDIgICAgOy8vIGg1L3NxcnQoMikKLQotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk0bG8sIEMgICAgICAgICA7Ly8gYyppNAotICAgICAgICBWTUxBTCAgICAgICBxWHQwLCBkWWk2bG8sIFMgICAgICAgICA7Ly8gYyppNCtzKmk2Ci0gICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTRoaSwgQwotICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWWk2aGksIFMKLSAgICAgICAgVlNIUk4gICAgICAgZFloNGxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg0Ci0gICAgICAgIFZTSFJOICAgICAgIGRZaDRoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk2bG8sIEMgICAgICAgICA7Ly8gYyppNgotICAgICAgICBWTUxTTCAgICAgICBxWHQwLCBkWWk0bG8sIFMgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2Ci0gICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTZoaSwgQwotICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWWk0aGksIFMKLSAgICAgICAgVlNIUk4gICAgICAgZFloNmxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg2Ci0gICAgICAgIFZTSFJOICAgICAgIGRZaDZoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBxWWc2LCBxWWg2LCBxWWg3Ci0gICAgICAgIFZTVUIgICAgICAgIHFZZzUsIHFZaDUsIHFZZzYKLSAgICAgICAgVlNVQiAgICAgICAgcVlnNCwgcVloNCwgcVlnNQotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBWSEFERCAgICAgICBxWWcxLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxK2gyKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFZZzIsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKLSAgICAgICAgVkhBREQgICAgICAgcVlnMCwgcVloMCwgcVloMyAgICAgICAgOy8vIChoMCtoMykvMgotICAgICAgICBWSFNVQiAgICAgICBxWWczLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwLWgzKS8yCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBWSEFERCAgICAgICAgcVlmMywgcVlnMywgcVlnNCAgICAgICAgCi0gICAgICAgIFZIU1VCICAgICAgICBxWWY0LCBxWWczLCBxWWc0ICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjIsIHFZZzIsIHFZZzUgICAgICAgIAotICAgICAgICBWSFNVQiAgICAgICAgcVlmNSwgcVlnMiwgcVlnNSAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgICBxWWYxLCBxWWcxLCBxWWc2Ci0gICAgICAgIFZIU1VCICAgICAgICBxWWY2LCBxWWcxLCBxWWc2ICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjAsIHFZZzAsIHFZZzcKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjcsIHFZZzAsIHFZZzcgICAgICAKLQotWVRSMCAgICAgICAgICAgIEVRVSBTcmMwCi1ZVFIxICAgICAgICAgICAgRVFVIFNyYzQKLVlUUjIgICAgICAgICAgICBFUVUgU3JjMQotWVRSMyAgICAgICAgICAgIEVRVSBTcmMyCi1ZVFI0ICAgICAgICAgICAgRVFVIFNyYzcKLVlUUjUgICAgICAgICAgICBFUVUgU3JjNQotWVRSNiAgICAgICAgICAgIEVRVSBUbXAKLVlUUjcgICAgICAgICAgICBFUVUgU3JjNgotWVRSdCAgICAgICAgICAgIEVRVSBTcmMzCi0KLXFDMCAgICAgICAgICAgICBRTiAgWVRSMC5TMzIgICAgICAgICAgICAgICAgOy8vIGZvciBZVFJwb3NlCi1xQzEgICAgICAgICAgICAgUU4gIFlUUjEuUzMyCi1xQzIgICAgICAgICAgICAgUU4gIFlUUjIuUzMyCi1xQzMgICAgICAgICAgICAgUU4gIFlUUjMuUzMyCi1xQzQgICAgICAgICAgICAgUU4gIFlUUjQuUzMyCi1xQzUgICAgICAgICAgICAgUU4gIFlUUjUuUzMyCi1xQzYgICAgICAgICAgICAgUU4gIFlUUjYuUzMyCi1xQzcgICAgICAgICAgICAgUU4gIFlUUjcuUzMyCi0KLWREMCAgICAgICAgICAgICBETiAgWVRSMCoyKzEgICAgICAgICAgICAgICAgOy8vIGZvciB1c2luZyBWU1dQCi1kRDEgICAgICAgICAgICAgRE4gIFlUUjEqMisxCi1kRDIgICAgICAgICAgICAgRE4gIFlUUjIqMisxCi1kRDMgICAgICAgICAgICAgRE4gIFlUUjMqMisxCi1kRDQgICAgICAgICAgICAgRE4gIFlUUjQqMgotZEQ1ICAgICAgICAgICAgIEROICBZVFI1KjIKLWRENiAgICAgICAgICAgICBETiAgWVRSNioyCi1kRDcgICAgICAgICAgICAgRE4gIFlUUjcqMgotICAgICAgICAgIAotICAgICAgICBWVFJOICAgICAgICBxWWYwLCBxWWYxCi0gICAgICAgIFZUUk4gICAgICAgIHFZZjIsIHFZZjMKLSAgICAgICAgVlRSTiAgICAgICAgcVlmNCwgcVlmNQotICAgICAgICBWVFJOICAgICAgICBxWWY2LCBxWWY3Ci0gICAgICAgIFZUUk4gICAgICAgIHFDMCwgcUMyCi0gICAgICAgIFZUUk4gICAgICAgIHFDMSwgcUMzCi0gICAgICAgIFZUUk4gICAgICAgIHFDNCwgcUM2Ci0gICAgICAgIFZUUk4gICAgICAgIHFDNSwgcUM3ICAgICAgICAKLSAgICAgICAgVlNXUCAgICAgICAgZEQwLCBkRDQKLSAgICAgICAgVlNXUCAgICAgICAgZEQxLCBkRDUKLSAgICAgICAgVlNXUCAgICAgICAgZEQyLCBkRDYKLSAgICAgICAgVlNXUCAgICAgICAgZEQzLCBkRDcKLQotICAgICAgICAKLWRZZjBVOCAgICAgICAgICBETiBZVFIwKjIuVTgKLWRZZjFVOCAgICAgICAgICBETiBZVFIxKjIuVTgKLWRZZjJVOCAgICAgICAgICBETiBZVFIyKjIuVTgKLWRZZjNVOCAgICAgICAgICBETiBZVFIzKjIuVTgKLWRZZjRVOCAgICAgICAgICBETiBZVFI0KjIuVTgKLWRZZjVVOCAgICAgICAgICBETiBZVFI1KjIuVTgKLWRZZjZVOCAgICAgICAgICBETiBZVFI2KjIuVTgKLWRZZjdVOCAgICAgICAgICBETiBZVFI3KjIuVTgKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRG8gc2F0dXJhdGlvbiBpZiBvdXRzaXplIGlzIG90aGVyIHRoYW4gUzE2Ci0gICAgICAgIDsvLwotICAgICAgICAKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWzAtMjU1XQotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMFU4LCBxWWYwCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYxVTgsIHFZZjEKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjJVOCwgcVlmMgotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmM1U4LCBxWWYzCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY0VTgsIHFZZjQKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjVVOCwgcVlmNQotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNlU4LCBxWWY2Ci0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY3VTgsIHFZZjcKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCi0gICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFstMjU2IHRvICsyNTVdCi0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gU3RvcmUgb3V0cHV0IGRlcGVuZGluZyBvbiB0aGUgU3RyaWRlIHNpemUKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0gICAgICAgICAgICAKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYwVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjFVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMlU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYzVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjRVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNVU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY2VTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjdVOCwgW3BEZXN0IEA2NF0KLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICA7Ly8gKCIkb3V0c2l6ZSI9InM5Iikgb3IgKCIkb3V0c2l6ZSI9InMxNiIpCi0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ESUYKLQotCi0KLSAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4Ci0KLQotCi0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIDsvLyBTY2FsZSBUV08gaW5wdXQgcm93cyB3aXRoIFRXTyByb3dzIG9mIDE2IGJpdCBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgTV9JRENUX1BSRVNDQUxFMTYgdG8gcHJlLXNjYWxlIG9uZSByb3cKLSAgICAgICAgOy8vIGlucHV0IChFaWdodCBpbnB1dCB2YWx1ZXMpIHdpdGggb25lIHJvdyBvZiBzY2FsZSB2YWx1ZXMuIEFsc28gCi0gICAgICAgIDsvLyBMb2FkcyBuZXh0IHNjYWxlIHZhbHVlcyBmcm9tIHBTY2FsZSwgaWYgJExhc3RSb3cgZmxhZyBpcyBub3Qgc2V0LgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCi0gICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KLSAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQotICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLyBxVDBsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gcVQwaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIHFUMWxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBxVDFoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gZFNjYWxlMWxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KLSAgICAgICAgOy8vIGRTY2FsZTFoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCi0gICAgICAgIDsvLyBkU2NhbGUybG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCi0gICAgICAgIDsvLyBkU2NhbGUyaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgRmxhZwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRMYXN0Um93ICAgICAgICAtIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjdXJyZW50IHJvdyBpcyBsYXN0IHJvdwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKQotICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4pCi0gICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4rMSkKLSAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCi0gICAgICAgIDsvLyBxU2NhbGUxICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93Ci0gICAgICAgIDsvLyBxU2NhbGUyICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93KzEKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1RfU0NBTEUxNiAkZEFsbywgJGRBaGksICRkQmxvLCAkZEJoaSwgJExhc3RSb3cKLSAgICAgICAgVk1VTEwgICAgICAgcVQwbG8sICRkQWxvLCBkU2NhbGUxbG8KLSAgICAgICAgVk1VTEwgICAgICAgcVQwaGksICRkQWhpLCBkU2NhbGUxaGkKLSAgICAgICAgVk1VTEwgICAgICAgcVQxbG8sICRkQmxvLCBkU2NhbGUybG8KLSAgICAgICAgVk1VTEwgICAgICAgcVQxaGksICRkQmhpLCBkU2NhbGUyaGkKLSAgICAgICAgSUYgIiRMYXN0Um93Ij0iMCIKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisxCi0gICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMgotICAgICAgICBFTkRJRgotICAgICAgICBWUVJTSFJOICAgICAgICRkQWxvLCBxVDBsbywgIzEyICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEFoaSwgcVQwaGksICMxMiAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRCbG8sIHFUMWxvLCAjMTIgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICAgICRkQmhpLCBxVDFoaSwgIzEyICAgICAgICAKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMTYgYml0IHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgotICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBxWGluICAgICAgICAgICAgLSBuIHRoIG91dHB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgotICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAotICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGowbG8sIGRYajBoaSwgZFhqMWxvLCBkWGoxaGksIDAgICAgICAgIDsvLyBQcmUgc2NhbGUgcm93IDAgJiAxCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajJsbywgZFhqMmhpLCBkWGozbG8sIGRYajNoaSwgMCAgICAgICAgCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajRsbywgZFhqNGhpLCBkWGo1bG8sIGRYajVoaSwgMCAgICAgICAgCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajZsbywgZFhqNmhpLCBkWGo3bG8sIGRYajdoaSwgMSAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgIHFYaTUsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFYaTYsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gajEtajcKLSAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICBWSEFERCAgICAgICBxWGkzLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICBWU1VCICAgICAgICBxWGkyLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIGoyLWo2Ci0gICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgIFZIQUREICAgICAgIHFYaTcsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFYaTQsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gajUtajMKLSAgICAgICAgTUVORCAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDMyIGJpdCBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KLSAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIDMyYml0IHNjYWxlIHZhbHVlcyBpbiBRMjMgZm9ybWF0Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBkWGlubG8gICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKLSAgICAgICAgOy8vIGRYaW5oaSAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgotcVNjYWxlMGxvICAgICAgIFFOIDAuUzMyCi1xU2NhbGUwaGkgICAgICAgUU4gMS5TMzIKLXFTY2FsZTFsbyAgICAgICBRTiAyLlMzMgotcVNjYWxlMWhpICAgICAgIFFOIDMuUzMyCi1xU2NhbGUybG8gICAgICAgUU4gcVNjYWxlMWxvCi1xU2NhbGUyaGkgICAgICAgUU4gcVNjYWxlMWhpCi1xU2NhbGUzbG8gICAgICAgUU4gcVNjYWxlMWxvCi1xU2NhbGUzaGkgICAgICAgUU4gcVNjYWxlMWhpCi1xU2NhbGU0bG8gICAgICAgUU4gcVNjYWxlMWxvCi1xU2NhbGU0aGkgICAgICAgUU4gcVNjYWxlMWhpCi1xU2NhbGU1bG8gICAgICAgUU4gcVNjYWxlMGxvCi1xU2NhbGU1aGkgICAgICAgUU4gcVNjYWxlMGhpCi1xU2NhbGU2bG8gICAgICAgUU4gcVNjYWxlMGxvCi1xU2NhbGU2aGkgICAgICAgUU4gcVNjYWxlMGhpCi1xU2NhbGU3bG8gICAgICAgUU4gcVNjYWxlMGxvCi1xU2NhbGU3aGkgICAgICAgUU4gcVNjYWxlMGhpCi0KLXFTcmMwbG8gICAgICAgICBRTiA0LlMzMgotcVNyYzBoaSAgICAgICAgIFFOIDUuUzMyCi1xU3JjMWxvICAgICAgICAgUU4gNi5TMzIKLXFTcmMxaGkgICAgICAgICBRTiBTcmM0LlMzMgotcVNyYzJsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmMyaGkgICAgICAgICBRTiBxU3JjMGhpCi1xU3JjM2xvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzNoaSAgICAgICAgIFFOIHFTcmMwaGkKLXFTcmM0bG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjNGhpICAgICAgICAgUU4gcVNyYzBoaQotcVNyYzVsbyAgICAgICAgIFFOIHFTcmMxbG8KLXFTcmM1aGkgICAgICAgICBRTiBxU3JjMWhpCi1xU3JjNmxvICAgICAgICAgUU4gcVNyYzFsbwotcVNyYzZoaSAgICAgICAgIFFOIHFTcmMxaGkKLXFTcmM3bG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjN2hpICAgICAgICAgUU4gcVNyYzBoaQotCi1xUmVzMTdsbyAgICAgICAgUU4gcVNjYWxlMGxvCi1xUmVzMTdoaSAgICAgICAgUU4gcVNjYWxlMGhpCi1xUmVzMjZsbyAgICAgICAgUU4gcVNjYWxlMGxvCi1xUmVzMjZoaSAgICAgICAgUU4gcVNjYWxlMGhpCi1xUmVzNTNsbyAgICAgICAgUU4gcVNjYWxlMGxvCi1xUmVzNTNoaSAgICAgICAgUU4gcVNjYWxlMGhpCi0KLSAgICAgICAgICAgIEFERCAgICAgICAgIHBUZW1wLCBwU2NhbGUsICM0KjgqNyAgICAgICAgICAgOy8vIEFkZHJlc3Mgb2YgIHBTY2FsZVs3XQotICAgICAgICAgICAgCi0gICAgICAgICAgICA7Ly8gUm93IDAKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUwbG8sIHFTY2FsZTBoaX0sIFtwU2NhbGVdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBsbywgZFhqMGxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGhpLCBkWGowaGksICMoMTItMSkgICAgICAgICAgICAKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUxbG8sIHFTY2FsZTFoaX0sIFtwU2NhbGVdIQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBsbywgcVNjYWxlMGxvLCBxU3JjMGxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGhpLCBxU2NhbGUwaGksIHFTcmMwaGkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU3bG8sIHFTY2FsZTdoaX0sIFtwVGVtcF0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWxvLCBkWGoxbG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxaGksIGRYajFoaSwgIygxMi0xKSAgICAgICAgICAgIAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGxvLCBxU3JjMGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkwCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwaGksIHFTcmMwaGkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3bG8sIGRYajdsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdoaSwgZFhqN2hpLCAjKDEyLTEpCi0gICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWxvLCBxU2NhbGUxbG8sIHFTcmMxbG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxaGksIHFTY2FsZTFoaSwgcVNyYzFoaQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdsbywgcVNjYWxlN2xvLCBxU3JjN2xvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2hpLCBxU2NhbGU3aGksIHFTcmM3aGkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUybG8sIHFTY2FsZTJoaX0sIFtwU2NhbGVdIQotCi0gICAgICAgICAgICA7Ly8gUm93IDEgJiA3Ci0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIChqMStqNykvMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk1Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1aGksIHFSZXMxN2hpICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIGoxLWo3Ci0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyBqMS1qNwotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk2Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2aGksIHFSZXMxN2hpICAgICAgCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmxvLCBkWGoybG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMyaGksIGRYajJoaSwgIygxMi0xKQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTZsbywgcVNjYWxlNmhpfSwgW3BUZW1wXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2bG8sIGRYajZsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZoaSwgZFhqNmhpLCAjKDEyLTEpCi0gICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmxvLCBxU2NhbGUybG8sIHFTcmMybG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMyaGksIHFTY2FsZTJoaSwgcVNyYzJoaQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZsbywgcVNjYWxlNmxvLCBxU3JjNmxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmhpLCBxU2NhbGU2aGksIHFTcmM2aGkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUzbG8sIHFTY2FsZTNoaX0sIFtwU2NhbGVdIQotCi0gICAgICAgICAgICA7Ly8gUm93IDIgJiA2Ci0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2xvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkzCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzaGksIHFSZXMyNmhpICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIGoyLWo2Ci0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyBqMi1qNgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmxvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkyCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkyaGksIHFSZXMyNmhpICAgICAgCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2xvLCBkWGozbG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzaGksIGRYajNoaSwgIygxMi0xKQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTVsbywgcVNjYWxlNWhpfSwgW3BUZW1wXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1bG8sIGRYajVsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVoaSwgZFhqNWhpLCAjKDEyLTEpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2xvLCBxU2NhbGUzbG8sIHFTcmMzbG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzaGksIHFTY2FsZTNoaSwgcVNyYzNoaQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVsbywgcVNjYWxlNWxvLCBxU3JjNWxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWhpLCBxU2NhbGU1aGksIHFTcmM1aGkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgOy8vIFJvdyAzICYgNQotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMxNioyKjIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNwotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2hpLCBxUmVzNTNoaSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyBqNS1qMwotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gajUtajMKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHFYajQsIFtwU3JjIEA2NF0KLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGhpLCBxUmVzNTNoaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRsbywgZFhqNGxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGhpLCBkWGo0aGksICMoMTItMSkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU0bG8sIHFTY2FsZTRoaX0sIFtwU2NhbGVdICAgICAgICAgICAgCi0gICAgICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiAgICAgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRsbywgcVNjYWxlNGxvLCBxU3JjNGxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGhpLCBxU2NhbGU0aGksIHFTcmM0aGkKLSAgICAgICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICAgICAgOy8vIFJvdyA0Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxbG8sIHFTcmM0bG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTEKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFoaSwgcVNyYzRoaSAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNRU5ECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDZmMTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheQotICovCi0gCi0KLQotI2lmbmRlZiBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KLSNkZWZpbmUgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCi0KLSNkZWZpbmUgTWFza1RhYmxlU2l6ZSA3MgotICAKLS8qIE1hc2sgdGFibGUgKi8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTViMmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIEd1YXJkIHRoZSBoZWFkZXIgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICovCi0jaWZuZGVmIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KLSNkZWZpbmUgX19BUk1fQ09NTV9WRVJTSU9OX0hfXwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgaW4gb214dHlwZXMuaCBidXQgaGFzbid0IGJlZW4gYXBwcm92ZWQgYnkgT3Blbk1BWCB5ZXQgKi8KLSNkZWZpbmUgT01YX1ZFUlNJT04gMTAyCi0KLS8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgI2RlZmluZSBudW1iZXIgaW50byBhICNkZWZpbmUgc3RyaW5nLiAqLwotI2RlZmluZSBBUk1fUVVPVEUoYSkgI2EKLSNkZWZpbmUgQVJNX0lORElSRUNUKEEpIEFSTV9RVU9URShBKQotCi0vKiBDb252ZXJ0IHRoZSBPTVhfVkVSU0lPTiBudW1iZXIgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgaXQgb3V0LiAqLwotI2RlZmluZSBBUk1fVkVSU0lPTl9TVFJJTkcgQVJNX0lORElSRUNUKE9NWF9WRVJTSU9OKQotCi0KLS8qIERlZmluZSB0aGlzIGluIG9yZGVyIHRvIHR1cm4gb24gQVJNIHZlcnNpb24vcmVsZWFzZS9idWlsZCBzdHJpbmdzIGluIGVhY2ggZG9tYWluICovCi0jZGVmaW5lIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi0KLSNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teEFDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SVBfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFNQX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0jZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KLQotCi0vKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgcmVsZWFzZSBzY3JpcHQgKi8KLS8qIFRoZXkgYXJlIHVzZWQgaW4gdGhlIEFSTSB2ZXJzaW9uIHN0cmluZ3MgZGVmaW5lZCBmb3IgZWFjaCBkb21haW4uICAgICAgICAgICAgICovCi0KLS8qIFRoZSByZWxlYXNlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LiAtIHVzZWQgZm9yIHNvdXJjZSBhbmQgb2JqZWN0IHJlbGVhc2VzICovCi0jZGVmaW5lIE9NWF9BUk1fUkVMRUFTRV9UQUcgICJyMHAwLTAwYmV0MSIKLQotLyogVGhlIEFSTSBhcmNoaXRlY3R1cmUgdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCi0jZGVmaW5lIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICJBUk0gQXJjaGl0ZWN0dXJlIFY2IgotCi0vKiBUaGUgQVJNIFRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KLSNkZWZpbmUgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gICAgIkFSTSBSVkNUIDMuMSIKLQotCi0jZW5kaWYgLyogX19BUk1fQ09NTV9WRVJTSU9OX0hfXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3MzVhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtQ09NTV9zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIEFSTSBvcHRpbWl6ZWQgT3Blbk1BWCBjb21tb24gaGVhZGVyIGZpbGUKLTsvLwotCi07Ly8gUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbgotIElGIDpMTk9UOjpERUY6QVJNQ09NTV9TX0gKLSBHQkxMIEFSTUNPTU1fU19ICi0KLSAgICAgICAgUkVRVUlSRTggICAgICAgICAgICA7Ly8gUmVxdWlyZXMgOC1ieXRlIHN0YWNrIGFsaWdubWVudAotICAgICAgICBQUkVTRVJWRTggICAgICAgICAgIDsvLyBQcmVzZXJ2ZXMgOC1ieXRlIHN0YWNrIGFsaWdubWVudAotICAgICAgICAKLSAgICAgICAgR0JMTCAgICBBUk1fRVJST1JDSEVDSwotQVJNX0VSUk9SQ0hFQ0sgIFNFVEwge0ZBTFNFfQotCi07Ly8gR2xvYmFscwotCi0gICAgICAgIEdCTFMgICAgX1JSZWdMaXN0ICAgOy8vIFIgc2F2ZWQgcmVnaXN0ZXIgbGlzdAotICAgICAgICBHQkxTICAgIF9EUmVnTGlzdCAgIDsvLyBEIHNhdmVkIHJlZ2lzdGVyIGxpc3QKLSAgICAgICAgR0JMUyAgICBfVmFyaWFudCAgICA7Ly8gU2VsZWN0ZWQgcHJvY2Vzc29yIHZhcmlhbnQKLSAgICAgICAgR0JMUyAgICBfQ1BVICAgICAgICA7Ly8gQ1BVIG5hbWUKLSAgICAgICAgR0JMUyAgICBfU3RydWN0ICAgICA7Ly8gU3RydWN0dXJlIG5hbWUKLSAgICAgICAgCi0gICAgICAgIEdCTEwgICAgX0luRnVuYyAgICAgOy8vIEluc2lkZSBmdW5jdGlvbiBhc3NlbWJseSBmbGFnCi0gICAgICAgIEdCTEwgICAgX1N3TG9uZyAgICAgOy8vIExvbmcgc3dpdGNoIGZsYWcKLSAgICAgICAgCi0gICAgICAgIEdCTEEgICAgX1JCeXRlcyAgICAgOy8vIE51bWJlciBvZiByZWdpc3RlciBieXRlcyBvbiBzdGFjawotICAgICAgICBHQkxBICAgIF9TQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2Ygc2NyYXRjaCBieXRlcyBvbiBzdGFjayAKLSAgICAgICAgR0JMQSAgICBfQUJ5dGVzICAgICA7Ly8gU3RhY2sgb2Zmc2V0IG9mIG5leHQgYXJndW1lbnQKLSAgICAgICAgR0JMQSAgICBfV29ya3NwYWNlICA7Ly8gU3RhY2sgb2Zmc2V0IG9mIHNjcmF0Y2ggd29ya3NwYWNlCi0gICAgICAgIEdCTEEgICAgX0YgICAgICAgICAgOy8vIEZ1bmN0aW9uIG51bWJlcgotICAgICAgICBHQkxBICAgIF9TdE9mZiAgICAgIDsvLyBTdHJ1Y3Qgb2Zmc2V0Ci0gICAgICAgIEdCTEEgICAgX1N3TnVtICAgICAgOy8vIFN3aXRjaCBudW1iZXIKLSAgICAgICAgR0JMUyAgICBfMzIgICAgICAgICA7Ly8gU3VmZml4IGZvciAzMiBieXRlIGFsaWdubW5ldAotICAgICAgICBHQkxTICAgIF8xNiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDE2IGJ5dGUgYWxpZ25tbmV0Ci0gICAgICAgIAotX0luRnVuYyAgICAgICAgIFNFVEwgICAge0ZBTFNFfQotX1NCeXRlcyAgICAgICAgIFNFVEEgICAgMAotX0YgICAgICAgICAgICAgIFNFVEEgICAgMAotX1N3TnVtICAgICAgICAgIFNFVEEgICAgMAotXzMyICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMzIiCi1fMTYgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04xNiIKLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIE92ZXJyaWRlIHRoZSB0b29scyBzZXR0aW5ncyBvZiB0aGUgQ1BVIGlmIHRoZSAjZGVmaW5lCi07Ly8gVVNFQ1BVIGlzIHNldCwgb3RoZXJ3aXNlIHVzZSB0aGUgQ1BVIGRlZmluZWQgYnkgdGhlCi07Ly8gYXNzZW1ibGVyIHNldHRpbmdzLgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgSUYgOkRFRjogT1ZFUlJJREVDUFUKLV9DUFUgICAgICAgU0VUUyAgT1ZFUlJJREVDUFUKLSAgICAgICBFTFNFCi1fQ1BVICAgICAgIFNFVFMgICAge0NQVX0gICAgICAgCi0gICAgICAgRU5ESUYKLQotCi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBXb3JrIG91dCB3aGljaCBjb2RlIHRvIGJ1aWxkCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgSUYgOkRFRjpBUk0xMTM2SlM6TE9SOjpERUY6Q29ydGV4QTg6TE9SOjpERUY6QVJNX0dFTkVSSUMKLSAgICAgICAgICAgIElORk8gMSwiUGxlYXNlIHN3aXRjaCB0byB1c2luZyBNX1ZBUklBTlRTIgotICAgICAgICBFTkRJRgotCi0gICAgICAgIDsvLyBEZWZpbmUgYW5kIHJlc2V0IGFsbCBvZmZpY2lhbGx5IHJlY29uZ25pc2VkIHZhcmlhbnRzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UUwotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk05MjZFSlMKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKU19VCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIENvcnRleEE4Ci0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTdURE1JCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UICR2YXIKLSAgICAgICAgR0JMTCAkdmFyCi0gICAgICAgIEdCTEwgX29rJHZhcgotJHZhciAgICBTRVRMIHtGQUxTRX0KLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBWYXJpYW50IGRlY2xhcmF0aW9uCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVmaW5lIGEgbGlzdCBvZiBjb2RlIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzCi0gICAgICAgIDsvLyBzb3VyY2UgZmlsZS4gVGhpcyBtYWNybyB0aGVuIGNob29zZXMgdGhlIG1vc3QKLSAgICAgICAgOy8vIGFwcHJvcHJpYXRlIHZhcmlhbnQgdG8gYnVpbGQgZm9yIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZAotICAgICAgICA7Ly8gY29yZS4KLSAgICAgICAgOy8vICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9WQVJJQU5UUyAkdjAsJHYxLCR2MiwkdjMsJHY0LCR2NSwkdjYsJHY3ICAgICAgICAKLSAgICAgICAgOy8vIFNldCB0byBUUlVFIHZhcmlhbnRzIHRoYXQgYXJlIHN1cHBvcnRlZAotICAgICAgICBfTV9ERUZfVkFSSUFOVFMKLSAgICAgICAgX01fVkFSSUFOVCAkdjAKLSAgICAgICAgX01fVkFSSUFOVCAkdjEKLSAgICAgICAgX01fVkFSSUFOVCAkdjIKLSAgICAgICAgX01fVkFSSUFOVCAkdjMKLSAgICAgICAgX01fVkFSSUFOVCAkdjQKLSAgICAgICAgX01fVkFSSUFOVCAkdjUKLSAgICAgICAgX01fVkFSSUFOVCAkdjYKLSAgICAgICAgX01fVkFSSUFOVCAkdjcKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb29rIGZvciBmaXJzdCBhdmFpbGFibGUgdmFyaWFudCB0byBtYXRjaCBhIENQVQotICAgICAgICA7Ly8gX01fVFJZIGNwdSwgdmFyaWFudCBmYWxsIGJhY2sgbGlzdAotX1ZhcmlhbnQgU0VUUyAiIiAgICAgICAgICAgICAgICAKLSAgICAgICAgX01fVFJZIEFSTTkyNkVKLVMsICAgQVJNOTI2RUpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTc2SlotUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTE3NkpaRi1TLCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExNTZUMi1TLCAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTU2VDJGLVMsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTEzNkotUywgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExMzZKRi1TLCAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBNUENvcmUsICAgICAgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQ29ydGV4LUE4LCAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBDb3J0ZXgtUjQsICAgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNN1RETUkKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZWxlY3QgdGhlIGNvcnJlY3QgdmFyaWFudAotICAgICAgICBfTV9ERUZfVkFSSUFOVFMKLSAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKLSAgICAgICAgICAgIElORk8gMSwgIk5vIG1hdGNoIGZvdW5kIGZvciBDUFUgJyRfQ1BVJyIKLSAgICAgICAgRUxTRQotJF9WYXJpYW50ICAgU0VUTCB7VFJVRX0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFJlZ2lzdGVyIGEgdmFyaWFudCBhcyBhdmFpbGFibGUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fVkFSSUFOVCAkdmFyCi0gICAgICAgIElGICIkdmFyIj0iIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgOkxOT1Q6OkRFRjpfb2skdmFyCi0gICAgICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgdmFyaWFudCAnJHZhciciCi0gICAgICAgIEVORElGCi0kdmFyICAgIFNFVEwge1RSVUV9Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGb3IgYSBnaXZlbiBDUFUsIHNlZSBpZiBhbnkgb2YgdGhlIHZhcmlhbnRzIHN1cHBvcnRpbmcKLSAgICAgICAgOy8vIHRoaXMgQ1BVIGFyZSBhdmFpbGFibGUuIFRoZSBmaXJzdCBhdmFpbGFibGUgdmFyaWFudCBpcwotICAgICAgICA7Ly8gY2hvc2VuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1RSWSAkY3B1LCAkdjAsJHYxLCR2MiwkdjMsJHY0LCR2NSwkdjYsJHY3Ci0gICAgICAgIElGICIkY3B1Ijw+X0NQVQotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgX01fVFJZMSAkdjAKLSAgICAgICAgX01fVFJZMSAkdjEKLSAgICAgICAgX01fVFJZMSAkdjIKLSAgICAgICAgX01fVFJZMSAkdjMKLSAgICAgICAgX01fVFJZMSAkdjQKLSAgICAgICAgX01fVFJZMSAkdjUKLSAgICAgICAgX01fVFJZMSAkdjYKLSAgICAgICAgX01fVFJZMSAkdjcKLSAgICAgICAgOy8vIENoZWNrIGEgbWF0Y2ggd2FzIGZvdW5kCi0gICAgICAgIElGIF9WYXJpYW50PSIiCi0gICAgICAgICAgICBJTkZPIDEsICJObyB2YXJpYW50IG1hdGNoIGZvdW5kIGZvciBDUFUgJyRfQ1BVJyIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fVFJZMSAkdmFyCi0gICAgICAgIElGICIkdmFyIj0iIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgKF9WYXJpYW50PSIiKTpMQU5EOiR2YXIKLV9WYXJpYW50IFNFVFMgIiR2YXIiCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIERlY2xhcmUgYSBzdHJ1Y3R1cmUgb2YgZ2l2ZW4gbmFtZQotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUlVDVCAkc25hbWUKLV9TdHJ1Y3QgU0VUUyAiJHNuYW1lIgotX1N0T2ZmICBTRVRBIDAKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIERlY2xhcmUgYSBzdHJ1Y3R1cmUgZmllbGQKLSAgICAgICAgOy8vIFRoZSBmaWVsZCBpcyBjYWxsZWQgJHNuYW1lXyRmbmFtZQotICAgICAgICA7Ly8gJHNpemUgICA9IHRoZSBzaXplIG9mIGVhY2ggZW50cnksIG11c3QgYmUgcG93ZXIgb2YgMiAKLSAgICAgICAgOy8vICRudW1iZXIgPSAoaWYgcHJvdmlkZWQpIHRoZSBudW1iZXIgb2YgZW50cmllcyBmb3IgYW4gYXJyYXkKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9GSUVMRCAkZm5hbWUsICRzaXplLCAkbnVtYmVyCi0gICAgICAgIElGIChfU3RPZmY6QU5EOigkc2l6ZS0xKSkhPTAKLV9TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgKCRzaXplIC0gKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSkKLSAgICAgICAgRU5ESUYKLSRfU3RydWN0Ll8kZm5hbWUgRVFVIF9TdE9mZgotICAgICAgICBJRiAiJG51bWJlciI8PiIiCi1fU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplKiRudW1iZXIKLSAgICAgICAgRUxTRQotX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAkc2l6ZQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FTkRTVFJVQ1QKLXNpemVvZl8kX1N0cnVjdCBFUVUgX1N0T2ZmCi1fU3RydWN0IFNFVFMgIiIKLSAgICAgICAgTUVORAotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIFN3aXRjaCBhbmQgdGFibGUgbWFjcm9zCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBTdGFydCBhIHJlbGF0aXZlIHN3aXRjaCB0YWJsZSB3aXRoIHJlZ2lzdGVyIHRvIHN3aXRjaCBvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICR2ID0gdGhlIHJlZ2lzdGVyIHRvIHN3aXRjaCBvbgotICAgICAgICA7Ly8gJHMgPSBpZiBzcGVjaWZpZWQgbXVzdCBiZSAiTCIgdG8gaW5kaWNhdGUgbG9uZwotICAgICAgICA7Ly8gICAgICB0aGlzIGFsbG93cyBhIGdyZWF0ZXIgcmFuZ2UgdG8gdGhlIGNhc2UgY29kZQotICAgICAgICBNQUNSTwotICAgICAgICBNX1NXSVRDSCAkdiwgJHMKLSAgICAgICAgQVNTRVJUICIkcyI9IiI6TE9SOiIkcyI9IkwiCi1fU3dMb25nIFNFVEwge0ZBTFNFfQotICAgICAgICBJRiAiJHMiPSJMIgotX1N3TG9uZyAgICAgU0VUTCB7VFJVRX0KLSAgICAgICAgRU5ESUYKLV9Td051bSAgU0VUQSBfU3dOdW0rMSAgICAgICAgCi0gICAgICAgIElGIHtDT05GSUd9PTE2Ci0gICAgICAgICAgICA7Ly8gVGh1bWIKLSAgICAgICAgICAgIElGIF9Td0xvbmcKLSAgICAgICAgICAgICAgICBUQkggW3BjLCAkdiwgTFNMIzFdCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgVEJCIFtwYywgJHZdCi0gICAgICAgICAgICBFTkRJRgotX1N3aXRjaCRfU3dOdW0KLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIEFSTQotICAgICAgICAgICAgQUREIHBjLCBwYywgJHYsIExTTCAjMgotICAgICAgICAgICAgTk9QCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBBZGQgYSBjYXNlIHRvIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQ0FTRSAgJGxhYmVsCi0gICAgICAgIElGIHtDT05GSUd9PTE2Ci0gICAgICAgICAgICA7Ly8gVGh1bWIKLSAgICAgICAgICAgIElGIF9Td0xvbmcKLSAgICAgICAgICAgICAgICBEQ1cgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgRENCICgkbGFiZWwgLSBfU3dpdGNoJF9Td051bSkvMgotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIEFSTQotICAgICAgICAgICAgQiAgICRsYWJlbAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gRW5kIG9mIHN3aXRjaCBzdGF0ZW1lbnQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FTkRTV0lUQ0gKLSAgICAgICAgQUxJR04gMgotICAgICAgICBNRU5EICAgICAgIAotCi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIERhdGEgYXJlYSBhbGxvY2F0aW9uCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gQ29uc3RhbnQgdGFibGUgYWxsb2NhdG9yIG1hY3JvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQ3JlYXRlcyBhIG5ldyBzZWN0aW9uIGZvciBlYWNoIGNvbnN0YW50IHRhYmxlCi0gICAgICAgIDsvLyAkbmFtZSBpcyBzeW1ib2wgdGhyb3VnaCB3aGljaCB0aGUgdGFibGUgY2FuIGJlIGFjY2Vzc2VkLgotICAgICAgICA7Ly8gJGFsaWduIGlzIHRoZSBvcHRpb25hbCBhbGlnbm1lbnQgb2YgdGhlIHRhYmxlLCBsb2cyIG9mIAotICAgICAgICA7Ly8gIHRoZSBieXRlIGFsaWdubWVudCAtICRhbGlnbj00IGlzIDE2IGJ5dGUgYWxpZ25lZAotICAgICAgICBNQUNSTwotICAgICAgICBNX1RBQkxFICAkbmFtZSwgJGFsaWduCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGICIkYWxpZ24iPSIiCi0gICAgICAgICAgICBBUkVBIHwuY29uc3RkYXRhfCwgUkVBRE9OTFksIERBVEEKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIEFSRUFzIGluaGVyaXQgdGhlIGFsaWdubWVudCBvZiB0aGUgZmlyc3QgZGVjbGFyYXRpb24uCi0gICAgICAgICAgICA7Ly8gVGhlcmVmb3JlIGZvciBlYWNoIGFsaWdubWVudCBzaXplIHdlIG11c3QgaGF2ZSBhbiBhcmVhCi0gICAgICAgICAgICA7Ly8gb2YgYSBkaWZmZXJlbnQgbmFtZS4KLSAgICAgICAgICAgIEFSRUEgY29uc3RkYXRhX2EkYWxpZ24sIFJFQURPTkxZLCBEQVRBLCBBTElHTj0kYWxpZ24KLSAgICAgICAgICAgIAotICAgICAgICAgICAgOy8vIFdlIGFsc28gZm9yY2UgYWxpZ25tZW50IGluY2FzZSB3ZSBhcmUgdGFnZ2luZyBvbnRvCi0gICAgICAgICAgICA7Ly8gYW4gYWxyZWFkeSBzdGFydGVkIGFyZWEuCi0gICAgICAgICAgICBBTElHTiAoMTw8JGFsaWduKQotICAgICAgICBFTkRJRgotJG5hbWUKLSAgICAgICAgTUVORAotICAgICAgICAKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIE1hY3JvcyB0byBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sKLTsvLwotOy8vIFRoZXNlIGFsbCBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgaXMgOC1ieXRlIGFsaWduZWQKLTsvLyBhdCBlbnRyeSB0byB0aGUgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIAotOy8vIDMyLWJ5dGUgYWxpZ25tZW50IG1hY3JvIG5lZWRzIHRvIHdvcmsgaW4gYQotOy8vIGJpdCBtb3JlIG9mIGEgc3BlY2lhbCB3YXkuLi4KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIAotCi0KLSAgICAgICAgOy8vIEFsbG9jYXRlIDEtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzEgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgMi1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMiAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDoxKSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDIgLSAoX1NCeXRlczpBTkQ6MSkpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORAotICAgICAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA0LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0M0ICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjMpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoNCAtIChfU0J5dGVzOkFORDozKSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5ECi0gICAgICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzggICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICgkc2l6ZSsxNikgYnl0ZXMuCi0gICAgICAgIDsvLyBUaGUgZXh0cmEgMTYgYnl0ZXMgYXJlIGxhdGVyIHVzZWQgdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gMTYgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MxNiAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiRfMTYgICBFUVUgKF9TQnl0ZXMgKyA4KQotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpICsgOAotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzMyKSBieXRlcy4KLSAgICAgICAgOy8vIFRoZSBleHRyYSAzMiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAzMiBieXRlcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzMyICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GJF8zMiAgIEVRVSAoX1NCeXRlcyArIDI0KQotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpICsgMjQKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQXJndW1lbnQgRGVjbGFyYXRpb24gTWFjcm8KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBhbiBhcmd1bWVudCBuYW1lICRuYW1lCi0gICAgICAgIDsvLyBzaXplICRzaXplIGJ5dGVzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQVJHICAgICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIF9JbkZ1bmMKLSRuYW1lJF9GICAgIEVRVSBfQUJ5dGVzCi1fQUJ5dGVzIFNFVEEgX0FCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gTWFjcm9zIHRvIGFjY2VzcyBzdGFja2VkIHZhcmlhYmxlcwotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIE1hY3JvIHRvIHBlcmZvcm0gYSBkYXRhIHByb2Nlc3Npbmcgb3BlcmF0aW9uCi0gICAgICAgIDsvLyB3aXRoIGEgY29uc3RhbnQgc2Vjb25kIG9wZXJhbmQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fT1BDICRvcCwkcmQsJHJuLCRjb25zdAotICAgICAgICBMQ0xBICAgIF9zaAotICAgICAgICBMQ0xBICAgIF9jc3QKLV9zaCAgICAgU0VUQSAgICAwCi1fY3N0ICAgIFNFVEEgICAgJGNvbnN0Ci0gICAgICAgIElGIF9jc3Q9MAotICAgICAgICAkb3AgJHJkLCAkcm4sICNfY3N0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBXSElMRSAoX2NzdDpBTkQ6Myk9MAotX2NzdCAgICAgICAgU0VUQSBfY3N0Pj4yCi1fc2ggICAgICAgICBTRVRBIF9zaCsyCi0gICAgICAgIFdFTkQKLSAgICAgICAgJG9wICRyZCwgJHJuLCAjKF9jc3Q6QU5EOjB4MDAwMDAwRkYpPDxfc2gKLSAgICAgICAgSUYgX2NzdD49MjU2Ci0gICAgICAgICAgICAkb3AgJHJkLCAkcmQsICMoX2NzdDpBTkQ6MHhGRkZGRkYwMCk8PF9zaAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIE1hY3JvIHRvIHBlcmZvcm0gYSBkYXRhIGFjY2VzcyBvcGVyYXRpb24KLSAgICAgICAgOy8vIFN1Y2ggYXMgTERSIG9yIFNUUgotICAgICAgICA7Ly8gVGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBtb2RpZmllZCBzdWNoIHRoYXQKLSAgICAgICAgOy8vIDEuIElmIG5vIGFkZHJlc3MgaXMgZ2l2ZW4gdGhlbiB0aGUgbmFtZSBpcyB0YWtlbgotICAgICAgICA7Ly8gICAgYXMgYSBzdGFjayBvZmZzZXQKLSAgICAgICAgOy8vIDIuIElmIHRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlCi0gICAgICAgIDsvLyAgICBzdGF0ZSBiZWluZyBhc3NlbWJsZWQgZm9yIChlZyBUaHVtYikgdGhlbiBhIHN1aXRhYmxlCi0gICAgICAgIDsvLyAgICBhZGRyZXNzaW5nIG1vZGUgaXMgc3Vic3RpdHV0ZWQuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT24gRW50cnk6Ci0gICAgICAgIDsvLyAkaSA9IEluc3RydWN0aW9uIHRvIHBlcmZvcm0gKGVnICJMRFJCIikKLSAgICAgICAgOy8vICRhID0gUmVxdWlyZWQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgOy8vICRyID0gUmVnaXN0ZXIocykgdG8gdHJhbnNmZXIgKGVnICJyMSIpCi0gICAgICAgIDsvLyAkYTAsJGExLCRhMi4gQWRkcmVzc2luZyBtb2RlIGFuZCBjb25kaXRpb24uIE9uZSBvZjoKLSAgICAgICAgOy8vICAgICBsYWJlbCB7LGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlXSAgICAgICAgICAgICAgICAgICAgeywsLGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlLCBvZmZzZXRdeyF9ICAgICAgICAgeywsY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldCwgc2hpZnRdeyF9ICB7LGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlXSwgb2Zmc2V0ICAgICAgICAgICAgeywsY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQsIHNoaWZ0ICAgICB7LGNjfQotICAgICAgICBNQUNSTwotICAgICAgICBfTV9EQVRBICRpLCRhLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBJRiAiJGEwIjpMRUZUOjE9IlsiCi0gICAgICAgICAgICBJRiAiJGExIj0iIgotICAgICAgICAgICAgICAgICRpJGEzICAgJHIsICRhMAotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIElGICIkYTAiOlJJR0hUOjE9Il0iCi0gICAgICAgICAgICAgICAgICAgIElGICIkYTIiPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QT1NUSU5EICRpJGEzLCAiJHIiLCAkYTAsICRhMQotICAgICAgICAgICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QT1NUSU5EICRpJGEzLCAiJHIiLCAkYTAsICIkYTEsJGEyIgotICAgICAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BSRUlORCAgJGkkYTMsICIkciIsICRhMCwgJGExCi0gICAgICAgICAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BSRUlORCAgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCi0gICAgICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIExDTEEgICAgX09mZnNldAotX09mZnNldCAgICAgU0VUQSAgICBfV29ya3NwYWNlICsgJGEwJF9GCi0gICAgICAgICAgICBBU1NFUlQgIChfT2Zmc2V0OkFORDooJGEtMSkpPTAKLSAgICAgICAgICAgICRpJGExICAgJHIsIFtzcCwgI19PZmZzZXRdCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBIYW5kbGUgcG9zdCBpbmRleGVkIGxvYWQvc3RvcmVzCi0gICAgICAgIDsvLyBvcCAgcmVnLCBbYmFzZV0sIG9mZnNldAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9QT1NUSU5EICRpLCRyLCRhMCwkYTEKLSAgICAgICAgTENMUyBfYmFzZQotICAgICAgICBMQ0xTIF9vZmZzZXQKLSAgICAgICAgSUYge0NPTkZJR309MTYgOy8vIFRodW1iCi1fYmFzZSAgICAgICBTRVRTICgiJGEwIjpMRUZUOig6TEVOOiIkYTAiLTEpKTpSSUdIVDooOkxFTjoiJGEwIi0yKSAgIDsvLyByZW1vdmUgW10KLV9vZmZzZXQgICAgIFNFVFMgIiRhMSIKLSAgICAgICAgICAgIElGIF9vZmZzZXQ6TEVGVDoxPSIrIgotX29mZnNldCAgICAgICAgIFNFVFMgX29mZnNldDpSSUdIVDooOkxFTjpfb2Zmc2V0LTEpCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgJGkgICRyLCAkYTAKLSAgICAgICAgICAgIElGIF9vZmZzZXQ6TEVGVDoxPSItIgotX29mZnNldCAgICAgICAgIFNFVFMgX29mZnNldDpSSUdIVDooOkxFTjpfb2Zmc2V0LTEpCi0gICAgICAgICAgICAgICAgU1VCICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAotICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0Ci0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTFNFIDsvLyBBUk0KLSAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEhhbmRsZSBwcmUgaW5kZXhlZCBsb2FkL3N0b3JlCi0gICAgICAgIDsvLyBvcCAgcmVnLCBbYmFzZSwgb2Zmc2V0XXshfQotICAgICAgICBNQUNSTwotICAgICAgICBfTV9QUkVJTkQgJGksJHIsJGEwLCRhMQotICAgICAgICBMQ0xTIF9iYXNlCi0gICAgICAgIExDTFMgX29mZnNldAotICAgICAgICBJRiAoe0NPTkZJR309MTYpOkxBTkQ6KCgiJGExIjpSSUdIVDoyKT0iXSEiKQotX2Jhc2UgICAgICAgU0VUUyAiJGEwIjpSSUdIVDooOkxFTjooIiRhMCIpLTEpCi1fb2Zmc2V0ICAgICBTRVRTICIkYTEiOkxFRlQ6KDpMRU46KCIkYTEiKS0yKQotICAgICAgICAgICAgJGkgJHIsIFskX2Jhc2UsICRfb2Zmc2V0XQotICAgICAgICAgICAgQUREICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAotICAgICAgICBFTFNFCi0gICAgICAgICAgICAkaSAgJHIsICRhMCwgJGExCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBieXRlIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJCICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgc2lnbmVkIGJ5dGUgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUlNCICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJTQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIGJ5dGUgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJCICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgdW5zaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJIICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgc2lnbmVkIGhhbGYgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSU0ggJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUlNIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgaGFsZiB3b3JkIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSSCAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUkgiLDIsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTG9hZCB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFIgICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSIiw0LCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgd29yZCB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUiAgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTG9hZCBkb3VibGUgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSRCAgJHIwLCRyMSwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSRCIsOCwiJHIwLCRyMSIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIGRvdWJsZSB3b3JkIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSRCAgJHIwLCRyMSwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSRCIsOCwiJHIwLCRyMSIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BRFIgICAkYSwgJGIsICRjYwotICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GKQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyB0byAxNiBieXRlcwotICAgICAgICBNQUNSTwotICAgICAgICBNX0FEUjE2ICRhLCAkYiwgJGNjCi0gICAgICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GJF8xNikKLSAgICAgICAgCi0gICAgICAgICAgICA7Ly8gTm93IGFsaWduICRhIHRvIDE2IGJ5dGVzCi0gICAgICAgICAgICBCSUMkY2MgICRhLCRhLCMweDBGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDMyIGJ5dGVzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQURSMzIgJGEsICRiLCAkY2MKLSAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzMyKQotICAgICAgICAKLSAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMzIgYnl0ZXMKLSAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MUYKLSAgICAgICAgTUVORAotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIEZ1bmN0aW9uIGhlYWRlciBhbmQgZm9vdGVyIG1hY3JvcwotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBIZWFkZXIgTWFjcm8gICAgCi0gICAgICAgIDsvLyBHZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlCi0gICAgICAgIDsvLyBOb3RlIHRoYXQgZnVuY3Rpb25zIHNob3VsZCBhbGwgYmUgInN0YWNrLW1vdmVzLW9uY2UiCi0gICAgICAgIDsvLyBUaGUgRk5TVEFSVCBhbmQgRk5FTkQgbWFjcm9zIHNob3VsZCBiZSB0aGUgb25seSBwbGFjZXMKLSAgICAgICAgOy8vIHdoZXJlIHRoZSBzdGFjayBtb3Zlcy4KLSAgICAgICAgOy8vICAgIAotICAgICAgICA7Ly8gJG5hbWUgID0gZnVuY3Rpb24gbmFtZQotICAgICAgICA7Ly8gJHJyZWcgID0gIiIgICBkb24ndCBzdGFjayBhbnkgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyAgICAgICAgICAibHIiIHN0YWNrICJsciIgb25seQotICAgICAgICA7Ly8gICAgICAgICAgInJOIiBzdGFjayByZWdpc3RlcnMgInI0LXJOLGxyIgotICAgICAgICA7Ly8gJGRyZWcgID0gIiIgICBkb24ndCBzdGFjayBhbnkgRCByZWdpc3RlcnMKLSAgICAgICAgOy8vICAgICAgICAgICJkTiIgc3RhY2sgcmVnaXN0ZXJzICJkOC1kTiIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBOb3RlOiBBUk0gQXJjaGljdHVyZSBwcm9jZWR1cmUgY2FsbCBzdGFuZGFyZCBBQVBDUwotICAgICAgICA7Ly8gc3RhdGVzIHRoYXQgcjQtcjExLCBzcCwgZDgtZDE1IG11c3QgYmUgcHJlc2VydmVkIGJ5Ci0gICAgICAgIDsvLyBhIGNvbXBsaWFudCBmdW5jdGlvbi4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVEFSVCAkbmFtZSwgJHJyZWcsICRkcmVnCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIEFTU0VSVCAiJG5hbWUiIT0iIgotX0luRnVuYyBTRVRMIHtUUlVFfQotX1JCeXRlcyBTRVRBIDAKLV9Xb3Jrc3BhY2UgU0VUQSAwCi0KLSAgICAgICAgOy8vIENyZWF0ZSBhbiBhcmVhIGZvciB0aGUgZnVuY3Rpb24gICAgICAgIAotICAgICAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLSAgICAgICAgRVhQT1JUICAkbmFtZQotJG5hbWUgICBGVU5DVElPTgotICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgUiByZWdpc3RlcnMKLSAgICAgICAgX01fR0VUUlJFR0xJU1QgJHJyZWcKLSAgICAgICAgSUYgX1JSZWdMaXN0PD4iIgotICAgICAgICAgICAgU1RNRkQgICBzcCEsIHskX1JSZWdMaXN0LCBscn0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgRCByZWdpc3RlcnMKLSAgICAgICAgX01fR0VURFJFR0xJU1QgICRkcmVnICAgICAgICAKLSAgICAgICAgSUYgX0RSZWdMaXN0PD4iIgotICAgICAgICAgICAgVlNUTUZEICBzcCEsIHskX0RSZWdMaXN0fQotICAgICAgICBFTkRJRiAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gRW5zdXJlIHNpemUgY2xhaW1lZCBvbiBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAotICAgICAgICBJRiAoKF9TQnl0ZXM6QU5EOjcpIT0wKQotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBJRiAoX1NCeXRlcyE9MCkKLSAgICAgICAgICAgIF9NX09QQyBTVUIsIHNwLCBzcCwgX1NCeXRlcwotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgCi1fQUJ5dGVzIFNFVEEgX1NCeXRlcyArIF9SQnl0ZXMgLSBfV29ya3NwYWNlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUHJpbnQgZnVuY3Rpb24gbmFtZSBpZiBkZWJ1ZyBlbmFibGVkCi0gICAgICAgIE1fUFJJTlRGICIkbmFtZVxuIiwKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFdvcmsgb3V0IGEgbGlzdCBvZiBSIHNhdmVkIHJlZ2lzdGVycwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZwotICAgICAgICBJRiAiJHJyZWciPSIiCi1fUlJlZ0xpc3QgICBTRVRTICIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIElGICIkcnJlZyI9ImxyIjpMT1I6IiRycmVnIj0icjQiCi1fUlJlZ0xpc3QgICBTRVRTICJyNCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys4Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyNSI6TE9SOiIkcnJlZyI9InI2IgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjYiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InI3IjpMT1I6IiRycmVnIj0icjgiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yOCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjkiOkxPUjoiJHJyZWciPSJyMTAiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yMTAiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMzIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InIxMSI6TE9SOiIkcnJlZyI9InIxMiIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXIxMiIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0MAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHNhdmVkIHIgcmVnaXN0ZXIgbGltaXQgJyRycmVnJyIKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIEQgc2F2ZWQgcmVnaXN0ZXJzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0dFVERSRUdMSVNUICRkcmVnCi0gICAgICAgIElGICIkZHJlZyI9IiIKLV9EUmVnTGlzdCAgIFNFVFMgIiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgSUYgIiRkcmVnIj0iZDgiCi1fRFJlZ0xpc3QgICBTRVRTICJkOCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys4Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkOSIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQ5IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzE2Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTAiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTAiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMjQKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMSIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMSIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDEyIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEyIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTMiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTMiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDgKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxNCIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxNCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys1NgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDE1IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE1IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzY0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgZCByZWdpc3RlciBsaW1pdCAnJGRyZWcnIgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gUHJvZHVjZSBmdW5jdGlvbiByZXR1cm4gaW5zdHJ1Y3Rpb25zCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1JFVCAkY2MKLSAgICAgICAgSUYgX0RSZWdMaXN0PD4iIgotICAgICAgICAgICAgVlBPUCRjYyB7JF9EUmVnTGlzdH0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgX1JSZWdMaXN0PSIiCi0gICAgICAgICAgICBCWCRjYyBscgotICAgICAgICBFTFNFCi0gICAgICAgICAgICBMRE0kY2MuRkQgc3AhLCB7JF9SUmVnTGlzdCwgcGN9Ci0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEVhcmx5IEZ1bmN0aW9uIEV4aXQgTWFjcm8KLSAgICAgICAgOy8vICRjYyA9IGNvbmRpdGlvbiB0byBleGl0IHdpdGgKLSAgICAgICAgOy8vIChFeGFtcGxlOiBNX0VYSVQgRVEpCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRVhJVCAgJGNjCi0gICAgICAgIEFTU0VSVCAgX0luRnVuYwotICAgICAgICBJRiAgX1NCeXRlcyE9MAotICAgICAgICAgICAgOy8vIFJlc3RvcmUgc3RhY2sgZnJhbWUgYW5kIGV4aXQKLSAgICAgICAgICAgIEIkY2MgIF9FbmQkX0YKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIENhbiByZXR1cm4gZGlyZWN0bHkKLSAgICAgICAgICAgIF9NX1JFVCAkY2MKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gRm9vdGVyIE1hY3JvICAgICAgICAKLSAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXBpbG9ndWUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FTkQKLSAgICAgICAgQVNTRVJUIF9JbkZ1bmMKLV9JbkZ1bmMgU0VUTCB7RkFMU0V9Ci1fRW5kJF9GCi0KLSAgICAgICAgOy8vIFJlc3RvcmUgdGhlIHN0YWNrIHBvaW50ZXIgdG8gaXRzIG9yaWdpbmFsIHZhbHVlIG9uIGZ1bmN0aW9uIGVudHJ5Ci0gICAgICAgIElGIF9TQnl0ZXMhPTAKLSAgICAgICAgICAgIF9NX09QQyBBREQsIHNwLCBzcCwgX1NCeXRlcwotICAgICAgICBFTkRJRgotICAgICAgICBfTV9SRVQKLSAgICAgICAgRU5ERlVOQwotCi0gICAgICAgIDsvLyBSZXNldCB0aGUgZ2xvYmFsIHN0YWNrIHRyYWNraW5nIHZhcmlhYmxlcyBiYWNrIHRvIHRoZWlyIAotICAgICAgICA7Ly8gaW5pdGlhbCB2YWx1ZXMsIGFuZCBpbmNyZW1lbnQgdGhlIGZ1bmN0aW9uIGNvdW50Ci1fU0J5dGVzICAgICAgICBTRVRBIDAKLV9GICAgICAgICAgICAgIFNFVEEgX0YrMQotICAgICAgICBNRU5ECi0KLSAgICAgICAgICAgICAgICAKLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07Ly8gRGVidWcgTWFjcm9zCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIEdCTEwgICAgREVCVUdfT04KLURFQlVHX09OIFNFVEwgICB7RkFMU0V9Ci0gICAgICAgIEdCTEwgICAgREVCVUdfU1RBTExTX09OCi1ERUJVR19TVEFMTFNfT04gU0VUTCB7RkFMU0V9Ci0gICAgICAgIAotICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICA7Ly8gRGVidWcgY2FsbCB0byBwcmludGYKLSAgICAgICAgOy8vICBNX1BSSU5URiAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRXhhbXBsZXM6Ci0gICAgICAgIDsvLyAgTV9QUklOVEYgIng9JTA4eFxuIiwgcjAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIHByZXNlcnZlcyB0aGUgdmFsdWUgb2YgYWxsIHJlZ2lzdGVycyBpbmNsdWRpbmcgdGhlCi0gICAgICAgIDsvLyBmbGFncy4KLSAgICAgICAgOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICBNQUNSTwotICAgICAgICBNX1BSSU5URiAgJGZvcm1hdCwgJHZhbDAsICR2YWwxLCAkdmFsMgotICAgICAgICBJRiBERUJVR19PTgotICAgICAgICAKLSAgICAgICAgSU1QT1JUICBwcmludGYKLSAgICAgICAgTENMQSAgICBuQXJncwotbkFyZ3MJU0VUQSAgICAwCi0gICAgICAgIAotICAgICAgICA7Ly8gc2F2ZSByZWdpc3RlcnMgc28gd2UgZG9uJ3QgY29ycnVwdCB0aGVtCi0gICAgICAgIFNUTUZEICAgc3AhLCB7cjAtcjEyLCBscn0KLSAgICAgICAgCi0gICAgICAgIDsvLyBEcm9wIHN0YWNrIHRvIGdpdmUgdXMgc29tZSB3b3Jrc3BhY2UKLSAgICAgICAgU1VCICAgICBzcCwgc3AsICMxNgotICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHdlIG5lZWQgdG8gcHJpbnQgdG8gdGhlIHN0YWNrCi0gICAgICAgIElGICIkdmFsMiIgPD4gIiIKLSAgICAgICAgICAgIEFTU0VSVCAiJHZhbDEiIDw+ICIiCi0gICAgICAgICAgICBTVFIgICAgJHZhbDIsIFtzcCwgIzhdCi1uQXJncyAgICAgICBTRVRBICAgbkFyZ3MrMQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHZhbDEiIDw+ICIiCi0gICAgICAgICAgICBBU1NFUlQgIiR2YWwwIiA8PiAiIgotICAgICAgICAgICAgU1RSICAgICR2YWwxLCBbc3AsICM0XQotbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkdmFsMCI8PiIiCi0gICAgICAgICAgICBTVFIgICAgJHZhbDAsIFtzcF0KLW5BcmdzCSAgICBTRVRBICAgbkFyZ3MrMQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIE5vdyB3ZSBhcmUgc2FmZSB0byBjb3JydXB0IHJlZ2lzdGVycwotICAgICAgICBBRFIgICAgIHIwLCAlRlQwMAotICAgICAgICBJRiBuQXJncz0xCi0gICAgICAgICAgTERSICAgcjEsIFtzcF0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgbkFyZ3M9MgotICAgICAgICAgIExETUlBIHNwLCB7cjEscjJ9Ci0gICAgICAgIEVORElGCi0gICAgICAgIElGIG5BcmdzPTMKLSAgICAgICAgICBMRE1JQSBzcCwge3IxLHIyLHIzfQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIHByaW50IHRoZSB2YWx1ZXMKLSAgICAgICAgTVJTICAgICByNCwgY3BzciAgICAgICAgOy8vIHByZXNlcnZlIGZsYWdzCi0gICAgICAgIEJMICAgICAgcHJpbnRmCi0gICAgICAgIE1TUiAgICAgY3Bzcl9mLCByNCAgICAgIDsvLyByZXN0b3JlIGZsYWdzCi0gICAgICAgIEIgICAgICAgJUZUMDEKLTAwICAgICAgOy8vIHN0cmluZyB0byBwcmludAotICAgICAgICBEQ0IgICAgICIkZm9ybWF0IiwgMAotICAgICAgICBBTElHTgotMDEgICAgICA7Ly8gRmluaXNoZWQKLSAgICAgICAgQUREICAgICBzcCwgc3AsICMxNgotICAgICAgICA7Ly8gUmVzdG9yZSByZWdpc3RlcnMKLSAgICAgICAgTERNRkQJc3AhLCB7cjAtcjEyLGxyfQotCi0gICAgICAgIEVORElGICAgOy8vIERFQlVHX09OCi0gICAgICAgIE1FTkQKLQotCi0gICAgICAgIDsvLyBTdGFsbCBTaW11bGF0aW9uIE1hY3JvCi0gICAgICAgIDsvLyBJbnNlcnRzIGEgZ2l2ZW4gbnVtYmVyIG9mIE5PUHMgZm9yIHRoZSBjdXJyZW50bHkKLSAgICAgICAgOy8vICBkZWZpbmVkIHBsYXRmb3JtCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RBTEwgJHBsYXQxc3RhbGwsICRwbGF0MnN0YWxsLCAkcGxhdDNzdGFsbCwgJHBsYXQ0c3RhbGwsICRwbGF0NXN0YWxsLCAkcGxhdDZzdGFsbAotICAgICAgICBJRiBERUJVR19TVEFMTFNfT04KLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDFzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDJzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDNzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDRzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDVzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDZzdGFsbCAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fU1RBTExfU1VCICRwbGF0c3RhbGwKLSAgICAgICAgSUYgIiRwbGF0c3RhbGwiIT0iIgotICAgICAgICAgICAgTENMQSBfcGxsZW4KLSAgICAgICAgICAgIExDTFMgX3BsCi0gICAgICAgICAgICBMQ0xMIF9wbGxvZwotX3BsbGVuICAgICAgU0VUQSA6TEVOOiIkcGxhdHN0YWxsIgotX3BsICAgICAgICAgU0VUUyAiJHBsYXRzdGFsbCI6TEVGVDooX3BsbGVuIC0gMikKLSAgICAgICAgICAgIElGIDpERUY6JF9wbAotICAgICAgICAgICAgICAgIElGICRfcGwKLSAgICAgICAgICAgICAgICAgICAgTENMUyBfc3QKLSAgICAgICAgICAgICAgICAgICAgTENMQSBfc3RudW0KLV9zdCAgICAgICAgICAgICAgICAgU0VUUyAiJHBsYXRzdGFsbCI6UklHSFQ6MSAgICAgICAgCi1fc3RudW0gICAgICAgICAgICAgIFNFVEEgJF9zdAotICAgICAgICAgICAgICAgICAgICBXSElMRSBfc3RudW0+MAotCQkJTU9WIHNwLCBzcAotX3N0bnVtICAgICAgICAgICAgICAgICAgU0VUQSBfc3RudW0gLSAxCi0gICAgICAgICAgICAgICAgICAgIFdFTkQKLSAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsvLyBFbmRpYW4gSW52YXJpZW5jZSBNYWNyb3MKLTsvLyAKLTsvLyBUaGUgaWRlYSBiZWhpbmQgdGhlc2UgbWFjcm9zIGlzIHRoYXQgaWYgYW4gYXJyYXkgaXMKLTsvLyBsb2FkZWQgYXMgd29yZHMgdGhlbiB0aGUgU01VTDAwIG1hY3JvIHdpbGwgbXVsdGlwbHkKLTsvLyBhcnJheSBlbGVtZW50cyAwIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbmVzcyBvZiB0aGUKLTsvLyBzeXN0ZW0uIEZvciBsaXR0bGUgZW5kaWFuIFNNVUwwMD1TTVVMQkIsIGZvciBiaWcKLTsvLyBlbmRpYW4gU01VTDAwPVNNVUxUVCBhbmQgc2ltaWxhcmx5IGZvciBvdGhlciBwYWNrZWQgb3BlcmF0aW9ucy4KLTsvLwotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICBNQUNSTwotICAgICAgICBMSUJJNCAgICRjb21saSwgJGNvbWJpLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIElGIHtFTkRJQU59PSJiaWciCi0gICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYywgJGQKLSAgICAgICAgRUxTRQotICAgICAgICAkY29tbGkuJGNjICRhLCAkYiwgJGMsICRkCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIExJQkkzICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRjYwotICAgICAgICBJRiB7RU5ESUFOfT0iYmlnIgotICAgICAgICAkY29tYmkuJGNjICRhLCAkYiwgJGMKLSAgICAgICAgRUxTRQotICAgICAgICAkY29tbGkuJGNjICRhLCAkYiwgJGMKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFNNTEF4eSBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTBCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMTAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTExICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMVQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUIwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCQiwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFCMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVQxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUVCwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTTVVMeHkgbWFjcm9zCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMDAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDBCICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMFQgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDExICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMUIgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxVCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUVCwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTEIwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMQjEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxUMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFQxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU01MQVd4LCBTTVVMV3ggbWFjcm9zCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVzAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVdCLCBTTUxBV1QsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVcxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFXVCwgU01MQVdCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxXMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxXQiwgU01VTFdULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFcxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFdULCBTTVVMV0IsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIFNNTEFMeHkgbWFjcm9zCi0KLQotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDAwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDBUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLQotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDExICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMVQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTEIwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxCMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMVDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTFQxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgRU5ESUYgOy8vIEFSTUNPTU1fU19ICi0gICAgICAgICAgICAKLSAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1PTVguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjMGMyNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1PTVhfUmVsZWFzZVZlcnNpb24uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIFRoaXMgZmlsZSBhbGxvd3MgYSB2ZXJzaW9uIG9mIHRoZSBPTVggREwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IHdoZXJlIHNvbWUgb3IKLSAqIGFsbCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGdpdmVuIGEgdXNlciBzcGVjaWZpZWQgc3VmZml4LiAKLSAqCi0gKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgaXQgd2hlcmU6Ci0gKgotICogLSB5b3Ugd2FudCB0byByZW5hbWUgYSBmdW5jdGlvbiAib3V0IG9mIHRoZSB3YXkiIHNvIHRoYXQgeW91IGNvdWxkIHJlcGxhY2UKLSAqICAgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gKHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdvdWxkIHN0aWxsIGJlCi0gKiAgIGluIHRoZSBsaWJyYXJ5IGp1c3Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lIC0gc28geW91IGNvdWxkIGRlYnVnIHRoZSBuZXcKLSAqICAgdmVyc2lvbiBieSBjb21wYXJpbmcgaXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgb2xkKQotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHZlcnNpb25zIHdpdGggYSBzdWZmaXggc28gdGhhdCAKLSAqICAgeW91IGNhbiBpbmNsdWRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBhbmQgY2hvb3NlIGJldHdlZW4gZnVuY3Rpb25zCi0gKiAgIGF0IHJ1bnRpbWUuCi0gKgotICogICAgIGUuZy4gb214SVBCTV9Db3B5X1U4X0MxUiBjb3VsZCBiZSByZW5hbWVkIG9teElQQk1fQ29weV9VOF9DMVJfQ29ydGV4QTgKLSAqIAotICovCi0KLSAgCi0jaWZuZGVmIF9hcm1PTVhfSF8KLSNkZWZpbmUgX2FybU9NWF9IXwotCi0KLS8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgaW4gb3JkZXIgdG8gZXhwYW5kIGFuZCBjb25jYXRlbmF0ZSB0aGUgbmFtZXMgKi8KLSNkZWZpbmUgT01YQ0FUMkJBUihBLCBCKSBvbXggIyMgQSAjIyBCCi0jZGVmaW5lIE9NWENBVEJBUihBLCBCKSBPTVhDQVQyQkFSKEEsIEIpCi0KLS8qIERlZmluZSB0aGUgc3VmZml4IHRvIGFkZCB0byBhbGwgZnVuY3Rpb25zIC0gdGhlIGRlZmF1bHQgaXMgbm8gc3VmZml4ICovCi0jZGVmaW5lIEJBUkVfU1VGRklYIAotCi0KLQotLyogRGVmaW5lIHdoYXQgaGFwcGVucyB0byB0aGUgYmFyZSBzdWZmaXgtbGVzcyBmdW5jdGlvbnMsIGRvd24gdG8gdGhlIHN1Yi1kb21haW4gYWNjdXJhY3kgKi8KLSNkZWZpbmUgT01YQUNBQUNfU1VGRklYICAgIEJBUkVfU1VGRklYICAgCi0jZGVmaW5lIE9NWEFDTVAzX1NVRkZJWCAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJQ0pQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBCTV9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQ1NfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUFBQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YU1BfU1VGRklYICAgICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDQ09NTV9TVUZGSVggICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ000UDEwX1NVRkZJWCAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAyX1NVRkZJWCAgIEJBUkVfU1VGRklYCi0KLQotCi0KLS8qIERlZmluZSB3aGF0IHRoZSBlYWNoIGJhcmUsIHVuLXN1ZmZpeGVkIE9wZW5NQVggQVBJIGZ1bmN0aW9uIG5hbWVzIGlzIHRvIGJlIHJlbmFtZWQgKi8KLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlRGF0U3RyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRGF0U3RyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUZpbGxFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUZpbGxFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZVByZ0NmZ0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVByZ0NmZ0VsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0VuY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0VuY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0kgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTURDVEZ3ZF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEZ3ZF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTURDVEludl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEludl9TMzJfUzE2LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX05vaXNlbGVzc0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX05vaXNlbGVzc0RlY29kZSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19RdWFudEludl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19RdWFudEludl9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRElGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRElGSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotCi0KLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZV9TMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZV9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfTURDVEludl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfTURDVEludl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZV9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZV9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2LCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTaWRlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTaWRlSW5mbywgT01YQUNNUDNfU1VGRklYKQotCi0jZGVmaW5lIG9teElDSlBfQ29weUV4cGFuZF9VOF9DMyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfQ29weUV4cGFuZF9VOF9DMywgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENURndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENURndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQotCi0jZGVmaW5lIG9teElQQk1fQWRkQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQWRkQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DM1IsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX01pcnJvcl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX01pcnJvcl9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX011bENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX011bENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiAgICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0ZpbHRlckZJUl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlckZJUl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50R2V0U3RhdGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50R2V0U3RhdGVTaXplLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRJbml0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DM1IsIE9NWElQUFBfU1VGRklYKQotCi0jZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQ29weV9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQ29weV9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRG90UHJvZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRG90UHJvZF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV84eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaywgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5MTZ4MTYsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db3B5OHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5OHg4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fRXhwYW5kRnJhbWVfSSwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0xpbWl0TVZUb1JlY3QsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9TQURfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQotCi0jZGVmaW5lIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQXZlcmFnZV80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrTHVtYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgT01YQ0FUQkFSKFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0dldFZMQ0luZm8sIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FSW5pdCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfMTZ4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzh4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQVREXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQVREXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVBhZE1WX1BWT1AsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlTVYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRmluZE1WcHJlZCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0lEQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NQ1JlY29uQmxvY2ssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUluaXQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLCBPTVhWQ000UDJfU1VGRklYKQotCi0KLSNlbmRpZiAvKiBfYXJtT01YX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmNiMGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKgotICogRmlsZTogb214dHlwZXMuaAotICogQnJpZWY6IERlZmluZXMgYmFzaWMgRGF0YSB0eXBlcyB1c2VkIGluIE9wZW5NQVggdjEuMC4yIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqCi0gKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKLSAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCi0gKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCi0gKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAotICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAotICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAotICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCi0gKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKLSAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAotICoKLSAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAotICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCi0gKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKLSAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKLSAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAotICogbWF0ZXJpYWxzLgotICogCi0gKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKgotICovCi0gIAotI2lmbmRlZiBfT01YVFlQRVNfSF8KLSNkZWZpbmUgX09NWFRZUEVTX0hfCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4gCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNkZWZpbmUgT01YX0lOCi0jZGVmaW5lIE9NWF9PVVQKLSNkZWZpbmUgT01YX0lOT1VUCi0KLQotdHlwZWRlZiBlbnVtIHsKLSAgICAKLSAgICAvKiBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAqLwotICAgIE9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgID0gIDAsICAgIC8qIE5vIGVycm9yLCB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLwotICAgIE9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgID0gLTIsICAgIC8qIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgKi8gICAgCi0gICAgT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgPSAtMTgyLCAgLyogSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgKi8gICAgCi0gICAgT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgPSAtOSwgICAgLyogTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uICovCi0gICAgT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgPSAtMTU5LCAgLyogQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAqLwotICAgIE9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgID0gLTE2NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgKi8KLSAgICBPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICA9IC0xNjMsICAvKiBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICovICAgICAKLSAgICBPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICA9IC0xNjIsICAvKiBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAqLyAgICAKLQlPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICA9IC0xNjAsICAvKiBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yICovCi0KLSAgICAvKiBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uKi8KLSAgICBPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICA9IC01LCAgICAvKiBCYWQgQXJndW1lbnRzICovCi0KLSAgICBPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICA9IC0xNTcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAqLwotICAgIE9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgID0gLTE1NiwgIC8qIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgKi8gICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICA9IC0xNTUsICAvKiBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgKi8gICAgICAgICAgICAgICAgICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICA9IC0xNTQsICAvKiBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLwotICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgID0gLTE1MywgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8gICAgICAgICAgICAgICAgICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICA9IC0xNTIsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICovICAKLQotICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgID0gLTE4MywgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgID0gLTE4MSwgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgPSAtMTcsICAgLyogQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uICovCi0KLSAgICBPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICA9IC0xODAsICAvKiBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgKi8KLQotICAgIE9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgID0gSU5UX01BWCAgLypQbGFjZWhvbGRlciwgZm9yY2VzIGVudW0gb2Ygc2l6ZSBPTVhfSU5UKi8KLSAgICAKLSB9IE9NWFJlc3VsdDsgICAgICAgICAgLyoqIFJldHVybiB2YWx1ZSBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24uIElkZW50aWNhbCB0byBPTVhfSU5UICovCi0KLSAKLS8qIE9NWF9VOCAqLwotdHlwZWRlZiB1aW50OF90IE9NWF9VODsKLSAKLS8qIE9NWF9TOCAqLwotdHlwZWRlZiBpbnQ4X3QgT01YX1M4OwotIAotLyogT01YX1UxNiAqLwotdHlwZWRlZiB1aW50MTZfdCBPTVhfVTE2OwotCi0vKiBPTVhfUzE2ICovCi10eXBlZGVmIGludDE2X3QgT01YX1MxNjsKLQotLyogT01YX1UzMiAqLwotdHlwZWRlZiB1aW50MzJfdCBPTVhfVTMyOwotCi0vKiBPTVhfUzMyICovCi10eXBlZGVmIGludDMyX3QgT01YX1MzMjsKLQotLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KLSNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKLSAgICB0eXBlZGVmIF9faW50NjQgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMGk2NCkKLSAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMGk2NCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKLSNlbHNlCi0gICAgdHlwZWRlZiBpbnQ2NF90IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVpbnQ2NF90IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQotICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCi0jZW5kaWYKLQotLyogT01YX1NDOCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M4IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TOCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0M4OyAvKiogU2lnbmVkIDgtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMTYgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMTYgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MxNiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MxNjsgLyoqIFNpZ25lZCAxNi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0MzMiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1MzMiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzMyOyAvKiogU2lnbmVkIDMyLWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzY0ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDNjQ7IC8qKiBTaWduZWQgNjQtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX0YzMiAqLwotdHlwZWRlZiBmbG9hdCBPTVhfRjMyOyAvKiogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9GNjQgKi8KLXR5cGVkZWYgZG91YmxlIE9NWF9GNjQ7IC8qKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCi0KLQotLyogT01YX0lOVCAqLwotdHlwZWRlZiBpbnQgT01YX0lOVDsgLyoqIHNpZ25lZCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gbWFjaGluZSB3b3JkIGxlbmd0aCwgaGFzIG1heGltdW0gc2lnbmVkIHZhbHVlIElOVF9NQVgqLwotCi0KLSNkZWZpbmUgT01YX01JTl9TOCAgCSAgIAkoLTEyOCkKLSNkZWZpbmUgT01YX01JTl9VOCAgCQkwCi0jZGVmaW5lIE9NWF9NSU5fUzE2CQkgCSgtMzI3NjgpCi0jZGVmaW5lIE9NWF9NSU5fVTE2CQkJMAotI2RlZmluZSBPTVhfTUlOX1MzMgkJCSgtMjE0NzQ4MzY0Ny0xKQotI2RlZmluZSBPTVhfTUlOX1UzMgkJCTAKLQotI2RlZmluZSBPTVhfTUFYX1M4CQkJKDEyNykKLSNkZWZpbmUgT01YX01BWF9VOAkJCSgyNTUpCi0jZGVmaW5lIE9NWF9NQVhfUzE2CQkJKDMyNzY3KQotI2RlZmluZSBPTVhfTUFYX1UxNgkJCSgweEZGRkYpCi0jZGVmaW5lIE9NWF9NQVhfUzMyCQkJKDIxNDc0ODM2NDcpCi0jZGVmaW5lIE9NWF9NQVhfVTMyCQkJKDB4RkZGRkZGRkYpCi0KLXR5cGVkZWYgdm9pZCBPTVhWb2lkOwotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAoKHZvaWQqKTApCi0jZW5kaWYKLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBhIHJlY3RhbmdsZSwgCi0gICogd2hlcmUgeCx5IGRlZmluZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIKLSAgKiBvZiB0aGUgcmVjdGFuZ2xlLCB3aXRoIGRpbWVuc2lvbnMgd2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uIAotICAqIGFuZCBoZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JT01YX0lOVCB4OyAgICAgIC8qKiB4LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLwotCU9NWF9JTlQgeTsgICAgICAvKiogeS1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbi4gKi8KLQlPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24uICovCi19T01YUmVjdDsKLQotCi0vKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIG9mIGEgcG9pbnQsICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSBPTVhfSU5UIHg7IC8qKiB4LWNvb3JkaW5hdGUgKi8KLSBPTVhfSU5UIHk7CS8qKiB5LWNvb3JkaW5hdGUgKi8KLQkKLX0gT01YUG9pbnQ7Ci0KLQotLyoqIERlZmluZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSByZWN0YW5nbGUsIG9yIHJlZ2lvbiBvZiBpbnRlcmVzdCBpbiBhbiBpbWFnZSAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeC1kaXJlY3Rpb24gKi8KLSBPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KLQkKLX0gT01YU2l6ZTsKLQotI2VuZGlmIC8qIF9PTVhUWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxYTAzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXh0eXBlc19zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gCi1PTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICBFUVUgIDAgICAgOy8vIE5vIGVycm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IAotT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgRVFVIC0yICAgIDsvLyBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICAgICAKLU9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgIEVRVSAtMTgyICA7Ly8gSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgICAgIAotT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgRVFVIC05ICAgIDsvLyBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gCi1PTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICBFUVUgLTE1OSAgOy8vIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgCi1PTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICBFUVUgLTE2NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgCi1PTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICBFUVUgLTE2MyAgOy8vIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgICAgICAKLU9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgIEVRVSAtMTYyICA7Ly8gQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgICAgIAotT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgRVFVIC0xNjAgIDsvLyBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yIAotCi07Ly8gT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbgotT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgRVFVIC01ICAgIDsvLyBCYWQgQXJndW1lbnRzIAotCi1PTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICBFUVUgLTE1NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgIAotT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgRVFVIC0xNTYgIDsvLyBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICAgIAotT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgRVFVIC0xNTUgIDsvLyBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgICAgICAgICAgICAgICAgICAgCi1PTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICBFUVUgLTE1NCAgOy8vIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgIAotT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgRVFVIC0xNTMgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgIAotT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgRVFVIC0xNTIgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICAgCi0KLU9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgIEVRVSAtMTgzICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgIAotT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgRVFVIC0xODEgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAKLU9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgIEVRVSAtMTcgICA7Ly8gQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uIAotCi1PTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICBFUVUgLTE4MCAgOy8vIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAKLQotT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgRVFVIDB4N0ZGRkZGRkYKLQotCi0KLU9NWF9NSU5fUzggICAgICBFUVUgCSAgIAkoLTEyOCkKLU9NWF9NSU5fVTggIAlFUVUgICAgIAkwCi1PTVhfTUlOX1MxNgkJRVFVICAgICAgCSgtMzI3NjgpCi1PTVhfTUlOX1UxNgkJRVFVCSAgICAgICAgMAotCi0KLU9NWF9NSU5fUzMyCQlFUVUJKC0yMTQ3NDgzNjQ3LTEpCi1PTVhfTUlOX1UzMgkJRVFVCTAKLQotT01YX01BWF9TOAkJRVFVCSgxMjcpCi1PTVhfTUFYX1U4CQlFUVUJKDI1NSkKLU9NWF9NQVhfUzE2CQlFUVUJKDMyNzY3KQotT01YX01BWF9VMTYJCUVRVQkoMHhGRkZGKQotT01YX01BWF9TMzIJCUVRVQkoMjE0NzQ4MzY0NykKLU9NWF9NQVhfVTMyCQlFUVUJKDB4RkZGRkZGRkYpCi0KLU9NWF9WQ19VUFBFUiAgICBFUVUgMHgxICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAotT01YX1ZDX0xFRlQgICAgIEVRVSAweDIgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zIAotT01YX1ZDX1VQUEVSX1JJR0hUICAgIEVRVSAweDQwICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCi0KLU5VTEwgICAgRVFVIDAKLQotOy8vIFN0cnVjdHVyZXMKLQotICAgIElOQ0xVREUgICAgIGFybUNPTU1fcy5oCi0KLSAgICBNX1NUUlVDVCAgICBPTVhQb2ludAotICAgIE1fRklFTEQgICAgIHgsIDQKLSAgICBNX0ZJRUxEICAgICB5LCA0Ci0gICAgTV9FTkRTVFJVQ1QKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9idWlsZF92Yy5wbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9idWlsZF92Yy5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ2NzJiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIAotIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAotIyBPcGVuTUFYIERMOiB2MS4wLjIKLSMgUmV2aXNpb246ICAgOTY0MQotIyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotIyAKLSMgCi0jIAotIwotIyBUaGlzIGZpbGUgYnVpbGRzIHRoZSBPcGVuTUFYIERMIHZjIGRvbWFpbiBsaWJyYXJ5IG9teFZDLm8uCi0jCi0KLXVzZSBGaWxlOjpTcGVjOwotdXNlIHN0cmljdDsKLQotbXkgKCRDQywgJENDX09QVFMsICRBUywgJEFTX09QVFMsICRMSUIsICRMSUJfT1BUUywgJExJQl9UWVBFKTsKLQotJENDICAgICAgID0gJ2FybWNjJzsKLSRDQ19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQVJNMTEzNkotUyAtYyc7Ci0kQVMgICAgICAgPSAnYXJtYXNtJzsKLSRBU19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQVJNMTEzNkotUyc7Ci0jICRMSUIgICAgICA9ICdhcm1saW5rJzsKLSMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7Ci0jICRMSUJfVFlQRSA9ICcubyc7Ci0kTElCICAgICAgPSAnYXJtYXInOwotJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKLSRMSUJfVFlQRSA9ICcuYSc7Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOwotCi0jIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KLUBoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOwotCi0jIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KLW9wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOwotQGZpbGVsaXN0ID0gPEZJTEVTPjsKLWNsb3NlKEZJTEVTKTsKLQotIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCi1mb3JlYWNoICRoIChAaGVhZGVybGlzdCkKLXsKLSAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOwotfQotCi0jIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKLSRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7Ci0KLSMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKLW1rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKLW1rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKLQotJG9iamxpc3QgPSAnJzsKLQotIyBDb21waWxlIGVhY2ggZmlsZQotZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQotewotCW15ICRmOwotCW15ICRiYXNlOwotCW15ICRleHQ7Ci0JbXkgJG9iamZpbGU7Ci0KLQljaG9tcCgkZmlsZSk7Ci0JJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOwotCi0JKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKLQlpZigoJGJhc2UsICRleHQpID0gJGYgPX4gLyguKylcLihcdykkLykKLQl7Ci0JCSRvYmpmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnb2JqJywgJGJhc2UuJy5vJyk7Ci0KLQkJaWYoJGV4dCBlcSAnYycpCi0JCXsKLQkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOwotCQkJJGNvbW1hbmQgPSAkQ0MuJyAnLiRDQ19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKLQkJCXByaW50ICIkY29tbWFuZFxuIjsKLQkJCXN5c3RlbSgkY29tbWFuZCk7Ci0JCX0KLQkJZWxzaWYoJGV4dCBlcSAncycpCi0JCXsKLQkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOwotCQkJJGNvbW1hbmQgPSAkQVMuJyAnLiRBU19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKLQkJCXByaW50ICIkY29tbWFuZFxuIjsKLQkJCXN5c3RlbSgkY29tbWFuZCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcmludCAiSWdub3JpbmcgZmlsZTogJGZcbiI7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJZGllICJObyBmaWxlIGV4dGVuc2lvbiBmb3VuZDogJGZcbiI7Ci0JfQotfQotCi0jIERvIHRoZSBmaW5hbCBsaW5rIHN0YWdlIHRvIGNyZWF0ZSB0aGUgbGlicmFyaWVzLgotJGxpYmZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdsaWInLCAnb214VkMnLiRMSUJfVFlQRSk7Ci0kY29tbWFuZCA9ICRMSUIuJyAnLiRMSUJfT1BUUy4nICcuJGxpYmZpbGUuJyAnLiRvYmpsaXN0OwotcHJpbnQgIiRjb21tYW5kXG4iOwotKHN5c3RlbSgkY29tbWFuZCkgPT0gMCkgYW5kIHByaW50ICJCdWlsZCBzdWNjZXNzZnVsXG4iOwotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2ZpbGVsaXN0X3ZjLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNjIzZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLi9hcGkvYXJtQ09NTS5oCi0uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKLS4vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKLS4vYXBpL2FybUNPTU1fSURDVF9zLmgKLS4vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKLS4vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKLS4vYXBpL2FybUNPTU1fcy5oCi0uL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotLi9hcGkvYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLS4vYXBpL29teHR5cGVzLmgKLS4vYXBpL29teHR5cGVzX3MuaAotLi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwotLi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwotLi92Yy9hcGkvYXJtVkMuaAotLi92Yy9hcGkvYXJtVkNDT01NX3MuaAotLi92Yy9hcGkvb214VkMuaAotLi92Yy9hcGkvb214VkNfcy5oCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKLS4vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCi0uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRiZjQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlICs9IDAuNTsKLSAgICAgICAgCi0gICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gMC41OwotCi0gICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotCi1PTVhfSU5UIGFybVNpZ25DaGVjayAoCi0gICAgT01YX1MxNiB2YXIKLSkKLQotewotICAgIE9NWF9JTlQgU2lnbjsKLSAgICAKLSAgICBpZiAodmFyIDwgMCkKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAtMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHZhciA+IDApCi0gICAgewotICAgICAgICBTaWduID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU2lnbiA9IDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBTaWduOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1DbGlwICgKLSAgICBPTVhfSU5UIG1pbiwKLSAgICBPTVhfSU5UIG1heCwgCi0gICAgT01YX1MzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgIE9NWF9GMzIgbWluLAotICAgIE9NWF9GMzIgbWF4LCAKLSAgICBPTVhfRjMyIHNyYyAKLSkKLSAKLXsKLSAgICBpZiAoc3JjID4gbWF4KQotICAgIHsKLSAgICAgICAgc3JjID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChzcmMgPCBtaW4pCi0gICAgewotICAgICAgICBzcmMgPSBtaW47Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzcmM7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCi17Ci0gICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKLSAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKLSAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7Ci0gICAgT01YX1UzMiB2SW50OwotICAgIE9NWF9VMzIgdkludFNhdDsKLSAgICAKLSAgICBpZih2IDw9IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OwotICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKLSAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7Ci0gICAgdkludFNhdCA9IHZJbnQ7Ci0gICAgaWYodkludFNhdCA+IG1heFYpIAotICAgICAgICB2SW50U2F0ID0gbWF4VjsKLSAgICByZXR1cm4gdkludFNhdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KLSAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KLSAqLwotT01YUmVzdWx0IGFybVN3YXBFbGVtKAotICAgICAgICBPTVhfVTggKnBCdWYxLAotICAgICAgICBPTVhfVTggKnBCdWYyLAotICAgICAgICBPTVhfSU5UIGVsZW1TaXplCi0gICAgICAgKQotewotICAgIE9NWF9JTlQgaTsKLSAgICBPTVhfVTggdGVtcDsKLSAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7Ci0gICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKLSAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybU1lZGlhbk9mMwotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5Ci0gKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5Ci0gKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybU1lZGlhbk9mMyAoCi0gICAgT01YX1MzMiBmRW50cnksCi0gICAgT01YX1MzMiBzRW50cnksIAotICAgIE9NWF9TMzIgdEVudHJ5IAotKQotewotICAgIE9NWF9TMzIgYSwgYiwgYzsKLSAgICAKLSAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7Ci0gICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOwotICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7Ci0gICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCi0gICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KLSAqLyAKLSAKLU9NWF9VOCBhcm1Mb2dTaXplICgKLSAgICBPTVhfVTE2IHZhbHVlIAotKQotewotICAgIE9NWF9VOCBpOyAgICAKLSAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAotICAgIHsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCi0gICAgewotICAgICAgICAvKlNhbWUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCi17Ci0gICAgT01YX1M2NCBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OwotICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCi0gKiAKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKLSAgICB7Ci0gICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKLSAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKLQotICAgIHJldHVybiBSZXN1bHQ7ICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCi17Ci0gICAgCi0gICAgT01YX1MzMiByZXN1bHQ7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKLQotICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7Ci0gICAgfQotICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7Ci0gICAgfQotCi0gICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKLSAgICAKLSAgICByZXR1cm4gbWFjOwotfQotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KLSAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQotewotICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7Ci0KLSAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKLSAgICB9Ci0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqICAgICAKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCi17Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgIGlmIChTaGlmdCA8IDApCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDsKLSAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOwotICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkyLGxvMTsKLSAgICBPTVhfVTE2IGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOwotICAgIE9NWF9TMzIgcmVzdWx0OwotICAgIAotICAgIGxvMSAgPSBpbnB1dDE7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gaGkyICogbG8xOwotICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OwotCi0gICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCi17Ci0gICAgT01YX1MxNiBoaTEsaGkyOwotICAgIE9NWF9VMTYgbG8xLGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOwotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOwotICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKLQotICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKLSAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7Ci0gICAgCi0gICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKLSAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKLSAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKLXsKLSAgICBPTVhfRjY0IHJlc3VsdDsKLSAgICAKLSAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7Ci0gICAgCi0gICAgaWYgKHJlc3VsdCA+PSAwKQotICAgIHsKLSAgICAgICAgcmVzdWx0ICs9IDAuNTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0IC09IDAuNTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Ci19Ci0KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmNTNjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLi4zMgotICoKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLQotT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAKLSAgICBpZihOID09IDApCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci0KLSAgICAvKiBSZXR1cm4gTiBiaXRzICovCi0gICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKLXsKLSAgICBpZigqcE9mZnNldCA+IDApCi0gICAgewotICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKLSAgICAgICAgKnBPZmZzZXQgPSAwOwotICAgIH0gICAgCi19Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLQotT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKLXsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgIAotICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCi0gICAgT2Zmc2V0ICs9IE47Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCi0gKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKLSAqIHBvaW50ZWQgYnkgcENvZGVCb29rCi0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIHBDb2RlQm9vawotICogCi0gKiBbb3V0XSAgICAqcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0jaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAotCi1PTVhfVTE2IGFybVVuUGFja1ZMQzMyKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKLSkKLXsgICAgCi0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICBPTVhfSU5UIEluZGV4OwotICAgICAgICAKLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAotICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCi0gICAgewotICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKLSAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKLSAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBJbmRleDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHBDb2RlQm9vaysrOwotICAgIH0KLQotICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KLSAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOwotfQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrQml0cyAoCi0gICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIE9NWF9VMzIgY29kZVdvcmQsIAotICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKLSkKLXsKLSAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAgICAgCi0gICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCi0gICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7Ci0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOwotICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOwotCi0gICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCi0gICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCi0gICAgewotICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKLSAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOwotICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7Ci0gICAgICAgIE9mZnNldCA9IDA7Ci0gICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLwotICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7Ci0gICAgCi0gICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOwotfQotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSkKLXsKLSAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKLX0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMGI4N2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqICAgCi0gKiBGaWxlOiBhcm1DT01NX0lEQ1RUYWJsZS5jCi0gKiBCcmllZjogRGVmaW5lcyBUYWJsZXMgdXNlZCBpbiBJRENUIGNvbXB1dGF0aW9uCi0gKgotICovCi0KLSNpbmNsdWRlICJhcm1DT01NX0lEQ1RUYWJsZS5oIgotCi0gICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKLSAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1Ci0gICAgICAqICBzKDYpPTIuMAotICAgICAgKiAgcyg3KT00LjAKLSAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKLSAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQotCSAgKi8KLQkgIAotX19hbGlnbig0KSBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF0gPQotewotICAgIDB4NDAwMCwgMHg1OGM1LCAweDUzOWYsIDB4NGI0MiwgMHg0MDAwLCAweDMyNDksIDB4NDU0NiwgMHg0NmExLAotICAgIDB4NThjNSwgMHg3YjIxLCAweDczZmMsIDB4Njg2MiwgMHg1OGM1LCAweDQ1YmYsIDB4NjAxNiwgMHg2MWY4LAotICAgIDB4NTM5ZiwgMHg3M2ZjLCAweDZkNDEsIDB4NjI1NCwgMHg1MzlmLCAweDQxYjMsIDB4NWE4MiwgMHg1YzQ4LAotICAgIDB4NGI0MiwgMHg2ODYyLCAweDYyNTQsIDB4NTg3ZSwgMHg0YjQyLCAweDNiMjEsIDB4NTE3NSwgMHg1MzBkLAotICAgIDB4NDAwMCwgMHg1OGM1LCAweDUzOWYsIDB4NGI0MiwgMHg0MDAwLCAweDMyNDksIDB4NDU0NiwgMHg0NmExLAotICAgIDB4MzI0OSwgMHg0NWJmLCAweDQxYjMsIDB4M2IyMSwgMHgzMjQ5LCAweDI3ODIsIDB4MzY2ZCwgMHgzNzdlLAotICAgIDB4MjJhMywgMHgzMDBiLCAweDJkNDEsIDB4MjhiYSwgMHgyMmEzLCAweDFiMzcsIDB4MjU3ZSwgMHgyNjNhLAotICAgIDB4MTFhOCwgMHgxODdlLCAweDE3MTIsIDB4MTRjMywgMHgxMWE4LCAweDBkZTAsIDB4MTMxZCwgMHgxMzdkICAgIAotfTsKLSAgICAvKiBBYm92ZSBhcnJheSBhcm1DT01NX0lEQ1RQcmVTY2FsZSwgIGluIFEyMyBmb3JtYXQgKi8KLWNvbnN0IE9NWF9VMzIgYXJtQ09NTV9JRENUUHJlU2NhbGVVMzIgWzY0XSA9Ci17Ci0gICAgMHg0MDAwMDAsIDB4NThjNTQzLCAweDUzOWViYSwgMHg0YjQxOGMsIDB4NDAwMDAwLCAweDMyNDhkNCwgMHg0NTQ1ZWEsIDB4NDZhMTU3LAotICAgIDB4NThjNTQzLCAweDdiMjBkOCwgMHg3M2ZiZmMsIDB4Njg2MjE0LCAweDU4YzU0MywgMHg0NWJmMWYsIDB4NjAxNWE1LCAweDYxZjc4YiwKLSAgICAweDUzOWViYSwgMHg3M2ZiZmMsIDB4NmQ0MTNkLCAweDYyNTNhNiwgMHg1MzllYmEsIDB4NDFiMzI4LCAweDVhODI3YSwgMHg1YzQ4NjksCi0gICAgMHg0YjQxOGMsIDB4Njg2MjE0LCAweDYyNTNhNiwgMHg1ODdkZTMsIDB4NGI0MThjLCAweDNiMjBkOCwgMHg1MTc0ZTAsIDB4NTMwZDY5LAotICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKLSAgICAweDMyNDhkNCwgMHg0NWJmMWYsIDB4NDFiMzI4LCAweDNiMjBkOCwgMHgzMjQ4ZDQsIDB4Mjc4MjFkLCAweDM2NmQ3MiwgMHgzNzdlNmIsCi0gICAgMHgyMmEyZjUsIDB4MzAwYWQzLCAweDJkNDEzZCwgMHgyOGJhNzAsIDB4MjJhMmY1LCAweDFiMzZiOSwgMHgyNTdkODYsIDB4MjYzOThkLAotICAgIDB4MTFhODU2LCAweDE4N2RlMywgMHgxNzEyMWEsIDB4MTRjMzVhLCAweDExYTg1NiwgMHgwZGRmOWIsIDB4MTMxY2M3LCAweDEzN2NhMgotfTsKLSAgIAotY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XSA9Ci17Ci0gICAgMHg1YTgyLCAvKiBJbnZTcXJ0MiAqLwotICAgIDB4MzBmYywgLyogU2luUElCeTggKi8KLSAgICAweDc2NDIsIC8qIENvc1BJQnk4ICovCi0gICAgMHgwMDAwICAgIAotfTsKLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YThlNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkuCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSNkZWZpbmUgTWFza1RhYmxlU2l6ZSA3MgotCi1jb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdID0gCi17Ci0gICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiAgICAKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdID0gCi17Ci0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGICAgIAotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZThiNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtVmlkZW8uaAotICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCi0gKgotICovCi0KLQotI2lmbmRlZiBfYXJtVmlkZW9fSF8KLSNkZWZpbmUgX2FybVZpZGVvX0hfCi0KLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKgotICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgotICovCi0gCi1zdHJ1Y3QgbTRwMl9NRVNwZWMKLXsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Ci19OwotCi1zdHJ1Y3QgbTRwMTBfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOwotICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKLXR5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKLSAqIGJlc3QgTVYgYW5kIFNBRAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKLSAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKLSAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKLSAqLwotCi1PTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAotICAgIE9NWF9TMTYgbXZYLAotICAgIE9NWF9TMTYgbXZZLAotICAgIE9NWF9JTlQgY2FuZFNBRCwKLSAgICBPTVhfUzE2IGJlc3RNVlgsCi0gICAgT01YX1MxNiBiZXN0TVZZLAotICAgIE9NWF9JTlQgYmVzdFNBRCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAotICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgotICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAotICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bwotICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKLSAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAotICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAotICAgICBPTVhfSU5UIGN1clFQLAotICAgICBPTVhfSU5UIHByZWRRUCwKLSAgICAgT01YX0lOVCBwcmVkRGlyLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCi0gICAgIE9NWF9VOCBmbGFnLAotICAgICBPTVhfSU5UICpwU3VtRXJyCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQwotICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCi0gKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX0lOVCAqcHJlZERpciwKLSAgICAgT01YX0lOVCAqcHJlZFFQLAotICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KLSAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWF9VOCBzdGFydAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCi0gICAgIE9NWF9VOCAgc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCi0gKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAotICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCi0gKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKLSAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAotICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAotICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKLSAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0gICAgT01YX1UzMiBzdG9yZVJ1biwKLSAgICBPTVhfUzE2ICogcERzdCwKLSAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCi0gICAgT01YX1U4ICBzaWduLAotICAgIE9NWF9VOCAgbGFzdCwKLSAgICBPTVhfVTggICogaW5kZXgsCi0gICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0JCQkgIE9NWF9TMTYgKiBwRHN0LAotCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0JCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAotCQkJICBPTVhfVTggICogcExhc3QsCi0JCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKLSAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAotICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcwotICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKLSAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKLSAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKLQkJCSAgT01YX1UzMiBydW5QbHVzLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCi0gICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCi0JCQkgIE9NWF9VOCAgbGFzdCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIAotICogUmV0dXJuIFZhbHVlOgotICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKLSAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAotICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCi0gKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCi0gKgotICovCi0KLU9NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAotICAgICBPTVhfVTMyIHJ1biwKLSAgICAgT01YX1UzMiBydW5QbHVzLAotICAgICBPTVhfUzE2IGxldmVsLAotICAgICBPTVhfUzE2IGxldmVsUGx1cywKLSAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKLSAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKLSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCi0gKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCi0gKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCi0gKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAotICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCi0gKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAotICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKLSAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCi0gKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQotICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAotICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCi0gKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgotICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCi0gKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCi0gKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCi0gKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCi0gKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKLSAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKLSAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCi0gKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAotICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAotICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCi0gKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jawotICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKLSAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCi0gICAgIE9NWF9VOCAqIHBUcmFuc3AKLSk7Ci0KLS8qIAotICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAotICovCi0vKiBEZWZpbmVzICovCi0jZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQotCi0KLS8qIERlcXVhbnQgdGFibGVzICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKLQotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKLSAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCi0gKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKLSAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucwotICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCi0gKgkJCQkJCQkJdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0KLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgblRhYmxlLAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCi0gKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCi0gKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCi0gKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCi0gKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCi0gKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCi0gKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCi0gKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKLSAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscwotICogCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KLSAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KLSAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KLSAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KLSAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLwotICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCi0gICAgaW50IENocm9tYUZsYWcKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucwotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKLSAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCi0JCU9NWF9VMzIgCWlTcmNTdGVwLCAKLQkJT01YX1U4KiAJcERzdCwgCi0JCU9NWF9VMzIgCWlEc3RTdGVwLCAKLQkJT01YX1UzMiAJaVdpZHRoLCAKLQkJT01YX1UzMiAJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCi0JIGNvbnN0IE9NWF9VOCogCXBTcmMsIAotCSBPTVhfVTMyIAlpU3JjU3RlcCwgCi0gCSBPTVhfVTgqIAlwRHN0LAotIAkgT01YX1UzMiAJaURzdFN0ZXAsIAotIAkgT01YX1UzMiAJaVdpZHRoLCAKLSAJIE9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKLSAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7Ci0KLU9NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAotICAgIE9NWF9TMTYgIG12WCwKLSAgICBPTVhfUzE2ICBtdlksCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKLSAgICBPTVhfSU5UIGNhbmRTQUQsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKLSAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCi0JY29uc3QgT01YX1U4KiAJcFNyY09yZywKLQlPTVhfVTMyIAlpU3RlcE9yZywKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAotCU9NWF9VMzIgCWlTdGVwUmVmLAotCU9NWF9TMzIqCXBEc3RTQUQsCi0JT01YX1UzMgkJaUhlaWdodCwKLQlPTVhfVTMyCQlpV2lkdGgpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCi0gKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcwotICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaVdpZHRoLAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAotICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAotICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKLSAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKLQljb25zdCBPTVhfVTgqIAlwU3JjLAotICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICBPTVhfVTMyICAgICBpV2lkdGgKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAotICAgICAgICBPTVhfVTggICAgICAqcFNyYywKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCi0gICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgICAgICBPTVhfVTMyICAgICBkeCwKLSAgICAgICAgT01YX1UzMiAgICAgZHkKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAotICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAotICAgICBPTVhfVTggICAgICpwRHN0LAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwKLSAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAotICAgICBPTVhfVTMyICAgIGR4LAotICAgICBPTVhfVTMyICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAotICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKLSAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCi0gKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAotICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAotICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLSAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKLSAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAotICAgICBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiAqcERzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX1MxNiogcERDLAotICAgICBpbnQgQUMKLSk7Ci0KLSNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLwotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWQ0NjQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkNDT01NX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggQUMgaGVhZGVyIGZpbGUKLTsvLyAKLTsvLyBGb3JtdWxhIHVzZWQ6Ci07Ly8gTUFDUk8gZm9yIGNhbGN1bGF0aW5nIG1lZGlhbiBmb3IgdGhyZWUgdmFsdWVzLgotCi0KLQotICAgIElGIDpMTk9UOjpERUY6QVJNVkNDT01NX1NfSAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgTV9WQVJJQU5UUyAgICAgIENvcnRleEE4LCBBUk0xMTM2SlMKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTggCi0gICAgIAotICAgICA7Ly8vKgotICAgICA7Ly8gKiBNYWNybzogTV9NRURJQU4zCi0gICAgIDsvLyAqCi0gICAgIDsvLyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAgICAgOy8vICogCi0gICAgIDsvLyAqIFJlbWFya3M6Ci0gICAgIDsvLyAqCi0gICAgIDsvLyAqIFBhcmFtZXRlcnM6Ci0gICAgIDsvLyAqIFtpbl0geCAgICAgRmlyc3QgZW50cnkgZm9yIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCi0gICAgIDsvLyAqIFtpbl0geSAgICAgU2Vjb25kIGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgotICAgICA7Ly8gKiAgICAgICAgICAgIElucHV0IHZhbHVlIG1heSBiZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZgotICAgICA7Ly8gKiAgICAgICAgICAgIHRoZSBleGVjdXRpb24gb2YgdGhpcyBtYWNyby4KLSAgICAgOy8vICogW2luXSB6ICAgICBUaGlyZCBlbnRyeSBvZiB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgotICAgICA7Ly8gKiAgICAgICAgICAgIElucHV0IHZhbHVlIGNvcnJ1cHRlZCBhdCB0aGUgZW5kIG9mIHRoZSAKLSAgICAgOy8vICogICAgICAgICAgICBleGVjdXRpb24gb2YgdGhpcyBtYWNyby4KLSAgICAgOy8vICogW2luXSB0ICAgICBUZW1wb3Jhcnkgc2NyYXRjaCAgcmVnaXN0ZXIuCi0gICAgIDsvLyAqIFtvdXRdeiAgICAgTWVkaWFuIG9mIHRoZSB0aHJlZSBudW1iZXJzLiAgICAgICAKLSAgICAgOy8vICovCi0gICAgIAotICAgICBNQUNSTwotCi0gICAgIE1fTUVESUFOMyAkeCwgJHksICR6LCAkdCAKLSAgICAgCi0gICAgIFNVQlMgICR0LCAkeSwgJHo7IC8vIGlmICh5IDwgeikKLSAgICAgQURETFQgJHosICR6LCAkdDsgLy8gIHN3YXAgeSBhbmQgegotICAgICBTVUJMVCAkeSwgJHksICR0OwotCi0gICAgIDsvLyBOb3cgeicgPD0geScsIHNvIHRoZXJlIGFyZSB0aHJlZSBjYXNlcyBmb3IgdGhlCi0gICAgIDsvLyBtZWRpYW4gdmFsdWUsIGRlcGVuZGluZyBvbiB4LgotCi0gICAgIDsvLyAxKSB4IDw9IHonICAgICAgPD0geScgICAgICA6IG1lZGlhbiB2YWx1ZSBpcyB6JwotICAgICA7Ly8gMikgICAgICB6JyA8PSB4IDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeAotICAgICA7Ly8gMykgICAgICB6JyAgICAgIDw9IHknIDw9IHggOiBtZWRpYW4gdmFsdWUgaXMgeScKLQotICAgICBDTVAgICAkeiwgJHg7ICAgICAvLyBpZiAoIHggPiBtaW4oeSx6KSApCi0gICAgIE1PVkxUICR6LCAkeDsgICAgIC8vIGFucyA9IHggCi0KLSAgICAgQ01QICAgJHgsICR5OyAgICAgLy8gaWYgKCB4ID4gbWF4KHkseikgKQotICAgICBNT1ZHVCAkeiwgJHk7ICAgICAvLyBhbnMgPSBtYXgoeSx6KQotICAgICAKLSAgICAgTUVORAotICAgIEVORElGICAgICAgCi0gICAgCi0gICAgCi0gICAgICAgIAotICAgIEVORElGIDsvLyBBUk1BQ0NPTU1fU19ICi0KLSBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzY2M3Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzgxICswLDAgQEAKLS8qKgotICogRmlsZTogb214VkMuaAotICogQnJpZWY6IE9wZW5NQVggREwgdjEuMC4yIC0gVmlkZW8gQ29kaW5nIGxpYnJhcnkKLSAqCi0gKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqCi0gKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKLSAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCi0gKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCi0gKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAotICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAotICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAotICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCi0gKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKLSAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAotICoKLSAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAotICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCi0gKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKLSAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKLSAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAotICogbWF0ZXJpYWxzLgotICogCi0gKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKgotICovCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9PTVhWQ19IXwotI2RlZmluZSBfT01YVkNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiA2LjEuMS4xIE1vdGlvbiBWZWN0b3JzICAqLwotLyogSW4gb214VkMsIG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMTYgZHg7Ci0gICAgT01YX1MxNiBkeTsKLX0gT01YVkNNb3Rpb25WZWN0b3I7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAotICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKLSAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKLSAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAotICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCi0gKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCi0gKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCi0gKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKLSAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAotICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKLSAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKLSAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKLSAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCi0gKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAotICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdFBsYW5lLAotICAgIE9NWF9VMzIgaUZyYW1lV2lkdGgsCi0gICAgT01YX1UzMiBpRnJhbWVIZWlnaHQsCi0gICAgT01YX1UzMiBpRXhwYW5kUGVscywKLSAgICBPTVhfVTMyIGlQbGFuZVN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAotICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5OHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCi0gKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgKDYuMS40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrOyBhbHNvIHJldHVybnMgU0FELiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgKFNBRCkgdmFsdWUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmLCBwRHN0IGFuZCBwRHN0U0FELiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCi0gKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCi0gKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAotICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAotICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCi0gKiAgICAgICAgICAgIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKLSAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAotICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICgKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlY3RWT1BSZWYsCi0gICAgT01YX0lOVCBYY29vcmQsCi0gICAgT01YX0lOVCBZY29vcmQsCi0gICAgT01YX0lOVCBzaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKiA2LjIuMS4xIERpcmVjdGlvbiAgKi8KLS8qIFRoZSBkaXJlY3Rpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBBQy9EQyBwcmVkaWN0aW9uIGFuZCB6aWctemFnIHNjYW4uICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfTk9ORSAgICAgICA9IDAsCi0gICAgT01YX1ZDX0hPUklaT05UQUwgPSAxLAotICAgIE9NWF9WQ19WRVJUSUNBTCAgID0gMiAKLX07Ci0KLQotCi0vKiA2LjIuMS4yIEJpbGluZWFyIEludGVycG9sYXRpb24gICovCi0vKiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBtb3Rpb24gZXN0aW1hdGlvbiwgbW90aW9uIGNvbXBlbnNhdGlvbiwgYW5kIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9ucy4gICovCi0KLWVudW0gewotICAgIE9NWF9WQ19JTlRFR0VSX1BJWEVMID0gMCwgLyogY2FzZSBhICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWCAgPSAxLCAvKiBjYXNlIGIgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9ZICA9IDIsIC8qIGNhc2UgYyAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1hZID0gMyAgLyogY2FzZSBkICovIAotfTsKLQotCi0KLS8qIDYuMi4xLjMgTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkgICovCi0vKiBOZWlnaGJvcmluZyBtYWNyb2Jsb2NrIGF2YWlsYWJpbGl0eSBpcyBpbmRpY2F0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmbGFnczogICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfVVBQRVIgPSAxLCAgICAgICAgLyoqIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0xFRlQgPSAyLCAgICAgICAgIC8qKiBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0NFTlRFUiA9IDQsCi0gICAgT01YX1ZDX1JJR0hUID0gOCwKLSAgICBPTVhfVkNfTE9XRVIgPSAxNiwKLSAgICBPTVhfVkNfVVBQRVJfTEVGVCA9IDMyLCAgLyoqIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfVVBQRVJfUklHSFQgPSA2NCwgLyoqIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0xPV0VSX0xFRlQgPSAxMjgsCi0gICAgT01YX1ZDX0xPV0VSX1JJR0hUID0gMjU2IAotfTsKLQotCi0KLS8qIDYuMi4xLjQgVmlkZW8gQ29tcG9uZW50cyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyB2aWRlbyBjb21wb25lbnRzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0xVTUlOQU5DRSwgICAgLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KLSAgICBPTVhfVkNfQ0hST01JTkFOQ0UgICAvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovIAotfSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudDsKLQotCi0KLS8qIDYuMi4xLjUgTWFjcm9ibG9ja1R5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfSU5URVIgICAgID0gMCwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUl9RICAgPSAxLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSNFYgICA9IDIsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5UUkEgICAgID0gMywgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVFJBX1EgICA9IDQsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUjRWX1EgPSA1ICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotfSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMi4xLjYgQ29vcmRpbmF0ZXMgICovCi0vKiBDb29yZGluYXRlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfSU5UIHg7Ci0gICAgT01YX0lOVCB5OwotfSBPTVhWQ000UDJDb29yZGluYXRlOwotCi0KLQotLyogNi4yLjEuNyBNb3Rpb24gRXN0aW1hdGlvbiBBbGdvcml0aG1zICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCBtZXRob2RzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX000UDJfRkFTVF9TRUFSQ0ggPSAwLCAgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLwotICAgIE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIID0gMSAgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCi19IE9NWFZDTTRQMk1FTW9kZTsKLQotCi0KLS8qIDYuMi4xLjggTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KLS8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBjb250cm9sIHBhcmFtZXRlcnMgZm9yIAotICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfSU5UIHNlYXJjaEVuYWJsZTh4ODsgICAgIC8qKiBlbmFibGVzIDh4OCBzZWFyY2ggKi8KLSAgICBPTVhfSU5UIGhhbGZQZWxTZWFyY2hFbmFibGU7IC8qKiBlbmFibGVzIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KLSAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOyAgICAgICAgIC8qKiBzZWFyY2ggcmFuZ2UgKi8KLSAgICBPTVhfSU5UIHJuZFZhbDsgICAgICAgICAgICAgIC8qKiByb3VuZGluZyBjb250cm9sOyAwLWRpc2FibGVkLCAxLWVuYWJsZWQqLwotfSBPTVhWQ000UDJNRVBhcmFtczsKLQotCi0KLS8qIDYuMi4xLjkgTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgICovCi0vKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIGZvciAKLSAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgLyogTUIgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIE9NWF9WQ19JTlRFUjQgKi8KLSAgICBPTVhfUzMyIHFwOyAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gcGFyYW1ldGVyKi8KLSAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLwotICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzJdWzJdOyAgICAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPTB+MSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFsyXVsyXTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPSAwfjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9VOCBwUHJlZERpclsyXVsyXTsgICAgICAgICAgIC8qIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIE9NWF9WQ19OT05FLCBPTVhfVkNfVkVSVElDQUwsIE9NWF9WQ19IT1JJWk9OVEFMIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBPTVhWQ000UDJNQkluZm8sICpPTVhWQ000UDJNQkluZm9QdHI7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCi0gKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAotICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCi0gKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKLSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAotICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKLSAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKLSAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKLSAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCi0gKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKLSAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKLSAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCi0gKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCi0gKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAotICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCAoCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkN1ck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYzLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkTUUsCi0gICAgT01YX0lOVCBpQmxrCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVJbml0ICAgKDYuMi40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBybmRWYWwsIHNlYXJjaFJhbmdlLCBldGMuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfTUVHZXRCdWZTaXplLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0ICgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zKnBNRVBhcmFtcywKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAoNi4yLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIAotICogaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBNQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuICBGb3IgZXhhbXBsZSwgaWYgcGFkZGluZyBleHRlbmRzIDQgcGl4ZWxzIGJleW9uZCAKLSAqICAgICAgICAgICAgZnJhbWUgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIGxlZnQgYm9yZGVyIGNvdWxkIGJlIHNldCB0byAKLSAqICAgICAgICAgICAgLTQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjUHJlTVYsCi0gICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgT01YX0lOVCBybmRWYWwsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4yLjQuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIHNlYXJjaCBmb3IgYSAxNngxNiBtYWNyb2Jsb2NrLiAgU2VsZWN0cyBiZXN0IG1vdGlvbiBzZWFyY2ggCi0gKiBzdHJhdGVneSBmcm9tIGFtb25nIGludGVyLTFNViwgaW50ZXItNE1WLCBhbmQgaW50cmEgbW9kZXMuICBTdXBwb3J0cyAKLSAqIGludGVnZXIgYW5kIGhhbGYgcGl4ZWwgcmVzb2x1dGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgTUIgaW4gdGhlIAotICogICAgICAgICAgICBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3Qgc291cmNlIGRhdGEgb3V0c2lkZSB0aGUgcmVnaW9uIAotICogICAgICAgICAgICBib3VuZGVkIGJ5IHRoZSBNQiB0byBiZSBhdmFpbGFibGU7IGZvciBleGFtcGxlIGl0IGlzIG5vdCAKLSAqICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGd1YXJhbnRlZSB0aGUgYXZhaWxhYmlsaXR5IG9mIAotICogICAgICAgICAgICBwU3JjQ3VyckJ1ZlstU3JjQ3VyclN0ZXBdLCBpLmUuLCB0aGUgcm93IG9mIHBpeGVscyBhYm92ZSB0aGUgTUIgCi0gKiAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZC4gCi0gKiAgIHNyY0N1cnJTdGVwIC0gd2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGxhbmUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjUmVmU3RlcCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlLCBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gCi0gKiAgICAgICAgICAgIHRoZSBpbWFnZSBvcmlnaW4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZTsgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW5mbyAtIGFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgbmVhcmJ5IE1CczogCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzBdIC0gcG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1sxXSAtIHBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1syXSAtIHBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzNdIC0gcG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIHRvIE5VTEwgaWYgdGhlIAotICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIE1CIGRvZXNuJ3QgZXhpc3QuICBGb3IgZWFjaCBNQiwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgCi0gKiAgICAgICAgICAgIG1lbWJlcnMgYXJlIHVzZWQ6ICAgIAotICogICAgICAgICAgICAtICAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlLCBlaXRoZXIgT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYgCi0gKiAgICAgICAgICAgIC0gICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgIGluIDEvMiBwaXhlbCB1bml0cyAKLSAqICAgICAgICAgICAgLSAgIHNsaWNlSUQgLSBudW1iZXIgb2YgdGhlIHNsaWNlIHRvIHdoaWNoIHRoZSBNQiBiZWxvbmdzIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gIFRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2JweSBhbmQgY2JwYyBhcmUgCi0gKiAgICAgICAgICAgIGlnbm9yZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbjogICAKLSAqICAgICAgICAgICAgICAtICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0Vi4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WUHJlZFsyXVsyXSAtIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBjYnB5IGFuZCBjYnBjIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgZnVuY3Rpb24uIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgbWluaW11bSBTQUQgZm9yIElOVEVSMVYsIG9yIHN1bSBvZiBtaW5pbXVtIFNBRHMgCi0gKiAgICAgICAgICAgIGZvciBJTlRFUjRWIAotICogICBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFNBRCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgCi0gKiAgICAgICAgICAgIDh4OCBsdW1hIGJsb2NrcyBpbiB0aGUgTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNQkludGVyLCBwTUJJbnRyYSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyciwgb3IgcERzdFNBRC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAotICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTE2ICpwRHN0U0FELAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKLSAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDYuMS4zLjguIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50cmFfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludGVyX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAoNi4yLjQuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzLCBpbXBsZW1lbnRzIGludHJhIGJsb2NrIEFDL0RDIGNvZWZmaWNpZW50IAotICogcHJlZGljdGlvbiwgYW5kIHJlY29uc3RydWN0cyB0aGUgY3VycmVudCBpbnRyYSBibG9jayB0ZXh0dXJlIGZvciBwcmVkaWN0aW9uIAotICogb24gdGhlIG5leHQgZnJhbWUuICBRdWFudGl6ZWQgcm93IGFuZCBjb2x1bW4gY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiAKLSAqIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGJ1ZmZlcnMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBwaXhlbHMgb2YgY3VycmVudCBpbnRyYSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgY29udGFpbmluZyAKLSAqICAgICAgICAgICAgKChudW1fbWJfcGVyX3JvdyAqIDIgKyAxKSAqIDgpIGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gCi0gKiAgICAgICAgICAgIENvZWZmaWNpZW50cyBhcmUgb3JnYW5pemVkIGludG8gYmxvY2tzIG9mIGVpZ2h0IGFzIGRlc2NyaWJlZCAKLSAqICAgICAgICAgICAgYmVsb3cgKEludGVybmFsIFByZWRpY3Rpb24gQ29lZmZpY2llbnQgVXBkYXRlIFByb2NlZHVyZXMpLiAgVGhlIAotICogICAgICAgICAgICBEQyBjb2VmZmljaWVudCBpcyBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgYnVmZmVyIGxvY2F0aW9ucyAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cy4gRWFjaCBncm91cCBvZiBlaWdodCByb3cgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBlbGVtZW50cyBjb21iaW5lZCB3aXRoIG9uZSBlbGVtZW50IGVpZ2h0IGVsZW1lbnRzIGFoZWFkIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgY29lZmZpY2llbnQgcHJlZGljdG9ycyBvZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgCi0gKiAgICAgICAgICAgIHRoYXQgaXMgc3BhdGlhbGx5IGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgdG8gCi0gKiAgICAgICAgICAgIGJlIGRlY29kZWQuIEEgbmVnYXRpdmUtdmFsdWVkIERDIGNvZWZmaWNpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgCi0gKiAgICAgICAgICAgIG5laWdoYm9yaW5nIGJsb2NrIGlzIG5vdCBJTlRSQS1jb2RlZCBvciBvdXQgb2YgYm91bmRzLCBhbmQgCi0gKiAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgaW52YWxpZC4gIFBvaW50ZXIgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgICAgICAgICAgY29udGFpbmluZyAxNiBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIENvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIG9yZ2FuaXplZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjIuMi41LiAgUG9pbnRlciBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IEFDIHByZWRpY3Rpb24gaXMgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkOyBBQyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgaWYgKnBTdW1FcnIgPj0wLCBidXQgdGhlIAotICogICAgICAgICAgICB2YWx1ZSBpcyBub3QgdXNlZCBmb3IgY29lZmZpY2llbnQgcHJlZGljdGlvbiwgaS5lLiwgdGhlIHN1bSBvZiAKLSAqICAgICAgICAgICAgYWJzb2x1dGUgZGlmZmVyZW5jZXMgc3RhcnRzIGZyb20gMCBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIEFDIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgaWYgKnBTdW1FcnIgPCAwIC4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjguIAotICogICBjdXJRcCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIGJlbG9uZ3MgCi0gKiAgIHBRcEJ1ZiAtIHBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXI7IHBRcEJ1ZlswXSAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggCi0gKiAgICAgICAgICAgIGJsb2NrIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYSksIGFuZCBwUXBCdWZbMV0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IGJsb2NrIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayAoUVBjKS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIAotICogICAgICAgICAgICBibG9jayBpcyBvdXRzaWRlIG9mIHRoZSBWT1AgYm91bmQsIHRoZSBRcCB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgCi0gKiAgICAgICAgICAgIHRoZSBpbnRyYSBwcmVkaWN0aW9uIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIAotICogICAgICAgICAgICBzdWItY2xhdXNlIDcuNC4zLjMsICBBZGFwdGl2ZSBBQyBDb2VmZmljaWVudCBQcmVkaWN0aW9uLiAgCi0gKiAgIHNyY1N0ZXAgLSB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gd2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCBidWZmZXI7IHBEc3RbMF0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgREMgY29lZmZpY2llbnQ7IHRoZSByZW1haW5pbmcgZW50cmllcyBjb250YWluIHRoZSAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cyAod2l0aG91dCBwcmVkaWN0aW9uKS4gIFRoZSBwb2ludGVyIAotICogICAgICAgICAgICBwRHN0bXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICBwUHJlQUNQcmVkaWN0IC0gaWYgcHJlZGljdGlvbiBpcyBlbmFibGVkLCB0aGUgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgCi0gKiAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgZGlmZmVyZW5jZXMgZm9yIAotICogICAgICAgICAgICBWTEMgZW5jb2RpbmcuIFRoZSBlbnRyeSBwUHJlQUNQcmVkaWN0WzBdaW5kaWNhdGVzIHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIGRpcmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICB2YWx1ZXM6IE9NWF9WQ19OT05FIChwcmVkaWN0aW9uIGRpc2FibGVkKSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwuICBUaGUgZW50cmllcyAKLSAqICAgICAgICAgICAgcFByZUFDUHJlZGljdFsxXS1wUHJlQUNQcmVkaWN0WzddY29udGFpbiBwcmVkaWN0ZWQgQUMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cy4gIElmIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgKCpwU3VtRXJyPDApIHRoZW4gdGhlIAotICogICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcmUgdW5kZWZpbmVkIHVwb24gcmV0dXJuIGZyb20gdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRlZCBBQyBjb2VmZmljaWVudCBlcnJvcnMsIAotICogICAgICAgICAgICBpLmUuLCBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGVkIGFuZCAKLSAqICAgICAgICAgICAgdW5wcmVkaWN0ZWQgQUMgY29lZmZpY2llbnRzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0LCBwUmVjLCAKLSAqICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUXBCdWYsIHBQcmVBQ1ByZWRpY3QsIHBTdW1FcnIuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwOyAKLSAqICAgIC0gICAgY3VyUVAgPD0gMCBvciBjdXJRUCA+PSAzMi4gCi0gKiAgICAtICAgIHNyY1N0ZXAsIG9yIGRzdFN0ZXAgPD0gMCBvciBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkOiAuIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgOC1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICBwU3JjLCBwUmVjLiAgCi0gKgotICogIE5vdGU6IFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgIHVwZGF0ZSBwcm9jZWR1cmVzIGRlZmluZWQgaW4gc2VjdGlvbiBpbiA2LjIuMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggKnBSZWMsCi0gICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgT01YX1MxNiAqcFByZUFDUHJlZGljdCwKLSAgICBPTVhfSU5UICpwU3VtRXJyLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfVTggY3VyUXAsCi0gICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKLSAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCi0gKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKLSAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgICAgIC0gcFNyYyAKLSAqICAgICAgICAgICAgLSBwRHN0Ci0gKiAgICAgICAgICAgIC0gcFJlYwotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfUzE2ICpwUmVjLAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAotICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKLSAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKLSAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKLSAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCi0gKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCi0gKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCi0gKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCi0gKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCi0gKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZU1WICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDdXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZMZWZ0TUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCi0gKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCi0gKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAotICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAotICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCi0gKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKLSAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCi0gKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKLSAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKLSAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKLSAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgc3ludGF4IAotICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAotICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAotICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCi0gKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybwotICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkxlZnRNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZVcHBlck1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WQ3VyTUIsCi0gICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gCi0gKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAotICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWY6Ci0gKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCi0gKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKLSAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKLSAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCi0gKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKLSAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKLSAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAotICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCi0gKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKLSAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKLSAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAotICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKLSAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKLSAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCi0gKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKLSAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKLSAqCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCi0gKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAotICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCi0gKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKLSAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCi0gKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKLSAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKLSAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCi0gKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQotICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAotICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwLAotICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgIE9NWF9VOCBjdXJRUCwKLSAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX0lOVCBpbnRyYURDVkxDLAotICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKLSAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAotICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCi0gKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCi0gKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKLSAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgUVAgPD0gMC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAotICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCi0gKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKLSAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAotICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAotICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAotICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAotICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KLSAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgT01YX0lOVCBjdXJRUCwKLSAgICBPTVhfSU5UIHByZWRRUCwKLSAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgKDYuMi41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAotICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgc3JjU3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcFNyY1Jlc2lkdWUgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uIAotICogICAgICAgICAgICByZXNpZHVhbHM7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGVuIAotICogICAgICAgICAgICBubyBwcmVkaWN0aW9uIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIAotICogICAgICAgICAgICBpcyBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uIAotICogICBwcmVkaWN0VHlwZSAtIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIAotICogICAgICAgICAgICA2LjIuMS4yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAgSWYgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcyBhcmUgCi0gKiAgICAgICAgICAgIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwU3JjUmVzaWR1ZSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIG9yIHBEc3QuIAotICogICAgLSAgICBlaXRoZXIgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBpbnZhbGlkIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIHByZWRpY3RUeXBlLiAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBybmRWYWwgaXMgbm90IGVxdWFsIGVpdGhlciB0byAwIG9yIDEuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIHByZWRpY3RUeXBlLAotICAgIE9NWF9JTlQgcm5kVmFsCi0pOwotCi0KLQotLyogNi4zLjEuMSBJbnRyYSAxNngxNiBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzE2eDE2IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ18xNlgxNl9WRVJUID0gMCwgIC8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ18xNlgxNl9IT1IgPSAxLCAgIC8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDXzE2WDE2X0RDID0gMiwgICAgLyoqIEludHJhXzE2eDE2X0RDICovCi0gICAgT01YX1ZDXzE2WDE2X1BMQU5FID0gMyAgLyoqIEludHJhXzE2eDE2X1BsYW5lICovIAotfSBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuMiBJbnRyYSA0eDQgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV80eDQgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDXzRYNF9WRVJUID0gMCwgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfNFg0X0hPUiA9IDEsICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDXzRYNF9EQyA9IDIsICAgICAgIC8qKiBJbnRyYV80eDRfREMgKi8KLSAgICBPTVhfVkNfNFg0X0RJQUdfREwgPSAzLCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKi8KLSAgICBPTVhfVkNfNFg0X0RJQUdfRFIgPSA0LCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCi0gICAgT01YX1ZDXzRYNF9WUiA9IDUsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KLSAgICBPTVhfVkNfNFg0X0hEID0gNiwgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KLSAgICBPTVhfVkNfNFg0X1ZMID0gNywgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCi0gICAgT01YX1ZDXzRYNF9IVSA9IDggICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLyAKLX0gT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS4zIENocm9tYSBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0NIUk9NQV9EQyA9IDAsICAgIC8qKiBJbnRyYV9DaHJvbWFfREMgKi8KLSAgICBPTVhfVkNfQ0hST01BX0hPUiA9IDEsICAgLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDX0NIUk9NQV9WRVJUID0gMiwgIC8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfQ0hST01BX1BMQU5FID0gMyAgLyoqIEludHJhX0Nocm9tYV9QbGFuZSAqLyAKLX0gT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS40IE1vdGlvbiBFc3RpbWF0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1vdGlvbiBlc3RpbWF0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIID0gMCwgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLwotICAgIE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCA9IDEgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCi19IE9NWFZDTTRQMTBNRU1vZGU7Ci0KLQotCi0vKiA2LjMuMS41IE1hY3JvYmxvY2sgVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19QXzE2eDE2ICA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLwotICAgIE9NWF9WQ19QXzE2eDggID0gMSwKLSAgICBPTVhfVkNfUF84eDE2ICA9IDIsCi0gICAgT01YX1ZDX1BfOHg4ICA9IDMsCi0gICAgT01YX1ZDX1BSRUYwXzh4OCAgPSA0LAotICAgIE9NWF9WQ19JTlRFUl9TS0lQICA9IDUsCi0gICAgT01YX1ZDX0lOVFJBXzR4NCAgPSA4LAotICAgIE9NWF9WQ19JTlRSQV8xNngxNiAgPSA5LAotICAgIE9NWF9WQ19JTlRSQV9QQ00gPSAxMCAKLX0gT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4zLjEuNiBTdWItTWFjcm9ibG9jayBUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBzdWItbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19TVUJfUF84eDggPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KLSAgICBPTVhfVkNfU1VCX1BfOHg0ID0gMSwKLSAgICBPTVhfVkNfU1VCX1BfNHg4ID0gMiwKLSAgICBPTVhfVkNfU1VCX1BfNHg0ID0gMyAKLX0gT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4zLjEuNyBWYXJpYWJsZSBMZW5ndGggQ29kaW5nIChWTEMpIEluZm9ybWF0aW9uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1U4IHVUcmFpbGluZ19PbmVzOyAgICAgIC8qIFRyYWlsaW5nIG9uZXM7IDMgYXQgbW9zdCAqLwotICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lX1NpZ25zOyAvKiBUcmFpbGluZyBvbmVzIHNpZ25hbCAqLwotICAgIE9NWF9VOCB1TnVtQ29lZmZzOyAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2Ygbm9uLXplcm8gY29lZnMsIGluY2x1ZGluZyB0cmFpbGluZyBvbmVzICovCi0gICAgT01YX1U4IHVUb3RhbFplcm9zOyAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiB6ZXJvIGNvZWZzICovCi0gICAgT01YX1MxNiBpTGV2ZWxzWzE2XTsgICAgICAgIC8qIExldmVscyBvZiBub24temVybyBjb2VmcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCi0gICAgT01YX1U4IHVSdW5zWzE2XTsgICAgICAgICAgIC8qIFJ1bnMgZm9yIGxldmVscyBhbmQgdHJhaWxpbmcgb25lcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCi19IE9NWFZDTTRQMTBWTENJbmZvOwotCi0KLQotLyogNi4zLjEuOCBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCi0gICAgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgICAgICAgICAgLyogTUIgdHlwZSAqLwotICAgIE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSBzdWJNQlR5cGVbNF07IC8qIHN1Yi1ibG9jayB0eXBlICovCi0gICAgT01YX1MzMiBxcHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGx1bWEgKi8KLSAgICBPTVhfUzMyIHFwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgY2hyb21hICovCi0gICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KLSAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0wfjMpICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCBSZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPSAwfjMpICovCi0gICAgT01YX1U4IHBSZWZMMElkeFs0XTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgaW5kaWNlcyAqLwotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgSW50cmExNngxNlByZWRNb2RlOyAvKiBiZXN0IGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSAqLwotICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzE2XTsgLyogYmVzdCBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoIGJsb2NrLCBwTVYwIGluZGV4ZWQgYXMgYWJvdmUgKi8KLX0gT01YVkNNNFAxME1CSW5mbywgKk9NWFZDTTRQMTBNQkluZm9QdHI7Ci0KLQotCi0vKiA2LjMuMS45IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU4eDg7IC8qIGVuYWJsZXMgMTZ4OCwgOHgxNiwgOHg4ICovCi0gICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlNHg0OyAvKiBlbmFibGUgc3BsaXR0aW5nIG9mIDh4NCwgNHg4LCA0eDQgYmxvY2tzICovCi0gICAgT01YX1MzMiBoYWxmU2VhcmNoRW5hYmxlOwotICAgIE9NWF9TMzIgcXVhcnRlclNlYXJjaEVuYWJsZTsKLSAgICBPTVhfUzMyIGludHJhRW5hYmxlNHg0OyAgICAgIC8qIDE9ZW5hYmxlLCAwPWRpc2FibGUgKi8KLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlMTZ4MTY7ICAgIC8qIGludGVnZXIgcGl4ZWwgdW5pdHMgKi8KLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlOHg4OwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U0eDQ7Ci19IE9NWFZDTTRQMTBNRVBhcmFtczsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCi0gKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCi0gKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAotICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAotICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCi0gKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKLSAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCi0gKiAgICAgICAgICAgIDAuLjE1KSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAotICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKLSAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKiBOb3RlOiAKLSAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgKDYuMy4zLjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBzYW1wbGVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHk9IAotICogICAgICAgICAgICAwLi43KS4gCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uNywgeSAKLSAqICAgICAgICAgICAgPSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwcmVkTW9kZSAtIEludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4zLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgY2hyb21hIGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCBwbGVhc2UgcmVmZXIgCi0gKiAgICAgICAgICAgIHRvICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgOCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uNyksIG9yIHBbLTEseV0gKHkgPSAwLi43KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogIE5vdGU6IHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCi0gKiAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKiAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICg2LjMuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGx1bWEgTUIuIEl0IGlzIGFzc3VtZWQgdGhhdCAKLSAqIHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC0gcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAotICogICBkc3RTdGVwIC0gZGVzdGluYXRpb24gZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoIAotICogICBkeCAtIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICBkeSAtIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICByb2kgLSBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjogCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IHJvaS53aWR0aC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAsM10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCBvciAxNiwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX1MzMiBkc3RTdGVwLAotICAgIE9NWF9TMzIgZHgsCi0gICAgT01YX1MzMiBkeSwKLSAgICBPTVhTaXplIHJvaQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKLSAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGguIAotICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOgotICogICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICBpZiByb2kud2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICBPTVhfUzMyIGR4LAotICAgIE9NWF9TMzIgZHksCi0gICAgT01YU2l6ZSByb2kKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLUFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC1BcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC1BcnJheSBvZiBzaXplIDE2IG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKTsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4uICBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCAKLSAqICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTIAotICogICAgICAgICAgICAgIGlzIE5VTEwuIAotICogICAgRWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgCi0gKiAgICAgICAgICAgICAgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKLSAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCi0gKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBTdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgZm9yIAotICogICAgICAgICAgICBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gQXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2Ugb2YgZWFjaCA0eDIgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzICh2YWx1ZXMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIAotICogICAgICAgICAgICBzYW1lIGFzIHRoZSBwQlMgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKLSAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gdGhlIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGFycmF5IHN0ZXA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYWxwaGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIGludGVybmFsIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGJldGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBpbnRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggMng0IGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIEJTIHBhcmFtZXRlcnMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXI7IHZhbGlkIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgCi0gKiAgICAgICAgICAgIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gCi0gKiAgICAgICAgICAgIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAotICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAotICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMzFdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKLSAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAotICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAotICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKLSAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAotICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAotICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAotICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCi0gKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCi0gKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9TMzIqcE9mZnNldCwKLSAgICBPTVhfVTggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTggKipwcFBvc0NvZWZidWYKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAotICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAotICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKLSAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAotICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAotICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCi0gKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAotICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAotICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCi0gKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCi0gKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAotICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAotICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCi0gKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAotICoKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9TMzIgKnBPZmZzZXQsCi0gICAgT01YX1U4ICpwTnVtQ29lZmYsCi0gICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmLAotICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKLSAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICg2LjMuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdHMgdGhlIDR4NCBMdW1hREMgYmxvY2sgZnJvbSB0aGUgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciAKLSAqIGJ1ZmZlciwgcGVyZm9ybXMgaW50ZWdlciBpbnZlcnNlLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDR4NCBMdW1hREMgCi0gKiBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGVzIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcFkgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgTHVtYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKLSAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAotICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKLSAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAotICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCi0gKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCi0gKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKLSAqIDEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKLSAqICAgICAgICAgICAgZXhpc3QgCi0gKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKLSAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKLSAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAotICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZCwKLSAgICBjb25zdCBPTVhfUzE2ICpwREMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgcHJlZFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YX0lOVCBBQwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKLSAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAotICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAotICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAotICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCi0gKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAotICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCi0gKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAotICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKLSAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVJbml0ICgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2s6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAotICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAotICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBhcmUgTlVMTDoKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKLSAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdCwKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAotICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKLSAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAotICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKLSAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6Ci0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCi0gKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCi0gKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKLSAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKLSAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKLSAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZToKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBoYWxmLXBlbCBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQgcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgcXVhcnRlci1wZWwgc2VhcmNoLCBleHByZXNzZWQgCi0gKiAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCi0gKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKLSAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKLSAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAotICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5URVIuIAotICogICAgICAgICAgICAtICBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRSQS4gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAotICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCi0gKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKLSAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKLSAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IAotICogICAgICAgICAgICAtICBNYlR5cGUgCi0gKiAgICAgICAgICAgIC0gIHN1Yk1CVHlwZVs0XSAKLSAqICAgICAgICAgICAgLSAgcE1WMFs0XVs0XSAKLSAqICAgICAgICAgICAgLSAgcE1WUHJlZFs0XVs0XSAKLSAqICAgICAgICAgICAgLSAgcFJlZkwwSWR4WzRdIAotICogICAgICAgICAgICAtICBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICAgICAgICAgIC0gIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKLSAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAotICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFsxNV0sCi0gICAgT01YX1MzMiBTcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwKLSAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBPTVhfVTMyIExhbWJkYSwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAotICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfSU5UICpwRHN0Q29zdCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCi0gKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQVREXzR4NCAgICg2LjMuNS40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN1bSBvZiBhYnNvbHV0ZSB0cmFuc2Zvcm0gZGlmZmVyZW5jZXMgKFNBVEQpIAotICogZm9yIGEgNHg0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgSGFkYW1hcmQgdHJhbnNmb3JtIHRvIHRoZSBkaWZmZXJlbmNlIGJsb2NrIAotICogYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhYnNvbHV0ZSBjb2VmZmljaWVudCB2YWx1ZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwU3JjUmVmIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIGVpdGhlciBwU3JjT3JnIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3RlcE9yZyA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBVERfNHg0ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfVTMyICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAotICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAotICogICAgICAgICAgICAoLTEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAotICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdExlZnQsCi0gICAgT01YX1U4ICpwRHN0UmlnaHQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlXaWR0aCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICg2LjMuNS41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAtIAotICogKDAsIC0xLzIpIGFuZCAoMCwgMS8yKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VXAgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgLTEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERvd24gLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGJlbG93IAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmMsIHBEc3RVcCwgb3IgcERzdERvd24gCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3RVcCwKLSAgICBPTVhfVTggKnBEc3REb3duLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpV2lkdGgsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICg2LjMuNS41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDR4NCwgNHg4IGJsb2Nrcy4gIFRoZSByZXN1bHQgCi0gKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMTsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3M7IG11c3QgYmUgZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgIHBQcmVkMCwgcFByZWQxLCBvciBwRHN0UHJlZCAKLSAqICAgIC0gICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLiAxLUlOVFJBLCAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTMyIGlRUCwKLSAgICBPTVhfVTggYkludHJhCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiB0aGUgMngyIEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDggYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCi0gKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCi0gKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAotICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBtYXRyaXguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCi0gICAgY29uc3QgT01YX1MxNiAqcERlcXVhbnRDb2VmZiwKLSAgICBPTVhfVTggKnBEc3RSZWNvbiwKLSAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKLSAgICBPTVhfVTMyIGlEc3RSZWNvblN0ZXAsCi0gICAgT01YX1U4IGJBQwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCi0gKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCi0gKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCi0gKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAotICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCi0gKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIDQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKLSAqICAgICAgICAgICAgb2YgNC4gCi0gKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKLSAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCi0gKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKLSAqICAgICAgICAgICAgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKLSAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKLSAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCi0gICAgT01YX1UzMiBpU3JjT3JnU3RlcCwKLSAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKLSAgICBPTVhfUzE2ICpwRHN0UXVhbnRDb2VmZiwKLSAgICBPTVhfUzE2ICpwRHN0RGVRdWFudENvZWZmLAotICAgIE9NWF9TMTYgKnBEQ0NvZWZmLAotICAgIE9NWF9TOCAqcE51bUNvZWZmLAotICAgIE9NWF9VMzIgblRocmVzaFNBRCwKLSAgICBPTVhfVTMyIGlRUCwKLSAgICBPTVhfVTggYkludHJhCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCi0gKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCi0gKiBzdHJ1Y3R1cmUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCi0gKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCi0gKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAotICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCi0gKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCi0gKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCi0gKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAotICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCi0gKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAotICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCi0gKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjQ29lZmYsCi0gICAgY29uc3QgT01YX1U4ICpwU2Nhbk1hdHJpeCwKLSAgICBPTVhfVTggYkFDLAotICAgIE9NWF9VMzIgTWF4TnVtQ29lZiwKLSAgICBPTVhWQ000UDEwVkxDSW5mbypwRHN0VkxDSW5mbwotKTsKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiogZW5kIG9mICNkZWZpbmUgX09NWFZDX0hfICovCi0KLS8qKiBFT0YgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NzRkNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLTsvKiogPT09PT09PT09PT09PT09IFN0cnVjdHVyZSBEZWZpbml0aW9uIGZvciBTYW1wbGUgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PSAqLwotOy8qKiB0cmFuc3BhcmVudCBzdGF0dXMgKi8KLQotO2VudW0gewotT01YX1ZJREVPX1RSQU5TUEFSRU5UCUVRVSAwOwkvKiogV2hvbGx5IHRyYW5zcGFyZW50ICovCi1PTVhfVklERU9fUEFSVElBTAkJRVFVIDE7CS8qKiBQYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KLU9NWF9WSURFT19PUEFRVUUJCUVRVSAyOwkvKiogT3BhcXVlICovCi07fQotCi07LyoqIGRpcmVjdGlvbiAqLwotO2VudW0gewotT01YX1ZJREVPX05PTkUJCQlFUVUgMDsKLU9NWF9WSURFT19IT1JJWk9OVEFMCUVRVSAxOwotT01YX1ZJREVPX1ZFUlRJQ0FMCQlFUVUgMjsKLTt9Ci0KLTsvKiogYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlICovCi07ZW51bSB7Ci1PTVhfVklERU9fSU5URUdFUl9QSVhFTCBFUVUgMDsJLyoqIGNhc2UgobBhobEgKi8KLU9NWF9WSURFT19IQUxGX1BJWEVMX1ggIEVRVSAxOwkvKiogY2FzZSChsGKhsSAqLwotT01YX1ZJREVPX0hBTEZfUElYRUxfWSAgRVFVIDI7CS8qKiBjYXNlIKGwY6GxICovCi1PTVhfVklERU9fSEFMRl9QSVhFTF9YWSBFUVUgMzsJLyoqIGNhc2UgobBkobEgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF9VUFBFUiAgCQkJCUVRVSAxOwkJCS8qKiBzZXQgaWYgdGhlIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfTEVGVCAgIAkJCQlFUVUgMjsJCQkvKiogc2V0IGlmIHRoZSBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfQ0VOVEVSIAkJCQlFUVUgNDsKLU9NWF9SSUdIVAkJCQlFUVUgODsKLU9NWF9MT1dFUiAgCQkJCUVRVQkxNjsKLU9NWF9VUFBFUl9MRUZUICAJCUVRVSAzMjsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9VUFBFUl9SSUdIVCAJCUVRVSA2NDsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfTE9XRVJfTEVGVCAgCQlFUVUgMTI4OwotT01YX0xPV0VSX1JJR0hUIAkJRVFVIDI1NgotO30KLQotO2VudW0gewotT01YX1ZJREVPX0xVTUlOQU5DRSAgCUVRVSAwOwkvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLwotT01YX1ZJREVPX0NIUk9NSU5BTkNFICAJRVFVIDE7CS8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8KLU9NWF9WSURFT19BTFBIQSAgCQlFUVUgMjsJCQkvKiogQWxwaGEgY29tcG9uZW50ICovCi07fQotCi07ZW51bSB7Ci1PTVhfVklERU9fSU5URVIJCQlFUVUgMDsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSX1EJCUVRVSAxOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVklERU9fSU5URVI0VgkJRVFVIDI7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRSQQkJCUVRVSAzOwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRSQV9RCQlFUVUgNDsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCi1PTVhfVklERU9fSU5URVI0Vl9RCQlFUVUgNTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLU9NWF9WSURFT19ESVJFQ1QJCUVRVSA2OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QIChNUEVHLTQgb25seSkgKi8KLU9NWF9WSURFT19JTlRFUlBPTEFURQlFUVUgNzsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX0JBQ0tXQVJECQlFUVUgODsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX0ZPUldBUkQJCUVRVSA5OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi1PTVhfVklERU9fTk9UQ09ERUQJCUVRVSAxMDsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotO30KLQotO2VudW0gewotT01YXzE2WDE2X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF8xNlgxNl9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzE2WDE2X0RDIAkJCUVRVSAyOwkJLyoqIEludHJhXzE2eDE2X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfMTZYMTZfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhXzE2eDE2X1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07ZW51bSB7Ci1PTVhfNHg0X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0hPUiAgCQkJRVFVIDE7CQkvKiogSW50cmFfNHg0X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfREMgICAJCQlFUVUgMjsJCS8qKiBJbnRyYV80eDRfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfRElBR19ETCAJCUVRVSAzOwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9ESUFHX0RSIAkJRVFVIDQ7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9WUiAJCQkJRVFVIDU7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IRCAJCQkJRVFVIDY7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfVkwgCQkJCUVRVSA3OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IVSAJCQkJRVFVIDg7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07ZW51bSB7Ci1PTVhfQ0hST01BX0RDIAkJCUVRVSAwOwkJLyoqIEludHJhX0Nocm9tYV9EQyAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YX0NIUk9NQV9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF9DSFJPTUFfVkVSVCAJCUVRVSAyOwkvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfQ0hST01BX1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KLTt9Ci0KLTt0eXBlZGVmCXN0cnVjdCB7CQoteAlFUVUJMDsKLXkJRVFVCTQ7Ci07fU9NWENvb3JkaW5hdGU7Ci0KLTt0eXBlZGVmIHN0cnVjdCB7Ci1keAlFUVUJMDsKLWR5CUVRVQkyOwotO31PTVhNb3Rpb25WZWN0b3I7Ci0KLTt0eXBlZGVmIHN0cnVjdCB7Ci14eAkJRVFVCTA7Ci15eQkJRVFVCTQ7Ci13aWR0aAlFUVUJODsKLWhlaWdodAlFUVUJMTI7Ci07fU9NWGlSZWN0OwotCi07dHlwZWRlZiBlbnVtIHsKLU9NWF9WQ19JTlRFUiAgICAgICAgIEVRVSAwOyAgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZDX0lOVEVSX1EgICAgICAgRVFVIDE7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUjRWICAgICAgIEVRVSAyOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVkNfSU5UUkEgICAgICAgICBFUVUgMzsgICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotT01YX1ZDX0lOVFJBX1EgICAgICAgRVFVIDQ7ICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotT01YX1ZDX0lOVEVSNFZfUSAgICAgRVFVIDU7ICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi07fSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKLQotO2VudW0gewotT01YX1ZDX05PTkUgICAgICAgICAgRVFVIDAKLU9NWF9WQ19IT1JJWk9OVEFMICAgIEVRVSAxCi1PTVhfVkNfVkVSVElDQUwgICAgICBFUVUgMiAKLTt9OwotCi0KLQlFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYzYTcwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0gOy8qKgotIDsgKiBGdW5jdGlvbjogb214VkNDT01NX0NvcHkxNngxNgotIDsgKgotIDsgKiBEZXNjcmlwdGlvbjoKLSA7ICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCi0gOyAqIFBhcmFtZXRlcnM6Ci0gOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgotIDsgKiBbaW5dIHN0ZXAgICAgICAgICAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lLCBpbiBieXRlczsKLSA7ICogICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFJldHVybiBWYWx1ZToKLSA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgotIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeTogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAgCi0gOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgCi0gICAgIAotICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotcFNyYyAgICBSTiAwICAgICAgICAKLXBEc3QgICAgUk4gMSAgICAgICAgCi1zdGVwICAgIFJOIDIKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1Db3VudCAgIFJOIDE0Ci1YMCAgICAgIFJOIDIKLVgxICAgICAgUk4gNAotCi1SZXR1cm4gIFJOIDAKLSAgICAgCi0gICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHkxNngxNixyNQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVUIgICBDb3VudCxzdGVwLCM4ICAgICAgICAgICAgICAgICA7Ly9Db3VudD1zdGVwLTgKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4ICAgICAgICAgICAgICAgICAgOy8vcFNyYyBhZnRlciBsb2FkaW5nIHBTcmM9cFNyYys4Ci0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudCAgICAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyBwU3JjPXBTcmMrc3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0KLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0KLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0KLSAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTM4NzNjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0gOy8qKgotIDsgKiBGdW5jdGlvbjogb214VkNDT01NX0NvcHk4eDgKLSA7ICoKLSA7ICogRGVzY3JpcHRpb246Ci0gOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KLSA7ICogUGFyYW1ldGVyczoKLSA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7Ci0gOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gOC4KLSA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSA7ICogUmV0dXJuIFZhbHVlOgotIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCi0gOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguICAKLSA7ICovCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAKLSAgICAgCi0gICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjICAgIFJOIDAgICAgICAgIAotcERzdCAgICBSTiAxICAgICAgICAKLXN0ZXAgICAgUk4gMgotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLUNvdW50ICAgUk4gMTQKLVgwICAgICAgUk4gMgotWDEgICAgICBSTiA0Ci1SZXR1cm4gIFJOIDAKLSAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTh4OCxyNQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNT1YgICBDb3VudCxzdGVwICAgICAgICAgICAgICAgICA7Ly9Db3VudD1zdGVwIAotICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLENvdW50ICAgICAgICAgICAgOy8vcFNyYyBhZnRlciBsb2FkaW5nIDogcFNyYz1wU3JjK3N0ZXAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLENvdW50IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLENvdW50Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDIyNzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgRXhwYW5kIEZyYW1lIGJvdW5kYXJ5IHBpeGVscyBpbnRvIFBsYW5lCi07Ly8gCi07Ly8gCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgCi0gIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLQotICAgIAotCi0KLQotICAgICAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQVJNMTEzNkpTCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLQotcFNyY0RzdFBsYW5lICAgIFJOICAwCi1pRnJhbWVXaWR0aCAgICAgUk4gIDEKLWlGcmFtZUhlaWdodCAgICBSTiAgMiAgICAKLWlFeHBhbmRQZWxzICAgICBSTiAgMwotCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLQotcmVzdWx0ICAgICAgICAgIFJOICAwCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLWlQbGFuZVN0ZXAgICAgICBSTiAgNAotcFRvcCAgICAgICAgICAgIFJOICA1Ci1wQm90dG9tICAgICAgICAgUk4gIDYKLXBCb3R0b21JbmRleCAgICBSTiAgNwoteCAgICAgICAgICAgICAgIFJOICA4Ci15ICAgICAgICAgICAgICAgUk4gIDkKLXRlbXBUb3AgICAgICAgICBSTiAgMTAKLXRlbXBCb3QgICAgICAgICBSTiAgMTEKLUNvbFN0ZXAgICAgICAgICBSTiAgMTIKLXBMZWZ0ICAgICAgICAgICBSTiAgNQotcFJpZ2h0ICAgICAgICAgIFJOICA2Ci1wUmlnaHRJbmRleCAgICAgUk4gIDcKLXRlbXBMZWZ0MSAgICAgICBSTiAgMTAKLXRlbXBSaWdodDEgICAgICBSTiAgMTEKLXRlbXBMZWZ0MiAgICAgICBSTiAgMTQKLXRlbXBSaWdodDIgICAgICBSTiAgMgotaW5kZXhZICAgICAgICAgIFJOICAxNAotUm93U3RlcCAgICAgICAgIFJOICAxMgotZXhwYW5kVG80Ynl0ZXMgIFJOICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb3B5IGEgYnl0ZSB0byA0IGJ5dGVzIG9mIGEgd29yZAotICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSxyMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgaVBsYW5lU3RlcE9uU3RhY2ssIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSICAgaVBsYW5lU3RlcCwgaVBsYW5lU3RlcE9uU3RhY2sKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgcFRvcCxpRXhwYW5kUGVscyxpUGxhbmVTdGVwCi0gICAgICAgIE1MQSAgICAgcEJvdHRvbSxpRnJhbWVIZWlnaHQsaVBsYW5lU3RlcCxwU3JjRHN0UGxhbmUKLSAgICAgICAgU1VCICAgICB4LGlGcmFtZVdpZHRoLCM0Ci0gICAgICAgIE1PViAgICAgaW5kZXhZLHBUb3AKLSAgICAgICAgQUREICAgICBDb2xTdGVwLGluZGV4WSwjNAotICAgICAgICBTVUIgICAgIHBCb3R0b21JbmRleCxwQm90dG9tLGlQbGFuZVN0ZXAKLSAgICAgICAgU1VCICAgICBwVG9wLHBTcmNEc3RQbGFuZSxwVG9wCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgQUREICAgICBwVG9wLHBUb3AseAotICAgICAgICBBREQgICAgIHBCb3R0b20scEJvdHRvbSx4Ci0KLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBUaGUgZm9sbG93aW5nIGltcHJvdmVzIHVwb24gdGhlIEMgaW1wbG1lbnRhdGlvbgotICAgICAgICA7Ly8gVGhlIHggYW5kIHkgbG9vcHMgYXJlIGludGVyY2hhbmdlZDogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZhbHVlcyBvZgotICAgICAgICA7Ly8gcFNyY0RzdFBsYW5lIFt4XSBhbmQgcFNyY0RzdFBsYW5lIFsoaUZyYW1lSGVpZ2h0IC0gMSkgKiBpUGxhbmVTdGVwICsgeF0gCi0gICAgICAgIDsvLyB3aGljaCBkZXBlbmQgb25seSBvbiBsb29wIHZhcmlhYmxlICd4JyBhcmUgbG9hZGVkIG9uY2UgYW5kIHVzZWQgaW4gCi0gICAgICAgIDsvLyBtdWx0aXBsZSBzdG9yZXMgaW4gdGhlICdZJyBsb29wCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIDsvLyB4bG9vcAotRXhwYW5kRnJhbWVUb3BCb3RYbG9vcAotICAgICAgICAKLSAgICAgICAgTERSICAgICB0ZW1wVG9wLFtwU3JjRHN0UGxhbmUseF0KLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XSBpcyBzaW1wbGlmaWVkIGFzOgotICAgICAgICA7Ly8gcFNyY0RzdFBsYW5lICsgKGlGcmFtZUhlaWdodCAqIGlQbGFuZVN0ZXApIC0gaVBsYW5lU3RlcCArIHggPT0KLSAgICAgICAgOy8vIHBCb3R0b20gLSBpUGxhbmVTdGVwICsgeCA9PSBwQm90dG9tSW5kZXggW3hdCi0gICAgICAgIDsvLyBUaGUgdmFsdWUgb2YgcEJvdHRvbUluZGV4IGlzIGNhbGN1bGF0ZWQgYWJvdmUgdGhpcyAneCcgbG9vcAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTERSICAgICB0ZW1wQm90LFtwQm90dG9tSW5kZXgseF0KLSAgICAgICAgCi0gICAgICAgIDsvLyB5bG9vcAotICAgICAgICBNT1YgICAgIHksaUV4cGFuZFBlbHMKLQotRXhwYW5kRnJhbWVUb3BCb3RZbG9vcCAgICAgICAgCi0gICAgICAgIFNVQlMgICAgeSx5LCMxCi0gICAgICAgIE1fU1RSICAgdGVtcFRvcCxbcFRvcF0saVBsYW5lU3RlcAotICAgICAgICBNX1NUUiAgIHRlbXBCb3QsW3BCb3R0b21dLGlQbGFuZVN0ZXAKLSAgICAgICAgQkdUICAgICBFeHBhbmRGcmFtZVRvcEJvdFlsb29wCi0gICAgICAgIAotICAgICAgICBTVUJTICAgIHgseCwjNAotICAgICAgICBTVUIgICAgIHBUb3AscFRvcCxDb2xTdGVwCi0gICAgICAgIFNVQiAgICAgcEJvdHRvbSxwQm90dG9tLENvbFN0ZXAKLSAgICAgICAgQkdFICAgICBFeHBhbmRGcmFtZVRvcEJvdFhsb29wCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIHkgbG9vcAotICAgICAgICA7Ly8gVGhlIHByb2R1Y3QgaXMgYWxyZWFkeSBjYWxjdWxhdGVkIGFib3ZlIDogUmV1c2UKLSAgICAgICAgOy8vTVVMICAgICBpbmRleFksaUV4cGFuZFBlbHMsaVBsYW5lU3RlcCAgICAgIAotICAgICAgCi0gICAgICAgIFNVQiAgICAgcFNyY0RzdFBsYW5lLHBTcmNEc3RQbGFuZSxpbmRleFkKLSAgICAgICAgU1VCICAgICBwTGVmdCxwU3JjRHN0UGxhbmUsaUV4cGFuZFBlbHMgICAgICAgICAgICAgICAgICA7Ly8gcExlZnQtPnBvaW50cyB0byB0aGUgdG9wIGxlZnQgb2YgdGhlIGV4cGFuZGVkIGJsb2NrCi0gICAgICAgIEFERCAgICAgcFJpZ2h0LHBTcmNEc3RQbGFuZSxpRnJhbWVXaWR0aAotICAgICAgICBTVUIgICAgIHBSaWdodEluZGV4LHBSaWdodCwjMSAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgeSxpRnJhbWVIZWlnaHQsaUV4cGFuZFBlbHMsTFNMICMxCi0gICAgICAgIExEUiAgICAgZXhwYW5kVG80Ynl0ZXMsPTB4MDEwMTAxMDEKLSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgUm93U3RlcCxpRXhwYW5kUGVscyxpUGxhbmVTdGVwLExTTCAjMQotCi0gICAgICAgIDsvLyBUaGUgWSBMb29wIGlzIHVucm9sbGVkIHR3aWNlCi1FeHBhbmRGcmFtZUxlZnRSaWdodFlsb29wICAKLSAgICAgICAgTERSQiAgICB0ZW1wTGVmdDIsW3BTcmNEc3RQbGFuZSxpUGxhbmVTdGVwXSAgICAgICAgICAgICA7Ly8gUHJlTG9hZCB0aGUgdmFsdWVzCi0gICAgICAgIExEUkIgICAgdGVtcFJpZ2h0MixbcFJpZ2h0SW5kZXgsaVBsYW5lU3RlcF0KLSAgICAgICAgTV9MRFJCICB0ZW1wTGVmdDEsW3BTcmNEc3RQbGFuZV0saVBsYW5lU3RlcCxMU0wgIzEgICAgICA7Ly8gUHJlTG9hZCB0aGUgdmFsdWVzCi0gICAgICAgIE1fTERSQiAgdGVtcFJpZ2h0MSxbcFJpZ2h0SW5kZXhdLGlQbGFuZVN0ZXAsTFNMICMxCi0gICAgICAgICAgICAgIAotICAgICAgICBTVUIgICAgIHgsaUV4cGFuZFBlbHMsIzQKLSAgICAgICAgTVVMICAgICB0ZW1wTGVmdDIsdGVtcExlZnQyLGV4cGFuZFRvNGJ5dGVzICAgICAgICAgICAgICA7Ly8gQ29weSB0aGUgc2luZ2xlIGJ5dGUgdG8gNCBieXRlcwotICAgICAgICBNVUwgICAgIHRlbXBSaWdodDIsdGVtcFJpZ2h0MixleHBhbmRUbzRieXRlcwotICAgICAgICBNVUwgICAgIHRlbXBMZWZ0MSx0ZW1wTGVmdDEsZXhwYW5kVG80Ynl0ZXMgICAgICAgICAgICAgIDsvLyBDb3B5IHRoZSBzaW5nbGUgYnl0ZSB0byA0IGJ5dGVzCi0gICAgICAgIE1VTCAgICAgdGVtcFJpZ2h0MSx0ZW1wUmlnaHQxLGV4cGFuZFRvNGJ5dGVzCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIHggbG9vcAotRXhwYW5kRnJhbWVMZWZ0UmlnaHRYbG9vcCAgICAgICAgCi0gICAgICAgIFNVQlMgICAgeCx4LCM0Ci0gICAgICAgIFNUUiAgICAgdGVtcExlZnQyLFtwTGVmdCxpUGxhbmVTdGVwXSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgNCBieXRlcyBhdCBvbmUgZ28KLSAgICAgICAgU1RSICAgICB0ZW1wUmlnaHQyLFtwUmlnaHQsaVBsYW5lU3RlcF0KLSAgICAgICAgU1RSICAgICB0ZW1wTGVmdDEsW3BMZWZ0XSwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSA0IGJ5dGVzIGF0IG9uZSBnbwotICAgICAgICBTVFIgICAgIHRlbXBSaWdodDEsW3BSaWdodF0sIzQKLSAgICAgICAgQkdFICAgICBFeHBhbmRGcmFtZUxlZnRSaWdodFhsb29wCi0gICAgICAgIAotICAgICAgICBTVUJTICAgIHkseSwjMgotICAgICAgICBBREQgICAgIHBMZWZ0LHBMZWZ0LFJvd1N0ZXAKLSAgICAgICAgQUREICAgICBwUmlnaHQscFJpZ2h0LFJvd1N0ZXAKLSAgICAgICAgQkdUICAgICBFeHBhbmRGcmFtZUxlZnRSaWdodFlsb29wCi0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VyciAgCi1FbmQgICAgICAgICAgICAgCi0gICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgCi0gCi0gICAgICAgICAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2Q4NmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIEhlYWRlciBmaWxlIGZvciBvcHRpbWl6ZWQgSC4yNjQgQ0FMVkMgdGFibGVzCi0gKiAKLSAqLwotIAotI2lmbmRlZiBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKLSNkZWZpbmUgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0gIAotLyogQ0FWTEMgdGFibGVzICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF07Ci1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV07Ci1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107Ci1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XTsKLWV4dGVybiBjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOThmMGFjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotCi07Ly8gRnVuY3Rpb25zOgotOy8vICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduPEFMSUdOTUVOVD5fdW5zYWZlICAKLTsvLwotOy8vIEltcGxlbWVudHMgQXZlcmFnZSBvZiA0eDQgd2l0aCBlcXVhdGlvbiBjID0gKGErYisxKT4+MS4KLTsvLyBGaXJzdCBvcGVyYW5kIHdpbGwgYmUgYXQgb2Zmc2V0IEFMSUdOTUVOVCBmcm9tIGFsaWduZWQgYWRkcmVzcwotOy8vIFNlY29uZCBvcGVyYW5kIHdpbGwgYmUgYXQgYWxpZ25lZCBsb2NhdGlvbiBhbmQgd2lsbCBiZSB1c2VkIGFzIG91dHB1dC4KLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KLTsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjIscjMgd2hlcmUgcjIgY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjMgc3RlcCBzaXplCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByNCxyNSxyNixyOCxyOSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIyIC0gcG9pbnRlciB0byB0aGUgYWxpZ25lZCBsb2NhdGlvbgotOy8vIHIzIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFByZWQwICAgICAgICAgIFJOIDAKLWlQcmVkU3RlcDAgICAgICBSTiAxCi1wUHJlZDEgICAgICAgICAgUk4gMgotaVByZWRTdGVwMSAgICAgIFJOIDMKLXBEc3RQcmVkICAgICAgICBSTiAyCi1pRHN0U3RlcCAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1pUHJlZEEwICAgICAgICAgUk4gMTAKLWlQcmVkQTEgICAgICAgICBSTiAxMQotaVByZWRCMCAgICAgICAgIFJOIDEyCi1pUHJlZEIxICAgICAgICAgUk4gMTQKLVRlbXAxICAgICAgICAgICBSTiA0Ci1UZW1wMiAgICAgICAgICAgUk4gNQotUmVzdWx0QSAgICAgICAgIFJOIDUKLVJlc3VsdEIgICAgICAgICBSTiA0Ci1yMHg4MDgwODA4MCAgICAgUk4gNwotCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAotICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMCBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAotCi0gICAgICAgIDsvLyAxc3QgbG9hZAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLQotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKLUVuZDAKLSAgICAgICAgTV9FTkQKLQotICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAotICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMiBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAotCi0gICAgICAgIDsvLyAxc3QgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgotCi0gICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKLQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAotRW5kMgotICAgICAgICBNX0VORAotCi0KLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDMgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLQotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAotCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCi1FbmQzCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I4NGM4ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogT3B0aW1pemVkIENBVkxDIHRhYmxlcyBmb3IgSC4yNjQKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKLQotLyogNHg0IERlWmlnWmFnIHRhYmxlICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdID0KLXsKLSAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Ci19OwotCi0vKiAyeDIgRGVaaWdaYWcgdGFibGUgKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XSA9Ci17Ci0gICAgMCwgMSwgMiwgMwotfTsKLQotCi0vKgotICogU3VmZml4IFRvIExldmVsIHRhYmxlCi0gKiBXZSBpbmNyZW1lbnQgdGhlIHN1ZmZpeCBsZW5ndGggaWYgCi0gKiAoKExldmVsQ29kZT4+MSkrMSk+KDM8PChTdWZmaXhMZW5ndGgtMSkpICYmIFN1ZmZpeExlbmd0aDw2Ci0gKiAoTGV2ZWxDb2RlPj4xKT49KDM8PChTdWZmaXhMZW5ndGgtMSkpICAgICYmIFN1ZmZpeExlbmd0aDw2Ci0gKiAgTGV2ZWxDb2RlICAgID49IDM8PFN1ZmZpeExlbmd0aCAgICAgICAgICYmIFN1ZmZpeExlbmd0aDw2Ci0gKiAoTGV2ZWxDb2RlKzIpID49ICgzPDxTdWZmaXhMZW5ndGgpKzIgICAgICYmIFN1ZmZpeExlbmd0aDw2Ci0gKi8KLWNvbnN0IE9NWF9TOCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWxbN10gPQotewotICAgICgzPDwxKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MSAqLwotICAgICgzPDwxKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MSAqLwotICAgICgzPDwyKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MiAqLwotICAgICgzPDwzKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MyAqLwotICAgICgzPDw0KSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9NCAqLwotICAgICgzPDw1KSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9NSAqLwotICAgIC0xICAgICAgICAgICAgICAvKiBTdWZmaXhMZW5ndGg9NiAtIG5ldmVyIGluY3JlbWVudCAqLwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMFsxMzJdID0gewotICAgIDB4MDAyMCwgMHgwMTAwLCAweDIwMTUsIDB4MjAxNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAotICAgIDB4MDAyOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDMwLCAweDAwZDgsIDB4MDBlMCwgMHgwMGU4LAotICAgIDB4MDAzOCwgMHgwMGEwLCAweDAwYzgsIDB4MDBkMCwgMHgwMDQwLCAweDAwNjgsIDB4MDA5MCwgMHgwMDk4LAotICAgIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgyN2ZmLCAweDI3ZmYsIDB4MjA2YiwgMHgyMDZiLAotICAgIDB4MDA4MSwgMHgwMDg1LCAweDAwODMsIDB4MDA3OSwgMHgwMDg3LCAweDAwN2QsIDB4MDA3YiwgMHgwMDcxLAotICAgIDB4MDA3ZiwgMHgwMDc1LCAweDAwNzMsIDB4MDA2OSwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAotICAgIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwgMHgyMDYzLCAweDIwNjMsIDB4MjA2MSwgMHgyMDYxLAotICAgIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwgMHgyMDViLCAweDIwNWIsIDB4MjA1OSwgMHgyMDU5LAotICAgIDB4MDA2NywgMHgwMDVkLCAweDAwNTMsIDB4MDA1MSwgMHgwMDVmLCAweDAwNTUsIDB4MDA0YiwgMHgwMDQ5LAotICAgIDB4MDBhOCwgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgyMDQxLCAweDIwNDEsIDB4MjA0ZCwgMHgyMDRkLAotICAgIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LAotICAgIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwgMHgyMDRmLCAweDIwNGYsIDB4MjAzZCwgMHgyMDNkLAotICAgIDB4MjAzMywgMHgyMDMzLCAweDIwMjksIDB4MjAyOSwgMHgwMDQ3LCAweDAwMzUsIDB4MDAyYiwgMHgwMDIxLAotICAgIDB4MjAzZiwgMHgyMDNmLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAxOSwgMHgyMDE5LAotICAgIDB4MDAzNywgMHgwMDI1LCAweDAwMWIsIDB4MDAxMSwgMHgyMDJmLCAweDIwMmYsIDB4MjAxZCwgMHgyMDFkLAotICAgIDB4MDAxMywgMHgwMDA5LCAweDIwMWYsIDB4MjAxZgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMVsxMjhdID0gewotICAgIDB4MDAyMCwgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMDI3LCAweDAwMWYsIDB4MjAxNSwgMHgyMDE1LAotICAgIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAotICAgIDB4MDAyOCwgMHgwMGQwLCAweDAwZDgsIDB4MDBlMCwgMHgwMDMwLCAweDAwOTgsIDB4MDBjMCwgMHgwMGM4LAotICAgIDB4MDAzOCwgMHgwMDYwLCAweDAwODgsIDB4MDA5MCwgMHgwMDQwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAotICAgIDB4MjdmZiwgMHgyN2ZmLCAweDIwN2YsIDB4MjA3ZiwgMHgwMDg3LCAweDAwODUsIDB4MDA4MywgMHgwMDgxLAotICAgIDB4MDA3YiwgMHgwMDc5LCAweDAwN2QsIDB4MDA3MywgMHgyMDc1LCAweDIwNzUsIDB4MjA3MSwgMHgyMDcxLAotICAgIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgyMDc3LCAweDIwNzcsIDB4MjA2ZCwgMHgyMDZkLAotICAgIDB4MjA2YiwgMHgyMDZiLCAweDIwNjksIDB4MjA2OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAotICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwgMHgwMDU5LCAweDAwNWQsIDB4MDA1YiwgMHgwMDUxLAotICAgIDB4MDA2NywgMHgwMDU1LCAweDAwNTMsIDB4MDA0OSwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LAotICAgIDB4MjA1ZiwgMHgyMDVmLCAweDIwNGQsIDB4MjA0ZCwgMHgyMDRiLCAweDIwNGIsIDB4MjA0MSwgMHgyMDQxLAotICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAzOSwgMHgyMDM5LAotICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwgMHgyMDNiLCAweDIwM2IsIDB4MjAzMSwgMHgyMDMxLAotICAgIDB4MDAyOSwgMHgwMDM1LCAweDAwMzMsIDB4MDAyMSwgMHgyMDQ3LCAweDIwNDcsIDB4MjAyZCwgMHgyMDJkLAotICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMTksIDB4MjAxOSwgMHgwMDNmLCAweDAwMjUsIDB4MDAyMywgMHgwMDExLAotICAgIDB4MDAzNywgMHgwMDFkLCAweDAwMWIsIDB4MDAwOSwgMHgyMDJmLCAweDIwMmYsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yWzExMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAwODgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCi0gICAgMHgwMDNmLCAweDAwMzcsIDB4MDAyZiwgMHgwMDI3LCAweDAwMWYsIDB4MDAxNSwgMHgwMDBiLCAweDAwMDEsCi0gICAgMHgwMDI4LCAweDAwNTAsIDB4MDA3OCwgMHgwMDgwLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLCAweDAwNDgsCi0gICAgMHgwN2ZmLCAweDAwODEsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA3OSwgMHgwMDdmLCAweDAwN2QsCi0gICAgMHgwMDdiLCAweDAwNzEsIDB4MDA3NywgMHgwMDc1LCAweDAwNzMsIDB4MDA2OSwgMHgyMDZiLCAweDIwNmIsCi0gICAgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDIwNjEsIDB4MjA2MSwgMHgyMDZkLCAweDIwNmQsCi0gICAgMHgyMDYzLCAweDIwNjMsIDB4MjA1OSwgMHgyMDU5LCAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsCi0gICAgMHgyMDViLCAweDIwNWIsIDB4MjA1MSwgMHgyMDUxLCAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNDksCi0gICAgMHgwMDVmLCAweDAwNTUsIDB4MDA0YiwgMHgwMDQxLCAweDAwOTAsIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsCi0gICAgMHgyMDM5LCAweDIwMzksIDB4MjAzMSwgMHgyMDMxLCAweDIwNGQsIDB4MjA0ZCwgMHgyMDI5LCAweDIwMjksCi0gICAgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LCAweDIwNDMsIDB4MjA0MywgMHgyMDIxLCAweDIwMjEsCi0gICAgMHgwMDE5LCAweDAwM2QsIDB4MDAzYiwgMHgwMDExLCAweDAwNGYsIDB4MDAzNSwgMHgwMDMzLCAweDAwMDksCi0gICAgMHgyMDJiLCAweDIwMmIsIDB4MjAyZCwgMHgyMDJkLCAweDIwMjMsIDB4MjAyMywgMHgyMDI1LCAweDIwMjUsCi0gICAgMHgyMDFiLCAweDIwMWIsIDB4MjA0NywgMHgyMDQ3LCAweDIwMWQsIDB4MjAxZCwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzNbODBdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAotICAgIDB4MDA2MCwgMHgwMDY4LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsIDB4MDA5MCwgMHgwMDk4LAotICAgIDB4MDAwOSwgMHgwMDBiLCAweDA3ZmYsIDB4MDAwMSwgMHgwMDExLCAweDAwMTMsIDB4MDAxNSwgMHgwN2ZmLAotICAgIDB4MDAxOSwgMHgwMDFiLCAweDAwMWQsIDB4MDAxZiwgMHgwMDIxLCAweDAwMjMsIDB4MDAyNSwgMHgwMDI3LAotICAgIDB4MDAyOSwgMHgwMDJiLCAweDAwMmQsIDB4MDAyZiwgMHgwMDMxLCAweDAwMzMsIDB4MDAzNSwgMHgwMDM3LAotICAgIDB4MDAzOSwgMHgwMDNiLCAweDAwM2QsIDB4MDAzZiwgMHgwMDQxLCAweDAwNDMsIDB4MDA0NSwgMHgwMDQ3LAotICAgIDB4MDA0OSwgMHgwMDRiLCAweDAwNGQsIDB4MDA0ZiwgMHgwMDUxLCAweDAwNTMsIDB4MDA1NSwgMHgwMDU3LAotICAgIDB4MDA1OSwgMHgwMDViLCAweDAwNWQsIDB4MDA1ZiwgMHgwMDYxLCAweDAwNjMsIDB4MDA2NSwgMHgwMDY3LAotICAgIDB4MDA2OSwgMHgwMDZiLCAweDAwNmQsIDB4MDA2ZiwgMHgwMDcxLCAweDAwNzMsIDB4MDA3NSwgMHgwMDc3LAotICAgIDB4MDA3OSwgMHgwMDdiLCAweDAwN2QsIDB4MDA3ZiwgMHgwMDgxLCAweDAwODMsIDB4MDA4NSwgMHgwMDg3Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc180WzMyXSA9IHsKLSAgICAweDAwMjAsIDB4MDAzOCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKLSAgICAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwKLSAgICAweDAwMjgsIDB4MDAzMCwgMHgwMDIxLCAweDAwMTksIDB4MjAyNywgMHgyMDI3LCAweDAwMjUsIDB4MDAyMywKLSAgICAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsIDB4MDAxMSwgMHgwMDFmLCAweDAwMTMsIDB4MDAwOQotfTsKLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzE4XSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wLCAvKiBuQz0wICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzEsIC8qIG5DPTIgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0zICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTUgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz02ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTggKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz05ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTAgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEyICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTMgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE1ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTYgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc180ICAvKiBuQz0tMSAqLwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18wWzQwXSA9IHsKLSAgICAweDAwMjAsIDB4MDA0OCwgMHgwMDA5LCAweDAwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKLSAgICAweDAwMjgsIDB4MDA0MCwgMHgwMDExLCAweDAwMGYsIDB4MDAzMCwgMHgwMDM4LCAweDAwMTksIDB4MDAxNywKLSAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDFmLCAweDIwMWYsIDB4MjAxZCwgMHgyMDFkLCAweDIwMWIsIDB4MjAxYiwKLSAgICAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMsIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xWzI0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDExLCAweDAwMGYsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMSwKLSAgICAweDAwMWQsIDB4MDAxYiwgMHgwMDE5LCAweDAwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yWzI0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDExLCAweDAwMGIsIDB4MDAwOSwgMHgwMDAxLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywKLSAgICAweDAwMWIsIDB4MDAxNywgMHgyMDE5LCAweDIwMTksIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18zWzI0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDEzLCAweDAwMGYsIDB4MDAwNywgMHgwMDA1LCAweDIwMTEsIDB4MjAxMSwKLSAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDMsIDB4MjAwMywKLSAgICAweDIwMTksIDB4MjAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc180WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAxNSwgMHgwMDExLCAweDAwMDUsIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywKLSAgICAweDIwMTcsIDB4MjAxNywgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNVsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMTEsIDB4MjAxMywgMHgyMDEzLCAweDIwMGYsIDB4MjAwZiwgMHgyMDBkLCAweDIwMGQsCi0gICAgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsCi0gICAgMHgwMDE1LCAweDAwMDEsIDB4MjAwMywgMHgyMDAzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzZbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDBmLCAweDIwMTEsIDB4MjAxMSwgMHgyMDBkLCAweDIwMGQsIDB4MjAwOSwgMHgyMDA5LAotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAotICAgIDB4MDAxMywgMHgwMDAxLCAweDIwMDMsIDB4MjAwMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc183WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDcsIDB4MjAwNywKLSAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwKLSAgICAweDAwMTEsIDB4MDAwMSwgMHgyMDA1LCAweDIwMDUKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOFsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMDUsIDB4MjAwYiwgMHgyMDBiLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLCAweDQwMGQsCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCi0gICAgMHgwMDAzLCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzlbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDBkLCAweDIwMDUsIDB4MjAwNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAotICAgIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMFsxNl0gPSB7Ci0gICAgMHgwMDAxLCAweDAwMDMsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDcsIDB4MjAwNywgMHgyMDBiLCAweDIwMGIsCi0gICAgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDkKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTFbMTZdID0gewotICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDksIDB4MjAwOSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAotICAgIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEyWzE2XSA9IHsKLSAgICAweDIwMDEsIDB4MjAwMSwgMHgyMDAzLCAweDIwMDMsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKLSAgICAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xM1sxNl0gPSB7Ci0gICAgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTRbMTZdID0gewotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAotICAgIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzCi19OwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV0gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18wLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzIsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18zLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzUsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNywKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzgsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTAsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEyLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTMsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xNAotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMFsxNl0gPSB7Ci0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzFbMTZdID0gewotICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18yWzE2XSA9IHsKLSAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQotfTsKLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzAsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18yCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzBbOF0gPSB7Ci0gICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMVs4XSA9IHsKLSAgICAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yWzhdID0gewotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzNbOF0gPSB7Ci0gICAgMHgwMDA5LCAweDAwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNFs4XSA9IHsKLSAgICAweDAwMGIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181WzhdID0gewotICAgIDB4MDAwMywgMHgwMDA1LCAweDAwMDksIDB4MDAwNywgMHgwMDBkLCAweDAwMGIsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzZbMjRdID0gewotICAgIDB4MDAxMCwgMHgwMDBkLCAweDAwMGIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDUsIDB4MDAwMywgMHgwMDAxLAotICAgIDB4MDAxOCwgMHgwMDExLCAweDIwMGYsIDB4MjAwZiwgMHgwMDIwLCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLAotICAgIDB4MDAyOCwgMHgwMDE5LCAweDIwMTcsIDB4MjAxNywgMHgwN2ZmLCAweDAwMWQsIDB4MjAxYiwgMHgyMDFiCi19OwotCi0vKiBUYWJsZXMgNyB0byAxNCBhcmUgZHVwbGljYXRlcyBvZiB0YWJsZSA2ICovCi0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzE1XSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzAsICAvKiBaZXJvc0xlZnQ9MSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMSwKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzIsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zLAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNCwKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzUsICAvKiBaZXJvc0xlZnQ9NiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD03ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTggKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9OSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xNCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiAgIC8qIFplcm9zTGVmdD0xNSAqLwotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWRjYjkyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4NTIzMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0KLQotICAgIElGICBBUk0xMTM2SlMKLQotTUFTS18xICBFUVUgMHgwMTAxMDEwMQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcFEwICAgICAgICBSTiAwCi1TdGVwQXJnICAgIFJOIDEKLXRDMEFyZyAgICAgUk4gMgotYWxwaGEgICAgICBSTiA2Ci0KLWJldGEgICAgICAgUk4gMTQKLWJTICAgICAgICAgUk4gMTQKLXRDMCAgICAgICAgUk4gMTQKLXB0QzAgICAgICAgUk4gMQotCi07Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCi0KLTsvLyBQaXhlbHMKLXBfMCAgICAgUk4gMyAKLXBfMSAgICAgUk4gNSAgCi1wXzIgICAgIFJOIDQgIAotcF8zICAgICBSTiAyICAKLXFfMCAgICAgUk4gOCAgCi1xXzEgICAgIFJOIDkgIAotcV8yICAgICBSTiAxMCAKLXFfMyAgICAgUk4gMTIgCi0KLQotOy8vIEZpbHRlcmluZwotCi1hcDBxMCAgIFJOIDEgIAotZmlsdCAgICBSTiAyCi0gICAgICAgIAotbTAwICAgICBSTiA3Ci1tMDEgICAgIFJOIDExCi0KLWFwZmxnICAgUk4gMCAKLWFxZmxnICAgUk4gNgotCi10QyAgICAgIFJOIDEKLQotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAotCi1wb3MgICAgIFJOIDcKLW5lZyAgICAgUk4gMTIKLQotUDBhICAgICBSTiAxICAgCi1QMWEgICAgIFJOIDggICAKLVEwYSAgICAgUk4gNyAgCi1RMWEgICAgIFJOIDQgICAKLQotdTEgICAgICBSTiAzICAgCi1tYXggICAgIFJOIDEyCi1taW4gICAgIFJOIDIgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKLQotcV8zYiAgICBSTiA5ICAgCi1wXzNiICAgIFJOIDAKLWFwcWZsZyAgUk4gMTIKLQotUDBiICAgICBSTiA2Ci1QMWIgICAgIFJOIDcgCi1QMmIgICAgIFJOIDEKLQotUTBiICAgICBSTiA5IAotUTFiICAgICBSTiAwIAotUTJiICAgICBSTiAyCi0KLTsvLyBNaXNjZWxsYW5vdXMKLQotYSAgICAgICBSTiAwCi10MCAgICAgIFJOIDMgCi10MSAgICAgIFJOIDEyCi10MiAgICAgIFJOIDcKLXQzICAgICAgUk4gMTEKLXQ0ICAgICAgUk4gNCAgIAotdDUgICAgICBSTiAxICAgCi10OCAgICAgIFJOIDYgICAKLXQ5ICAgICAgUk4gMTQgIAotdDEwICAgICBSTiA1ICAgCi10MTEgICAgIFJOIDkgICAKLQotOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUoKQotOy8vCi07Ly8gSW5wdXRzIC0gMyw0LDUsOCw5LDEwIC0gSW5wdXQgUGl4ZWxzIChwMC1wMixxMC1xMikKLTsvLyAgICAgICAgLSAyIC0gZmlsdCwgMCAtIGFwZmxnLCA2IC0gYXFmbGcKLTsvLyAgICAgICAgLSAxMSAtIG0wMSwgNyAtIHRDMAotOy8vICAgICAgICAgCi07Ly8gT3V0cHV0cyAtIDEsOCw3LDExIC0gT3V0cHV0IFBpeGVscyhQMGEsUDFhLFEwYSxRMWEpCi07Ly8KLTsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkIC0gMC0zLDUtMTIsMTQKLQotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZSwgbHIKLQotICAgICAgICA7Ly8gU2luY2UgYmV0YSA8PSAxOCBhbmQgYWxwaGEgPD0gMjU1IHdlIGtub3cKLSAgICAgICAgOy8vIC0yNTQgPD0gcDAtcTAgPD0gMjU0Ci0gICAgICAgIDsvLyAgLTE3IDw9IHExLXEwIDw9IDE3Ci0gICAgICAgIDsvLyAgLTE3IDw9IHAxLXAwIDw9IDE3Ci0KLSAgICAgICAgOy8vIGRlbHRhID0gQ2xpcDMoIC10QywgdEMsICgoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zKSkKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gICAgQ2FsY3VsYXRlIEEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICg0KnEwIC0gNCpwMCArIHAxIC0gcTEgKyA0KT4+MwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoKHAxLXAwKSAtIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MwotICAgICAgICAKLSAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKLSAgICAgICAgTVVMICAgICB0QzAsIHQyLCBtMDEKLSAgICAgICAgCi0gICAgICAgIFVTVUI4ICAgdDIsIHFfMSwgcV8wCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgotCi0gICAgICAgIFVTVUI4ICAgdDIsIHBfMCwgcV8wCi0gICAgICAgIEFORCAgICAgdDIsIHQyLCBtMDEKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQyCi0gICAgICAgIFVIU1VCOCAgdDUsIHBfMCwgcV8wCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKLSAgICAgICAgTU9WICAgICBtMDAsICMwCi0gICAgICAgIFNBREQ4ICAgdDEsIHQxLCBtMDEKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1Ci0gICAgICAgIAotICAgICAgICA7Ly8gdEMgPSB0QzAKLSAgICAgICAgOy8vIGlmIChhcCA8IGJldGEpIHRDKys7Ci0gICAgICAgIDsvLyBpZiAoYXEgPCBiZXRhKSB0QysrOwotICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKLSAgICAgICAgU0VMICAgICB0QzAsIHRDMCwgbTAwCi0gICAgICAgIFVRQUREOCAgdEMsIHRDMCwgYXBmbGcKLSAgICAgICAgU1NVQjggICB0MSwgdDEsIG0wMAotICAgICAgICBVUUFERDggIHRDLCB0QywgYXFmbGcKLQotICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKLSAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKLSAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKLSAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QwotICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcwotICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCi0gICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCi0gICAgICAgIAotICAgICAgICA7Ly9SZWxvYWQgbTAxCi0gICAgICAgIExEUiAgICAgbTAxLD1NQVNLXzEKLQotICAgICAgICBVUUFERDggIFAwYSwgcF8wLCBwb3MKLSAgICAgICAgVVFTVUI4ICBRMGEsIHFfMCwgcG9zCi0gICAgICAgIFVRU1VCOCAgUDBhLCBQMGEsIG5lZwotICAgICAgICBVUUFERDggIFEwYSwgUTBhLCBuZWcKLSAgICAgICAgCi0gICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCi0gICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKLSAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAotICAgICAgICBTRUwgICAgIFAwYSwgUDBhLCBwXzAKLSAgICAgICAgU0VMICAgICBRMGEsIFEwYSwgcV8wCi0gICAgCi0gICAgICAgIDsvLyBkZWx0YSA9IChwMiArICgocDArcTArMSk+PjEpIC0gKHAxPDwxKSk+PjE7Ci0gICAgICAgIDsvLyB1MSA9IChwMCArIHEwICsgMSk+PjEKLSAgICAgICAgOy8vIHUxID0gKCAocV8wIC0gcF8wJyk+PjEgKSBeIDB4ODAKLSAgICAgICAgTVZOICAgICBwXzAsIHBfMAotICAgICAgICBVSFNVQjggIHUxLCBxXzAsIHBfMCAKLSAgICAgICAgVVFBREQ4ICBtYXgsIHBfMSwgdEMwCi0gICAgICAgIEVPUiAgICAgdTEsIHUxLCBtMDEgLExTTCAjNwotICAgIAotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEEgPSAocDIrdTEpPj4xIAotICAgICAgICA7Ly8gVGhlbiBkZWx0YSA9IENsaXAzKCAtdEMwLCB0QzAsIEEgLSBwMSkKLQotICAgICAgICA7Ly8gQ2xpcCBQMQotICAgICAgICBVSEFERDggIFAxYSwgcF8yLCB1MQotICAgICAgICBVUVNVQjggIG1pbiwgcF8xLCB0QzAKLSAgICAgICAgVVNVQjggICB0NCwgUDFhLCBtYXgKLSAgICAgICAgU0VMICAgICBQMWEsIG1heCwgUDFhCi0gICAgICAgIFVTVUI4ICAgdDQsIFAxYSwgbWluCi0gICAgICAgIFNFTCAgICAgUDFhLCBQMWEsIG1pbgotCi0gICAgICAgIDsvLyBDbGlwIFExCi0gICAgICAgIFVIQUREOCAgUTFhLCBxXzIsIHUxCi0gICAgICAgIFVRQUREOCAgbWF4LCBxXzEsIHRDMAotICAgICAgICBVUVNVQjggIG1pbiwgcV8xLCB0QzAKLSAgICAgICAgVVNVQjggICB0MCwgUTFhLCBtYXgKLSAgICAgICAgU0VMICAgICBRMWEsIG1heCwgUTFhCi0gICAgICAgIFVTVUI4ICAgdDAsIFExYSwgbWluCi0gICAgICAgIFNFTCAgICAgUTFhLCBRMWEsIG1pbgotICAgICAgICAKLSAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKLSAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAotICAgICAgICBVU1VCOCAgIHQwLCBhcGZsZywgbTAxCi0gICAgICAgIFNFTCAgICAgUDFhLCBQMWEsIHBfMQotICAgICAgICBVU1VCOCAgIHQwLCBhcWZsZywgbTAxCi0gICAgICAgIFNFTCAgICAgdDMsIFExYSwgcV8xCi0gICAgICAgIAotICAgICAgICBNX0VORAotCi07Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSgpCi07Ly8KLTsvLyBJbnB1dHMgLSAzLDQsNSw4LDksMTAgLSBJbnB1dCBQaXhlbHMgKHAwLXAyLHEwLXEyKQotOy8vICAgICAgICAtIDIgLSBmaWx0LCAwIC0gYXBmbGcsYXFmbGcKLTsvLyAgICAgICAgLSAxIC0gYXAwcTAsIDYgLSBhbHBoYQotOy8vICAgICAgICAtIDcgLSBtMDAsIDExIC0gbTAxCi07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gNiw3LDEsOSwwLDIgLSBPdXRwdXQgUGl4ZWxzKFAwYixQMWIsUDJiLCBRMGIsUTFiLFEyYikKLTsvLyAKLTsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkIC0gMC0zLDUtMTIsMTQKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUsIGxyCi0gICAgCi0gICAgICAgIDsvLyBhcGZsZyA9IGFwZmxnICYmIHxwMC1xMHw8KChhbHBoYT4+MikrMikgCi0gICAgICAgIDsvLyBhcGZsZyA9IGFxZmxnICYmIHxwMC1xMHw8KChhbHBoYT4+MikrMikgCi0KLSAgICAgICAgTV9BUkcgICBwRHVtbXksNAotICAgICAgICBNX0FSRyAgIHBRXzMsNAotICAgICAgICBNX0FSRyAgIHBQXzMsNAotICAgICAgICAKLSAgICAgICAgVUhBREQ4ICBhbHBoYSwgYWxwaGEsIG0wMAotICAgICAgICBVU1VCOCAgIHQ5LCBwXzIsIHBfMCAgICA7Ly90OSA9IGRwMnAwCi0gICAgICAgIFVIQUREOCAgYWxwaGEsIGFscGhhLCBtMDAKLSAgICAgICAgQUREICAgICBhbHBoYSwgYWxwaGEsIG0wMSwgTFNMICMxICAgICAgICAKLSAgICAgICAgVVNVQjggICBhcDBxMCwgYXAwcTAsIGFscGhhCi0gICAgICAgIFNFTCAgICAgYXBxZmxnLCBtMDAsIGFwZmxnCi0KLSAgICAgICAgOy8vIFAwID0gKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+MyAKLSAgICAgICAgOy8vICAgID0gKChwMi1wMCkgKyAyKihwMS1wMCkgKyAocTEtcTApICsgMyoocTAtcDApICsgOCpwMCArIDQpPj4zCi0gICAgICAgIDsvLyAgICA9IHAwICsgKCgocDItcDApICsgMioocDEtcDApICsgKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zKQotCi0gICAgICAgIDsvLyBQMSA9IChwMiArIHAxICsgcTAgKyBwMCArIDIpPj4yCi0gICAgICAgIDsvLyAgICA9IHAwICsgKCgocDItcDApICsgKHAxLXAwKSAtIChwMC1xMCkgKyAyKT4+MikKLSAgICAgICAgCi0gICAgICAgIDsvLyBQMiA9ICgyKnAzICsgMypwMiArIHAxICsgcDAgKyBxMCArIDQpPj4zCi0gICAgICAgIDsvLyAgICA9ICgyKihwMy1wMCkgKyAzKihwMi1wMCkgKyAocDEtcDApIC0gKHAwLXEwKSArIDgqcDAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAzLXAwKSArIChwMi1wMCkgKyB0MiArIDIpPj4yKQotCi0gICAgICAgIDsvLyBDb21wdXRlIFAwYgotICAgICAgICBVU1VCOCAgIHQyLCBwXzAsIHFfMCAgICAgICAgIAotICAgICAgICBTU1VCOCAgIHQ1LCB0OSwgdDIgICAgICAgICAgIAotCi0gICAgICAgIFVTVUI4ICAgdDgsIHFfMSwgcV8wICAgICAgICAgCi0gICAgICAgIFNIQUREOCAgdDgsIHQ1LCB0OAotCi0gICAgICAgIFVTVUI4ICAgdDksIHBfMSwgcF8wICAgICAgICAgCi0gICAgICAgIFNBREQ4ICAgdDgsIHQ4LCB0OQotICAgICAgICBTSFNVQjggIHQ4LCB0OCwgdDIKLSAgICAgICAgU0hBREQ4ICB0NSwgdDUsIHQ5Ci0gICAgICAgIFNIQUREOCAgdDgsIHQ4LCBtMDEKLSAgICAgICAgU0hBREQ4ICB0OSwgdDUsIG0wMQotICAgICAgICBTQUREOCAgIFAwYiwgcF8wLCB0OCAgICAgICAgIAotICAgICAgICA7Ly8gUDBiIHJlYWR5Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ29tcHV0ZSBQMWIKLSAgICAgICAgTV9MRFIgICBwXzNiLCBwUF8zCi0gICAgICAgIFNBREQ4ICAgUDFiLCBwXzAsIHQ5ICAgICAgICAgCi0gICAgICAgIDsvLyBQMWIgcmVhZHkKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb21wdXRlIFAyYgotICAgICAgICBVU1VCOCAgIHQ5LCBwXzIsIHBfMCAgICAgICAgIAotICAgICAgICBTQUREOCAgIHQ1LCB0NSwgdDkKLSAgICAgICAgVUhTVUI4ICB0OSwgcF8zYiwgcF8wICAgICAgICAKLSAgICAgICAgRU9SICAgICBhLCBwXzNiLCBwXzAgICAgICAgICAKLSAgICAgICAgQU5EICAgICBhLCBhLCBtMDEKLSAgICAgICAgU0hBREQ4ICB0NSwgdDUsIGEKLSAgICAgICAgVUhBREQ4ICBhLCBwXzAsIHFfMQotICAgICAgICBTQUREOCAgIHQ1LCB0NSwgbTAxCi0gICAgICAgIFNIQUREOCAgdDUsIHQ1LCB0OQotICAgICAgICBNVk4gICAgIHQ5LCBwXzEKLSAgICAgICAgU0FERDggICBQMmIsIHBfMCwgdDUgICAgICAgICAKLSAgICAgICAgOy8vIFAyYiByZWFkeQotICAgICAgICAKLSAgICAgICAgVUhTVUI4ICBhLCBhLCB0OQotICAgICAgICBPUlIgICAgIHQ5LCBhcHFmbGcsIG0wMQotICAgICAgICBVU1VCOCAgIHQ5LCBhcHFmbGcsIHQ5Ci0KLSAgICAgICAgRU9SICAgICBhLCBhLCBtMDEsIExTTCAjNwotICAgICAgICBTRUwgICAgIFAwYiwgUDBiLCBhCi0gICAgICAgIFNFTCAgICAgUDFiLCBQMWIsIHBfMQotICAgICAgICBTRUwgICAgIFAyYiwgUDJiLCBwXzIKLQotICAgICAgICBVU1VCOCAgIHQ0LCBmaWx0LCBtMDEKLSAgICAgICAgU0VMICAgICBQMGIsIFAwYiwgcF8wCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBRMCA9IChxMiArIDIqcTEgKyAyKnEwICsgMipwMCArIHAxICsgNCk+PjMgCi0gICAgICAgIDsvLyAgICA9ICgocTItcTApICsgMioocTEtcTApICsgKHAxLXAwKSArIDMqKHAwLXEwKSArIDgqcTAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEyLXEwKSArIDIqKHExLXEwKSArIChwMS1wMCkgKyAzKihwMC1xMCkgKyA0KT4+MykKLQotICAgICAgICA7Ly8gUTEgPSAocTIgKyBxMSArIHAwICsgcTAgKyAyKT4+MgotICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEyLXEwKSArIChxMS1xMCkgKyAocDAtcTApICsgMik+PjIpCi0KLSAgICAgICAgOy8vIFEyID0gKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCk+PjMKLSAgICAgICAgOy8vICAgID0gKDIqKHEzLXEwKSArIDMqKHEyLXEwKSArIChxMS1xMCkgKyAocDAtcTApICsgOCpxMCArIDQpPj4zCi0gICAgICAgIDsvLyAgICA9IHEwICsgKCgocTMtcTApICsgKHEyLXEwKSArIHQyICsgMik+PjIpCi0KLQotICAgICAgICA7Ly8gQ29tcHV0ZSBRMGIgUTFiCi0gICAgICAgIFVTVUI4ICAgdDQsIHFfMiwgcV8wICAgICAgICAgICAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHFfMAotICAgICAgICBVU1VCOCAgIHQ5LCBwXzEsIHBfMAotICAgICAgICBTQUREOCAgIHQwLCB0NCwgYQotICAgICAgICBTSEFERDggIHQ5LCB0MCwgdDkKLSAgICAgICAgVUhBREQ4ICB0MTAsIHFfMCwgcF8xCi0gICAgICAgIFNBREQ4ICAgdDksIHQ5LCBhCi0gICAgICAgIFVTVUI4ICAgYSwgcV8xLCBxXzAKLSAgICAgICAgU0hBREQ4ICB0OSwgdDksIGEKLSAgICAgICAgU0hBREQ4ICB0MCwgdDAsIGEKLSAgICAgICAgU0hBREQ4ICB0OSwgdDksIG0wMQotICAgICAgICBTSEFERDggIGEsIHQwLCBtMDEKLSAgICAgICAgU0FERDggICB0OSwgcV8wLCB0OSAgICAgICAgICAgIAotICAgICAgICA7Ly8gUTBiIHJlYWR5IC0gdDkKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgdDQsICMwCi0gICAgICAgIFVIQUREOCAgYXBxZmxnLCBhcHFmbGcsIHQ0Ci0gICAgICAgIAotICAgICAgICBTQUREOCAgIFExYiwgcV8wLCBhIAotICAgICAgICA7Ly8gUTFiIHJlYWR5Ci0gICAgICAgCi0gICAgICAgIFVTVUI4ICAgdDQsIGFwcWZsZywgbTAxCi0gICAgICAgIFNFTCAgICAgUTFiLCBRMWIsIHFfMQotICAgICAgICBNVk4gICAgIHQxMSwgcV8xCi0gICAgICAgIFVIU1VCOCAgdDEwLCB0MTAsIHQxMQotICAgICAgICBNX0xEUiAgIHFfM2IsIHBRXzMKLSAgICAgICAgRU9SICAgICB0MTAsIHQxMCwgbTAxLCBMU0wgIzcKLSAgICAgICAgU0VMICAgICB0OSwgdDksIHQxMCAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENvbXB1dGUgUTJiCi0gICAgICAgIFVTVUI4ICAgdDQsIHFfMiwgcV8wCi0gICAgICAgIFNBREQ4ICAgdDQsIHQwLCB0NAotICAgICAgICBFT1IgICAgIHQwLCBxXzNiLCBxXzAgCi0gICAgICAgIEFORCAgICAgdDAsIHQwLCBtMDEKLSAgICAgICAgU0hBREQ4ICB0NCwgdDQsIHQwCi0gICAgICAgIFVIU1VCOCAgdDEwLCBxXzNiLCBxXzAKLSAgICAgICAgU0FERDggICB0NCwgdDQsIG0wMQotICAgICAgICBTSEFERDggIHQ0LCB0NCwgdDEwCi0KLSAgICAgICAgVVNVQjggICB0MTAsIGZpbHQsIG0wMQotICAgICAgICBTRUwgICAgIFEwYiwgdDksIHFfMAotCi0gICAgICAgIFNBREQ4ICAgdDQsIHFfMCwgdDQgICAgICAgICAgICAKLSAgICAgICAgOy8vIFEyYiByZWFkeSAtIHQ0Ci0KLSAgICAgICAgVVNVQjggICB0MTAsIGFwcWZsZywgbTAxCi0gICAgICAgIFNFTCAgICAgUTJiLCB0NCwgcV8yCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2MzhiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzR4NAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0gICAgICAgIAotTEFTVF9DT0VGRiAgICAgICAgICAgICAgIEVRVSAweDIwICAgICAgICA7Ly8gRW5kIG9mIGJsb2NrIGZsYWcKLVRXT19CWVRFX0NPRUZGICAgICAgICAgICBFUVUgMHgxMAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcHBCaXRTdHJlYW0gICAgIFJOIDAKLXBPZmZzZXQgICAgICAgICBSTiAxCi1wTnVtQ29lZmYgICAgICAgUk4gMgotcHBQb3NDb2VmYnVmICAgIFJOIDMKLW5DICAgICAgICAgICAgICBSTiA0IDsvLyBudW1iZXIgb2YgY29lZmZzIG9yIDE3IGZvciBjaHJvbWEKLXNNYXhOdW1Db2VmZiAgICBSTiA1Ci0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi0KLTsvLyBMZXZlbCBsb29wCi1Db3VudCAgICAgICAgICAgUk4gMAotVHJhaWxpbmdPbmVzICAgIFJOIDEKLXBMZXZlbCAgICAgICAgICBSTiAyCi1MZXZlbFN1ZmZpeCAgICAgUk4gMwotU3VmZml4TGVuZ3RoICAgIFJOIDQKLVRvdGFsQ29lZmYgICAgICBSTiA1Ci0KLXBWTERUYWJsZSAgICAgICBSTiA2Ci1TeW1ib2wgICAgICAgICAgUk4gNwotVDEgICAgICAgICAgICAgIFJOIDgKLVQyICAgICAgICAgICAgICBSTiA5Ci1SQml0U3RyZWFtICAgICAgUk4gMTAKLVJCaXRCdWZmZXIgICAgICBSTiAxMQotUkJpdENvdW50ICAgICAgIFJOIDEyCi1sciAgICAgICAgICAgICAgUk4gMTQKLQotOy8vIFJ1biBsb29wCi1Db3VudCAgICAgICAgICAgUk4gMAotWmVyb3NMZWZ0ICAgICAgIFJOIDEKLXBMZXZlbCAgICAgICAgICBSTiAyCi1wcFJ1blRhYmxlICAgICAgUk4gMwotcFJ1biAgICAgICAgICAgIFJOIDQKLVRvdGFsQ29lZmYgICAgICBSTiA1Ci0KLXBWTERUYWJsZSAgICAgICBSTiA2Ci1TeW1ib2wgICAgICAgICAgUk4gNwotVDEgICAgICAgICAgICAgIFJOIDgKLVQyICAgICAgICAgICAgICBSTiA5Ci1SQml0U3RyZWFtICAgICAgUk4gMTAKLVJCaXRCdWZmZXIgICAgICBSTiAxMQotUkJpdENvdW50ICAgICAgIFJOIDEyCi1sciAgICAgICAgICAgICAgUk4gMTQKLQotOy8vIEZpbGwgaW4gY29lZmZpY2llbnRzIGxvb3AKLXBQb3NDb2VmYnVmICAgICBSTiAwCi10ZW1wICAgICAgICAgICAgUk4gMQotcExldmVsICAgICAgICAgIFJOIDIKLXBwUG9zQ29lZmJ1ZiAgICBSTiAzCi1wUnVuICAgICAgICAgICAgUk4gNAotVG90YWxDb2VmZiAgICAgIFJOIDUKLXBaaWdaYWcgICAgICAgICBSTiA2Ci0KLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotQ29lZmZOdW0gICAgICAgIFJOIDE0Ci0KLQotCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICBNX0FMTE9DNCBwcHBCaXRTdHJlYW0sIDQKLSAgICAgICAgTV9BTExPQzQgcHBPZmZzZXQsIDQKLSAgICAgICAgTV9BTExPQzQgcHBwUG9zQ29lZmJ1ZiwgNAotICAgICAgICBNX0FMTE9DNCBwcExldmVsLCAxNioyCi0gICAgICAgIE1fQUxMT0M0IHBwUnVuLCAxNgotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcE5DLCA0Ci0gICAgICAgIE1fQVJHICAgcFNNYXhOdW1Db2VmZiw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDAgcHBCaXRTdHJlYW0sIHBPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAotICAgICAgICBMRFIgICAgICAgIHBWTERUYWJsZSwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi0gICAgICAgIE1fTERSICAgICAgbkMsIHBOQwotICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMSBUMSwgVDIsIGxyCi0gICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBuQywgTFNMICMyXSAgOy8vIEZpbmQgVkxEIHRhYmxlICAgIAotICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMiBUMSwgVDIsIGxyCi0KLSAgICAgICAgOy8vIERlY29kZSBTeW1ib2wgPSBUb3RhbENvZWZmKjQgKyBUcmFpbGluZ09uZXMKLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIKLSAgICAKLSAgICAgICAgTU9WUyAgICBUb3RhbENvZWZmLCBTeW1ib2wsIExTUiAjMiAgICAKLSAgICAgICAgU1RSQiAgICBUb3RhbENvZWZmLCBbcE51bUNvZWZmXSAgICAKLSAgICAgICAgTV9QUklOVEYgIlRvdGFsQ29lZmY9JWRcbiIsIFRvdGFsQ29lZmYKLSAgICAgICAgQkVRLlcgICBFbmROb0Vycm9yICAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGVkIGlmIG5vIGNvZWZmaWNpZW50cwotCi0gICAgICAgIENNUCAgICAgU3ltYm9sLCAjMTcqNAotICAgICAgICBCR0UuVyAgIEVuZEJhZFN5bWJvbCAgICAgICAgICAgICAgICA7Ly8gRXJyb3IgaWYgYmFkIHN5bWJvbAotICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgYml0c3RyZWFtIHBvaW50ZXJzCi0gICAgICAgIE1fU1RSICAgcHBCaXRTdHJlYW0sICBwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9TVFIgICBwT2Zmc2V0LCAgICAgIHBwT2Zmc2V0Ci0gICAgICAgIE1fU1RSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBUcmFpbGluZyBPbmVzCi0gICAgICAgIEFORFMgICAgVHJhaWxpbmdPbmVzLCBTeW1ib2wsICMzCi0gICAgICAgIE1fQURSICAgcExldmVsLCBwcExldmVsICAgICAgICAgICAgCi0gICAgICAgIE1fUFJJTlRGICJUcmFpbGluZ09uZXM9JWRcbiIsIFRyYWlsaW5nT25lcwotICAgICAgICBCRVEgICAgIFRyYWlsaW5nT25lc0RvbmUgICAgCi0gICAgICAgIE1PViAgICAgQ291bnQsIFRyYWlsaW5nT25lcwotVHJhaWxpbmdPbmVzTG9vcCAgICAKLSAgICAgICAgTV9CRF9SRUFEOCBTeW1ib2wsIDEsIFQxCi0gICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQotICAgICAgICBNT1YgICAgIFQxLCAjMQotICAgICAgICBTVUIgICAgIFQxLCBUMSwgU3ltYm9sLCBMU0wgIzEKLSAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQotICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIKLSAgICAgICAgQkdUICAgICBUcmFpbGluZ09uZXNMb29wCi1UcmFpbGluZ09uZXNEb25lICAgIAotICAgIAotICAgICAgICA7Ly8gRGVjb2RlIGxldmVsIHZhbHVlcyAgICAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzICAgICA7Ly8gTnVtYmVyIG9mIGxldmVscyB0byByZWFkCi0gICAgICAgIEJFUSAgICAgRGVjb2RlUnVucyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5vbmUgbGVmdAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBTdWZmaXhMZW5ndGgsICMxCi0gICAgICAgIENNUCAgICAgVG90YWxDb2VmZiwgIzEwCi0gICAgICAgIE1PVkxFICAgU3VmZml4TGVuZ3RoLCAjMAotICAgICAgICBDTVAgICAgIFRyYWlsaW5nT25lcywgIzMgICAgOy8vIGlmIChUcmFpbGluZ09uZXM8MykKLSAgICAgICAgTU9WTFQgICBUcmFpbGluZ09uZXMsICM0ICAgIDsvLyB0aGVuIFRyYWlsaW5nT25lcyA9ICs0Ci0gICAgICAgIE1PVkdFICAgVHJhaWxpbmdPbmVzLCAjMiAgICA7Ly8gZWxzZSBUcmFpbGluZ09uZXMgPSArMgotICAgICAgICBNT1ZHRSAgIFN1ZmZpeExlbmd0aCwgIzAgICAgOy8vICAgICAgU3VmZml4TGVuZ3RoID0gMAotICAgICAgICAKLUxldmVsTG9vcAotICAgICAgICBNX0JEX0NMWjE2IFN5bWJvbCwgVDEsIFQyICAgOy8vIFN5bWJvbD1MZXZlbFByZWZpeAotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKLSAgICAgICAgCi0gICAgICAgIE1PVlMgICAgbHIsIFN1ZmZpeExlbmd0aCAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCi0gICAgICAgIFRFUUVRICAgU3ltYm9sLCAjMTQgICAgICAgICA7Ly8gICBhbmQgIExldmVsUHJlZml4PT0xNAotICAgICAgICBNT1ZFUSAgIGxyLCAjNCAgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9NAotICAgICAgICBURVEgICAgIFN5bWJvbCwgIzE1ICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MTUKLSAgICAgICAgTU9WRVEgICBsciwgIzEyICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTEyCi0gICAgICAgIAotICAgICAgICBURVFFUSAgIFN1ZmZpeExlbmd0aCwjMAotICAgICAgICBBRERFUSAgIFN5bWJvbCxTeW1ib2wsIzE1Ci0gICAgICAgIAotICAgICAgICBURVEgICAgIGxyLCAjMCAgICAgICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAotICAgICAgICBCRVEgICAgIExldmVsQ29kZVJlYWQgICAgICAgOy8vIExldmVsQ29kZSA9IExldmVsUHJlZml4Ci0gICAgICAgIAotICAgICAgICBNX0JEX1ZSRUFEMTYgTGV2ZWxTdWZmaXgsIGxyLCBUMSwgVDIgIDsvLyBSZWFkIExldmVsIFN1ZmZpeAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBTeW1ib2wsIFN5bWJvbCwgTFNMIFN1ZmZpeExlbmd0aAotICAgICAgICBBREQgICAgIFN5bWJvbCwgTGV2ZWxTdWZmaXgsIFN5bWJvbAotICAgICAgICAgICAgIAotTGV2ZWxDb2RlUmVhZCAgICAgICAgCi0gICAgICAgIDsvLyBTeW1ib2wgPSBMZXZlbENvZGUKLSAgICAgICAgQUREICAgICBTeW1ib2wsIFN5bWJvbCwgVHJhaWxpbmdPbmVzIDsvLyArNCBpZiBsZXZlbCBjYW5ub3QgYmUgKy8tMSwgKzIgby93Ci0gICAgICAgIE1PViAgICAgVHJhaWxpbmdPbmVzLCAjMgotICAgICAgICBNT1ZTICAgIFQxLCBTeW1ib2wsIExTUiAjMQotICAgICAgICBSU0JDUyAgIFQxLCBUMSwgIzAgICAgICAgICAgICAgICAgICA7Ly8gSWYgU3ltYm9sIG9kZCB0aGVuIG5lZ2F0ZQotICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCi0gICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMiAgICAgICAgICAgIDsvLyBTdG9yZSBsZXZlbC4KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgVDIsID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKLSAgICAgICAgTERSU0IgICBUMSwgW1QyLCBTdWZmaXhMZW5ndGhdICAgICAgOy8vIEZpbmQgaW5jcmVtZW50IGxldmVsICAgICAgICAKLSAgICAgICAgVEVRICAgICBTdWZmaXhMZW5ndGgsICMwCi0gICAgICAgIE1PVkVRICAgU3VmZml4TGVuZ3RoLCAjMQotICAgICAgICBDTVAgICAgIFN5bWJvbCwgVDEKLSAgICAgICAgQUREQ1MgICBTdWZmaXhMZW5ndGgsIFN1ZmZpeExlbmd0aCwgIzEgICAgICAgIAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgIAotICAgICAgICBCR1QgICAgIExldmVsTG9vcAotICAgICAgICAKLURlY29kZVJ1bnMgICAgICAgIAotICAgICAgICA7Ly8gRmluZCBudW1iZXIgb2YgemVyb3MKLSAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgotICAgICAgICBTVUIgICAgIENvdW50LCBUb3RhbENvZWZmLCAjMSAgICAgICA7Ly8gTnVtYmVyIG9mIHJ1bnMgZXhjbHVkaW5nIGxhc3QKLSAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFQxLCBUb3RhbENvZWZmICAgOy8vIE1heGltdW0gbnVtYmVyIG9mIHplcm9zIHRoZXJlIGNvdWxkIGJlCi0gICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KLSAgICAgICAgTU9WICAgICBDb2VmZk51bSxUb3RhbENvZWZmCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKLSAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAotICAgICAgICAKLSAgICAgICAgOy8vIFVucGFjayBudW1iZXIgb2YgemVyb3MgZnJvbSBiaXRzdHJlYW0KLSAgICAgICAgVEVRICAgICBUMSwgIzQgICAgICAgIAotICAgICAgICBMRFJFUSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcy00KQotICAgICAgICBMRFJORSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzLTQpCi0gICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBUb3RhbENvZWZmLCBMU0wgIzJdCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMiA7Ly8gU3ltYm9sID0gWmVyb3NMZWZ0Ci0gICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgotICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAotCi0gICAgICAgIExEUiAgICAgcHBSdW5UYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzLTQpCi0gICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KLSAgICAgICAgTU9WUyAgICBaZXJvc0xlZnQsIFN5bWJvbAotCi0gICAgICAgIEFERCAgICAgQ29lZmZOdW0sQ29lZmZOdW0sWmVyb3NMZWZ0ICAgICAgICAKLQotICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgemVyb3MgYXJlIGxlZnQgYW5kIG1vcmUgdGhhbiBvbmUgY29lZmZpY2llbnQKLVJ1bkxvb3AgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BwUnVuVGFibGUsIFplcm9zTGVmdCwgTFNMIzJdCi0gICAgICAgIEJMVCAgICAgTGFzdFJ1bgotICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgMywgMiA7Ly8gU3ltYm9sID0gUnVuCi0gICAgICAgIENNUCAgICAgU3ltYm9sLCMxNSAgICAgICAgIAotICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbCAgICAgICAgCi0KLSAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFplcm9zTGVmdCwgU3ltYm9sCi0gICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFN5bWJvbAotICAgICAgICBTVFJCICAgIFN5bWJvbCwgW3BSdW5dLCAjMQotICAgICAgICBCR1QgICAgIFJ1bkxvb3AKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSBubyB6ZXJvcyBhcmUgbGVmdAotTm9aZXJvc0xlZnQgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQotICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBaZXJvc0xlZnQKLSAgICAgICAgU1RSR0VCICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEKLSAgICAgICAgQkdUICAgICBOb1plcm9zTGVmdAotCi1MYXN0UnVuICAgICAgICAKLSAgICAgICAgOy8vIEZpbmFsIHJ1biBsZW5ndGggaXMgcmVtYWluaW5nIHplcm9zCi0gICAgICAgIE1fUFJJTlRGICJMYXN0UnVuPSVkXG4iLCBaZXJvc0xlZnQKLSAgICAgICAgU1RSQiAgICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGNvZWZmaWNpZW50cyB0byBvdXRwdXQgYXJyYXkKLSAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgotICAgICAgICBURVEgICAgIFQxLCAjMTUKLSAgICAgICAgQURERVEgICBDb2VmZk51bSxDb2VmZk51bSwjMQotICAgICAgICAKLQotICAgICAgICBTVUIgICAgIHBSdW4scFJ1bixUb3RhbENvZWZmCi0gICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAKLSAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgICAKLQotICAgICAgICBNX0xEUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZgotICAgICAgICBMRFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQotICAgICAgICBURVEgICAgIFQxLCAjNAotICAgICAgICBMRFJFUSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICAgICAgTERSTkUgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci0KLSAgICAgICAgCi0gICAgICAgIAotT3V0cHV0TG9vcAotICAgICAgICAKLSAgICAgICAgTERSQiAgICBUMiwgW3BSdW5dLCMxCi0gICAgICAgIExEUkIgICAgVDEsIFtwWmlnWmFnLCBDb2VmZk51bV0KLSAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sICMxICAgICAgOy8vIFNraXAgTm9uIHplcm8KLSAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sIFQyICAgICAgOy8vIFNraXAgWmVybyBydW4KLSAgICAgICAgCi0gICAgICAgIExEUlNIICAgVDIsIFtwTGV2ZWxdLCMyCi0gICAgICAgIAotICAgICAgICBTVUJTICAgIFRvdGFsQ29lZmYsIFRvdGFsQ29lZmYsICMxICAgICAgIAotICAgICAgICBPUlJFUSAgIFQxLCBUMSwgI0xBU1RfQ09FRkYKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgdGVtcCwgVDIsICMxMjgKLSAgICAgICAgQ01QICAgICB0ZW1wLCAjMjU2Ci0gICAgICAgIE9SUkNTICAgVDEsIFQxLCAjVFdPX0JZVEVfQ09FRkYKLQotICAgICAgICAKLSAgICAgICAgVEVRICAgICBUb3RhbENvZWZmLCAjMCAgICAgICAgICAgICAgOy8vIFByZXNlcnZlcyBjYXJyeSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1BSSU5URiAiT3V0cHV0PSUwMnggJTA0eFxuIiwgVDEsIFQyCi0gICAgICAgIFNUUkIgICAgVDEsIFtwUG9zQ29lZmJ1Zl0sICMxCi0gICAgICAgIFNUUkIgICAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxCi0gICAgICAgIE1PViAgICAgVDIsIFQyLCBMU1IgIzgKLSAgICAgICAgU1RSQ1NCICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEgICAgICAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgT3V0cHV0TG9vcAotICAgICAgICAKLSAgICAgICAgOy8vIEZpbmlzaGVkCi0gICAgICAgIFNUUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCi0gICAgICAgIE1fTERSICAgcHBCaXRTdHJlYW0sIHBwcEJpdFN0cmVhbQotICAgICAgICBNX0xEUiAgIHBPZmZzZXQsIHBwT2Zmc2V0Ci0gICAgICAgIEIgICAgICAgRW5kTm9FcnJvcgotICAgICAgICAgICAgCi1FbmRCYWRTeW1ib2wKLSAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfRXJyCi0gICAgICAgIEIgICAgICAgRW5kICAgIAotICAgICAgICAKLUVuZE5vRXJyb3IKLSAgICAgICAgOy8vIEZpbmlzaGVkIHJlYWRpbmcgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBPZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyICAgIAotRW5kCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlMDdiNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotCi0gICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeCAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLSAgICAgICAgIAotICAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgICAgCi0gICAgICAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLQotICAgIAotICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotICAgICAgICAgICAKLSAKLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKLSAgICAgICAgIERDQiAgMCwgMiwgMCwgMgotICAgICAgICAgRENCICAyLCAxLCAyLCAxCi0gICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMSwgMiwgMQotCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAgICAgIERDQiAgMCwgMgotICAgICAgICAgRENCICAyLCAxCi0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXgKLSAgICAgICAgIERDQiAgMTAsIDE2LCAxMwotICAgICAgICAgRENCICAxMSwgMTgsIDE0Ci0gICAgICAgICBEQ0IgIDEzLCAyMCwgMTYKLSAgICAgICAgIERDQiAgMTQsIDIzLCAxOAotICAgICAgICAgRENCICAxNiwgMjUsIDIwCi0gICAgICAgICBEQ0IgIDE4LCAyOSwgMjMKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIFsoSU5UKShRUC82KV0sCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICAgRENCICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLSAgICAgICAgIERDQiAgMSwgIDEsICAxLCAgMSwgIDEsICAxCi0gICAgICAgICBEQ0IgIDIsICAyLCAgMiwgIDIsICAyLCAgMgotICAgICAgICAgRENCICAzLCAgMywgIDMsICAzLCAgMywgIDMKLSAgICAgICAgIERDQiAgNCwgIDQsICA0LCAgNCwgIDQsICA0Ci0gICAgICAgICBEQ0IgIDUsICA1LCAgNSwgIDUsICA1LCAgNQotICAgICAgICAgRENCICA2LCAgNiwgIDYsICA2LCAgNiwgIDYKLSAgICAgICAgIERDQiAgNywgIDcsICA3LCAgNywgIDcsICA3Ci0gICAgICAgICBEQ0IgIDgsICA4LCAgOCwgIDgsICA4LCAgOAotICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdIGVudGlyZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgbW9kdWx1cyBleHByZXNzaW9uIFtRUCU2XSo2LAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW52aWR1YWwgYnl0ZSB2YWx1ZXMgc3RvcmVkIGFzCi07Ly8gaGFsZndvcmRzLiBUaGlzIGF2b2lkcyB1bnBhY2tpbmcgaW5zaWRlIHRoZSBmdW5jdGlvbgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgICBEQ1cgMTAsIDE2LCAxMyAKLSAgICAgICAgIERDVyAxMSwgMTgsIDE0Ci0gICAgICAgICBEQ1cgMTMsIDIwLCAxNgotICAgICAgICAgRENXIDE0LCAyMywgMTgKLSAgICAgICAgIERDVyAxNiwgMjUsIDIwCi0gICAgICAgICBEQ1cgMTgsIDI5LCAyMyAKLSAgICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAKLSAgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmUxMjNkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi0gICAgSUYgQVJNMTEzNkpTIAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDgKLWlIZWlnaHQgICAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi14ICAgICAgICAgICAgICAgUk4gNwoteDAgICAgICAgICAgICAgIFJOIDcKLXgxICAgICAgICAgICAgICBSTiAxMAoteDIgICAgICAgICAgICAgIFJOIDExCi1TY3JhdGNoICAgICAgICAgUk4gMTIKLQotOy8vIEZ1bmN0aW9uOiAKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLTsvLwotOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGEgNCBieXRlIGFsaWduZWQKLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLgotOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA5IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gcm93cyB0byBjb3B5Ci07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMixyMyxyNCxyNSxyNgotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYwotOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZSAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29weSBwRHN0IHRvIHNjcmF0Y2gKLSAgICAgICAgTU9WICAgICBTY3JhdGNoLCBwRHN0Ci0KLVN0YXJ0QWxpZ25lZFN0YWNrQ29weQotICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMKLSAgICAgICAgCi0gICAgICAgIE1fU1dJVENIIHgKLSAgICAgICAgTV9DQVNFICAgQ29weTB0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTF0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTJ0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTN0b0FsaWduZWQKLSAgICAgICAgTV9FTkRTV0lUQ0gKLQotQ29weTB0b0FsaWduZWQgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MHRvQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlFbmQgIAotICAgICAgCi1Db3B5MXRvQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMjQKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTF0b0FsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5RW5kICAKLQotQ29weTJ0b0FsaWduZWQgICAgICAgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMTYKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkydG9BbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weUVuZCAgCi0KLUNvcHkzdG9BbGlnbmVkICAgICAgICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjOAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTN0b0FsaWduZWQKLQotQ29weUVuZCAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHBTcmMsIFNjcmF0Y2gKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjMTIKLQotICAgICAgICBNX0VORAotICAgIAotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCi07Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIG9mIHJvd3MgdG8gY29weQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjIscjMscjQscjUscjYKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENvcHkgcFNyYyB0byBzdGFjawotU3RhcnRWQWxpZ25lZFN0YWNrQ29weQotICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NXSVRDSCB4Ci0gICAgICAgIE1fQ0FTRSAgIENvcHkwdG9WQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MXRvVkFsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTJ0b1ZBbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkzdG9WQWxpZ25lZAotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICAKLUNvcHkwdG9WQWxpZ25lZCAgCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MHRvVkFsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCi0gICAgICAKLUNvcHkxdG9WQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICM4Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTF0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotCi1Db3B5MnRvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMTYKLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MnRvVkFsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCi0KLUNvcHkzdG9WQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzI0Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTN0b1ZBbGlnbmVkCi0KLUNvcHlWRW5kICAKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBEc3QsICMyOAotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0KLSAgICAgICAgTV9FTkQKLQotCi0gICAgRU5ESUYKLQotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhODlmZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZSAKLTsvLwotOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjEscjMscjQscjUscjYscjcscjEwLHIxMSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByMCxyMixyOCxyOSxyMTIKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQotICAgICAgICAKLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwoteDAgICAgICAgICAgICAgIFJOIDQKLXgxICAgICAgICAgICAgICBSTiA1Ci14MiAgICAgICAgICAgICAgUk4gOAoteDMgICAgICAgICAgICAgIFJOIDkKLVRlbXAgICAgICAgICAgICBSTiAxMgotCi0gICAgSUYgQVJNMTEzNkpTCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZSwgcjYKLQotQ29weTR4NFN0YXJ0Ci0gICAgICAgIDsvLyBEbyBDb3B5IGFuZCBicmFuY2ggdG8gRW5kT2ZJbnRlcnBvbGF0aW9uCi0gICAgICAgIEFORCAgICAgVGVtcCwgcFNyYywgIzMKLSAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIE1fU1dJVENIIFRlbXAKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24wCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMQotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjIKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24zCi0gICAgICAgIE1fRU5EU1dJVENICi0KLUNvcHk0eDRBbGlnbjAKLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fTERSICAgeDEsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDEsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHgzLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1fU1RSICAgeDMsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotCi1Db3B5NHg0QWxpZ24xCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotICAgICAgCi1Db3B5NHg0QWxpZ24yCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCi0KLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLQotQ29weTR4NEFsaWduMyAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLQotQ29weTR4NEVuZAotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLQotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI2N2ViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKLQotOy8vIEZ1bmN0aW9uczogCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSBhbmQKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlIAotOy8vCi07Ly8gSW1wbGVtZW50cyByZS1hcnJhbmdlbWVudCBvZiBkYXRhIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciB0byBhIGJ1ZmZlciBwb2ludGVkIGJ5IHBCdWYuCi07Ly8gVGhpcyB3aWxsIGRvIHRoZSBjb252ZXJ0aW9uIG9mIGRhdGEgZnJvbSAxNiBiaXQgdG8gOCBiaXQgYW5kIGl0IGFsc28KLTsvLyByZW1vdmUgb2Zmc2V0IGFuZCBjaGVjayBmb3Igc2F0dXJhdGlvbi4KLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjcgd2hlcmUgcjAgaXMgaW5wdXQgcG9pbnRlciBhbmQgcjIgaXRzIHN0ZXAgc2l6ZSwgcjcgaXMgb3V0cHV0IHBvaW50ZXIKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgotOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgZGVzdGluYXRpb24gbG9jYXRpb24KLQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLSAgICAgICAgCi1NQVNLICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAgIDsvLyBNYXNrIGlzIHVzZWQgdG8gaW1wbGVtZW50IChhK2IrMSkvMgotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcFNyYzAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAwICAgICAgICBSTiAxCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLVRlbXAxICAgICAgICAgICBSTiA0Ci1UZW1wMiAgICAgICAgICAgUk4gNQotVGVtcDMgICAgICAgICAgIFJOIDEwCi1UZW1wNCAgICAgICAgICAgUk4gMTEKLXBCdWYgICAgICAgICAgICBSTiA3Ci1yMHgwZmUwMGZlMCAgICAgUk4gNgotcjB4MDBmZjAwZmYgICAgIFJOIDEyCi1Db3VudCAgICAgICAgICAgUk4gMTQKLVZhbHVlQTAgICAgICAgICBSTiAxMAotVmFsdWVBMSAgICAgICAgIFJOIDExCi0KLSAgICBJRiBBUk0xMTM2SlMKLQotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgIAotICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzQgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgCi1Mb29wU3RhcnQxCi0gICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMCAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICAgICAgIAotICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVFJEICAgICAgICBWYWx1ZUEwLCBbcEJ1Zl0sICM4IAotICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQxCi1FbmQxCi0gICAgICAgIFNVQiAgICAgICAgcFNyYzAsIHBCdWYsICMzMgotICAgICAgICBNT1YgICAgICAgIHNyY1N0ZXAwLCAjOAotCi0gICAgICAgIE1fRU5ECi0KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlLCByNgotICAgICAgICAKLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmCi0gICAgICAgIE1PViAgICAgICAgIENvdW50LCAjMgotCi1Mb29wU3RhcnQgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAotICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCi0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCi0gICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQotICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjLTQgIAotCi0gICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAotICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCi0gICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQotICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjNCAgCi0gICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQKLUVuZDIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYzAsIHBCdWYsICMzMi04Ci0gICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAwLCAjNAotCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjNlYWNlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLQotCi0gICAgSUYgQVJNMTEzNkpTIAotCi0KLSAgICAgICAgTV9BTExPQzggcHBEc3RBcmdzLCA4Ci0gICAgICAgIE1fQUxMT0M4IHBUZW1wUmVzdWx0MSwgOAotICAgICAgICBNX0FMTE9DOCBwVGVtcFJlc3VsdDIsIDgKLSAgICAgICAgTV9BTExPQzQgcHBTcmMsIDQKLSAgICAgICAgTV9BTExPQzQgcHBEc3QsIDQKLSAgICAgICAgTV9BTExPQzQgcERzdFN0ZXAsIDQKLSAgICAgICAgTV9BTExPQzQgcFNyY1N0ZXAsIDQKLSAgICAgICAgTV9BTExPQzQgcENvdW50ZXIsIDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIDsvLyBGdW5jdGlvbjogCi0gICAgICAgIDsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW1wbGVtZW50cyBkaWFnb25hbCBpbnRlcnBvbGF0aW9uIGZvciBhIGJsb2NrIG9mIHNpemUgNHg0LiBJbnB1dCBhbmQgb3V0cHV0IHNob3VsZCAKLSAgICAgICAgOy8vIGJlIGFsaWduZWQuIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMywgcjggd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIHN0ZXAgc2l6ZSwgcjggaW50ZXJtZWRpYXRlLWJ1ZiBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCByZWdpc3RlcnMKLSAgICAgICAgOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZSwgcjYKLSAgICAgICAgCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi1BY2MwICAgICAgICAgICAgUk4gNAotQWNjMSAgICAgICAgICAgIFJOIDUKLUFjYzIgICAgICAgICAgICBSTiA2Ci1BY2MzICAgICAgICAgICAgUk4gNwotCi1WYWxBICAgICAgICAgICAgUk4gNAotVmFsQiAgICAgICAgICAgIFJOIDUKLVZhbEMgICAgICAgICAgICBSTiA2Ci1WYWxEICAgICAgICAgICAgUk4gNwotVmFsRSAgICAgICAgICAgIFJOIDgKLVZhbEYgICAgICAgICAgICBSTiA5Ci1WYWxHICAgICAgICAgICAgUk4gMTIKLVZhbEggICAgICAgICAgICBSTiAxNAotVmFsSSAgICAgICAgICAgIFJOIDEKLQotVGVtcDEgICAgICAgICAgIFJOIDMKLVRlbXAyICAgICAgICAgICBSTiAxCi1UZW1wMyAgICAgICAgICAgUk4gMTIKLVRlbXA0ICAgICAgICAgICBSTiA3Ci1UZW1wNSAgICAgICAgICAgUk4gNQotcjB4MGZlMDBmZTAgICAgIFJOIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCi1yMHgwMGZmMDBmZiAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKLUNvdW50ZXIgICAgICAgICBSTiAxMQotcEludGVyQnVmICAgICAgIFJOIDgKLQotVmFsQ0EgICAgICAgICAgIFJOIDgKLVZhbERCICAgICAgICAgICBSTiA5Ci1WYWxHRSAgICAgICAgICAgUk4gMTAKLVZhbEhGICAgICAgICAgICBSTiAxMQotcjB4MDAxNDAwMDEgICAgIFJOIDEyCi1yMHgwMDE0ZmZmYiAgICAgUk4gMTQKLQotcjB4MDAwMWZjMDAgICAgIFJOIDExCi0KLUFjY3ggICAgICAgICAgICBSTiA4Ci1BY2N5ICAgICAgICAgICAgUk4gOQotVGVtcDYgICAgICAgICAgIFJOIDE0Ci0KLSAgICAgICAgTV9TVFJEICAgICAgcERzdCwgZHN0U3RlcCwgcHBEc3RBcmdzCi0KLSAgICAgICAgTU9WICAgICAgICAgcERzdCwgcEludGVyQnVmICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBkc3RTdGVwLCAjMTYKLQotICAgICAgICA7Ly8gU2V0IHVwIGNvdW50ZXIgb2YgZm9ybWF0LCBbMF0gIFswXSAgWzEgKGhlaWdodCldICBbOCAod2lkdGgpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjNAotICAgICAgICBNX1NUUiAgICAgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIHNyY1N0ZXAsIHBTcmNTdGVwICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAotCi1IZWlnaHRMb29wCi1OZXh0VHdvUm93c0xvb3AKLSAgICAgICAgTERSICAgICBWYWxELCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDEgW2QxIGMxIGIxIGExXQotICAgICAgICBMRFIgICAgIFZhbEEsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMCBbZDAgYzAgYjAgYTBdCi0gICAgICAgIExEUiAgICAgVmFsSCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDEgZzEgZjEgZTFdICAgICAgICAKLSAgICAgICAgTERSICAgICBWYWxFLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtoMCBnMCBmMCBlMF0KLSAgICAgICAgTERSQiAgICBUZW1wMiwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDEgW2wxIGsxIGoxIGkxXQotICAgICAgICBMRFJCICAgIFRlbXAxLCBbcFNyY10sICMtOCAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMCBbbDAgazAgajAgaTBdCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFZhbEIsIFZhbEEsIFZhbEQsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2IxIGExIGIwIGEwXQotICAgICAgICBQS0hUQiAgIFZhbEQsIFZhbEQsIFZhbEEsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2QxIGMxIGQwIGMwXQotICAgICAgICBVWFRBQjE2IFZhbEEsIHIweDAwZmYwMGZmLCBWYWxCICAgICAgICAgICAgICAgICA7Ly8gWzAwIGExIDAwIGEwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiBWYWxDLCByMHgwMGZmMDBmZiwgVmFsRCAgICAgICAgICAgICAgICAgOy8vIFswMCBjMSAwMCBjMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFBLSEJUICAgVmFsSSwgVGVtcDEsIFRlbXAyLCBMU0wgIzE2ICAgICAgICAgICAgIDsvLyBbMDAgaTEgMDAgaTBdICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgVmFsRiwgVmFsRSwgVmFsSCwgTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbZjEgZTEgZjAgZTBdCi0gICAgICAgIFBLSFRCICAgVmFsSCwgVmFsSCwgVmFsRSwgQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbaDEgZzEgaDAgZzBdCi0gICAgICAgIFVYVEFCMTYgVmFsRSwgcjB4MDBmZjAwZmYsIFZhbEYgICAgICAgICAgICAgICAgIDsvLyBbMDAgZTEgMDAgZTBdICsgWzAgMjU1IDAgMjU1XQotCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMAotICAgICAgICA7Ly8gQWNjMCA9IGEgLSA1KmIgKyAyMCpjICsgMjAqZCAtIDUqZSArIGYKLSAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsQywgVmFsRCwgUk9SICM4Ci0gICAgICAgIFVYVEFCMTYgVGVtcDMsIFZhbEUsIFZhbEIsIFJPUiAjOAotICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMywgVGVtcDEsIExTTCAjMiAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBBY2MwLCBWYWxBLCBWYWxGLCBST1IgIzgKLSAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAotICAgICAgICBBREQgICAgIEFjYzAsIEFjYzAsIFRlbXAxICAgICAgIAotCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMQotICAgICAgICA7Ly8gQWNjMSA9IGIgLSA1KmMgKyAyMCpkICsgMjAqZSAtIDUqZiArIGcKLSAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRSwgVmFsRCwgUk9SICM4Ci0gICAgICAgIFVYVEFCMTYgVGVtcDMsIFZhbEMsIFZhbEYsIFJPUiAjOAotICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMywgVGVtcDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2IFZhbEcsIHIweDAwZmYwMGZmLCBWYWxIICAgICAgICAgICAgICAgICA7Ly8gWzAwIGcxIDAwIGcwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAotICAgICAgICBVWFRBQjE2IEFjYzEsIFZhbEcsIFZhbEIsIFJPUiAjOAotICAgICAgICBBREQgICAgIEFjYzEsIEFjYzEsIFRlbXAxICAgICAgICAKLQotICAgICAgICBVWFRBQjE2IEFjYzIsIFZhbEMsIFZhbEgsIFJPUiAjOCAgICAgICAgCi0gICAgICAgIEFERCAgICAgVmFsSSwgcjB4MDBmZjAwZmYsIFZhbEkgICAgICAgICAgICAgICAgIDsvLyBbMDAgaTEgMDAgaTBdICsgWzAgMjU1IDAgMjU1XSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzIKLSAgICAgICAgOy8vIEFjYzIgPSBjIC0gNSpkICsgMjAqZSArIDIwKmYgLSA1KmcgKyBoCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEcsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IEFjYzMsIFZhbEksIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAyLCBWYWxFLCBWYWxGLCBST1IgIzgKLSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMiwgTFNMICMyICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRywgVmFsRiwgUk9SICM4Ci0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MyLCBBY2MyLCBUZW1wMSAgICAgICAgCi0KLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MzCi0gICAgICAgIDsvLyBBY2MzID0gZCAtIDUqZSArIDIwKmYgKyAyMCpnIC0gNSpoICsgaQotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxFLCBWYWxILCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDEsIFRlbXAyLCBMU0wgIzIKLSAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAotICAgICAgICBBREQgICAgIEFjYzMsIEFjYzMsIFRlbXAxCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsIHBEc3RTdGVwICAgICAgICAKLSAgICAgICAgTV9MRFIgICBzcmNTdGVwLCBwU3JjU3RlcAotCi0gICAgICAgIDsvLyBJZiBDb3VudGVyIGlzIGV2ZW4gc3RvcmUgQWNjMC1BY2MzIGluIGEgdGVtcG9yYXJ5IGJ1ZmZlcgotICAgICAgICA7Ly8gSWYgQ291bnRlciBpcyBvZmYgc3RvcmUgQWNjMC1BY2MzIGFuZCBwcmV2aW91cyBBY2MwLUFjYzMgaW4gYSBpbnRlcm1lZGlhdGUgYnVmIAotICAgICAgICBBTkRTICAgICAgICBUZW1wMywgQ291bnRlciwgIzEKLSAgICAgICAgQkVRICAgICAgICAgTm9Qcm9jZXNzaW5nICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBQYWNraW5nIHByZXZpb3VzIGFuZCBjdXJyZW50IEFjYzAtQWNjMyB2YWx1ZXMKLSAgICAgICAgTV9MRFJEICAgICAgQWNjeCwgQWNjeSwgcFRlbXBSZXN1bHQxCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N4LCBBY2MwLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGEyIDAgYTBdID0gWzAgYTMgMCBhMl0gWzAgYTEgMCBhMF0KLSAgICAgICAgUEtIVEIgICAgICAgQWNjMCwgQWNjMCwgQWNjeCwgQVNSICMxNiAgICAgICAgICAgOy8vWzAgYTMgMCBhMV0gPSBbMCBhMSAwIGEwXSBbMCBhMyAwIGEyXSAKLSAgICAgICAgU1RSICAgICAgICAgQWNjMCwgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeSwgQWNjMSwgTFNMICMxNiAgICAgICAgICA7Ly9bMCBiMiAwIGIwXSA9IFswIGIzIDAgYjJdIFswIGIxIDAgYjBdCi0gICAgICAgIFBLSFRCICAgICAgIEFjYzEsIEFjYzEsIEFjY3ksIEFTUiAjMTYgICAgICAgICAgICA7Ly9bMCBiMyAwIGIxXSA9IFswIGIxIDAgYjBdIFswIGIzIDAgYjJdCi0gICAgICAgIE1fTERSRCAgICAgIEFjY3gsIEFjY3ksIHBUZW1wUmVzdWx0MgotICAgICAgICBTVFIgICAgICAgICBBY2MxLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeCwgQWNjMiwgTFNMICMxNiAgICAgICAgICA7Ly9bMCBjMiAwIGMwXSA9IFswIGMzIDAgYzJdIFswIGMxIDAgYzBdCi0gICAgICAgIFBLSFRCICAgICAgIEFjYzIsIEFjYzIsIEFjY3gsIEFTUiAjMTYgICAgICAgICAgICA7Ly9bMCBjMyAwIGMxXSA9IFswIGMxIDAgYzBdIFswIGMzIDAgYzJdCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzIsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3ksIEFjYzMsIExTTCAjMTYgICAgICAgICAgOy8vWzAgZDIgMCBkMF0gPSBbMCBkMyAwIGQyXSBbMCBkMSAwIGQwXQotICAgICAgICBQS0hUQiAgICAgICBBY2MzLCBBY2MzLCBBY2N5LCBBU1IgIzE2ICAgICAgICAgICAgOy8vWzAgZDMgMCBkMV0gPSBbMCBkMSAwIGQwXSBbMCBkMyAwIGQyXQotICAgICAgICBTVFIgICAgICAgICBBY2MzLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIy0xMgotICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIEFmdGVyU3RvcmUKLQotTm9Qcm9jZXNzaW5nCi0gICAgICAgIE1fU1RSRCAgICAgIEFjYzAsIEFjYzEsIHBUZW1wUmVzdWx0MQotICAgICAgICBNX1NUUkQgICAgICBBY2MyLCBBY2MzLCBwVGVtcFJlc3VsdDIKLUFmdGVyU3RvcmUKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEgICAgICAgICAgICAgICAgOy8vIExvb3AgdGlsbCBoZWlnaHQgaXMgMTAKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJQTCAgICAgICAgIEhlaWdodExvb3AKLQotICAgICAgICBTVFIgICAgICAgICBBY2MwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICA7Ly9bMCBhMSAwIGEwXQotICAgICAgICBTVFIgICAgICAgICBBY2MxLCBbcERzdF0sICM0Ci0gICAgICAgIFNUUiAgICAgICAgIEFjYzIsIFtwRHN0XSwgIzQKLSAgICAgICAgU1RSICAgICAgICAgQWNjMywgW3BEc3RdLCAjLTEyCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbiB1c2luZyBtdWx0aXBsaWNhdGlvbgotICAgICAgICA7Ly8KLSAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAsICMxNgotICAgICAgICBNX0xEUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKLQotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjNAotICAgICAgICBMRFIgICAgICAgICByMHgwMDE0ZmZmYiwgPTB4MDAxNGZmZmIKLSAgICAgICAgTERSICAgICAgICAgcjB4MDAxNDAwMDEsID0weDAwMTQwMDAxCi0KLUhlaWdodExvb3AxCi0gICAgICAgIE1fU1RSICAgICAgIENvdW50ZXIsIHBDb3VudGVyCi0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsQ0EsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBjIDAgYV0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsREIsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBkIDAgYl0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsR0UsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBnIDAgZV0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsSEYsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBoIDAgZl0KLQotCi0gICAgICAgIDsvLyBBY2MwID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBjIDAgYV0gKyBbMCBkIDAgZl0pKSAtICg1ICogKGIgKyBlKSkgCi0gICAgICAgIDsvLyBBY2MxID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBlIDAgZ10gKyBbMCBkIDAgYl0pKSAtICg1ICogKGMgKyBmKSkgCi0gICAgICAgIDsvLyBBY2MyID0gc211YWQgKFswIDEgMCAyMF0sIGFkZChbMCBjIDAgZV0gKyBbMCBoIDAgZl0pKSAtICg1ICogKGQgKyBnKSkgCi0gICAgICAgIDsvLyBBY2MzID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBkIDAgZl0gKyBbMCBpIDAgZ10pKSAtICg1ICogKGUgKyBoKSkgCi0KLSAgICAgICAgU01VQUQgICAgICAgQWNjMCwgVmFsQ0EsIHIweDAwMTQwMDAxICAgICAgICAgICAgOy8vIEFjYzAgID0gWzAgYyAwIGFdICogWzAgMjAgMCAxXQotICAgICAgICBTTVVBRCAgICAgICBBY2MxLCBWYWxEQiwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMSAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNVUFEWCAgICAgIEFjYzIsIFZhbEdFLCByMHgwMDE0ZmZmYiAgICAgICAgICAgIDsvLyBBY2MyICA9IFswIGcgMCBlXSAqIFswIDIwIDAgLTVdCi0gICAgICAgIFNNVUFEICAgICAgIEFjYzMsIFZhbEdFLCByMHgwMDE0ZmZmYiAgICAgICAgICAgIDsvLyBBY2MzICA9IFswIGcgMCBlXSAqIFswIDIwIDAgLTVdCi0KLSAgICAgICAgU01MQUQgICAgICAgQWNjMCwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgZCAwIGJdICogWzAgMjAgMCAtNV0KLSAgICAgICAgU01MQURYICAgICAgQWNjMSwgVmFsR0UsIHIweDAwMTQwMDAxLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgZyAwIGVdICogWzAgMjAgMCAxXQotICAgICAgICBTTUxBRFggICAgICBBY2MyLCBWYWxIRiwgcjB4MDAxNDAwMDEsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBoIDAgZl0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNTEFEWCAgICAgIEFjYzMsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGggMCBmXSAqIFswIDIwIDAgLTVdCi0KLSAgICAgICAgU01MQUJCICAgICAgQWNjMCwgVmFsR0UsIHIweDAwMTRmZmZiLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgZyAwIGVdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MxLCBWYWxDQSwgcjB4MDAxNGZmZmIsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBkIDAgYl0gKiBbMCAwIDAgLTVdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzIsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQotICAgICAgICBTTUxBVEIgICAgICBBY2MzLCBWYWxEQiwgcjB4MDAxNDAwMDEsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBjIDAgYV0gKiBbMCAwIDAgMV0KLQotICAgICAgICBMRFJIICAgICAgICBWYWxDQSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gOCA9IHNyY1N0ZXAgLSAxNgotICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxIRiwgcjB4MDAxNDAwMDEsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBoIDAgZl0gKiBbMCAwIDAgMV0gICAgICAgIAotICAgICAgICBTTUxBQkIgICAgICBBY2MxLCBWYWxIRiwgcjB4MDAxNGZmZmIsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBoIDAgZl0gKiBbMCAwIDAgLTVdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzIsIFZhbERCLCByMHgwMDE0ZmZmYiwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0gICAgICAgIAotICAgICAgICBTTUxBQkIgICAgICBBY2MzLCBWYWxDQSwgcjB4MDAxNDAwMDEsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBkIDAgYl0gKiBbMCAwIDAgMV0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwMDFmYzAwLCA9MHgwMDAxZmMwMCAgICAgICAgICAgIDsvLyAoMHhmZiAqIDE2ICogMzIpIC0gNTEyCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzAsIEFjYzAsIHIweDAwMDFmYzAwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgQWNjMSwgQWNjMSwgcjB4MDAwMWZjMDAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBBY2MyLCBBY2MyLCByMHgwMDAxZmMwMCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzMsIEFjYzMsIHIweDAwMDFmYzAwICAgICAgICAKLQotICAgICAgICBVU0FUICAgICAgICBBY2MwLCAjMTgsIEFjYzAKLSAgICAgICAgVVNBVCAgICAgICAgQWNjMSwgIzE4LCBBY2MxCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzIsICMxOCwgQWNjMgotICAgICAgICBVU0FUICAgICAgICBBY2MzLCAjMTgsIEFjYzMKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIEFjYzAsIEFjYzAsIExTUiAjMTAKLSAgICAgICAgTV9TVFJCICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgICAgIEFjYzEsIEFjYzEsIExTUiAjMTAKLSAgICAgICAgTV9TVFJCICAgICAgQWNjMSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgICAgIEFjYzIsIEFjYzIsIExTUiAjMTAKLSAgICAgICAgTV9TVFJCICAgICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgICAgIEFjYzMsIEFjYzMsIExTUiAjMTAKLSAgICAgICAgTV9TVFJCICAgICAgQWNjMywgW3BEc3RdLCBkc3RTdGVwCi0KLQotICAgICAgICBNX0xEUiAgICAgICBDb3VudGVyLCBwQ291bnRlcgotICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyCi0gICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsICMxCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxCi0gICAgICAgIEJHVCAgICAgICAgIEhlaWdodExvb3AxCi1FbmQKLSAgICAgICAgU1VCICAgICAgICAgcERzdCwgcERzdCwgIzQKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzE2Ci0KLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdjNWM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgCi0gICAgCi0gICAgCi0KLSAgICBJRiBBUk0xMTM2SlMgCi0gICAgICAgIAotICAgICAgICBNX0FMTE9DOCBwcERzdEFyZ3MsIDgKLSAgICAgICAgTV9BTExPQzQgcHBTcmMsIDQKLSAgICAgICAgTV9BTExPQzQgcHBEc3QsIDQKLSAgICAgICAgTV9BTExPQzQgcENvdW50ZXIsIDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIDsvLyBGdW5jdGlvbjoKLSAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbXBsZW1lbnRzIGRpYWdvbmFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAotICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLSAgICAgICAgOy8vIHIwLHIxLHIyLHIzLCByOCB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgc3RlcCBzaXplLCByOCBpbnRlcm1lZGlhdGUtYnVmIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLSAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycwotICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMwotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlLCByNgotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi1WYWxBICAgICAgICAgICAgUk4gNQotVmFsQTAgICAgICAgICAgIFJOIDQKLVZhbEExICAgICAgICAgICBSTiA1Ci1WYWxBRjAgICAgICAgICAgUk4gNAotVmFsQUYxICAgICAgICAgIFJOIDUKLQotVmFsQiAgICAgICAgICAgIFJOIDExCi0KLVZhbEMgICAgICAgICAgICBSTiA1Ci1WYWxDMCAgICAgICAgICAgUk4gNAotVmFsQzEgICAgICAgICAgIFJOIDUKLVZhbENEMCAgICAgICAgICBSTiAxMgotVmFsQ0QxICAgICAgICAgIFJOIDE0Ci1WYWxDRjAgICAgICAgICAgUk4gNAotVmFsQ0YxICAgICAgICAgIFJOIDUKLQotVmFsRCAgICAgICAgICAgIFJOIDEwCi0KLVZhbEUgICAgICAgICAgICBSTiA3Ci1WYWxFMCAgICAgICAgICAgUk4gNgotVmFsRTEgICAgICAgICAgIFJOIDcKLVZhbEVCMCAgICAgICAgICBSTiAxMAotVmFsRUIxICAgICAgICAgIFJOIDExCi1WYWxFRDAgICAgICAgICAgUk4gNgotVmFsRUQxICAgICAgICAgIFJOIDcKLQotVmFsRiAgICAgICAgICAgIFJOIDEwCi0KLVZhbEcgICAgICAgICAgICBSTiAxNAotVmFsRzAgICAgICAgICAgIFJOIDEyCi1WYWxHMSAgICAgICAgICAgUk4gMTQKLVZhbEdCMCAgICAgICAgICBSTiAxMgotVmFsR0IxICAgICAgICAgIFJOIDE0Ci0KLUFjYzAgICAgICAgICAgICBSTiA0Ci1BY2MxICAgICAgICAgICAgUk4gNQotQWNjMiAgICAgICAgICAgIFJOIDYKLUFjYzMgICAgICAgICAgICBSTiA3Ci0KLVRlbXAgICAgICAgICAgICBSTiA3Ci1TdGVwICAgICAgICAgICAgUk4gNgotCi1wSW50ZXJCdWYgICAgICAgUk4gOAotQ291bnRlciAgICAgICAgIFJOIDgKLXIweDAwZmYwMGZmICAgICBSTiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKLXIweDAwMDFmYzAwICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KLQotICAgIAotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLVZhbENBICAgICAgICAgICBSTiA4Ci1WYWxEQiAgICAgICAgICAgUk4gOQotVmFsR0UgICAgICAgICAgIFJOIDEwCi1WYWxIRiAgICAgICAgICAgUk4gMTEKLXIweDAwMTQwMDAxICAgICBSTiAxMgotcjB4MDAxNGZmZmIgICAgIFJOIDE0Ci0KLXIweDAwMDAwMjAwICAgICBSTiAxMgotcjB4MDAwMDAwZmYgICAgIFJOIDEyCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKLSAgICAgICAgTU9WICAgICAgICAgcERzdCwgcEludGVyQnVmICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBkc3RTdGVwLCAjMjQKLQotICAgICAgICA7Ly8gU2V0IHVwIGNvdW50ZXIgb2YgZm9ybWF0LCBbMF0gIFswXSAgWzEgKGhlaWdodCldICBbOCAod2lkdGgpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjMQotICAgICAgICBNT1YgICAgICAgICBUZW1wLCAjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIENvdW50ZXIsIFRlbXAsIENvdW50ZXIsIExTTCAjOCAgICAgICAgOy8vIFswIDAgSCBXXSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKLVdpZHRoTG9vcAotICAgICAgICBNX1NUUiAgICAgICBwU3JjLCBwcFNyYwotICAgICAgICBNX1NUUiAgICAgICBwRHN0LCBwcERzdAotSGVpZ2h0TG9vcAotVHdvUm93c0xvb3AKLSAgICAgICAgTV9MRFIgICAgICAgVmFsQywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYzMgYzIgYzEgYzBdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEQsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQotICAgICAgICBNX0xEUiAgICAgICBWYWxFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtlMyBlMiBlMSBlMF0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEMwLCByMHgwMGZmMDBmZiwgVmFsQyAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEMxLCByMHgwMGZmMDBmZiwgVmFsQywgUk9SICM4ICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsQiwgW3BTcmNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRTAsIHIweDAwZmYwMGZmLCBWYWxFICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRTEsIHIweDAwZmYwMGZmLCBWYWxFLCBST1IgIzggICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDAsIFZhbEMwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENEMSwgVmFsQzEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjAsIFZhbEUwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbENEMCwgVmFsRUIwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSkKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzFdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjEsIFZhbEUxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUlNCICAgICAgICAgVmFsQ0QxLCBWYWxFQjEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQwLCBWYWxFMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDEsIFZhbEUxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxGLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtmMyBmMiBmMSBmMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxDRDAsIFZhbENEMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSldCi0gICAgICAgIEFERCAgICAgICAgIFZhbENEMSwgVmFsQ0QxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENGMSwgVmFsQzEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjAsIFZhbEMwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdICAgICAgICAKLSAgICAgICAgUlNCICAgICAgICAgVmFsRUQxLCBWYWxDRjEsIFZhbEVEMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIFZhbEEsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBMRFIgICAgICAgICBWYWxBLCBbVmFsQV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFthMyBhMiBhMSBhMF0KLSAgICAgICAgUlNCICAgICAgICAgVmFsRUQwLCBWYWxDRjAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA0KihPZmYrRStEKSAtIChPZmYrQytGKSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFZhbEVEMSwgVmFsRUQxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVmFsRUQwLCBWYWxFRDAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitFK0QpIC0gKE9mZitDK0YpXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBMCwgcjB4MDBmZjAwZmYsIFZhbEEgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBMSwgcjB4MDBmZjAwZmYsIFZhbEEsIFJPUiAjOCAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjAsIFZhbEEwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMSwgVmFsQTEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIEFjYzEsIFZhbENEMSwgVmFsQUYxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEcsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2czIGcyIGcxIGcwXQotICAgICAgICBBREQgICAgICAgICBBY2MwLCBWYWxDRDAsIFZhbEFGMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzAgPSAxNipPZmYgKyAoQStGKSArIDIwKihDK0QpIC0gNSooQitFKSAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0LCAjNF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKLSAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgotICAgICAgICBVWFRBQjE2ICAgICBWYWxHMCwgcjB4MDBmZjAwZmYsIFZhbEcgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxHMSwgcjB4MDBmZjAwZmYsIFZhbEcsIFJPUiAjOCAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjAsIFZhbEcwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMSwgVmFsRzEsIFZhbEIsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjMgMCBiMV0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgQWNjMiwgVmFsRUQwLCBWYWxHQjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MyID0gMTYqT2ZmICsgKEIrRykgKyAyMCooRCtFKSAtIDUqKEMrRikKLSAgICAgICAgQUREICAgICAgICAgQWNjMywgVmFsRUQxLCBWYWxHQjEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1RSICAgICAgICAgQWNjMywgW3BEc3QsICM0XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxIDw8IDggICAgICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIGhlaWdodCBpcyAxMAotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQlBMICAgICAgICAgSGVpZ2h0TG9vcAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgcFNyYywgcHBTcmMKLSAgICAgICAgTV9MRFIgICAgICAgcERzdCwgcHBEc3QKLSAgICAgICAgQUREUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIygxIDw8IDgpLTQgICAgICAgICAgIDsvLyBMb29wIHRpbGwgd2lkdGggaXMgMTIKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzQKLSAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzgKLSAgICAgICAgQUREICAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzE8PDgKLSAgICAgICAgQlBMICAgICAgICAgV2lkdGhMb29wCi0gICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCi0gICAgICAgIDsvLwotICAgIAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwRHN0LCAjMjQKLSAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcCwgIzI0Ci0gICAgICAgIE1fTERSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncwotCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0Ci0gICAgICAgIExEUiAgICAgICAgIHIweDAwMTRmZmZiLCA9MHgwMDE0ZmZmYgotICAgICAgICBMRFIgICAgICAgICByMHgwMDE0MDAwMSwgPTB4MDAxNDAwMDEKLQotSGVpZ2h0TG9vcDEKLSAgICAgICAgTV9TVFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKLQotCi0gICAgICAgIExEUiAgICAgICAgIFZhbENBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBjIDAgYV0KLSAgICAgICAgTERSICAgICAgICAgVmFsREIsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGQgMCBiXQotICAgICAgICBMRFIgICAgICAgICBWYWxHRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZyAwIGVdCi0gICAgICAgIExEUiAgICAgICAgIFZhbEhGLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBoIDAgZl0KLQotICAgICAgICA7Ly8gQWNjMCA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgYyAwIGFdICsgWzAgZCAwIGZdKSkgLSAoNSAqIChiICsgZSkpIAotICAgICAgICA7Ly8gQWNjMSA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZSAwIGddICsgWzAgZCAwIGJdKSkgLSAoNSAqIChjICsgZikpIAotICAgICAgICA7Ly8gQWNjMiA9IHNtdWFkIChbMCAxIDAgMjBdLCBhZGQoWzAgYyAwIGVdICsgWzAgaCAwIGZdKSkgLSAoNSAqIChkICsgZykpIAotICAgICAgICA7Ly8gQWNjMyA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZCAwIGZdICsgWzAgaSAwIGddKSkgLSAoNSAqIChlICsgaCkpIAotICAgICAgICBTTVVBRCAgICAgICBBY2MwLCBWYWxDQSwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMCAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNVUFEICAgICAgIEFjYzEsIFZhbERCLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MxICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01VQURYICAgICAgQWNjMiwgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzIgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KLSAgICAgICAgU01VQUQgICAgICAgQWNjMywgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzMgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KLQotICAgICAgICBTTUxBRCAgICAgICBBY2MwLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBkIDAgYl0gKiBbMCAyMCAwIC01XQotICAgICAgICBTTUxBRFggICAgICBBY2MxLCBWYWxHRSwgcjB4MDAxNDAwMDEsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBnIDAgZV0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNTEFEWCAgICAgIEFjYzIsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGggMCBmXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01MQURYICAgICAgQWNjMywgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAtNV0KLQotICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxHRSwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBnIDAgZV0gKiBbMCAwIDAgLTVdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzEsIFZhbENBLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzMsIFZhbERCLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQotCi0gICAgICAgIExEUkggICAgICAgIFZhbENBLCBbcFNyY10sICM4ICAgICAgICAgICAgICAgICAgIDsvLyA4ID0gc3JjU3RlcCAtIDE2Ci0gICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGggMCBmXSAqIFswIDAgMCAxXSAgICAgICAgCi0gICAgICAgIFNNTEFCQiAgICAgIEFjYzEsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGggMCBmXSAqIFswIDAgMCAtNV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XSAgICAgICAgCi0gICAgICAgIFNNTEFCQiAgICAgIEFjYzMsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGQgMCBiXSAqIFswIDAgMCAxXQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDAwMWZjMDAsID0weDAwMDFmYzAwICAgICAgICAgICAgOy8vICgweGZmICogMTYgKiAzMikgLSA1MTIKLSAgICAgICAgU1VCICAgICAgICAgQWNjMCwgQWNjMCwgcjB4MDAwMWZjMDAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBBY2MxLCBBY2MxLCByMHgwMDAxZmMwMCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzIsIEFjYzIsIHIweDAwMDFmYzAwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgQWNjMywgQWNjMywgcjB4MDAwMWZjMDAgICAgICAgIAotCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzAsICMxOCwgQWNjMAotICAgICAgICBVU0FUICAgICAgICBBY2MxLCAjMTgsIEFjYzEKLSAgICAgICAgVVNBVCAgICAgICAgQWNjMiwgIzE4LCBBY2MyCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzMsICMxOCwgQWNjMwotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMCwgQWNjMCwgTFNSICMxMAotICAgICAgICBNT1YgICAgICAgICBBY2MxLCBBY2MxLCBMU1IgIzEwCi0gICAgICAgIE1PViAgICAgICAgIEFjYzIsIEFjYzIsIExTUiAjMTAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMywgQWNjMywgTFNSICMxMAotCi0gICAgICAgIE1fTERSICAgICAgIENvdW50ZXIsIHBDb3VudGVyICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMSwgTFNMICM4Ci0gICAgICAgIE9SUiAgICAgICAgIEFjYzIsIEFjYzIsIEFjYzMsIExTTCAjOAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMQotICAgICAgICBPUlIgICAgICAgICBBY2MwLCBBY2MwLCBBY2MyLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBCR1QgICAgICAgICBIZWlnaHRMb29wMQotRW5kCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKLQotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWFmNzVhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi0KLSAgICBJRiBBUk0xMTM2SlMKLQotOy8vIEZ1bmN0aW9uOiAKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLTsvLwotOy8vIEltcGxlbWVudHMgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIGZvciBhIGJsb2NrIG9mIHNpemUgNHg0LiBJbnB1dCBhbmQgb3V0cHV0IHNob3VsZCAKLTsvLyBiZSBhbGlnbmVkLiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjIscjMgd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIGNvcnJlc3BvbmRpbmcgc3RlcCBzaXplCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKLQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi1BY2MwICAgICAgICAgICAgUk4gNAotQWNjMSAgICAgICAgICAgIFJOIDUKLUFjYzIgICAgICAgICAgICBSTiA2Ci1BY2MzICAgICAgICAgICAgUk4gNwotCi1WYWxBICAgICAgICAgICAgUk4gNAotVmFsQiAgICAgICAgICAgIFJOIDUKLVZhbEMgICAgICAgICAgICBSTiA2Ci1WYWxEICAgICAgICAgICAgUk4gNwotVmFsRSAgICAgICAgICAgIFJOIDgKLVZhbEYgICAgICAgICAgICBSTiA5Ci1WYWxHICAgICAgICAgICAgUk4gMTIKLVZhbEggICAgICAgICAgICBSTiAxNAotVmFsSSAgICAgICAgICAgIFJOIDEKLQotVGVtcDEgICAgICAgICAgIFJOIDMKLVRlbXAyICAgICAgICAgICBSTiAxCi1UZW1wMyAgICAgICAgICAgUk4gMTIKLVRlbXA0ICAgICAgICAgICBSTiA3Ci1UZW1wNSAgICAgICAgICAgUk4gNQotcjB4MGZlMDBmZTAgICAgIFJOIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCi1yMHgwMGZmMDBmZiAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKLUNvdW50ZXIgICAgICAgICBSTiAxMQotCi1IZWlnaHQgICAgICAgICAgUk4gMwotCi0gICAgICAgIE1fQUxMT0M0IHBEc3RTdGVwLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBTcmNTdGVwLCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlLCByNgotICAgICAgICAKLSAgICAgICAgTU9WICAgICBDb3VudGVyLCAjMgotICAgICAgICBNX1NUUiAgIGRzdFN0ZXAsIHBEc3RTdGVwICAgICAgICAKLSAgICAgICAgTV9TVFIgICBzcmNTdGVwLCBwU3JjU3RlcCAgICAgICAgCi0gICAgICAgIExEUiAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAotCi1OZXh0VHdvUm93c0xvb3AKLSAgICAgICAgTERSICAgICBWYWxELCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDEgW2QxIGMxIGIxIGExXQotICAgICAgICBMRFIgICAgIFZhbEEsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMCBbZDAgYzAgYjAgYTBdCi0gICAgICAgIExEUiAgICAgVmFsSCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDEgZzEgZjEgZTFdICAgICAgICAKLSAgICAgICAgTERSICAgICBWYWxFLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtoMCBnMCBmMCBlMF0KLSAgICAgICAgTERSQiAgICBUZW1wMiwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDEgW2wxIGsxIGoxIGkxXQotICAgICAgICBMRFJCICAgIFRlbXAxLCBbcFNyY10sICMtOCAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMCBbbDAgazAgajAgaTBdCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFZhbEIsIFZhbEEsIFZhbEQsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2IxIGExIGIwIGEwXQotICAgICAgICBQS0hUQiAgIFZhbEQsIFZhbEQsIFZhbEEsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2QxIGMxIGQwIGMwXQotICAgICAgICBVWFRBQjE2IFZhbEEsIHIweDAwZmYwMGZmLCBWYWxCICAgICAgICAgICAgICAgICA7Ly8gWzAwIGExIDAwIGEwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiBWYWxDLCByMHgwMGZmMDBmZiwgVmFsRCAgICAgICAgICAgICAgICAgOy8vIFswMCBjMSAwMCBjMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFBLSEJUICAgVmFsSSwgVGVtcDEsIFRlbXAyLCBMU0wgIzE2ICAgICAgICAgICAgIDsvLyBbMDAgaTEgMDAgaTBdICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgVmFsRiwgVmFsRSwgVmFsSCwgTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbZjEgZTEgZjAgZTBdCi0gICAgICAgIFBLSFRCICAgVmFsSCwgVmFsSCwgVmFsRSwgQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbaDEgZzEgaDAgZzBdCi0gICAgICAgIFVYVEFCMTYgVmFsRSwgcjB4MDBmZjAwZmYsIFZhbEYgICAgICAgICAgICAgICAgIDsvLyBbMDAgZTEgMDAgZTBdICsgWzAgMjU1IDAgMjU1XQotCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMAotICAgICAgICA7Ly8gQWNjMCA9IGEgLSA1KmIgKyAyMCpjICsgMjAqZCAtIDUqZSArIGYKLSAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsQywgVmFsRCwgUk9SICM4Ci0gICAgICAgIFVYVEFCMTYgVGVtcDMsIFZhbEUsIFZhbEIsIFJPUiAjOAotICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMywgVGVtcDEsIExTTCAjMiAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBBY2MwLCBWYWxBLCBWYWxGLCBST1IgIzgKLSAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAotICAgICAgICBBREQgICAgIEFjYzAsIEFjYzAsIFRlbXAxICAgICAgIAotCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMQotICAgICAgICA7Ly8gQWNjMSA9IGIgLSA1KmMgKyAyMCpkICsgMjAqZSAtIDUqZiArIGcKLSAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRSwgVmFsRCwgUk9SICM4Ci0gICAgICAgIFVYVEFCMTYgVGVtcDMsIFZhbEMsIFZhbEYsIFJPUiAjOAotICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMywgVGVtcDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2IFZhbEcsIHIweDAwZmYwMGZmLCBWYWxIICAgICAgICAgICAgICAgICA7Ly8gWzAwIGcxIDAwIGcwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAotICAgICAgICBVWFRBQjE2IEFjYzEsIFZhbEcsIFZhbEIsIFJPUiAjOAotICAgICAgICBBREQgICAgIEFjYzEsIEFjYzEsIFRlbXAxICAgICAgICAKLQotICAgICAgICBMRFIgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMCAgICAgICAgICAgICAgICA7Ly8gMHgwZmUwMGZlMCA9ICgxNiAqIE9mZnNldCkgLSAxNiB3aGVyZSBPZmZzZXQgaXMgMjU1ICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBBY2MyLCBWYWxDLCBWYWxILCBST1IgIzggICAgICAgIAotICAgICAgICBBREQgICAgIFZhbEksIHIweDAwZmYwMGZmLCBWYWxJICAgICAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICBVUVNVQjE2IEFjYzAsIEFjYzAsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiBBY2MxLCBBY2MxLCByMHgwZmUwMGZlMAotICAgICAgICBVU0FUMTYgIEFjYzAsICMxMywgQWNjMAotICAgICAgICBVU0FUMTYgIEFjYzEsICMxMywgQWNjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzIKLSAgICAgICAgOy8vIEFjYzIgPSBjIC0gNSpkICsgMjAqZSArIDIwKmYgLSA1KmcgKyBoCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEcsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IEFjYzMsIFZhbEksIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAyLCBWYWxFLCBWYWxGLCBST1IgIzgKLSAgICAgICAgQU5EICAgICBBY2MxLCByMHgwMGZmMDBmZiwgQWNjMSwgTFNSICM1Ci0gICAgICAgIEFORCAgICAgQWNjMCwgcjB4MDBmZjAwZmYsIEFjYzAsIExTUiAjNQotICAgICAgICBPUlIgICAgIEFjYzAsIEFjYzAsIEFjYzEsIExTTCAjOCAgICAgICAgCi0gICAgICAgIFJTQiAgICAgVGVtcDUsIFRlbXAxLCBUZW1wMiwgTFNMICMyICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRywgVmFsRiwgUk9SICM4Ci0gICAgICAgIEFERCAgICAgVGVtcDUsIFRlbXA1LCBUZW1wNSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MyLCBBY2MyLCBUZW1wNSAgICAgICAgCi0KLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MzCi0gICAgICAgIDsvLyBBY2MzID0gZCAtIDUqZSArIDIwKmYgKyAyMCpnIC0gNSpoICsgaQotICAgICAgICBVWFRBQjE2IFRlbXA1LCBWYWxFLCBWYWxILCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wNSwgVGVtcDUsIFRlbXAyLCBMU0wgIzIKLSAgICAgICAgTERSICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKLSAgICAgICAgQUREICAgICBUZW1wNSwgVGVtcDUsIFRlbXA1LCBMU0wgIzIgICAgICAgIAotICAgICAgICBBREQgICAgIEFjYzMsIEFjYzMsIFRlbXA1Ci0gICAgICAgIAotICAgICAgICBVUVNVQjE2IEFjYzMsIEFjYzMsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiBBY2MyLCBBY2MyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgQWNjMywgIzEzLCBBY2MzCi0gICAgICAgIFVTQVQxNiAgQWNjMiwgIzEzLCBBY2MyICAgICAgICAKLQotICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsIHBEc3RTdGVwCi0gICAgICAgIEFORCAgICAgQWNjMywgcjB4MDBmZjAwZmYsIEFjYzMsIExTUiAjNQotICAgICAgICBBTkQgICAgIEFjYzIsIHIweDAwZmYwMGZmLCBBY2MyLCBMU1IgIzUKLSAgICAgICAgT1JSICAgICBBY2MyLCBBY2MyLCBBY2MzLCBMU0wgIzgKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgQ291bnRlciwgQ291bnRlciwgIzEKLSAgICAgICAgTV9MRFIgICBzcmNTdGVwLCBwU3JjU3RlcAotICAgICAgICBQS0hCVCAgIEFjYzEsIEFjYzAsIEFjYzIsIExTTCAjMTYgICAKLSAgICAgICAgTV9TVFIgICBBY2MxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdDEKLSAgICAgICAgUEtIVEIgICBBY2MyLCBBY2MyLCBBY2MwLCBBU1IgIzE2ICAgCi0gICAgICAgIE1fU1RSICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQyCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIAotICAgICAgICBCR1QgICAgIE5leHRUd29Sb3dzTG9vcAotRW5kCi0gICAgICAgIFNVQiAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotCi0gICAgRU5ECi0gICAgCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNmNiZjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLQotCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLQotICAgICAgICA7Ly8gRnVuY3Rpb246IAotICAgICAgICA7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbXBsZW1lbnRzIHZlcnRpY2FsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAotICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLSAgICAgICAgOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBjb3JyZXNwb25kaW5nIHN0ZXAgc2l6ZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotICAgICAgICA7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICA7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUsIHI2Ci0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLVZhbEEgICAgICAgICAgICBSTiA1Ci1WYWxBMCAgICAgICAgICAgUk4gNAotVmFsQTEgICAgICAgICAgIFJOIDUKLVZhbEFGMCAgICAgICAgICBSTiA0Ci1WYWxBRjEgICAgICAgICAgUk4gNQotCi1WYWxCICAgICAgICAgICAgUk4gMTEKLQotVmFsQyAgICAgICAgICAgIFJOIDUKLVZhbEMwICAgICAgICAgICBSTiA0Ci1WYWxDMSAgICAgICAgICAgUk4gNQotVmFsQ0QwICAgICAgICAgIFJOIDEyCi1WYWxDRDEgICAgICAgICAgUk4gMTQKLVZhbENGMCAgICAgICAgICBSTiA0Ci1WYWxDRjEgICAgICAgICAgUk4gNQotCi1WYWxEICAgICAgICAgICAgUk4gMTAKLQotVmFsRSAgICAgICAgICAgIFJOIDcKLVZhbEUwICAgICAgICAgICBSTiA2Ci1WYWxFMSAgICAgICAgICAgUk4gNwotVmFsRUIwICAgICAgICAgIFJOIDEwCi1WYWxFQjEgICAgICAgICAgUk4gMTEKLVZhbEVEMCAgICAgICAgICBSTiA2Ci1WYWxFRDEgICAgICAgICAgUk4gNwotCi1WYWxGICAgICAgICAgICAgUk4gMTAKLQotVmFsRyAgICAgICAgICAgIFJOIDE0Ci1WYWxHMCAgICAgICAgICAgUk4gMTIKLVZhbEcxICAgICAgICAgICBSTiAxNAotVmFsR0IwICAgICAgICAgIFJOIDEyCi1WYWxHQjEgICAgICAgICAgUk4gMTQKLQotQWNjMCAgICAgICAgICAgIFJOIDQKLUFjYzEgICAgICAgICAgICBSTiA1Ci1BY2MyICAgICAgICAgICAgUk4gNgotQWNjMyAgICAgICAgICAgIFJOIDcKLQotVGVtcCAgICAgICAgICAgIFJOIDcKLUhlaWdodCAgICAgICAgICBSTiAzCi1TdGVwICAgICAgICAgICAgUk4gNgotCi1Db3VudGVyICAgICAgICAgUk4gOAotcjB4MDBmZjAwZmYgICAgIFJOIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gd2hlcmUgMjU1IGlzIG9mZnNldAotcjB4MGZlMDBmZTAgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQotCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjMgotICAgICAgICAKLVR3b1Jvd3NMb29wCi0gICAgICAgIE1fTERSICAgICAgIFZhbEMsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2MzIGMyIGMxIGMwXQotICAgICAgICBNX0xEUiAgICAgICBWYWxELCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsRSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZTMgZTIgZTEgZTBdICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxCLCBbcFNyY10gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtiMyBiMiBiMSBiMF0gICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDMCwgcjB4MDBmZjAwZmYsIFZhbEMgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxDMSwgcjB4MDBmZjAwZmYsIFZhbEMsIFJPUiAjOCAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxFMCwgcjB4MDBmZjAwZmYsIFZhbEUgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxFMSwgcjB4MDBmZjAwZmYsIFZhbEUsIFJPUiAjOCAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENEMCwgVmFsQzAsIFZhbEQgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDIgMCBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QxLCBWYWxDMSwgVmFsRCwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMyAwIGQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVCMCwgVmFsRTAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KLSAgICAgICAgUlNCICAgICAgICAgVmFsQ0QwLCBWYWxFQjAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA0KihPZmYrQytEKSAtIChPZmYrQitFKQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMV0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZDMgZDIgZDEgZDBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVCMSwgVmFsRTEsIFZhbEIsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjMgMCBiMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBSU0IgICAgICAgICBWYWxDRDEsIFZhbEVCMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQwLCBWYWxFMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDEsIFZhbEUxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEYsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2YzIGYyIGYxIGYwXQotICAgICAgICBNX0xEUiAgICAgICBWYWxCLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtiMyBiMiBiMSBiMF0gICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFZhbENEMCwgVmFsQ0QwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNSAqIFs0KihPZmYrQytEKSAtIChPZmYrQitFKV0KLSAgICAgICAgQUREICAgICAgICAgVmFsQ0QxLCBWYWxDRDEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YxLCBWYWxDMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENGMCwgVmFsQzAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0KLSAgICAgICAgUlNCICAgICAgICAgVmFsRUQxLCBWYWxDRjEsIFZhbEVEMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIFZhbEEsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBMRFIgICAgICAgICBWYWxBLCBbVmFsQV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFthMyBhMiBhMSBhMF0KLSAgICAgICAgUlNCICAgICAgICAgVmFsRUQwLCBWYWxDRjAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA0KihPZmYrRStEKSAtIChPZmYrQytGKSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFZhbEVEMSwgVmFsRUQxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVmFsRUQwLCBWYWxFRDAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitFK0QpIC0gKE9mZitDK0YpXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBMCwgcjB4MDBmZjAwZmYsIFZhbEEgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBMSwgcjB4MDBmZjAwZmYsIFZhbEEsIFJPUiAjOCAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjAsIFZhbEEwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMSwgVmFsQTEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKLSAgICAgICAgQUREICAgICAgICAgQWNjMSwgVmFsQ0QxLCBWYWxBRjEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsRywgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZzMgZzIgZzEgZzBdCi0gICAgICAgIEFERCAgICAgICAgIEFjYzAsIFZhbENEMCwgVmFsQUYwICAgICAgICAgICAgICAgICAgICA7Ly8gQWNjMCA9IDE2Kk9mZiArIChBK0YpICsgMjAqKEMrRCkgLSA1KihCK0UpICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgQWNjMSwgQWNjMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIDsvLyBBY2MxIC09ICgxNipPZmYgLSAxNikKLSAgICAgICAgVVFTVUIxNiAgICAgQWNjMCwgQWNjMCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxHMCwgcjB4MDBmZjAwZmYsIFZhbEcgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxHMSwgcjB4MDBmZjAwZmYsIFZhbEcsIFJPUiAjOCAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjAsIFZhbEcwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMSwgVmFsRzEsIFZhbEIsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjMgMCBiMV0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgQWNjMiwgVmFsRUQwLCBWYWxHQjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MyID0gMTYqT2ZmICsgKEIrRykgKyAyMCooRCtFKSAtIDUqKEMrRikKLSAgICAgICAgQUREICAgICAgICAgQWNjMywgVmFsRUQxLCBWYWxHQjEgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBBY2MzLCBBY2MzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgOy8vIEFjYzMgLT0gKDE2Kk9mZiAtIDE2KQotICAgICAgICBVUVNVQjE2ICAgICBBY2MyLCBBY2MyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIEFjYzEsICMxMywgQWNjMSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F0dXJhdGUgdG8gOCs1ID0gMTMgYml0cwotICAgICAgICBVU0FUMTYgICAgICBBY2MwLCAjMTMsIEFjYzAKLSAgICAgICAgVVNBVDE2ICAgICAgQWNjMywgIzEzLCBBY2MzICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgQWNjMiwgIzEzLCBBY2MyCi0gICAgICAgIEFORCAgICAgICAgIEFjYzEsIHIweDAwZmYwMGZmLCBBY2MxLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYTMgMCBhMV0KLSAgICAgICAgQU5EICAgICAgICAgQWNjMCwgcjB4MDBmZjAwZmYsIEFjYzAsIExTUiAjNSAgICAgICAgIDsvLyBbMCBhMiAwIGEwXQotICAgICAgICBPUlIgICAgICAgICBBY2MwLCBBY2MwLCBBY2MxLCBMU0wgIzggICAgICAgICAgICAgICAgOy8vIFthMyBhMiBhMSBhMF0KLSAgICAgICAgQU5EICAgICAgICAgQWNjMywgcjB4MDBmZjAwZmYsIEFjYzMsIExTUiAjNSAgICAgICAgIDsvLyBbMCBiMyAwIGIxXQotICAgICAgICBBTkQgICAgICAgICBBY2MyLCByMHgwMGZmMDBmZiwgQWNjMiwgTFNSICM1ICAgICAgICAgOy8vIFswIGIyIDAgYjBdCi0gICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyCi0gICAgICAgIE9SUiAgICAgICAgIEFjYzIsIEFjYzIsIEFjYzMsIExTTCAjOCAgICAgICAgICAgICAgICA7Ly8gW2IzIGIyIGIxIGIwXSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMQotICAgICAgICBCR1QgICAgICAgICBUd29Sb3dzTG9vcAotRW5kCi0gICAgICAgIFNVQiAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZjY3Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotICAgIElGIEFSTTExMzZKUwotCi07Ly8gaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmMgICAgICAgICAgICAgICAgIFJOIDAKLWlTcmNTdGVwICAgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLWlEc3RTdGVwICAgICAgICAgICAgIFJOIDMKLWlXaWR0aCAgICAgICAgICAgICAgIFJOIDQKLWlIZWlnaHQgICAgICAgICAgICAgIFJOIDUKLWR4ICAgICAgICAgICAgICAgICAgIFJOIDYKLWR5ICAgICAgICAgICAgICAgICAgIFJOIDcKLQotCi07Ly8gbG9jYWwgdmFyaWFibGUgcmVnaXN0ZXJzCi10ZW1wICAgICAgICAgICAgICAgICBSTiAxMQotcjB4MjAgICAgICAgICAgICAgICAgUk4gMTIKLXRtcDB4MjAgICAgICAgICAgICAgIFJOIDE0Ci1yZXR1cm4gICAgICAgICAgICAgICBSTiAwCi1keFBsdXNkeSAgICAgICAgICAgICBSTiAxMAotRWlnaHRNaW51c2R4ICAgICAgICAgUk4gOCAKLUVpZ2h0TWludXNkeSAgICAgICAgIFJOIDkKLWR4RWlnaHRNaW51c2R4ICAgICAgIFJOIDgKLUJBQ29lZmYgICAgICAgICAgICAgIFJOIDYKLURDQ29lZmYgICAgICAgICAgICAgIFJOIDcKLSAgICAgICAgICAgICAgICAgICAgIAotaURzdFN0ZXB4Mk1pbnVzV2lkdGggUk4gOAotaVNyY1N0ZXB4Mk1pbnVzV2lkdGggUk4gOQotaVNyY1N0ZXAxICAgICAgICAgICAgUk4gMTAKLQotcFNyYzEgICAgICAgICAgICAgICAgUk4gMQotcFNyYzIgICAgICAgICAgICAgICAgUk4gOAotcERzdDEgICAgICAgICAgICAgICAgUk4gOAotcERzdDIgICAgICAgICAgICAgICAgUk4gMTIKLSAgICAgICAgICAgICAgICAgICAgIAotcGl4MDAgICAgICAgICAgICAgICAgUk4gOAotcGl4MDEgICAgICAgICAgICAgICAgUk4gOQotcGl4MTAgICAgICAgICAgICAgICAgUk4gMTAKLXBpeDExICAgICAgICAgICAgICAgIFJOIDExCi0KLU91dDAxMDAgICAgICAgICAgICAgIFJOIDggIAotT3V0MTExMCAgICAgICAgICAgICAgUk4gMTAgCi0KLXgwMCAgICAgICAgICAgICAgICAgIFJOIDgKLXgwMSAgICAgICAgICAgICAgICAgIFJOIDEwCi14MDIgICAgICAgICAgICAgICAgICBSTiAxMgoteDEwICAgICAgICAgICAgICAgICAgUk4gOQoteDExICAgICAgICAgICAgICAgICAgUk4gMTEKLXgxMiAgICAgICAgICAgICAgICAgIFJOIDE0Ci14MjAgICAgICAgICAgICAgICAgICBSTiAxMAoteDIxICAgICAgICAgICAgICAgICAgUk4gMTIKLXgyMiAgICAgICAgICAgICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAgICAgICAgICAKLXgwMXgwMCAgICAgICAgICAgICAgIFJOIDggIAoteDAyeDAxICAgICAgICAgICAgICAgUk4gMTAgCi14MTF4MTAgICAgICAgICAgICAgICBSTiA5ICAKLXgxMngxMSAgICAgICAgICAgICAgIFJOIDExIAoteDIxeDIwICAgICAgICAgICAgICAgUk4gMTAgCi14MjJ4MjEgICAgICAgICAgICAgICBSTiAxMiAKLSAgICAgICAgICAgICAgICAgICAgIAotT3V0Um93MDAgICAgICAgICAgICAgUk4gMTIKLU91dFJvdzAxICAgICAgICAgICAgIFJOIDE0Ci1PdXRSb3cxMCAgICAgICAgICAgICBSTiAxMAotT3V0Um93MTEgICAgICAgICAgICAgUk4gMTIKLSAgICAgICAgICAgICAgICAgICAgIAotT3V0Um93MDEwMCAgICAgICAgICAgUk4gMTIKLU91dFJvdzExMTAgICAgICAgICAgIFJOIDEyCi0gICAgICAgICAgICAgICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIFdpZHRoLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICBIZWlnaHQsICAgICA0Ci0gICAgICAgIE1fQVJHICAgRHgsICAgICAgICAgNAotICAgICAgICBNX0FSRyAgIER5LCAgICAgICAgIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBNX0xEUiAgIGlXaWR0aCwgIFdpZHRoICAKLSAgICAgICAgTV9MRFIgICBpSGVpZ2h0LCBIZWlnaHQgIAotICAgICAgICBNX0xEUiAgIGR4LCAgICAgIER4IAotICAgICAgICBNX0xEUiAgIGR5LCAgICAgIER5Ci0gICAgICAgIAotICAgICAgICA7Ly8gRWlnaHRNaW51c2R4ID0gOCAtIGR4Ci0gICAgICAgIDsvLyBFaWdodE1pbnVzZHkgPSA4IC0gZHkKLSAgICAgICAgCi0gICAgICAgIDsvLyBBQ29lZmYgPSBFaWdodE1pbnVzZHggKiBFaWdodE1pbnVzZHkKLSAgICAgICAgOy8vIEJDb2VmZiA9IGR4ICogRWlnaHRNaW51c2R5Ci0gICAgICAgIDsvLyBDQ29lZmYgPSBFaWdodE1pbnVzZHggKiBkeQotICAgICAgICA7Ly8gRENvZWZmID0gZHggKiBkeQotICAgICAgICAKLSAgICAgICAgQUREICAgICBwU3JjMSwgcFNyYywgaVNyY1N0ZXAKLSAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCi0gICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R4LCBkeCwgIzggCi0gICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R5LCBkeSwgIzgKLSAgICAgICAgQ01OICAgICBkeCxkeQotICAgICAgICBBREQgICAgIGR4RWlnaHRNaW51c2R4LCBFaWdodE1pbnVzZHgsIGR4LCBMU0wgIzE2Ci0gICAgICAgIE9SUiAgICAgaVdpZHRoLCBpV2lkdGgsIHRlbXAsIExTTCAjMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBQYWNrZWQgQ29lZmZzLgotICAgICAgICAKLSAgICAgICAgTVVMICAgICBCQUNvZWZmLCBkeEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R5Ci0gICAgICAgIE1VTCAgICAgRENDb2VmZiwgZHhFaWdodE1pbnVzZHgsIGR5ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2tpbmcgZWl0aGVyIG9mIGR4IGFuZCBkeSBiZWluZyBub24temVybwotICAgICAgICAKLSAgICAgICAgQkVRICAgICBNVklzWmVybwotICAgICAgICAKLTsvLyBQaXhlbCBsYXlvdXQ6Ci07Ly8KLTsvLyAgIHgwMCB4MDEgeDAyCi07Ly8gICB4MTAgeDExIHgxMgotOy8vICAgeDIwIHgyMSB4MjIKLQotOy8vIElmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApCi0gICAgICAgIAotT3V0ZXJMb29wTVZJc05vdFplcm8KLQotSW5uZXJMb29wTVZJc05vdFplcm8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDAwLCBbcFNyYywgICMrMF0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MTAsIFtwU3JjMSwgIyswXSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgwMSwgW3BTcmMsICAjKzFdICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MTEsIFtwU3JjMSwgIysxXSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDAyLCBbcFNyYywgICMrMl0hICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDEyLCBbcFNyYzEsICMrMl0hICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9SUiAgICAgeDAxeDAwLCB4MDAsIHgwMSwgTFNMICMxNiAgICAgICAgCi0gICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgwMngwMSwgeDAxLCB4MDIsIExTTCAjMTYgICAgICAgIAotICAgICAgICAgICAgICAgIE1PViAgICAgcjB4MjAsICAjMzIKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgxMXgxMCwgeDEwLCB4MTEsIExTTCAjMTYgICAgCi0gICAgICAgICAgICAgICAgT1JSICAgICB4MTJ4MTEsIHgxMSwgeDEyLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIHgwMXgwMCwgeDAxeDAwLCBCQUNvZWZmLCByMHgyMAotICAgICAgICAgICAgICAgIFNNTEFEICAgeDAyeDAxLCB4MDJ4MDEsIEJBQ29lZmYsIHIweDIwICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDsvLyBpV2lkdGggcGFja2VkIHdpdGggTVNCICh0b3AgMTYgYml0cykgCi0gICAgICAgICAgICAgICAgOy8vIGFzIGlubmVyIGxvb3AgY291bnRlciB2YWx1ZSBpLmUgCi0gICAgICAgICAgICAgICAgOy8vIChpV2lkdGggLTEpIGFuZCBMU0IgKGxvd2VyIDE2IGJpdHMpCi0gICAgICAgICAgICAgICAgOy8vIGFzIG9yaWdpbmFsIHdpZHRoCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE3Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cwMCwgeDExeDEwLCBEQ0NvZWZmLCB4MDF4MDAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzAxLCB4MTJ4MTEsIERDQ29lZmYsIHgwMngwMSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFJTQiAgICAgcFNyYzIsIHBTcmMsIHBTcmMxLCBMU0wgIzEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzAwLCBPdXRSb3cwMCwgTFNSICM2Ci0gICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cwMSwgT3V0Um93MDEsIExTUiAjNgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDIwLFtwU3JjMiwgIy0yXQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0Um93MDEwMCwgT3V0Um93MDAsIE91dFJvdzAxLCBMU0wgIzgKLSAgICAgICAgICAgICAgICBTVFJIICAgIE91dFJvdzAxMDAsIFtwRHN0XSwgIzIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgyMSxbcFNyYzIsICMtMV0KLSAgICAgICAgICAgICAgICBMRFJCICAgIHgyMixbcFNyYzIsICMrMF0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEc3QxLCBwRHN0LCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9SUiAgICAgeDIxeDIwLCB4MjAsIHgyMSwgTFNMICMxNgotICAgICAgICAgICAgICAgIE9SUiAgICAgeDIyeDIxLCB4MjEsIHgyMiwgTFNMICMxNiAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTU9WICAgICB0bXAweDIwLCAjMzIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA7Ly8gUmV1c2luZyB0aGUgcGFja2VkIGRhdGEgeDExeDEwIGFuZCB4MTJ4MTEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIHgxMXgxMCwgIHgxMXgxMCwgIEJBQ29lZmYsIHRtcDB4MjAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIHgxMngxMSwgIHgxMngxMSwgIEJBQ29lZmYsIHRtcDB4MjAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzEwLCB4MjF4MjAsIERDQ29lZmYsIHgxMXgxMCAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MTEsIHgyMngyMSwgRENDb2VmZiwgeDEyeDExCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cxMCwgT3V0Um93MTAsIExTUiAjNgotICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MTEsIE91dFJvdzExLCBMU1IgIzYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgT1JSICAgICBPdXRSb3cxMTEwLCBPdXRSb3cxMCwgT3V0Um93MTEsIExTTCAjOAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNUUkggICAgT3V0Um93MTExMCwgW3BEc3QxLCAjLTJdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQkdUICAgICBJbm5lckxvb3BNVklzTm90WmVybwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICBBREQgICAgIGlXaWR0aCwgaVdpZHRoLCAjMTw8MTYKLSAgICAgICAgICAgICAgICBSU0IgICAgIGlEc3RTdGVweDJNaW51c1dpZHRoLCBpV2lkdGgsIGlEc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgICAgICAgICBTVUIgICAgIGlTcmNTdGVwMSwgcFNyYzEsIHBTcmMKLSAgICAgICAgICAgICAgICBTVUIgICAgIHRlbXAsIGlXaWR0aCwgIzEKLSAgICAgICAgICAgICAgICBSU0IgICAgIGlTcmNTdGVweDJNaW51c1dpZHRoLCBpV2lkdGgsIGlTcmNTdGVwMSwgTFNMICMxCi0gICAgICAgICAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCBpRHN0U3RlcHgyTWludXNXaWR0aAotICAgICAgICAgICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMxLCBpU3JjU3RlcHgyTWludXNXaWR0aAotICAgICAgICAgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2Ci0gICAgICAgICAgICAgICAgQkdUICAgICBPdXRlckxvb3BNVklzTm90WmVybwotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQKLQotOy8vIElmIGZyYWN0aW9ubCBtdiBpcyAoMCwgMCkKLQotTVZJc1plcm8KLSAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotT3V0ZXJMb29wTVZJc1plcm8KLQotSW5uZXJMb29wTVZJc1plcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICBwaXgwMCwgW3BTcmNdLCAgIysxCi0gICAgICAgICAgICAgICAgTERSQiAgICBwaXgwMSwgW3BTcmNdLCAgIysxCi0gICAgICAgICAgICAgICAgTERSQiAgICBwaXgxMCwgW3BTcmMxXSwgIysxCi0gICAgICAgICAgICAgICAgTERSQiAgICBwaXgxMSwgW3BTcmMxXSwgIysxCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRHN0MiwgIHBEc3QsIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE3ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0MDEwMCwgcGl4MDAsIHBpeDAxLCBMU0wgIzggCi0gICAgICAgICAgICAgICAgT1JSICAgICBPdXQxMTEwLCBwaXgxMCwgcGl4MTEsIExTTCAjOAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNUUkggICAgT3V0MDEwMCwgW3BEc3RdLCAgIzIKLSAgICAgICAgICAgICAgICBTVFJIICAgIE91dDExMTAsIFtwRHN0Ml0sICMyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQkdUICAgICBJbm5lckxvb3BNVklzWmVybwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICBBREQgICAgIGlXaWR0aCwgaVdpZHRoLCAjMTw8MTYKLSAgICAgICAgICAgICAgICBSU0IgICAgIGlEc3RTdGVweDJNaW51c1dpZHRoLCBpV2lkdGgsIGlEc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgICAgICAgICBTVUIgICAgIGlTcmNTdGVwMSwgcFNyYzEsIHBTcmMKLSAgICAgICAgICAgICAgICBTVUIgICAgIHRlbXAsIGlXaWR0aCwgIzEKLSAgICAgICAgICAgICAgICBSU0IgICAgIGlTcmNTdGVweDJNaW51c1dpZHRoLCBpV2lkdGgsIGlTcmNTdGVwMSwgTFNMICMxCi0gICAgICAgICAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCBpRHN0U3RlcHgyTWludXNXaWR0aAotICAgICAgICAgICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMxLCBpU3JjU3RlcHgyTWludXNXaWR0aAotICAgICAgICAgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2Ci0gICAgICAgICAgICAgICAgQkdUICAgICBPdXRlckxvb3BNVklzWmVybwotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VORAotCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLQotICAgICAgICAKLSAgICAgICAgRU5ECi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhjNzE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBUaGlzIGZpbGUgY29udGFpbnMgcXVhbnRpemF0aW9uIHRhYmxlcwotOy8vIAotOy8vIAotCi0gICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAKLSAgICAgICAgIAotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlICAKLSAgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdIGVudGlyZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpIHZhbHVlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZQotICAgICAgICAgRENCIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKLSAgICAgICAgIERDQiAxNywgMTcsIDE3LCAxNywgMTcsIDE3Ci0gICAgICAgICBEQ0IgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOAotICAgICAgICAgRENCIDE5LCAxOSwgMTksIDE5LCAxOSwgMTkKLSAgICAgICAgIERDQiAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwCi0gICAgICAgICBEQ0IgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMQotICAgICAgICAgRENCIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIKLSAgICAgICAgIERDQiAyMywgMjMsIDIzLCAyMywgMjMsIDIzCi0gICAgICAgICBEQ0IgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zICgxIDw8IFFiaXRzUGx1c09uZSkgLyAzIFZhbHVlcyAoSW50cmEgY2FzZSkgLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUsIDIKLSAgICAgICAgIERDRCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1Ci0gICAgICAgICBEQ0QgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MAotICAgICAgICAgRENEIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEKLSAgICAgICAgIERDRCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyCi0gICAgICAgICBEQ0QgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNQotICAgICAgICAgRENEIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAKLSAgICAgICAgIERDRCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxCi0gICAgICAgICBEQ0QgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMgotICAgICAgICAgRENEIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUgICAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgRU5ECi0gICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTM3MmUxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotOy8vIAotOy8vIAotCi0gICAgICAgIAotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQVJNMTEzNkpTIAotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wRHN0ICAgICAgICAgICAgICAgIFJOICAwCi1wU3JjICAgICAgICAgICAgICAgIFJOICAxCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLQotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotCi07Ly8gUGFja2VkIElucHV0IHBpeGVscwotaW4wMCAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzBdICYgU3JjWzFdIAotaW4wMiAgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzJdICYgU3JjWzNdCi1pbjEwICAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNF0gJiBTcmNbNV0KLWluMTIgICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s2XSAmIFNyY1s3XQotaW4yMCAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzhdICYgU3JjWzldCi1pbjIyICAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTBdICYgU3JjWzExXQotaW4zMCAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEyXSAmIFNyY1sxM10KLWluMzIgICAgICAgICAgICAgICAgUk4gIDkgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxNF0gJiBTcmNbMTVdCi0KLTsvLyBUcmFuc3Bvc2UgZm9yIFJvdyBvcGVyYXRpb25zIChSb3dzIHRvIGNvbHMpCi10clJvdzAwICAgICAgICAgICAgIFJOICAyCi10clJvdzEwICAgICAgICAgICAgIFJOICAxMAotdHJSb3cwMiAgICAgICAgICAgICBSTiAgMwotdHJSb3cxMiAgICAgICAgICAgICBSTiAgNQotdHJSb3cyMCAgICAgICAgICAgICBSTiAgMTEKLXRyUm93MzAgICAgICAgICAgICAgUk4gIDEyCi10clJvdzMyICAgICAgICAgICAgIFJOICAxNAotdHJSb3cyMiAgICAgICAgICAgICBSTiAgNwotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucwotZTAgICAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLWUxICAgICAgICAgICAgICAgICAgUk4gIDYKLWUyICAgICAgICAgICAgICAgICAgUk4gIDgKLWUzICAgICAgICAgICAgICAgICAgUk4gIDkKLWNvbnN0WmVybyAgICAgICAgICAgUk4gIDEKLQotOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKLXJvd09wMDAgICAgICAgICAgICAgUk4gIDIKLXJvd09wMTAgICAgICAgICAgICAgUk4gIDEwCi1yb3dPcDIwICAgICAgICAgICAgIFJOICAxMQotcm93T3AzMCAgICAgICAgICAgICBSTiAgMTIKLXJvd09wMDIgICAgICAgICAgICAgUk4gIDMKLXJvd09wMTIgICAgICAgICAgICAgUk4gIDUKLXJvd09wMjIgICAgICAgICAgICAgUk4gIDcKLXJvd09wMzIgICAgICAgICAgICAgUk4gIDE0Ci0KLTsvLyBUcmFuc3Bvc2UgZm9yIGNvbHVsbW4gb3BlcmF0aW9ucwotdHJDb2wwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLXRyQ29sMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi10ckNvbDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotdHJDb2wxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLXRyQ29sMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi10ckNvbDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotdHJDb2wzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLXRyQ29sMzIgICAgICAgICAgICAgUk4gIDkgIAotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucwotZzAgICAgICAgICAgICAgICAgICBSTiAgMTAKLWcxICAgICAgICAgICAgICAgICAgUk4gIDExCi1nMiAgICAgICAgICAgICAgICAgIFJOICAxMgotZzMgICAgICAgICAgICAgICAgICBSTiAgMTQgICAKLQotOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCi1jb2xPcDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAotY29sT3AwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKLWNvbE9wMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCi1jb2xPcDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAotY29sT3AyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKLWNvbE9wMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCi1jb2xPcDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAotY29sT3AzMiAgICAgICAgICAgICBSTiAgOSAgCi0KLQotdGVtcDEgICAgICAgICAgICAgICBSTiAgMTAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcG9yYXJ5IHNjcmF0Y2ggdmFyYWlibGVzCi1jb25zdDEgICAgICAgICAgICAgIFJOICAxMSAgICAgIAotY29uc3QyICAgICAgICAgICAgICBSTiAgMTIKLW1hc2sgICAgICAgICAgICAgICAgUk4gIDE0Ci0KLTsvLyBPdXRwdXQgcGl4ZWxzCi1vdXQwMCAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAotb3V0MDIgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKLW91dDEwICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCi1vdXQxMiAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAotb3V0MjAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKLW91dDIyICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCi1vdXQzMCAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAotb3V0MzIgICAgICAgICAgICAgICBSTiAgOSAgCi0gICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LHIxMQotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCi0gICAgICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA4IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgIDsvLyBTdG9yZSB0aGUgNHg0IGJsb2NrIGF0IG9uZSBnbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIAotICAgICAgICBMRE1JQSAgIHBTcmMse2luMDAsaW4wMixpbjEwLGluMTIsaW4yMCxpbjIyLGluMzAsaW4zMn0KLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICBjb25zdFplcm8sIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gcmlnaHQgc2hpZnQgYnkgMSAKLSAgICAgICAgO0xEUiAgICAgICBjb25zdFplcm8sPTB4MDAwMDAwMDAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBtYXRyaXggaW5vcmRlciB0byBwZXJmb3JtIHJvdyBvcHMgYXMgY29sb3VtbiBvcHMKLSAgICAgICAgOy8vIElucHV0OiAgIGluW11bXSA9IG9yaWdpbmFsIG1hdHJpeAotICAgICAgICA7Ly8gT3V0cHV0OiAgdHJSb3dbXVtdPSB0cmFuc3Bvc2VkIG1hdHJpeAotICAgICAgICA7Ly8gU3RlcDE6IE9idGFpbiB0aGUgTEwgcGFydCBvZiB0aGUgdHJhbnNwb3NlZCBtYXRyaXgKLSAgICAgICAgOy8vIFN0ZXAyOiBPYnRhaW4gdGhlIEhMIHBhcnQKLSAgICAgICAgOy8vIHN0ZXAzOiBPYnRhaW4gdGhlIExIIHBhcnQKLSAgICAgICAgOy8vIFN0ZXA0OiBPYnRhaW4gdGhlIEhIIHBhcnQKLSAgICAgICAgOy8vCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgZDAgZDEgLSAtCi0gICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyUm93MTAsaW4xMCxpbjAwLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzUgNF0gPSBbZjU6ZjFdICAgIAotICAgICAgICBQS0hCVCAgIHRyUm93MDAsaW4wMCxpbjEwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQotICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFBLSFRCICAgdHJSb3czMCxpbjEyLGluMDIsQVNSICMxNiAgICAgICAgICAgICAgOy8vIFsxMyAxMl0gPSBbNyAzXQotICAgICAgICAgUEtIQlQgICB0clJvdzIwLGluMDIsaW4xMixMU0wgIzE2ICAgICAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKLSAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAotICAgICAgICA7Ly8gICAtIC0gLSAgLQotICAgICAgICA7Ly8gICAtIC0gLSAgLQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB0clJvdzAyLGluMjAsaW4zMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAotICAgICAgICBQS0hUQiAgIHRyUm93MTIsaW4zMCxpbjIwLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzcgNl0gPSBbZjEzOmY5XSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly8gSEggMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICBkMTAgZDExCi0gICAgICAgIDsvLyAgICAtIC0gIGQxNCBkMTUKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJSb3czMixpbjMyLGluMjIsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbMTUgMTRdID0gWzE1IDExXQotICAgICAgICBQS0hCVCAgIHRyUm93MjIsaW4yMixpbjMyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzExIDEwXSA9IFsxNCAxMF0KLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIGZpcnN0IHR3byBjb2x1bW5zKHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgICAgZTAsIHRyUm93MDAsdHJSb3cyMCAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKLSAgICAgICAgU1NVQjE2ICAgIGUxLCB0clJvdzAwLHRyUm93MjAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgIAotICAgICAgICBTSEFERDE2ICAgZTIsIHRyUm93MTAsY29uc3RaZXJvICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgU0hBREQxNiAgIGUzLCB0clJvdzMwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vICBhdm9pZCBwaXBlbGluZSBzdGFsbHMgZm9yIGUyIGFuZCBlMwotICAgICAgICBTU1VCMTYgICAgZTIsIGUyLCB0clJvdzMwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzICAKLSAgICAgICAgU0FERDE2ICAgIGUzLCBlMywgdHJSb3cxMCAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAgCi0gICAgICAgIFNBREQxNiAgICByb3dPcDAwLCBlMCwgZTMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzICAKLSAgICAgICAgU0FERDE2ICAgIHJvd09wMTAsIGUxLCBlMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIgIAotICAgICAgICBTU1VCMTYgICAgcm93T3AyMCwgZTEsIGUyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMiAgCi0gICAgICAgIFNTVUIxNiAgICByb3dPcDMwLCBlMCwgZTMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCi0gICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMobmV4dCB0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgICAgZTAsIHRyUm93MDIsdHJSb3cyMgotICAgICAgICBTU1VCMTYgICAgZTEsIHRyUm93MDIsdHJSb3cyMgotICAgICAgICBTSEFERDE2ICAgZTIsIHRyUm93MTIsY29uc3RaZXJvICAgICAgICAgICAgICAgICA7Ly8oZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBTSEFERDE2ICAgZTMsIHRyUm93MzIsY29uc3RaZXJvCi0gICAgICAgIFNTVUIxNiAgICBlMiwgZTIsIHRyUm93MzIKLSAgICAgICAgU0FERDE2ICAgIGUzLCBlMywgdHJSb3cxMgotICAgICAgICBTQUREMTYgICAgcm93T3AwMiwgZTAsIGUzCi0gICAgICAgIFNBREQxNiAgICByb3dPcDEyLCBlMSwgZTIKLSAgICAgICAgU1NVQjE2ICAgIHJvd09wMjIsIGUxLCBlMgotICAgICAgICBTU1VCMTYgICAgcm93T3AzMiwgZTAsIGUzCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKLSAgICAgICAgOy8vIElucHV0OiAgcm93T3BbXVtdCi0gICAgICAgIDsvLyBPdXRwdXQ6IHRyQ29sW11bXSAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICBkMCBkMSAtIC0KLSAgICAgICAgOy8vICAgZDQgZDUgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJDb2wxMCxyb3dPcDEwLHJvd09wMDAsQVNSICMxNiAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXQotICAgICAgICBQS0hCVCAgIHRyQ29sMDAscm93T3AwMCxyb3dPcDEwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAotICAgICAgICAKLSAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCi0gICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgUEtIVEIgICB0ckNvbDMwLHJvd09wMTIscm93T3AwMixBU1IgIzE2ICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KLSAgICAgICAgIFBLSEJUICAgdHJDb2wyMCxyb3dPcDAyLHJvd09wMTIsTFNMICMxNiAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKLSAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAotICAgICAgICA7Ly8gICAtIC0gLSAgLQotICAgICAgICA7Ly8gICAtIC0gLSAgLQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB0ckNvbDAyLHJvd09wMjAscm93T3AzMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCi0gICAgICAgIFBLSFRCICAgdHJDb2wxMixyb3dPcDMwLHJvd09wMjAsQVNSICMxNiAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQotICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1Ci0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyQ29sMzIscm93T3AzMixyb3dPcDIyLEFTUiAjMTYgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KLSAgICAgICAgUEtIQlQgICB0ckNvbDIyLHJvd09wMjIscm93T3AzMixMU0wgIzE2ICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCi0gICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucwotICAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgICAgZzAsIHRyQ29sMDAsdHJDb2wyMAotICAgICAgICBTU1VCMTYgICAgZzEsIHRyQ29sMDAsdHJDb2wyMAotICAgICAgICBTSEFERDE2ICAgZzIsIHRyQ29sMTAsY29uc3RaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFNIQUREMTYgICBnMywgdHJDb2wzMCxjb25zdFplcm8KLSAgICAgICAgU1NVQjE2ICAgIGcyLCBnMiwgdHJDb2wzMAotICAgICAgICBTQUREMTYgICAgZzMsIGczLCB0ckNvbDEwCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDAwLCBnMCwgZzMKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMTAsIGcxLCBnMgotICAgICAgICBTU1VCMTYgICAgY29sT3AyMCwgZzEsIGcyCi0gICAgICAgIFNTVUIxNiAgICBjb2xPcDMwLCBnMCwgZzMKLSAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucwotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgICAgZzAsIHRyQ29sMDIsdHJDb2wyMgotICAgICAgICBTU1VCMTYgICAgZzEsIHRyQ29sMDIsdHJDb2wyMgotICAgICAgICBTSEFERDE2ICAgZzIsIHRyQ29sMTIsY29uc3RaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFNIQUREMTYgICBnMywgdHJDb2wzMixjb25zdFplcm8KLSAgICAgICAgU1NVQjE2ICAgIGcyLCBnMiwgdHJDb2wzMgotICAgICAgICBTQUREMTYgICAgZzMsIGczLCB0ckNvbDEyCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDAyLCBnMCwgZzMKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMTIsIGcxLCBnMgotICAgICAgICBTU1VCMTYgICAgY29sT3AyMiwgZzEsIGcyCi0gICAgICAgIFNTVUIxNiAgICBjb2xPcDMyLCBnMCwgZzMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBmaW5hbCB2YWx1ZSAoY29sT3BbaV1bal0gKyAzMik+PjYKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgOy8vIGNvbnN0MTogU2VydmVzIGR1YWwgcHVycG9zZSAKLSAgICAgICAgOy8vICgxKSBBZGQgIzMyIHRvIGJvdGggdGhlIGxvd2VyIGFuZCBoaWdoZXIgMTZiaXRzIG9mIHRoZSBTSU1EIHJlc3VsdCAKLSAgICAgICAgOy8vICgyKSBDb252ZXJ0IHRoZSBsb3dlciAxNiBiaXQgdmFsdWUgdG8gYW4gdW5zaWduZWQgbnVtYmVyIChBZGQgMzI3NjgpCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIGNvbnN0MSwgPTB4MDAyMDgwMjAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIG1hc2ssID0weGZmZmYwM2ZmICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byBtYXNrIHRoZSBkb3duIHNoaWZ0ZWQgNiBiaXRzICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBjb25zdDIoIzUxMik6IHVzZWQgdG8gY29udmVydCB0aGUgbG93ZXIgMTZiaXQgbnVtYmVyIGJhY2sgdG8gc2lnbmVkIHZhbHVlIAotICAgICAgCi0gICAgICAgIE1PViAgICAgY29uc3QyLCMweDIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb25zdDIgPSAyXjkKLSAgICAgICAgCi0gICAgICAgIDsvLyBGaXJzdCBSb3cgCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgY29sT3AwMCwgY29sT3AwMCwgY29uc3QxCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDAyLCBjb2xPcDAyLCBjb25zdDEKLSAgICAgICAgQU5EICAgICBjb2xPcDAwLCBtYXNrLCBjb2xPcDAwLCBBU1IgIzYKLSAgICAgICAgQU5EICAgICBjb2xPcDAyLCBtYXNrLCBjb2xPcDAyLCBBU1IgIzYKLSAgICAgICAgU1NVQjE2ICBvdXQwMCxjb2xPcDAwLGNvbnN0MgotICAgICAgICBTU1VCMTYgIG91dDAyLGNvbE9wMDIsY29uc3QyICAgIAotICAgICAgICAKLQotICAgICAgICA7Ly8gU2Vjb25kIFJvdwotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMTAsIGNvbE9wMTAsIGNvbnN0MQotICAgICAgICBTQUREMTYgICAgY29sT3AxMiwgY29sT3AxMiwgY29uc3QxCi0gICAgICAgIEFORCAgICAgY29sT3AxMCwgbWFzaywgY29sT3AxMCwgQVNSICM2Ci0gICAgICAgIEFORCAgICAgY29sT3AxMiwgbWFzaywgY29sT3AxMiwgQVNSICM2Ci0gICAgICAgIFNTVUIxNiAgb3V0MTAsY29sT3AxMCxjb25zdDIKLSAgICAgICAgU1NVQjE2ICBvdXQxMixjb2xPcDEyLGNvbnN0MiAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gVGhpcmQgUm93Ci0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgY29sT3AyMCwgY29sT3AyMCwgY29uc3QxCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDIyLCBjb2xPcDIyLCBjb25zdDEKLSAgICAgICAgQU5EICAgICBjb2xPcDIwLCBtYXNrLCBjb2xPcDIwLCBBU1IgIzYKLSAgICAgICAgQU5EICAgICBjb2xPcDIyLCBtYXNrLCBjb2xPcDIyLCBBU1IgIzYKLSAgICAgICAgU1NVQjE2ICBvdXQyMCxjb2xPcDIwLGNvbnN0MgotICAgICAgICBTU1VCMTYgIG91dDIyLGNvbE9wMjIsY29uc3QyCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEZvdXJ0aCBSb3cgICAKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDMwLCBjb2xPcDMwLCBjb25zdDEKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMzIsIGNvbE9wMzIsIGNvbnN0MQotICAgICAgICBBTkQgICAgIGNvbE9wMzAsIG1hc2ssIGNvbE9wMzAsIEFTUiAjNgotICAgICAgICBBTkQgICAgIGNvbE9wMzIsIG1hc2ssIGNvbE9wMzIsIEFTUiAjNgotICAgICAgICBTU1VCMTYgIG91dDMwLGNvbE9wMzAsY29uc3QyCi0gICAgICAgIFNTVUIxNiAgb3V0MzIsY29sT3AzMixjb25zdDIKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFNUTUlBICAgcERzdCx7b3V0MDAsb3V0MDIsb3V0MTAsb3V0MTIsb3V0MjAsb3V0MjIsb3V0MzAsb3V0MzJ9Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAKLUVuZCAgICAgICAgICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAKLSAgICAKLSAgICAKLQotCi0KLQotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgICAgICAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDJiNGYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIElucHV0IEFyZ3VtZW50cyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wcFNyYyAgICAgICAgICAgUk4gMCAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQotcERzdCAgICAgICAgICAgIFJOIDEgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBWYXJpYWJsZXMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyYyAgICAgICAgICAgIFJOIDIgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGVzCi1GbGFnICAgICAgICAgICAgUk4gMyAgICAKLVZhbHVlICAgICAgICAgICBSTiA0ICAgIAotVmFsdWUyICAgICAgICAgIFJOIDUgICAgCi1zdHJPZmZzZXQgICAgICAgUk4gNiAgICAKLWNzdE9mZnNldCAgICAgICBSTiA3ICAgIAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQsIHI3Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKLSAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCi0gICAgICAgIE1PViAgICAgIFZhbHVlMiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKLSAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgotICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzhdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNF0gID0gcERzdFs1XSAgPSBwRHN0WzZdICA9IHBEc3RbN10gID0gMAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMxNl0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzhdICA9IHBEc3RbOV0gID0gcERzdFsxMF0gPSBwRHN0WzExXSA9IDAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMjRdICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxMl0gPSBwRHN0WzEzXSA9IHBEc3RbMTRdID0gcERzdFsxNV0gPSAwCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBUaGUgbG9vcCBiZWxvdyBwYXJzZXMgYW5kIHVucGFja3MgdGhlIGlucHV0IHN0cmVhbS4gVGhlIEMtbW9kZWwgaGFzIAotICAgICAgICA7Ly8gYSBzb21ld2hhdCBjb21wbGljYXRlZCBsb2dpYyBmb3Igc2lnbiBleHRlbnNpb24uICBCdXQgaW4gdGhlIHY2IHZlcnNpb24sCi0gICAgICAgIDsvLyB0aGF0IGNhbiBiZSBlYXNpbHkgdGFrZW4gY2FyZSBieSBsb2FkaW5nIHRoZSBkYXRhIGZyb20gPHBTcmM+IHN0cmVhbSBhcyAKLSAgICAgICAgOy8vIFNJR05FRCBieXRlL2hhbGZ3b3JkLiBTbywgYmFzZWQgb24gdGhlIGZpcnN0IFRTVCBpbnN0cnVjdGlvbiwgOC1iaXRzIG9yIAotICAgICAgICA7Ly8gMTYtYml0cyBhcmUgcmVhZC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBOZXh0LCB0byBjb21wdXRlIHRoZSBvZmZzZXQsIHdoZXJlIHRoZSB1bnBhY2tlZCB2YWx1ZSBuZWVkcyB0byBiZSBzdG9yZWQsCi0gICAgICAgIDsvLyB3ZSBtb2RpZnkgdGhlIGNvbXB1dGF0aW9uIHRvIHBlcmZvcm0gWyhGbGFnICYgMTUpIDwgMV0gYXMgWyhGbGFnIDwgMSkgJiAzMV0KLSAgICAgICAgOy8vIFRoaXMgcmVzdWx0cyBpbiBhIHNhdmluZyBvZiBvbmUgY3ljbGUuCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi11bnBhY2tMb29wCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQotICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcyAgIAotICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKLSAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKLSAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQotICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KLSAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+Ci0gICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCi0gICAgICAgIAotICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWRlYTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIG1hY3JvYmxvY2sgKDE2eDE2KS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgotICogW2luXQlzcmNkc3RTdGVwICAgICAgU3RlcCBvZiB0aGUgYXJyYXlzCi0gKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwVGhyZXNob2xkcwkJQUFycmF5IG9mIHNpemUgIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiAgaG9yaXpvbnRhbCBibG9jayBvcmRlcikKLSAqIFtpbl0JcEJTCQkJCWFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgotICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jawotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzLCBvciBwQlMgaXMgTlVMTC4KLSAqICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KLSAqICAgLSBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KLSAqICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KLSAqICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCi0JT01YX1U4KiBwU3JjRHN0LCAKLQlPTVhfUzMyIHNyY2RzdFN0ZXAsIAotCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKLQljb25zdCBPTVhfVTgqIHBCZXRhLCAKLQljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pCi17Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOwotCi0gICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKLSAgICAKLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKLQotICAgIHJldHVybiBlcnJvckNvZGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0N2RjMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgbHVtYSBkZWJsb2NrCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotIAotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrCi0gKigxNngxNikuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KLSAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIGltYWdlIHdpZHRoCi0gKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwVGhyZXNob2xkcwkJcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyB2YWx1ZXMgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcikKLSAqIFtpbl0JcEJTCQkJCSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KLSAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzIG9yIHBCUyBpcyBOVUxMLgotICogICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KLSAqICAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4Ci0gKiAgICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgotLgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JKAotCU9NWF9VOCogcFNyY0RzdCwgCi0JT01YX1MzMiBzcmNkc3RTdGVwLCAKLQljb25zdCBPTVhfVTgqIHBBbHBoYSwgCi0JY29uc3QgT01YX1U4KiBwQmV0YSwgCi0JY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywgCi0JY29uc3QgT01YX1U4ICpwQlMKLSkKLXsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKLQotICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCi0gICAgCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKLQotICAgIHJldHVybiBlcnJvckNvZGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkNjVjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgMngyIGJsb2NrIG9mIAotICogQ2hyb21hRENMZXZlbC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgcmFzdGVyIHNjYW4gb3JkZXIsIG5hbWVseSBwb3NpdGlvbiBvcmRlci4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbQotICoJCQkJCQkJCWJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqCQkJCQkJCQlwb2ludGVkIHRvIGJ5ICpwcEJpdFN0cmVhbQotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cwotICoJCQkJCQkJCWluIHRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKLSApCi0KLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCAxNywgNCk7Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTcwNmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKLSAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCxMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiAKLSAqIEludmVyc2UgZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIAotICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyB6aWd6YWcgb3JkZXIgaW5zdGVhZCAKLSAqIG9mIHBvc2l0aW9uIG9yZGVyLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCi0gKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAotICoJCQkJCQkJCWJsb2NrCi0gKiBbaW5dCXNWTENTZWxlY3QJCVZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSBudW1iZXIgb2Ygbm9uLXplcm8KLSAqCQkJCQkJCQlBQyBjb2VmZmljaWVudHMgb2YgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gSXQgaXMgCi0gKgkJCQkJCQkJZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIAotICoJCQkJCQkJCXRhYmxlIDktNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW6hr3QgYmUgbGVzcyB0aGFuIHplcm8uCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCi0gKgkJCQkJCQkJdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApCi17Ci0gICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1Ziwgc1ZMQ1NlbGVjdCwgc01heE51bUNvZWZmKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg3ZjJiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKLTsvLyAKLTsvLyAKLQotICAgICAgICAKLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlIAotICAgICAgICAKLSAgICBNX1ZBUklBTlRTIEFSTTExMzZKUywgQVJNMTEzNkpTX1UKLSAgICAgICAgCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotCi0KLTsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKUyAKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcFNyY0RzdCAgICAgICBSTiAgMAotUVAgICAgICAgICAgICBSTiAgMQotCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLQotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotcFFQZGl2ICAgICAgICAgIFJOICA0Ci1wUVBtb2QgICAgICAgICAgUk4gIDUKLXBWUm93ICAgICAgICAgICBSTiAgMgotUVBtb2QgICAgICAgICAgIFJOICA2Ci1zaGlmdCAgICAgICAgICAgUk4gIDMKLXJvd0x1bWEwMSAgICAgICBSTiAgMQotcm93THVtYTIzICAgICAgIFJOICA0Ci0KLVNyY0RzdDAwICAgICAgICBSTiAgNQotU3JjRHN0MDIgICAgICAgIFJOICA2Ci1TcmNEc3QxMCAgICAgICAgUk4gIDcKLVNyY0RzdDEyICAgICAgICBSTiAgOAotU3JjRHN0MjAgICAgICAgIFJOICA5Ci1TcmNEc3QyMiAgICAgICAgUk4gIDEwCi1TcmNEc3QzMCAgICAgICAgUk4gIDExCi1TcmNEc3QzMiAgICAgICAgUk4gIDEyCi0KLXRlbXAxICAgICAgICAgICBSTiAgMgotdGVtcDIgICAgICAgICAgIFJOICAzCi10ZW1wMyAgICAgICAgICAgUk4gIDE0Ci0gICAgCi0gICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0LHIxMQotICAgICAgICAgCi0gICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAotICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAgCi0gICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKLSAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSSCAgICByb3dMdW1hMDEsW3BWUm93LFFQbW9kXSEgICAgICAgICAgICAgOy8vIHJvd0x1bWEwMSA9IFswMHwwYV0KLSAgICAgICAgTERSSCAgICB0ZW1wMyxbcFZSb3csIzJdICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAzICAgICA9IFswMHwwYl0gICAKLSAgICAgICAgTERSSCAgICByb3dMdW1hMjMsW3BWUm93LCM0XSAgICAgICAgICAgICAgICAgOy8vIHJvd0x1bWEyMyA9IFswMHwwY10gCi0gICAgICAgIE9SUiAgICAgcm93THVtYTAxLHJvd0x1bWEwMSx0ZW1wMyxMU0wgIzE2ICAgIDsvLyByb3dMdW1hMDEgPSBbMGJ8MGFdICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDE2ICdzcmMnIHZhbHVlcwotICAgICAgICBMRE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICdTaGlmdCcgcmFuZ2VzIGJldHdlZW4gWzAsOF0gCi0gICAgICAgIDsvLyBTbyB3ZSBjYW4gc2hpZnQgdGhlIHBhY2tlZCByb3dMdW1hIHZhbHVlcyBbMGJ8MGFdIHdpdGggYSBzaW5nbGUgTFNMIG9wZXJhdGlvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBMU0wgICAgcm93THVtYTAxLHJvd0x1bWEwMSxzaGlmdAotICAgICAgICBMU0wgICAgcm93THVtYTIzLHJvd0x1bWEyMyxzaGlmdAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGUgaWRlYSBpcyB0byB1bnJvbGwgdGhlIExvb3AgY29tcGxldGVseQotICAgICAgICA7Ly8gQWxsIHRoZSAxNiBzcmMgdmFsdWVzIGFyZSBsb2FkZWQgYXQgb25jZSBpbnRvIDggcmVnaXN0ZXJzIDogU3JjRHN0PHk+PHg+IChhYm92ZSkKLSAgICAgICAgOy8vIDA8PSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXSA8PTIgZm9yIGFueSAnaTwxNicgCi0gICAgICAgIDsvLyBTbyB0aGUgb25seSB2YWx1ZXMgb2YgcFZSb3dbaV0gdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBhcmUgZm9yIGk9MCwxLDIKLSAgICAgICAgOy8vIFRoZXNlIDMgdmFsdWVzIGFyZSBsb2FkZWQgaW50byByb3dMdW1hMDEgYW5kIHJvd0x1bWEyMyAoYWJvdmUpCi0gICAgICAgIDsvLyBXZSBmaXJzdCBjYWxjdWxhdGUgcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdCB3aGljaCBmaXRzIGludG8gMTYgYml0cyAoYWJvdmUpCi0gICAgICAgIDsvLyBUaGVuIHRoZSBwcm9kdWN0IHBTcmNEc3RbaV0gKiAocFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dIDw8IFNoaWZ0KSBpcyBjYWxjdWxhdGVkCi0gICAgICAgIDsvLyBIZXJlIHdlIGludGVybGVhdmUgdGhlIFBLSEJUIG9wZXJhdGlvbnMgZm9yIHZhcmlvdXMgcm93cyAgdG8gYXZvaWRlIHBpcGVsaW5lIHN0YWxscwotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBXZSB0aGVuIHBhY2sgdGhlIHR3byAxNiBiaXQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGludG8gYSB3b3JkIGFuZCBzdG9yZSBhdCBvbmUgZ28KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gUm93IDEKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDAwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKLSAgICAgICAgU01VTEJCICBTcmNEc3QwMCxTcmNEc3QwMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdICogKHBWUm93WzBdPDxTaGlmdCkgIAotICAgICAgICAKLSAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QwMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzNdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MDIsU3JjRHN0MDIscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsyXSAqIChwVlJvd1swXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDAwLFNyY0RzdDAwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIGZpcnN0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAyCi0gICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MTAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs1XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MTAsU3JjRHN0MTAscm93THVtYTIzICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs0XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDAyLFNyY0RzdDAyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFNNVUxUVCAgdGVtcDIsU3JjRHN0MTIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs3XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MTIsU3JjRHN0MTIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs2XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDEwLFNyY0RzdDEwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMyAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MjAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs5XSAqIChwVlJvd1syXTw8U2hpZnQpICAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MjAsU3JjRHN0MjAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs4XSAqIChwVlJvd1swXTw8U2hpZnQpICAKLSAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QxMixTcmNEc3QxMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MjIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKLSAgICAgICAgU01VTEJCICBTcmNEc3QyMixTcmNEc3QyMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEwXSAqIChwVlJvd1swXTw8U2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QyMCxTcmNEc3QyMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFJvdyA0ICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDMwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTNdICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QzMCxTcmNEc3QzMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEyXSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBTTVVMVFQgIHRlbXAzLFNyY0RzdDMyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTVdICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QzMixTcmNEc3QzMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE0XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MjIsU3JjRHN0MjIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgcmVtYWluaW5nIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MzAsU3JjRHN0MzAsdGVtcDEsTFNMICMxNgotICAgICAgICBQS0hCVCAgIFNyY0RzdDMyLFNyY0RzdDMyLHRlbXAzLExTTCAjMTYKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgCi0gCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQVJNMTEzNkpTX1UKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcFNyY0RzdCAgICAgICBSTiAgMAotUVAgICAgICAgICAgICBSTiAgMQotCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLQotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotcFFQZGl2ICAgICAgICAgIFJOICA0Ci1wUVBtb2QgICAgICAgICAgUk4gIDUKLXBWUm93ICAgICAgICAgICBSTiAgMgotUVBtb2QgICAgICAgICAgIFJOICA2Ci1zaGlmdCAgICAgICAgICAgUk4gIDMKLXJvd0x1bWEwMSAgICAgICBSTiAgMQotcm93THVtYTIzICAgICAgIFJOICA0Ci0KLVNyY0RzdDAwICAgICAgICBSTiAgNQotU3JjRHN0MDIgICAgICAgIFJOICA2Ci1TcmNEc3QxMCAgICAgICAgUk4gIDcKLVNyY0RzdDEyICAgICAgICBSTiAgOAotU3JjRHN0MjAgICAgICAgIFJOICA5Ci1TcmNEc3QyMiAgICAgICAgUk4gIDEwCi1TcmNEc3QzMCAgICAgICAgUk4gIDExCi1TcmNEc3QzMiAgICAgICAgUk4gIDEyCi0KLXRlbXAxICAgICAgICAgICBSTiAgMgotdGVtcDIgICAgICAgICAgIFJOICAzCi10ZW1wMyAgICAgICAgICAgUk4gIDE0Ci0gICAgCi0gICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0LHIxMQotICAgICAgICAgCi0gICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAotICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAgCi0gICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKLSAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgIHJvd0x1bWEwMSxbcFZSb3csUVBtb2RdISAgICAgICAgICAgICA7Ly8gcm93THVtYTAxID0gWzBifDBhXQotICAgICAgICBMRFIgICAgcm93THVtYTIzLFtwVlJvdywjNF0gICAgICAgICAgICAgICAgIDsvLyByb3dMdW1hMjMgPSBbMGR8MGNdICAgIAotCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgMTYgJ3NyYycgdmFsdWVzCi0gICAgICAgIExETUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJ1NoaWZ0JyByYW5nZXMgYmV0d2VlbiBbMCw4XSAKLSAgICAgICAgOy8vIFNvIHdlIGNhbiBzaGlmdCB0aGUgcGFja2VkIHJvd0x1bWEgdmFsdWVzIFswYnwwYV0gd2l0aCBhIHNpbmdsZSBMU0wgb3BlcmF0aW9uCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIExTTCAgICByb3dMdW1hMDEscm93THVtYTAxLHNoaWZ0Ci0gICAgICAgIExTTCAgICByb3dMdW1hMjMscm93THVtYTIzLHNoaWZ0Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoZSBpZGVhIGlzIHRvIHVucm9sbCB0aGUgTG9vcCBjb21wbGV0ZWx5Ci0gICAgICAgIDsvLyBBbGwgdGhlIDE2IHNyYyB2YWx1ZXMgYXJlIGxvYWRlZCBhdCBvbmNlIGludG8gOCByZWdpc3RlcnMgOiBTcmNEc3Q8eT48eD4gKGFib3ZlKQotICAgICAgICA7Ly8gMDw9IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldIDw9MiBmb3IgYW55ICdpPDE2JyAKLSAgICAgICAgOy8vIFNvIHRoZSBvbmx5IHZhbHVlcyBvZiBwVlJvd1tpXSB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGFyZSBmb3IgaT0wLDEsMgotICAgICAgICA7Ly8gVGhlc2UgMyB2YWx1ZXMgYXJlIGxvYWRlZCBpbnRvIHJvd0x1bWEwMSBhbmQgcm93THVtYTIzIChhYm92ZSkKLSAgICAgICAgOy8vIFdlIGZpcnN0IGNhbGN1bGF0ZSBwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0pIDw8IFNoaWZ0IHdoaWNoIGZpdHMgaW50byAxNiBiaXRzIChhYm92ZSkKLSAgICAgICAgOy8vIFRoZW4gdGhlIHByb2R1Y3QgcFNyY0RzdFtpXSAqIChwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0gPDwgU2hpZnQpIGlzIGNhbGN1bGF0ZWQKLSAgICAgICAgOy8vIEhlcmUgd2UgaW50ZXJsZWF2ZSB0aGUgUEtIQlQgb3BlcmF0aW9ucyBmb3IgdmFyaW91cyByb3dzICB0byBhdm9pZGUgcGlwZWxpbmUgc3RhbGxzCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIFdlIHRoZW4gcGFjayB0aGUgdHdvIDE2IGJpdCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaW50byBhIHdvcmQgYW5kIHN0b3JlIGF0IG9uZSBnbwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MDAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxXSAqIChwVlJvd1syXTw8U2hpZnQpIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDAwLFNyY0RzdDAwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCi0gICAgICAgIAotICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDAyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbM10gKiAocFZSb3dbMl08PFNoaWZ0KSAKLSAgICAgICAgU01VTEJCICBTcmNEc3QwMixTcmNEc3QwMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzJdICogKHBWUm93WzBdPDxTaGlmdCkKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MDAsU3JjRHN0MDAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgZmlyc3QgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUm93IDIKLSAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QxMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzVdICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QxMCxTcmNEc3QxMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzRdICogKHBWUm93WzJdPDxTaGlmdCkKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MDIsU3JjRHN0MDIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgU01VTFRUICB0ZW1wMixTcmNEc3QxMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzddICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QxMixTcmNEc3QxMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzZdICogKHBWUm93WzJdPDxTaGlmdCkKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MTAsU3JjRHN0MTAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAzICAgIAotICAgICAgICAKLSAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QyMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzldICogKHBWUm93WzJdPDxTaGlmdCkgICAgICAgICAKLSAgICAgICAgU01VTEJCICBTcmNEc3QyMCxTcmNEc3QyMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzhdICogKHBWUm93WzBdPDxTaGlmdCkgIAotICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDEyLFNyY0RzdDEyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QyMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzExXSAqIChwVlJvd1syXTw8U2hpZnQpIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDIyLFNyY0RzdDIyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTBdICogKHBWUm93WzBdPDxTaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDIwLFNyY0RzdDIwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUm93IDQgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MzAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxM10gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDMwLFNyY0RzdDMwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTJdICogKHBWUm93WzJdPDxTaGlmdCkKLSAgICAgICAgCi0gICAgICAgIFNNVUxUVCAgdGVtcDMsU3JjRHN0MzIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNV0gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDMyLFNyY0RzdDMyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTRdICogKHBWUm93WzJdPDxTaGlmdCkKLSAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QyMixTcmNEc3QyMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSByZW1haW5pbmcgcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgUEtIQlQgICBTcmNEc3QzMCxTcmNEc3QzMCx0ZW1wMSxMU0wgIzE2Ci0gICAgICAgIFBLSEJUICAgU3JjRHN0MzIsU3JjRHN0MzIsdGVtcDMsTFNMICMxNgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNUTUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTX1UgICAgICAgIAotCi0KLQotCi0KLTsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAotICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBBUk0xMTM2SlMKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcHBTcmMgICAgICAgUk4gIDAKLXBQcmVkICAgICAgIFJOICAxCi1wREMgICAgICAgICBSTiAgMgotcERzdCAgICAgICAgUk4gIDMKLSAgIAotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi1yZXN1bHQgICAgICBSTiAgMAotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotcERlbHRhICAgICAgUk4gIDQKLXBEZWx0YVRtcCAgIFJOICA2Ci1BQyAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKLXBQcmVkVGVtcCAgIFJOICA3Ci1wRENUZW1wICAgICBSTiAgOAotcERzdFRlbXAgICAgUk4gIDkKLXBEZWx0YUFyZzEgIFJOICAxCi1wRGVsdGFBcmcwICBSTiAgMAotUVAgICAgICAgICAgUk4gIDEgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCi1EQ3ZhbCAgICAgICBSTiAgMTAgIAotREN2YWxDb3B5ICAgUk4gIDExCi1wcmVkc3RlcCAgICBSTiAgMQotZHN0U3RlcCAgICAgUk4gIDEwCi15Y291bnRlciAgICBSTiAgMAotUHJlZFZhbDEgICAgUk4gIDMKLVByZWRWYWwyICAgIFJOICA1Ci1EZWx0YVZhbDEgICBSTiAgMgotRGVsdGFWYWwyICAgUk4gIDExCi1QcmVkVmFsICAgICBSTiAgOAotdG1wRGVsdGFWYWwgUk4gIDYKLXN1bTEgICAgICAgIFJOICAxMgotc3VtMiAgICAgICAgUk4gIDE0Ci0gICAgCi0gICAgCi0gICAgICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIE1fQUxMT0M4IHBCdWZmZXIsIDMyCi0gICAgICAgICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwcmVkU3RlcE9uU3RhY2ssIDQKLSAgICAgICAgTV9BUkcgICBkc3RTdGVwT25TdGFjayw0Ci0gICAgICAgIE1fQVJHICAgUVBPblN0YWNrLCA0Ci0gICAgICAgIE1fQVJHICAgQUNPblN0YWNrLDQKLSAgCi0gICAgICAgIAotICAgICAgICBNX0FEUiAgIHBEZWx0YSxwQnVmZmVyIAotICAgICAgICBNX0xEUiAgIEFDLEFDT25TdGFjayAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHIxLHIyLHIzIGJlZm9yZSBmdW5jdGlvbiBjYWxsICAgIAotICAgICAgICBNT1YgICAgIHBQcmVkVGVtcCxwUHJlZAotICAgICAgICBNT1YgICAgIHBEQ1RlbXAscERDCi0gICAgICAgIE1PViAgICAgcERzdFRlbXAscERzdAotICAgICAgICAKLSAgICAgICAgQ01QICAgICBBQywjMAotICAgICAgICBCRVEgICAgIERDY2FzZQotICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAKLSAgICAgICAgTV9MRFIgICBRUCxRUE9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIERlcXVhbnRMdW1hQUM0eDQKLSAgICAgICAgTU9WICAgICBwRGVsdGFBcmcwLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjAgZm9yIERlcXVhbnRMdW1hQUM0eDQKLQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgcERDVGVtcCwjMAotICAgICAgICBMRFJTSE5FIERDdmFsLFtwRENUZW1wXQotICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzAscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMCBmb3IgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAotICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAotICAgICAgICBTVFJITkUgIERDdmFsLFtwRGVsdGFdCi0gICAgICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgQiAgICAgICBPdXREQ2Nhc2UgCi0gICAgICAgIAotCi1EQ2Nhc2UKLSAgICAgICAgTERSU0ggICBEQ3ZhbCxbcERDVGVtcF0gCi0gICAgICAgIEFERCAgICAgREN2YWwsREN2YWwsIzMyIAotICAgICAgICBBU1IgICAgIERDdmFsLERDdmFsLCM2Ci0gICAgICAgIFBLSEJUICAgREN2YWwsREN2YWwsREN2YWwsTFNMICMxNiAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGluZyB0aGUgTG93ZXIgaGFsZndvcmQKLSAgICAgICAgTU9WICAgICBEQ3ZhbENvcHksIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5lZWRlZCBmb3IgU1RSRAotICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzBdICA9IHBEZWx0YVsxXSAgPSBwRGVsdGFbMl0gID0gcERlbHRhWzNdID0gREN2YWwKLSAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzhdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs0XSAgPSBwRGVsdGFbNV0gID0gcERlbHRhWzZdICA9IHBEZWx0YVs3XSA9IERDdmFsCi0gICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMxNl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbOF0gID0gcERlbHRhWzldICA9IHBEZWx0YVsxMF0gPSBwRGVsdGFbMTFdID0gREN2YWwKLSAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzI0XSAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotT3V0RENjYXNlICAgICAgCi0gICAgICAgIE1fTERSICAgcHJlZHN0ZXAscHJlZFN0ZXBPblN0YWNrCi0gICAgICAgIE1fTERSICAgZHN0U3RlcCxkc3RTdGVwT25TdGFjawotICAgICAgICAKLSAgICAgICAgTERNSUEgICBwRGVsdGEhLHt0bXBEZWx0YVZhbCxEZWx0YVZhbDJ9ICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAotICAgICAgICBNT1YgICAgIHljb3VudGVyLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvdW50ZXIgZm9yIHRoZSBQcmVkUGx1c0RlbHRhTG9vcAotICAgICAgICBMRFIgICAgIFByZWRWYWwsW3BQcmVkVGVtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZSBsb2FkCi0KLVByZWRQbHVzRGVsdGFMb29wCi0gICAgICAgIAotICAgICAgIAotICAgICAgICBTVUJTICAgIHljb3VudGVyLHljb3VudGVyLCMxCi0gICAgICAgIEFERCAgICAgcFByZWRUZW1wLHBQcmVkVGVtcCxwcmVkc3RlcCAgICAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBQcmVkIHB0cgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBEZWx0YVZhbDEsdG1wRGVsdGFWYWwsRGVsdGFWYWwyLExTTCAjMTYgICAgIDsvLyBEZWx0YXZhbDEgPSBbQyBBXSAgIAotICAgICAgICBQS0hUQiAgIERlbHRhVmFsMixEZWx0YVZhbDIsdG1wRGVsdGFWYWwsQVNSICMxNiAgICAgOy8vIERlbHRhVmFsMiA9IFtEIEJdCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgIFByZWRWYWwxLFByZWRWYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZWRWYWwxID0gWzBjMGFdCi0gICAgICAgIFVYVEIxNiAgUHJlZFZhbDIsUHJlZFZhbCxST1IgIzggICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlZFZhbDIgPSBbMGQwYl0KLSAgICAgICAgCi0gICAgICAgIExEUkdUICAgUHJlZFZhbCxbcFByZWRUZW1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKLSAgICAgICAgCi0gICAgICAgIFFBREQxNiAgc3VtMixEZWx0YVZhbDIsUHJlZFZhbDIgICAgICAgICAgICAgICAgICAgICA7Ly8gQWRkIGFuZCBzYXR1cmF0ZSB0byAxNiBiaXRzCi0gICAgICAgIFFBREQxNiAgc3VtMSxEZWx0YVZhbDEsUHJlZFZhbDEKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgc3VtMiwjOCxzdW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYXJtQ2xpcCgwLDI1NSxzdW0yKQotICAgICAgICBVU0FUMTYgIHN1bTEsIzgsc3VtMQotICAgICAgICAKLSAgICAgICAgTERNR1RJQSAgIHBEZWx0YSEse3RtcERlbHRhVmFsLERlbHRhVmFsMn0gICAgICAgICAgIDsvLyBQcmUgbG9hZAotICAgICAgICAgIAotICAgICAgICBPUlIgICAgIHN1bTEsc3VtMSxzdW0yLExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgPSBbZGNiYV0KLSAgICAgICAgU1RSICAgICBzdW0xLFtwRHN0VGVtcF0KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcERzdFRlbXAscERzdFRlbXAsZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBEc3QgcHRyCi0gICAgICAgIEJHVCAgICAgUHJlZFBsdXNEZWx0YUxvb3AgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotRW5kICAgICAgICAgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgCi0gICAgCi0gICAgCi07Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKLSAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICAKLSAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0MDQxOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICAKLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKLU1BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCi1MT09QX0NPVU5UICBFUVUgMHg1MDAwMDAwMAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcFNyY0RzdCAgICAgUk4gMAotc3JjZHN0U3RlcCAgUk4gMQotcEFscGhhQXJnICAgUk4gMgotcEJldGFBcmcgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiA2Ci1wQlMgICAgICAgICBSTiA5Ci1wUTAgICAgICAgICBSTiAwCi1iUyAgICAgICAgICBSTiAxMAotCi1hbHBoYSAgICAgICBSTiA2Ci1hbHBoYTAgICAgICBSTiA2Ci1hbHBoYTEgICAgICBSTiA4Ci0KLWJldGEgICAgICAgIFJOIDcKLWJldGEwICAgICAgIFJOIDcKLWJldGExICAgICAgIFJOIDkKLQotOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcwotCi07Ly8gUGl4ZWxzCi1wXzAgICAgICAgICBSTiAzICAKLXBfMSAgICAgICAgIFJOIDUgIAotcV8wICAgICAgICAgUk4gOCAgCi1xXzEgICAgICAgICBSTiA5ICAKLQotOy8vIEZpbHRlcmluZwotCi1kcDBxMCAgICAgICBSTiAxMgotZHAxcDAgICAgICAgUk4gMTIKLWRxMXEwICAgICAgIFJOIDEyCi0KLWFwMHEwICAgICAgIFJOIDQgIAotZmlsdCAgICAgICAgUk4gMgotICAgICAgICAKLW0wMCAgICAgICAgIFJOIDE0Ci1tMDEgICAgICAgICBSTiAxMQotICAgICAgICAgICAgCi1wUTAgICAgICAgICBSTiAwCi1TdGVwICAgICAgICBSTiAxCi0gICAgICAgICAgICAKLTsvLyBPdXRwdXQKLSAgICAgICAgICAgIAotUF8wICAgICAgICAgUk4gNgotUV8wICAgICAgICAgUk4gNyAKLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKLQotdEMgICAgICAgICAgUk4gMTIKLXRDMCAgICAgICAgIFJOIDUKLXRDMSAgICAgICAgIFJOIDEyCi1wb3MgICAgICAgICBSTiA1Ci1uZWcgICAgICAgICBSTiA5Ci0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCi0KLQotOy8vIE1pc2NlbGxhbm91cwotWFkgICAgICAgICAgUk4gOAotCi1hICAgICAgICAgICBSTiAxMAotdDEgICAgICAgICAgUk4gMTAKLXQyICAgICAgICAgIFJOIDEyCi10MyAgICAgICAgICBSTiAxNAotdDQgICAgICAgICAgUk4gNgotdDUgICAgICAgICAgUk4gNQotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAotICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKLSAgICAgICAgTV9BTExPQzggcFhZQlMsNAotICAgICAgICBNX0FMTE9DNCBwcEJTLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0Ci0gICAgICAgIAotICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KLSAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCi0gICAgICAgIExEUiAgICAgYSw9TUFTS18xCi0gICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KLQotICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCBhCi0gICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCBhCi0gICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIGEKLSAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIGEKLQotICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCi0gICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCi0gICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKLQotICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCi0gICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLUxvb3BZCi1Mb29wWAotOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUkggICAgYlMsIFtwQlNdLCAjMgotICAgICAgICAKLSAgICAgICAgTV9TVFIgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFIgICBwXzEsIFtwUTBdLHNyY2RzdFN0ZXAKLQotICAgICAgICBDTVAgICAgIGJTLCAjMAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICBwXzAsIFtwUTBdLHNyY2RzdFN0ZXAKLSAgICAgICAgTV9MRFIgICBxXzAsIFtwUTBdLHNyY2RzdFN0ZXAKLSAgICAgICAgTV9MRFIgICBxXzEsIFtwUTBdCi0gICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xICAgICAgICAgICAgICAgIDsvLyAgMDEwMTAxMDEgbWFzayAKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckJTMAotCi0gICAgICAgIAotICAgICAgICA7Ly8gcF8wID0gW3IzcDAgcjJwMCByMXAwIHIwcDBdCi0gICAgICAgIDsvLyBwXzEgPSBbcjNwMSByMnAxIHIxcDEgcjBwMV0KLSAgICAgICAgOy8vIHFfMCA9IFtyM3EwIHIycTAgcjFxMCByMHEwXQotICAgICAgICA7Ly8gcV8xID0gW3IzcTEgcjJxMSByMXExIHIwcTFdCi0KLTsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTU9WICAgICBtMDAsICNNQVNLXzAgICAgICAgICAgICAgICAgOy8vICAwMDAwMDAwMCBtYXNrIAotCi0gICAgICAgIE1PViAgICAgZmlsdCwgbTAxCi0gICAgICAgIFRTVCAgICAgYlMsICMweGZmMDAKLSAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU1IgIzE2Ci0gICAgICAgIFRTVCAgICAgYlMsICMweGZmCi0gICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNMICMxNgotICAgICAgICBUU1QgICAgIGJTLCAjNAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKLSAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKLSAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKLSAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICBCRVEgICAgIGJTTFQ0ICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotYlNHRTQgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotCi0gICAgICAgIDsvLyBDb21wdXRlIFAwYgotICAgICAgICBVSEFERDggIHQxLCBwXzAsIHFfMQotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLSAgICAgICAgTVZOICAgICB0MiwgcF8xCi0gICAgICAgIFVIU1VCOCAgdDEsIHQxLCB0MgotICAgICAgICBVU1VCOCAgIHQyLCBmaWx0LCBtMDEKLSAgICAgICAgRU9SICAgICB0MSwgdDEsIG0wMSwgTFNMICM3Ci0KLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcyxwVGhyZXNob2xkcywgIzIKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb21wdXRlIFEwYiAKLSAgICAgICAgVUhBREQ4ICB0MiwgcV8wLCBwXzEKLSAgICAgICAgTVZOICAgICB0MywgcV8xCi0gICAgICAgIFVIU1VCOCAgdDIsIHQyLCB0MwotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgU0VMICAgICBQXzAsIHQxLCBwXzAKLSAgICAgICAgRU9SICAgICB0MiwgdDIsIG0wMSwgTFNMICM3Ci0gICAgICAgIFNFTCAgICAgUV8wLCB0MiwgcV8wCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEIgICAgICAgU3RvcmVSZXN1bHRBbmRFeGl0Ci0KLTsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQotOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCi0KLU5vRmlsdGVyRmlsdDAKLU5vRmlsdGVyQlMwCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcAotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKLQotICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWQotICAgICAgICBCICAgICAgIEV4aXRMb29wWQotICAgICAgICAKLWJTTFQ0ICAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotICAgICAgICAKLSAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93Ci0gICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAotICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNwotICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNwotCi0gICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKLQotICAgICAgICBVU1VCOCAgIHQxLCBwXzEsIHBfMAotICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgdEMwLCBbcFRocmVzaG9sZHNdLCMxCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgotICAgICAgICBMRFJCICAgIHRDMSwgW3BUaHJlc2hvbGRzXSwjMQotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgVUhTVUI4ICB0NCwgcF8wLCBxXzAKLSAgICAgICAgT1JSICAgICB0QywgdEMwLCB0QzEsIExTTCAjMTYKLSAgICAgICAgVVNVQjggICB0NSwgcF8wLCBxXzAKLSAgICAgICAgQU5EICAgICB0NSwgdDUsIG0wMQotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKLSAgICAgICAgT1JSICAgICB0QywgdEMsIExTTCAjOCAgICAgICAgCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0NQotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKLSAgICAgICAgVVFBREQ4ICB0QywgdEMsIG0wMQotICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCi0gICAgICAgIFVTVUI4ICAgdDUsIGZpbHQsIG0wMSAgIAotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKLSAgICAgICAgU0VMICAgICB0QywgdEMsIG0wMAotCi0gICAgICAgIDsvLyBTcGxpdCBpbnRvIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0IGFuZCBjbGlwIAotCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKLSAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKLSAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKLSAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QwotICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcwotICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCi0gICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCi0gICAgICAgIFVRQUREOCAgUF8wLCBwXzAsIHBvcwotICAgICAgICBVUVNVQjggIFFfMCwgcV8wLCBwb3MKLSAgICAgICAgVVFTVUI4ICBQXzAsIFBfMCwgbmVnCi0gICAgICAgIFVRQUREOCAgUV8wLCBRXzAsIG5lZwotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0KLSAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKLSAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAotICAgICAgICBVU1VCOCAgIHQxLCBmaWx0LCBtMDEgICAgCi0gICAgICAgIFNFTCAgICAgUF8wLCBQXzAsIHBfMAotICAgICAgICBTRUwgICAgIFFfMCwgUV8wLCBxXzAKLSAgICAKLVN0b3JlUmVzdWx0QW5kRXhpdAotCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIDsvLyBQXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIFFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQotCi0gICAgICAgIE1fU1RSICAgUF8wLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBTVFIgICAgIFFfMCwgW3BRMF0sICM0Ci0KLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0KLTsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCi0KLUV4aXRMb29wWQotICAgICAgICBBREQgICAgIHBCUywgcEJTLCAjNAotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjOAotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgTV9TVFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBCTkUgICAgIExvb3BZCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRiAgICAgICAgCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGM5MzY5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgCi1NQVNLXzAgICAgICBFUVUgMHgwMDAwMDAwMCAgIAotTUFTS18xICAgICAgRVFVIDB4MDEwMTAxMDEKLU1BU0tfMiAgICAgIEVRVSAweDAwMDBmZjAwCi1MT09QX0NPVU5UICBFUVUgMHg1MDAwMDAwMAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcFNyY0RzdCAgICAgUk4gMAotc3JjZHN0U3RlcCAgUk4gMQotcEFscGhhQXJnICAgUk4gMgotcEJldGFBcmcgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiA2Ci1wQlMgICAgICAgICBSTiA5Ci1wUTAgICAgICAgICBSTiAwCi1iUyAgICAgICAgICBSTiAyCi1iU1RlbXAgICAgICBSTiAxMAotCi1hbHBoYSAgICAgICBSTiA2Ci1hbHBoYTAgICAgICBSTiA2Ci1hbHBoYTEgICAgICBSTiA4Ci0KLWJldGEgICAgICAgIFJOIDcKLWJldGEwICAgICAgIFJOIDcKLWJldGExICAgICAgIFJOIDkKLQotOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcwotCi07Ly8gUGl4ZWxzCi1wXzAgICAgICAgICBSTiAzICAKLXBfMSAgICAgICAgIFJOIDUgIAotcV8wICAgICAgICAgUk4gOCAgCi1xXzEgICAgICAgICBSTiA5ICAKLQotOy8vIFVucGFja2luZwotbWFzayAgICAgICAgUk4gMTEgCi0KLXJvdzAgICAgICAgIFJOIDIKLXJvdzEgICAgICAgIFJOIDQKLXJvdzIgICAgICAgIFJOIDUKLXJvdzMgICAgICAgIFJOIDMKLQotcm93NCAgICAgICAgUk4gOAotcm93NSAgICAgICAgUk4gOQotcm93NiAgICAgICAgUk4gMTAKLXJvdzcgICAgICAgIFJOIDEyCi0KLXR1bnBrMCAgICAgIFJOIDIKLXR1bnBrMiAgICAgIFJOIDEwCi10dW5wazMgICAgICBSTiAxMgotCi10dW5wazQgICAgICBSTiA0Ci10dW5wazUgICAgICBSTiA1Ci10dW5wazYgICAgICBSTiAxNAotdHVucGs3ICAgICAgUk4gMiAKLQotOy8vIEZpbHRlcmluZwotCi1kcDBxMCAgICAgICBSTiAxMgotZHAxcDAgICAgICAgUk4gMTIKLWRxMXEwICAgICAgIFJOIDEyCi0KLWFwMHEwICAgICAgIFJOIDQgIAotZmlsdCAgICAgICAgUk4gMgotICAgICAgICAKLW0wMCAgICAgICAgIFJOIDE0Ci1tMDEgICAgICAgICBSTiAxMQotICAgICAgICAgICAgCi1wUTAgICAgICAgICBSTiAwCi1TdGVwICAgICAgICBSTiAxCi0gICAgICAgICAgICAKLTsvLyBPdXRwdXQKLSAgICAgICAgICAgIAotUF8wICAgICAgICAgUk4gNgotUV8wICAgICAgICAgUk4gNyAKLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKLQotdEMgICAgICAgICAgUk4gMTIKLXRDMCAgICAgICAgIFJOIDUKLXRDMSAgICAgICAgIFJOIDEyCi1wb3MgICAgICAgICBSTiA1Ci1uZWcgICAgICAgICBSTiA5Ci0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCi0KLQotOy8vIE1pc2NlbGxhbm91cwotWFkgICAgICAgICAgUk4gOAotCi1hICAgICAgICAgICBSTiAxMAotdDEgICAgICAgICAgUk4gMTAKLXQyICAgICAgICAgIFJOIDEyCi10MyAgICAgICAgICBSTiAxNAotdDQgICAgICAgICAgUk4gNgotdDUgICAgICAgICAgUk4gNQotCi0KLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKLSAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4Ci0gICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKLSAgICAgICAgTV9BTExPQzQgcHBCUyw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAotICAgICAgICAKLSAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCi0gICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZwotICAgICAgICBMRFIgICAgIGEsPU1BU0tfMQotICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCi0KLSAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgYQotICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgYQotICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCBhCi0gICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCBhCi0KLSAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQotICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZwotICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAotICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIAotICAgICAgICAKLUxvb3BZCi1Mb29wWAotOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHEwLXExLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTERSSCAgICBiUywgW3BCU10sICM4Ci0gICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgotCi0gICAgICAgIE1fTERSSCAgcm93NCwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQ01QICAgICBiUywgIzAKLSAgICAgICAgTV9TVFIgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFJIICByb3c1LCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBCRVEuVyAgIE5vRmlsdGVyQlMwCi0gICAgICAgIExEUkggICAgcm93NiwgW3BRMF0KLSAgICAgICAgTERSSCAgICByb3c3LCBbcFEwLCBzcmNkc3RTdGVwXQotCi0gICAgICAgIDsvLyByb3c0ID0gWzAgMCByMHEwIHIwcTFdCi0gICAgICAgIDsvLyByb3c1ID0gWzAgMCByMXEwIHIxcTFdCi0gICAgICAgIDsvLyByb3c2ID0gWzAgMCByMnEwIHIycTFdCi0gICAgICAgIDsvLyByb3c3ID0gWzAgMCByM3EwIHIzcTFdCi0KLSAgICAgICAgQU5EICAgICB0dW5wazQsIG1hc2ssIHJvdzQKLSAgICAgICAgQU5EICAgICB0dW5wazUsIG1hc2ssIHJvdzQsIExTTCM4Ci0gICAgICAgIFVYVEFCICAgdHVucGs0LCB0dW5wazQsIHJvdzUsIFJPUiM4Ci0gICAgICAgIFVYVEFCICAgdHVucGs1LCB0dW5wazUsIHJvdzUKLSAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzYKLSAgICAgICAgQU5EICAgICB0dW5wazcsIG1hc2ssIHJvdzYsIExTTCM4Ci0gICAgICAgIFVYVEFCICAgdHVucGs2LCB0dW5wazYsIHJvdzcsIFJPUiM4Ci0gICAgICAgIFVYVEFCICAgdHVucGs3LCB0dW5wazcsIHJvdzcKLQotICAgICAgICA7Ly8gdHVucGs0ID0gWzAgMCByMHEwIHIxcTBdCi0gICAgICAgIDsvLyB0dW5wazUgPSBbMCAwIHIwcTEgcjFxMV0KLSAgICAgICAgOy8vIHR1bnBrNiA9IFswIDAgcjJxMCByM3EwXQotICAgICAgICA7Ly8gdHVucGs3ID0gWzAgMCByMnExIHIzcTFdCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMyCi0KLSAgICAgICAgUEtIQlQgICBxXzEsIHR1bnBrNiwgdHVucGs0LCBMU0wjMTYKLSAgICAgICAgUEtIQlQgICBxXzAsIHR1bnBrNywgdHVucGs1LCBMU0wjMTYKLQotICAgICAgICA7Ly8gcV8wID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCi0gICAgICAgIDsvLyBxXzEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KLQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBwMC1wMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgTV9MRFJIICByb3cwLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKLSAgICAgICAgTV9MRFJIICByb3cxLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKLSAgICAgICAgTERSSCAgICByb3cyLCBbcFEwXQotICAgICAgICBMRFJIICAgIHJvdzMsIFtwUTAsIHNyY2RzdFN0ZXBdCi0gICAgICAgIAotICAgICAgICA7Ly8gcm93MCA9IFswIDAgcjBwMCByMHAxXQotICAgICAgICA7Ly8gcm93MSA9IFswIDAgcjFwMCByMXAxXQotICAgICAgICA7Ly8gcm93MiA9IFswIDAgcjJwMCByMnAxXQotICAgICAgICA7Ly8gcm93MyA9IFswIDAgcjNwMCByM3AxXQotCi0gICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrLCByb3cwCi0gICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3cwLCBMU0wjOAotICAgICAgICBVWFRBQiAgIHR1bnBrMiwgdHVucGsyLCByb3cxLCBST1IjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNiwgdHVucGs2LCByb3cxCi0KLSAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2ssIHJvdzIKLSAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2ssIHJvdzIsIExTTCM4Ci0gICAgICAgIFVYVEFCICAgdHVucGswLCB0dW5wazAsIHJvdzMsIFJPUiM4Ci0gICAgICAgIFVYVEFCICAgdHVucGszLCB0dW5wazMsIHJvdzMKLQotICAgICAgICA7Ly8gdHVucGsyID0gWzAgMCByMHAwIHIxcDBdCi0gICAgICAgIDsvLyB0dW5wazYgPSBbMCAwIHIwcDEgcjFwMV0KLSAgICAgICAgOy8vIHR1bnBrMCA9IFswIDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gdHVucGszID0gWzAgMCByMnAxIHIzcDFdCi0KLSAgICAgICAgUEtIQlQgICBwXzAsIHR1bnBrMCwgdHVucGsyLCBMU0wjMTYKLSAgICAgICAgTV9MRFIgICBiU1RlbXAsIHBwQlMKLSAgICAgICAgUEtIQlQgICBwXzEsIHR1bnBrMywgdHVucGs2LCBMU0wjMTYKLQotICAgICAgICA7Ly8gcF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCi0gICAgICAgIDsvLyBwXzEgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KLQotOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBVU1VCOCAgIGRwMHEwLCBwXzAsIHFfMCAKLSAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEKLSAgICAgICAgTERSSCAgICBiU1RlbXAsIFtiU1RlbXAgLCMtOF0KLSAgICAgICAgTU9WICAgICBtMDAsICNNQVNLXzAgICAgICAgICAgICAgICAgOy8vICAwMDAwMDAwMCBtYXNrIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBmaWx0LCBtMDEKLSAgICAgICAgVFNUICAgICBiU1RlbXAsICMweGZmMDAKLSAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU0wgIzE2Ci0gICAgICAgIFRTVCAgICAgYlNUZW1wLCAjMHhmZgotICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTUiAjMTYKLSAgICAgICAgVFNUICAgICBiU1RlbXAsICM0Ci0KLSAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKLSAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKLSAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLSAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgQkVRICAgICBiU0xUNCAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJTR0U0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLQotICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKLSAgICAgICAgVUhBREQ4ICB0MSwgcF8wLCBxXzEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIE1WTiAgICAgdDIsIHBfMQotICAgICAgICBVSFNVQjggIHQxLCB0MSwgdDIKLSAgICAgICAgVVNVQjggICB0MiwgZmlsdCwgbTAxCi0gICAgICAgIEVPUiAgICAgdDEsIHQxLCBtMDEsIExTTCAjNwotCi0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMscFRocmVzaG9sZHMsICM0Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ29tcHV0ZSBRMGIgCi0gICAgICAgIFVIQUREOCAgdDIsIHFfMCwgcF8xCi0gICAgICAgIE1WTiAgICAgdDMsIHFfMQotICAgICAgICBVSFNVQjggIHQyLCB0MiwgdDMKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFNFTCAgICAgUF8wLCB0MSwgcF8wCi0gICAgICAgIEVPUiAgICAgdDIsIHQyLCBtMDEsIExTTCAjNwotICAgICAgICBTRUwgICAgIFFfMCwgdDIsIHFfMAotCi0gICAgICAgIEIgICAgICAgU3RvcmVSZXN1bHRBbmRFeGl0Ci0KLTsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQotOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCi0KLU5vRmlsdGVyRmlsdDAKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzIKLU5vRmlsdGVyQlMwCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIgZm9yIExvb3BYCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVyCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BZCi0gICAgICAgIEIgICAgICAgRXhpdExvb3BZCi0gICAgICAgIAotYlNMVDQgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93Ci0gICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAotICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNwotICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNwotCi0gICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKLQotICAgICAgICBVU1VCOCAgIHQxLCBwXzEsIHBfMAotICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgdEMwLCBbcFRocmVzaG9sZHNdLCAjMQotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKLSAgICAgICAgTERSQiAgICB0QzEsIFtwVGhyZXNob2xkc10sICMzCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBVSFNVQjggIHQ0LCBwXzAsIHFfMAotICAgICAgICBPUlIgICAgIHRDLCB0QzEsIHRDMCwgTFNMICMxNgotICAgICAgICBVU1VCOCAgIHQ1LCBwXzAsIHFfMAotICAgICAgICBBTkQgICAgIHQ1LCB0NSwgbTAxCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NQotICAgICAgICBPUlIgICAgIHRDLCB0QywgTFNMICM4ICAgICAgICAKLSAgICAgICAgU1NVQjggICB0MSwgdDEsIHQ1Ci0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NAotICAgICAgICBVUUFERDggIHRDLCB0QywgbTAxCi0gICAgICAgIFNBREQ4ICAgdDEsIHQxLCBtMDEKLSAgICAgICAgVVNVQjggICB0NSwgZmlsdCwgbTAxICAgCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NAotICAgICAgICBTRUwgICAgIHRDLCB0QywgbTAwCi0KLSAgICAgICAgOy8vIFNwbGl0IGludG8gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBhcnQgYW5kIGNsaXAgCi0KLSAgICAgICAgU1NVQjggICB0MSwgdDEsIG0wMAotICAgICAgICBTRUwgICAgIHBvcywgdDEsIG0wMAotICAgICAgICBVU1VCOCAgIG5lZywgcG9zLCB0MQotICAgICAgICBVU1VCOCAgIHQzLCBwb3MsIHRDCi0gICAgICAgIFNFTCAgICAgcG9zLCB0QywgcG9zCi0gICAgICAgIFVTVUI4ICAgdDMsIG5lZywgdEMKLSAgICAgICAgU0VMICAgICBuZWcsIHRDLCBuZWcKLSAgICAgICAgVVFBREQ4ICBQXzAsIHBfMCwgcG9zCi0gICAgICAgIFVRU1VCOCAgUV8wLCBxXzAsIHBvcwotICAgICAgICBVUVNVQjggIFBfMCwgUF8wLCBuZWcKLSAgICAgICAgVVFBREQ4ICBRXzAsIFFfMCwgbmVnCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hvb3NlIHRvIHN0b3JlIHRoZSBmaWx0ZXJlZAotICAgICAgICA7Ly8gdmFsdWUgb3IgdGhlIG9yaWdpbmFsIHBpeGVsCi0gICAgICAgIFVTVUI4ICAgdDEsIGZpbHQsIG0wMSAgICAKLSAgICAgICAgU0VMICAgICBQXzAsIFBfMCwgcF8wCi0gICAgICAgIFNFTCAgICAgUV8wLCBRXzAsIHFfMAotICAgIAotU3RvcmVSZXN1bHRBbmRFeGl0Ci0KLSAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgOy8vIFBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gUV8wID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEFERCAgICAgICAgcFEwLCBwUTAsICMxICAgICAgCi0gCi0gICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICMyNAotICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0KLSAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzI0Ci0gICAgICAgIE1fU1RSQiAgdDEsIFtwUTBdLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgTU9WICAgICB0MSwgUV8wLCBMU1IgIzE2Ci0gICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXQotICAgICAgICBNT1YgICAgIHQxLCBQXzAsIExTUiAjMTYKLSAgICAgICAgTV9TVFJCICB0MSwgW3BRMF0sIHNyY2RzdFN0ZXAKLQotICAgICAgICBNT1YgICAgIHQxLCBQXzAsIExTUiAjOAotICAgICAgICBTVFJCICAgIHQxLCBbcFEwXQotICAgICAgICBTVFJCICAgIFBfMCwgW3BRMCwgc3JjZHN0U3RlcF0KLSAgICAgICAgTU9WICAgICB0MSwgUV8wLCBMU1IgIzgKLSAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdIQotICAgICAgICBTVFJCICAgIFFfMCwgW3BRMCwgc3JjZHN0U3RlcF0KLQotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci0KLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFgKLQotOy8vLS0tLS0tLS0gQ29tbW9uIEV4aXQgb2YgTG9vcFkgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVycyAKLQotRXhpdExvb3BZCi0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICM4Ci0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgIHBCUywgcEJTLCAjMTQgCi0gICAgICAgIFNVQiAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNgotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLQotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIEJORSAgICAgTG9vcFkKLSAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIKLTsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgTV9FTkQKLQotICAgICAgICBFTkRJRiAgICAgICAgCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZmJmYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotCi0gICAgCi0KLSAgICBJRiBBUk0xMTM2SlMKLQotCi1NQVNLXzAgICAgICBFUVUgMHgwMDAwMDAwMCAgIAotTUFTS18xICAgICAgRVFVIDB4MDEwMTAxMDEKLU1BU0tfMiAgICAgIEVRVSAweGZmMDBmZjAwCi1MT09QX0NPVU5UICBFUVUgMHgxMTExMDAwMAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcFNyY0RzdCAgICAgUk4gMAotc3JjZHN0U3RlcCAgUk4gMQotcEFscGhhQXJnICAgUk4gMgotcEJldGFBcmcgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiAxNAotcEJTICAgICAgICAgUk4gOQotcFEwICAgICAgICAgUk4gMAotYlMgICAgICAgICAgUk4gMgotCi1hbHBoYSAgICAgICBSTiA2Ci1hbHBoYTAgICAgICBSTiA2Ci1hbHBoYTEgICAgICBSTiA4Ci0KLWJldGEgICAgICAgIFJOIDcKLWJldGEwICAgICAgIFJOIDcKLWJldGExICAgICAgIFJOIDkKLQotOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcwotCi07Ly8gUGl4ZWxzCi1wXzAgICAgICAgICBSTiAzICAKLXBfMSAgICAgICAgIFJOIDUgIAotcF8yICAgICAgICAgUk4gNCAgCi1wXzMgICAgICAgICBSTiAyICAKLXFfMCAgICAgICAgIFJOIDggIAotcV8xICAgICAgICAgUk4gOSAgCi1xXzIgICAgICAgICBSTiAxMCAKLXFfMyAgICAgICAgIFJOIDEyIAotCi07Ly8gRmlsdGVyaW5nCi0KLWRwMHEwICAgICAgIFJOIDEyCi1kcDFwMCAgICAgICBSTiAxMgotZHExcTAgICAgICAgUk4gMTIKLWRwMnAwICAgICAgIFJOIDEyCi1kcTJxMCAgICAgICBSTiAxMgotICAgICAgICAgICAgCi1hcDBxMCAgICAgICBSTiAxICAKLWZpbHQgICAgICAgIFJOIDIKLSAgICAgICAgCi1tMDAgICAgICAgICBSTiAxNAotbTAxICAgICAgICAgUk4gMTEKLSAgICAgICAgICAgIAotYXBmbGcgICAgICAgUk4gMCAKLWFxZmxnICAgICAgIFJOIDYKLWFwcWZsZyAgICAgIFJOIDAKLSAgICAgICAgICAgIAotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAotCi10QzAgICAgICAgICBSTiA3Ci1wdEMwICAgICAgICBSTiAxCi0KLXBRMGEgICAgICAgIFJOIDAgICAgCi1TdGVwYSAgICAgICBSTiAxICAgIAotbWFza2EgICAgICAgUk4gMTQKLSAgICAgICAgICAgIAotUDBhICAgICAgICAgUk4gMQotUDFhICAgICAgICAgUk4gOAotUTBhICAgICAgICAgUk4gNwotUTFhICAgICAgICAgUk4gMTEKLSAgICAgICAgICAgIAotOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKLQotcFEwYiAgICAgICAgUk4gMAotU3RlcGIgICAgICAgUk4gMQotbWFza2IgICAgICAgUk4gMTQKLSAgICAgICAgICAgIAotUDBiICAgICAgICAgUk4gNgotUDFiICAgICAgICAgUk4gNwotUDJiICAgICAgICAgUk4gMQotUDNiICAgICAgICAgUk4gMwotICAgICAgICAgICAgCi1RMGIgICAgICAgICBSTiA5IAotUTFiICAgICAgICAgUk4gMCAgIAotUTJiICAgICAgICAgUk4gMiAKLVEzYiAgICAgICAgIFJOIDMgCi0KLTsvLyBNaXNjZWxsYW5vdXMKLVhZICAgICAgICAgIFJOIDgKLXQwICAgICAgICAgIFJOIDMgCi10MSAgICAgICAgICBSTiAxMgotdDIgICAgICAgICAgUk4gMTQKLXQ3ICAgICAgICAgIFJOIDcKLXQ0ICAgICAgICAgIFJOIDQKLXQ1ICAgICAgICAgIFJOIDEgIAotdDggICAgICAgICAgUk4gNiAgCi1hICAgICAgICAgICBSTiAwCi0KLSAgICAgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAotICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAotICAgICAgICBNX0FMTE9DNCBwUV8zLDQKLSAgICAgICAgTV9BTExPQzQgcFBfMyw0Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAotICAgICAgICBNX0FMTE9DOCBwWFlCUyw0Ci0gICAgICAgIE1fQUxMT0M0IHBwQlMsNAotICAgICAgICBNX0FMTE9DOCBwcFEwU3RlcCw0Ci0gICAgICAgIE1fQUxMT0M0IHBTdGVwLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAotCi0gICAgICAgIExEUiAgICAgdDQsPU1BU0tfMQotCi0gICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQotICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQotICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KLSAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KLQotICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCB0NAotICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgdDQKLSAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgdDQKLSAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIHQ0Ci0KLSAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAotICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAotICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZwotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKLSAgICAgICAgTV9TVFIgICBzcmNkc3RTdGVwLCBwU3RlcAotICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLUxvb3BZCi1Mb29wWAotOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1fU1RSICAgcFEwLCBwcFEwU3RlcAotICAgICAgICBNX0xEUiAgIHBfMywgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgTV9MRFIgICBwXzIsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIE1fU1RSICAgcF8zLCBwUF8zCi0gICAgICAgIExEUkIgICAgYlMsIFtwQlNdLCAjMQotICAgICAgICBNX1NUUiAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgIHBfMSwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQ01QICAgICBiUywgIzAKLSAgICAgICAgTV9MRFIgICBwXzAsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHFfMSwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgTV9MRFIgICBxXzIsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8zLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBCRVEgICAgIE5vRmlsdGVyQlMwCi0gICAgICAgIENNUCAgICAgYlMsICM0Ci0gICAgICAgIE1fU1RSICAgcV8zLCBwUV8zCi0KLTsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAotICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCi0KLSAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCi0gICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCi0gICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCi0gICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBtMDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgOy8vIENoZWNrIGFwPEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHAycDAsIHBfMiwgcF8wCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzIKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcDJwMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBhcGZsZywgbTAwLCBmaWx0ICAgICAgICAgICAgOy8vIGFwZmxnID0gZmlsdCAmJiAoYXA8YmV0YSkKLQotICAgICAgICA7Ly8gQ2hlY2sgYXE8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcTJxMCwgcV8yLCBxXzAKLSAgICAgICAgVVNVQjggICB0MiwgcV8wLCBxXzIKLSAgICAgICAgU0VMICAgICB0MiwgdDIsIGRxMnEwCi0gICAgICAgIFVTVUI4ICAgdDIsIHQyLCBiZXRhCi0gICAgICAgIE1PViAgICAgdDcsIzAKLQotICAgICAgICBCTFQgICAgIGJTTFQ0ICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotYlNHRTQgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgU0VMICAgICB0MSwgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotICAgICAgICBPUlIgICAgIGFwcWZsZywgYXBmbGcsIHQxLCBMU0wgIzEKLSAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTU9WICAgICBwXzIsIFExYgotICAgICAgICBNT1YgICAgIHBfMSwgUDJiCi0gICAgICAgIE1fTERSRCAgcFEwYiwgU3RlcGIsIHBwUTBTdGVwCi0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsICMxCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX1NUUiAgIHBfMSwgW3BRMGIsIFN0ZXBiXSEKLSAgICAgICAgTV9TVFIgICBQMWIsIFtwUTBiLCBTdGVwYl0hCi0gICAgICAgIE1fU1RSICAgUDBiLCBbcFEwYiwgU3RlcGJdIQotICAgICAgICBNX1NUUiAgIFEwYiwgW3BRMGIsIFN0ZXBiXSEKLSAgICAgICAgU1RSICAgICBwXzIsIFtwUTBiLCBTdGVwYl0KLSAgICAgICAgU1RSICAgICBRMmIsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQotCi0KLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBTVUIgICAgIHBRMCwgcFEwYiwgU3RlcGIsIExTTCAjMgotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotICAgICAgICBCICAgICAgIEV4aXRMb29wWQotCi07Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KLTsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQotCi1Ob0ZpbHRlckJTMAotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzMKLU5vRmlsdGVyRmlsdDAKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLSAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzEKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLQotYlNMVDQgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgU0VMICAgICBhcWZsZywgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKLSAgICAgICAgTV9MRFIgICBwdEMwLCBwcFRocmVzaG9sZHMKLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotICAgICAgICAKLSAgICAgICAgTERSQiAgICB0QzAsIFtwdEMwXSwgIzEKLSAgICAgICAgTV9TVFIgICBwdEMwLCBwcFRocmVzaG9sZHMKLQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLQotICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTU9WICAgICBwXzIsIFAwYQotICAgICAgICBNX0xEUkQgIHBRMGEsIFN0ZXBhLCBwcFEwU3RlcAotICAgICAgICBNX1NUUiAgIFAxYSwgW3BRMGEsIFN0ZXBhLCBMU0wgIzFdIQotICAgICAgICBNX1NUUiAgIHBfMiwgW3BRMGEsIFN0ZXBhXSEKLSAgICAgICAgTV9TVFIgICBRMGEsIFtwUTBhLCBTdGVwYV0hCi0gICAgICAgIFNUUiAgICAgUTFhLCBbcFEwYSwgU3RlcGFdCi0gICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIKLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTBhLCBTdGVwYSwgTFNMICMyCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci0KLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFgKLSAgICAgICAgCi07Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAotRXhpdExvb3BZCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMxNgotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgTV9TVFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBCTkUgICAgIExvb3BZCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCi07Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYgICAgICAgIAotICAgICAgICAKLQotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkZjI3Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgICAgIAotICAgIAotICAgIElGIEFSTTExMzZKUwotCi1NQVNLXzAgICAgICBFUVUgMHgwMDAwMDAwMCAgIAotTUFTS18xICAgICAgRVFVIDB4MDEwMTAxMDEKLU1BU0tfMiAgICAgIEVRVSAweGZmMDBmZjAwCi1MT09QX0NPVU5UICBFUVUgMHgxMTExMDAwMAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcFNyY0RzdCAgICAgUk4gMAotc3JjZHN0U3RlcCAgUk4gMQotcEFscGhhQXJnICAgUk4gMgotcEJldGFBcmcgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiAxNAotcEJTICAgICAgICAgUk4gOQotcFEwICAgICAgICAgUk4gMAotYlMgICAgICAgICAgUk4gMgotCi1hbHBoYSAgICAgICBSTiA2Ci1hbHBoYTAgICAgICBSTiA2Ci1hbHBoYTEgICAgICBSTiA4Ci0KLWJldGEgICAgICAgIFJOIDcKLWJldGEwICAgICAgIFJOIDcKLWJldGExICAgICAgIFJOIDkKLQotOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcwotCi07Ly8gUGl4ZWxzCi1wXzAgICAgICAgICBSTiAzICAKLXBfMSAgICAgICAgIFJOIDUgIAotcF8yICAgICAgICAgUk4gNCAgCi1wXzMgICAgICAgICBSTiAyICAKLXFfMCAgICAgICAgIFJOIDggIAotcV8xICAgICAgICAgUk4gOSAgCi1xXzIgICAgICAgICBSTiAxMCAKLXFfMyAgICAgICAgIFJOIDEyIAotCi07Ly8gVW5wYWNraW5nCi1tYXNrICAgICAgICBSTiAxMSAKLQotcm93MCAgICAgICAgUk4gMgotcm93MSAgICAgICAgUk4gNAotcm93MiAgICAgICAgUk4gNQotcm93MyAgICAgICAgUk4gMwotCi1yb3c0ICAgICAgICBSTiA4Ci1yb3c1ICAgICAgICBSTiA5Ci1yb3c2ICAgICAgICBSTiAxMAotcm93NyAgICAgICAgUk4gMTIKLXJvdzggICAgICAgIFJOIDE0Ci1yb3c5ICAgICAgICBSTiA3Ci0gICAgICAgICAgICAKLXR1bnBrMCAgICAgIFJOIDgKLXR1bnBrMSAgICAgIFJOIDkKLXR1bnBrMiAgICAgIFJOIDEwCi10dW5wazMgICAgICBSTiAxMgotdHVucGs0ICAgICAgUk4gMAotCi10dW5wazUgICAgICBSTiAxCi10dW5wazYgICAgICBSTiAxNAotdHVucGs3ICAgICAgUk4gMiAKLXR1bnBrOCAgICAgIFJOIDUgCi10dW5wazkgICAgICBSTiA2IAotIAotCi07Ly8gRmlsdGVyaW5nCi0KLWRwMHEwICAgICAgIFJOIDEyCi1kcDFwMCAgICAgICBSTiAxMgotZHExcTAgICAgICAgUk4gMTIKLWRwMnAwICAgICAgIFJOIDEyCi1kcTJxMCAgICAgICBSTiAxMgotICAgICAgICAgICAgCi1hcDBxMCAgICAgICBSTiAxICAKLWZpbHQgICAgICAgIFJOIDIKLSAgICAgICAgCi1tMDAgICAgICAgICBSTiAxNAotbTAxICAgICAgICAgUk4gMTEKLSAgICAgICAgICAgIAotYXBmbGcgICAgICAgUk4gMCAKLWFxZmxnICAgICAgIFJOIDYKLWFwcWZsZyAgICAgIFJOIDAKLSAgICAgICAgICAgIAotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAotCi10QzAgICAgICAgICBSTiA3Ci1wdEMwICAgICAgICBSTiAxCi0KLXBRMGEgICAgICAgIFJOIDAgICAgCi1TdGVwYSAgICAgICBSTiAxICAgIAotbWFza2EgICAgICAgUk4gMTQKLSAgICAgICAgICAgIAotUDBhICAgICAgICAgUk4gMQotUDFhICAgICAgICAgUk4gOAotUTBhICAgICAgICAgUk4gNwotUTFhICAgICAgICAgUk4gMTEKLSAgICAgICAgICAgIAotOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKLQotcFEwYiAgICAgICAgUk4gMAotU3RlcGIgICAgICAgUk4gMQotbWFza2IgICAgICAgUk4gMTQKLSAgICAgICAgICAgIAotUDBiICAgICAgICAgUk4gNgotUDFiICAgICAgICAgUk4gNwotUDJiICAgICAgICAgUk4gMQotUDNiICAgICAgICAgUk4gMwotICAgICAgICAgICAgCi1RMGIgICAgICAgICBSTiA5IAotUTFiICAgICAgICAgUk4gMCAgIAotUTJiICAgICAgICAgUk4gMiAKLVEzYiAgICAgICAgIFJOIDMgCi0KLTsvLyBNaXNjZWxsYW5vdXMKLVhZICAgICAgICAgIFJOIDgKLXQwICAgICAgICAgIFJOIDMgCi10MSAgICAgICAgICBSTiAxMgotdDIgICAgICAgICAgUk4gMTQKLXQ3ICAgICAgICAgIFJOIDcKLXQ0ICAgICAgICAgIFJOIDQKLXQ1ICAgICAgICAgIFJOIDEgIAotdDggICAgICAgICAgUk4gNiAgCi1hICAgICAgICAgICBSTiAwCi0KLSAgICAgICAgICAgIAotCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCi0gICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0Ci0gICAgICAgIE1fQUxMT0M0IHBRXzMsNAotICAgICAgICBNX0FMTE9DNCBwUF8zLDQKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4Ci0gICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKLSAgICAgICAgTV9BTExPQzQgcHBCUyw0Ci0gICAgICAgIE1fQUxMT0M4IHBwUTBTdGVwLDQKLSAgICAgICAgTV9BTExPQzQgcFN0ZXAsNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgIHQ0LD1NQVNLXzEKLQotICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KLSAgICAgICAgTERSQiAgICBiZXRhMCwgIFtwQmV0YUFyZ10KLSAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCi0gICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCi0KLSAgICAgICAgTVVMICAgICBhbHBoYTAsIGFscGhhMCwgdDQKLSAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIHQ0Ci0gICAgICAgIE1VTCAgICAgYWxwaGExLCBhbHBoYTEsIHQ0Ci0gICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCB0NAotCi0gICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKLSAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIExEUiAgICAgWFksPUxPT1BfQ09VTlQKLSAgICAgICAgTV9MRFIgICBwQlMsIHBwQlNBcmcKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCi0gICAgICAgIE1fU1RSICAgc3JjZHN0U3RlcCwgcFN0ZXAKLSAgICAgICAgTV9TVFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICM0Ci1Mb29wWQotOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHAwLXAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgIHJvdzAsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAotICAgICAgICBNX0xEUiAgIHJvdzEsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAotICAgICAgICBMRFIgICAgIHJvdzIsIFtwUTBdCi0gICAgICAgIExEUiAgICAgcm93MywgW3BRMCwgc3JjZHN0U3RlcF0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIAotICAgICAgICA7Ly8gcm93MCA9IFtyMHAwIHIwcDEgcjBwMiByMHAzXQotICAgICAgICA7Ly8gcm93MSA9IFtyMXAwIHIxcDEgcjFwMiByMXAzXQotICAgICAgICA7Ly8gcm93MiA9IFtyMnAwIHIycDEgcjJwMiByMnAzXQotICAgICAgICA7Ly8gcm93MyA9IFtyM3AwIHIzcDEgcjNwMiByM3AzXQotCi0gICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrLCByb3cwCi0gICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3cwLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCByb3cxLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNiwgdHVucGs2LCByb3cxCi0gICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrLCByb3cyCi0gICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrLCByb3cyLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCByb3czLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCByb3czCi0KLSAgICAgICAgOy8vIHR1bnBrMCA9IFtyMHAwIHIxcDAgcjBwMiByMXAyXQotICAgICAgICA7Ly8gdHVucGs2ID0gW3IwcDEgcjFwMSByMHAzIHIxcDNdCi0gICAgICAgIDsvLyB0dW5wazIgPSBbcjJwMCByM3AwIHIycDIgcjNwMl0KLSAgICAgICAgOy8vIHR1bnBrMyA9IFtyMnAxIHIzcDEgcjJwMyByM3AzXQotCi0gICAgICAgIFBLSFRCICAgcF8wLCB0dW5wazAsIHR1bnBrMiwgQVNSIzE2Ci0gICAgICAgIFBLSFRCICAgcF8xLCB0dW5wazYsIHR1bnBrMywgQVNSIzE2Ci0gICAgICAgIFBLSEJUICAgcF8yLCB0dW5wazIsIHR1bnBrMCwgTFNMIzE2Ci0gICAgICAgIFBLSEJUICAgcF8zLCB0dW5wazMsIHR1bnBrNiwgTFNMIzE2Ci0KLQotICAgICAgICA7Ly8gcF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCi0gICAgICAgIDsvLyBwXzEgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KLSAgICAgICAgOy8vIHBfMiA9IFtyMHAyIHIxcDIgcjJwMSByM3AyXQotICAgICAgICA7Ly8gcF8zID0gW3IwcDMgcjFwMyByMnAzIHIzcDNdCi0KLSAgICAgICAgTV9TVFIgICBwXzMsIHBQXzMKLQotOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcTAtcTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTG9vcFgKLSAgICAgICAgTERSQiAgICBiUywgW3BCU10sICM0Ci0gICAgICAgIE1fU1RSICAgcFEwLCBwcFEwU3RlcAotICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKLSAgICAgICAgQ01QICAgICBiUywgIzAKLSAgICAgICAgTV9TVFIgICBwQlMsIHBwQlMKLQotICAgICAgICBMRFIgICAgIHJvdzQsIFtwUTAsICM0XSEKLSAgICAgICAgQkVRLlcgICBOb0ZpbHRlckJTMAotICAgICAgICBNX0xEUiAgIHJvdzUsIFtwUTAsIHNyY2RzdFN0ZXBdIQotICAgICAgICBNX0xEUiAgIHJvdzYsIFtwUTAsIHNyY2RzdFN0ZXBdIQotICAgICAgICBNX0xEUiAgIHJvdzcsIFtwUTAsIHNyY2RzdFN0ZXBdCi0KLSAgICAgICAgOy8vIHJvdzQgPSBbcjBxMyByMHEyIHIwcTEgcjBxMF0KLSAgICAgICAgOy8vIHJvdzUgPSBbcjFxMyByMXEyIHIxcTEgcjFxMF0KLSAgICAgICAgOy8vIHJvdzYgPSBbcjJxMyByMnEyIHIycTEgcjJxMF0KLSAgICAgICAgOy8vIHJvdzcgPSBbcjNxMyByM3EyIHIzcTEgcjNxMF0KLSAgICAKLSAgICAgICAgQU5EICAgICB0dW5wazQsIG1hc2ssIHJvdzQKLSAgICAgICAgQ01QICAgICBiUywgIzQKLSAgICAgICAgQU5EICAgICB0dW5wazUsIG1hc2ssIHJvdzQsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs0LCB0dW5wazQsIHJvdzUsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs1LCB0dW5wazUsIHJvdzUKLSAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzYKLSAgICAgICAgQU5EICAgICB0dW5wazcsIG1hc2ssIHJvdzYsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs2LCB0dW5wazYsIHJvdzcsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs3LCB0dW5wazcsIHJvdzcKLQotICAgICAgICA7Ly8gdHVucGs0ID0gW3IwcTAgcjFxMCByMHEyIHIxcTJdCi0gICAgICAgIDsvLyB0dW5wazUgPSBbcjBxMSByMXExIHIwcTMgcjFxM10KLSAgICAgICAgOy8vIHR1bnBrNiA9IFtyMnEwIHIzcTAgcjJxMiByM3EyXQotICAgICAgICA7Ly8gdHVucGs3ID0gW3IycTEgcjNxMSByMnEzIHIzcTNdCi0KLSAgICAgICAgUEtIVEIgICBxXzMsIHR1bnBrNCwgdHVucGs2LCBBU1IjMTYKLSAgICAgICAgUEtIVEIgICBxXzIsIHR1bnBrNSwgdHVucGs3LCBBU1IjMTYKLSAgICAgICAgUEtIQlQgICBxXzEsIHR1bnBrNiwgdHVucGs0LCBMU0wjMTYKLSAgICAgICAgTV9TVFIgICBxXzMsIHBRXzMKLSAgICAgICAgUEtIQlQgICBxXzAsIHR1bnBrNywgdHVucGs1LCBMU0wjMTYKLQotCi0gICAgICAgIDsvLyBxXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KLSAgICAgICAgOy8vIHFfMSA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQotICAgICAgICA7Ly8gcV8yID0gW3IwcTIgcjFxMiByMnExIHIzcTJdCi0gICAgICAgIDsvLyBxXzMgPSBbcjBxMyByMXEzIHIycTMgcjNxM10KLQotCi07Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xICAgICAgICAgICAgICAgIDsvLyAgMDEwMTAxMDEgbWFzayAKLSAgICAgICAgTU9WICAgICBtMDAsICNNQVNLXzAgICAgICAgICAgICAgICAgOy8vICAwMDAwMDAwMCBtYXNrIAotCi0gICAgICAgIDsvLyBDaGVjayB8cDAtcTB8PEFscGhhIAotICAgICAgICBVU1VCOCAgIGRwMHEwLCBwXzAsIHFfMCAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHBfMAotICAgICAgICBTRUwgICAgIGFwMHEwLCBhLCBkcDBxMAotICAgICAgICBVU1VCOCAgIGEsIGFwMHEwLCBhbHBoYQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgbTAxCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgfHAxLXAwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMXAwLCBwXzEsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAxcDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgOy8vIENoZWNrIHxxMS1xMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcTFxMCwgcV8xLCBxXzAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHFfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRxMXEwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIDsvLyBDaGVjayBhcDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMnAwLCBwXzIsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8yCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAycDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgYXBmbGcsIG0wMCwgZmlsdCAgICAgICAgICAgIDsvLyBhcGZsZyA9IGZpbHQgJiYgKGFwPGJldGEpCi0KLSAgICAgICAgOy8vIENoZWNrIGFxPEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHEycTAsIHFfMiwgcV8wCi0gICAgICAgIFVTVUI4ICAgdDIsIHFfMCwgcV8yCi0gICAgICAgIFNFTCAgICAgdDIsIHQyLCBkcTJxMAotICAgICAgICBVU1VCOCAgIHQyLCB0MiwgYmV0YQotICAgICAgICBNT1YgICAgIHQ3LCMwCi0gICAgICAgIAotCi0gICAgICAgIEJMVCAgICAgYlNMVDQgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi1iU0dFNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBTRUwgICAgIHQxLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0gICAgICAgIE9SUiAgICAgYXBxZmxnLCBhcGZsZywgdDEsIExTTCAjMQotICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgTERSICAgICBtYXNrYiw9TUFTS18yCi0KLSAgICAgICAgOy8vIFAwYiA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gUDFiID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCi0gICAgICAgIDsvLyBQMmIgPSBbcjBwMiByMXAyIHIycDIgcjNwMl0KLSAgICAgICAgOy8vIFAzYiA9IFtyMHAzIHIxcDMgcjJwMyByM3AzXQotCi0gICAgICAgIE1fTERSICAgUDNiLCBwUF8zICAgCi0gICAgICAgIE1fU1RSICAgUTBiLCBwUF8zICAgCi0KLSAgICAgICAgOy8vLS0tLS0tUGFjayBwMC1wMy0tLS0tLQotICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFza2IsIFAwYgotICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2IsIFAwYiwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgUDFiLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBQMWIKLQotICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2IsIFAyYgotICAgICAgICBBTkQgICAgIHR1bnBrOCwgbWFza2IsIFAyYiwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgUDNiLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrOCwgdHVucGs4LCBQM2IKLQotICAgICAgICA7Ly8gdHVucGswID0gW3IwcDAgcjBwMSByMnAwIHIycDFdCi0gICAgICAgIDsvLyB0dW5wazIgPSBbcjFwMCByMXAxIHIzcDAgcjNwMV0KLSAgICAgICAgOy8vIHR1bnBrMyA9IFtyMHAyIHIwcDMgcjJwMiByMnAzXQotICAgICAgICA7Ly8gdHVucGs4ID0gW3IxcDIgcjFwMyByM3AyIHIzcDNdCi0KLSAgICAgICAgTU9WICAgICBwXzIsIFExYgotICAgICAgICBNX0xEUkQgIHBRMGIsIFN0ZXBiLCBwcFEwU3RlcAotCi0gICAgICAgIFBLSFRCICAgcm93OSwgdHVucGswLCB0dW5wazMsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHJvdzcsIHR1bnBrMywgdHVucGswLCBMU0wjMTYKLSAgICAgICAgUEtIVEIgICByb3czLCB0dW5wazIsIHR1bnBrOCwgQVNSIzE2Ci0gICAgICAgIFBLSEJUICAgcm93NiwgdHVucGs4LCB0dW5wazIsIExTTCMxNgotCi0gICAgICAgIDsvLyByb3c5ID0gW3IwcDAgcjBwMSByMHAyIHIwcDNdCi0gICAgICAgIDsvLyByb3czID0gW3IxcDAgcjFwMSByMXAyIHIxcDNdCi0gICAgICAgIDsvLyByb3c3ID0gW3IycDAgcjJwMSByMnAyIHIycDNdCi0gICAgICAgIDsvLyByb3c2ID0gW3IzcDAgcjNwMSByM3AyIHIzcDNdCi0KLSAgICAgICAgTV9TVFIgICByb3c5LCBbcFEwYl0sIFN0ZXBiCi0gICAgICAgIFNUUiAgICAgcm93NywgW3BRMGIsIFN0ZXBiXQotICAgICAgICBTVFIgICAgIHJvdzYsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQotICAgICAgICBTVFIgICAgIHJvdzMsIFtwUTBiXSwgIzQKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgUTNiLCBwUV8zCi0KLSAgICAgICAgOy8vIFEwYiA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQotICAgICAgICA7Ly8gUTFiID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCi0gICAgICAgIDsvLyBRMmIgPSBbcjBxMiByMXEyIHIycTIgcjNxMl0KLSAgICAgICAgOy8vIFEzYiA9IFtyMHEzIHIxcTMgcjJxMyByM3EzXQotCi0gICAgICAgIDsvLy0tLS0tLVBhY2sgcTAtcTMtLS0tLS0KLSAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2tiLCBwXzIKLSAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2tiLCBwXzIsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIFEwYiwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUTBiCi0KLSAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2tiLCBRM2IKLSAgICAgICAgQU5EICAgICB0dW5wazgsIG1hc2tiLCBRM2IsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFEyYiwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazgsIHR1bnBrOCwgUTJiCi0KLSAgICAgICAgOy8vIHR1bnBrMCA9IFtyMHExIHIwcTAgcjJxMSByMnEwXQotICAgICAgICA7Ly8gdHVucGsyID0gW3IxcTEgcjFxMCByM3ExIHIzcTBdCi0gICAgICAgIDsvLyB0dW5wazMgPSBbcjBxMyByMHEyIHIycTMgcjJxMl0KLSAgICAgICAgOy8vIHR1bnBrOCA9IFtyMXEzIHIxcTIgcjNxMyByM3EyXQotCi0gICAgICAgIFBLSFRCICAgcm93OCwgdHVucGszLCB0dW5wazAsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHJvdzcsIHR1bnBrMCwgdHVucGszLCBMU0wjMTYKLSAgICAgICAgUEtIVEIgICByb3c0LCB0dW5wazgsIHR1bnBrMiwgQVNSIzE2Ci0gICAgICAgIFBLSEJUICAgcm93NiwgdHVucGsyLCB0dW5wazgsIExTTCMxNgotCi0gICAgICAgIDsvLyByb3c4ID0gW3IwcTAgcjBxMSByMHEyIHIwcTNdCi0gICAgICAgIDsvLyByb3c0ID0gW3IxcTAgcjFxMSByMXEyIHIxcTNdCi0gICAgICAgIDsvLyByb3c3ID0gW3IycTAgcjJxMSByMnEyIHIycTNdCi0gICAgICAgIDsvLyByb3c2ID0gW3IzcTAgcjNxMSByM3EyIHIzcTNdCi0KLSAgICAgICAgU1RSICAgICByb3c0LCBbcFEwYl0KLSAgICAgICAgU1RSICAgICByb3c3LCBbcFEwYiwgU3RlcGJdCi0gICAgICAgIFNUUiAgICAgcm93NiwgW3BRMGIsIFN0ZXBiLCBMU0wgIzFdCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMGIsIFN0ZXBiCi0gICAgICAgIE1PViAgICAgcF8xLCBRMmIKLQotICAgICAgICBTVFIgICAgIHJvdzgsIFtwUTBdCi0KLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLQotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLQotOy8vLS0tLS0tLS0tLSBFeGl0IG9mIExvb3BYIC0tLS0tLS0tLS0tLS0tCi07Ly8tLS0tIGZvciB0aGUgY2FzZSBvZiBubyBmaWx0ZXJpbmcgLS0tLS0KLQotTm9GaWx0ZXJGaWx0MAotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotTm9GaWx0ZXJCUzAKLSAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWQotICAgICAgICBCICAgICAgIEV4aXRMb29wWQotICAgICAgICAKLWJTTFQ0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNMVDQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFNFTCAgICAgYXFmbGcsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCi0gICAgICAgIE1fTERSICAgcHRDMCwgcHBUaHJlc2hvbGRzCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgdEMwLCBbcHRDMF0sICM0Ci0gICAgICAgIE1fU1RSICAgcHRDMCwgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLy0tLS0tLS0tUGFjayBwMSxwMCxxMSxxMC0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vTG9hZCBkZXN0aW5hdGlvbiBwb2ludGVyCi0gICAgICAgIExEUiAgICAgbWFza2EsPU1BU0tfMgotICAgICAgICBNX1NUUiAgIFEwYSwgcFBfMwotICAgICAgICBNT1YgICAgIHBfMSwgcV8yCi0KLSAgICAgICAgOy8vIFAxYSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQotICAgICAgICA7Ly8gUDBhID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCi0gICAgICAgIDsvLyBRMGEgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KLSAgICAgICAgOy8vIFExYSA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQotCi0gICAgICAgIEFORCAgICAgdHVucGsxLCBtYXNrYSwgUDBhCi0gICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYSwgUDBhLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMSwgdHVucGsxLCBQMWEsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFAxYQotCi0gICAgICAgIE1fTERSRCAgcFEwYSwgU3RlcGEsIHBwUTBTdGVwCi0KLSAgICAgICAgQU5EICAgICB0dW5wazksIG1hc2thLCBRMWEKLSAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2thLCBRMWEsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs5LCB0dW5wazksIFEwYSwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgUTBhCi0KLSAgICAgICAgOy8vIHR1bnBrMSA9IFtyMHAwIHIwcDEgcjJwMCByMnAxXQotICAgICAgICA7Ly8gdHVucGsyID0gW3IxcDAgcjFwMSByM3AwIHIzcDFdCi0gICAgICAgIDsvLyB0dW5wazkgPSBbcjBxMSByMHEwIHIycTEgcjJxMF0KLSAgICAgICAgOy8vIHR1bnBrMyA9IFtyMXExIHIxcTAgcjNxMSByM3EwXQotCi0gICAgICAgIE1PViAgICAgdDQsIHR1bnBrMSwgTFNSICMxNgotICAgICAgICBNT1YgICAgIHQwLCB0dW5wazksIExTUiAjMTYKLQotICAgICAgICBTVFJIICAgIHQ0LFtwUTBhLCAjMl0hICAgICAgICAgIDsvL1N0b3JlcyBbcjBwMCByMHAxXQotICAgICAgICBTVFJIICAgIHQwLFtwUTBhLCAjMl0gICAgICAgICAgIDsvL1N0b3JlcyBbcjBxMCByMHExXQotCi0gICAgICAgIE1PViAgICAgdDQsIHR1bnBrMiwgTFNSICMxNgotICAgICAgICBNT1YgICAgIHQwLCB0dW5wazMsIExTUiAjMTYKLQotICAgICAgICBNX1NUUkggIHQ0LFtwUTBhLCBTdGVwYV0hICAgICAgIDsvL1N0b3JlcyBbcjFwMCByMXAxXQotICAgICAgICBTVFJIICAgIHQwLFtwUTBhLCAjMl0gICAgICAgICAgIDsvL1N0b3JlcyBbcjFxMCByMXExXQotICAgICAgICAKLSAgICAgICAgTV9TVFJIICB0dW5wazEsW3BRMGEsIFN0ZXBhXSEgICA7Ly9TdG9yZXMgW3IycDAgcjJwMV0KLSAgICAgICAgU1RSSCAgICB0dW5wazIsW3BRMGEsIFN0ZXBhXSAgICA7Ly9TdG9yZXMgW3IzcDAgcjNwMV0KLSAgICAgICAgU1RSSCAgICB0dW5wazksW3BRMGEsICMyXSEgICAgICAgIDsvL1N0b3JlcyBbcjJxMCByMnExXQotICAgICAgICBTVFJIICAgIHR1bnBrMyxbcFEwYSwgU3RlcGFdICAgIDsvL1N0b3JlcyBbcjNxMCByM3ExXQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTBhLCBTdGVwYSwgTFNMICMxCi0KLSAgICAgICAgOy8vIExvYWQgY291bnRlcgotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0KLSAgICAgICAgOy8vIFJlbG9hZCBQaXhlbHMKLSAgICAgICAgTV9MRFIgICBwXzAsIHBRXzMKLSAgICAgICAgTU9WICAgICBwXzIsIFExYQotICAgICAgICAgICAgICAgIAotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0gICAgICAgIAotOy8vLS0tLS0tLS0gQ29tbW9uIEV4aXQgb2YgTG9vcFkgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVycyAKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi1FeGl0TG9vcFkKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzE2Ci0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgIHBCUywgcEJTLCAjMTUKLSAgICAgICAgU1VCICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMxNQotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLQotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIEJORSAgICAgTG9vcFkKLSAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIKLQotICAgICAgICBNX0VORAotOy8vLS0tLS0tLS0tLS0tLS0tLS1FbmQgRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEVORElGICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2QxODVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDEvOCBQaXhlbCBpbnRlcnBvbGF0aW9uIGZvciBDaHJvbWEgQmxvY2sKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmMJUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKLSAqIFtpbl0Jc3JjU3RlcCBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCi0gKiBbaW5dCWRzdFN0ZXAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aC4KLSAqIFtpbl0JZHgJCUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50Ci0gKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQotICogW2luXQlkeQkJRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50Ci0gKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQotICogW2luXQlyb2kJCURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LgotICogW291dF0JcERzdAlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgotICogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBPTVhfU3RzX0JhZEFyZ0VycjoKLSAqCXBTcmMgb3IgcERzdCBpcyBOVUxMLgotICoJc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4KLSAqCWR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4KLSAqCXJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LgotICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4KLSAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuCi0gKglyb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLgotICoJc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjLAotICAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX1MzMiBkc3RTdGVwLAotICAgICBPTVhfUzMyIGR4LAotICAgICBPTVhfUzMyIGR5LAotICAgICBPTVhTaXplIHJvaQotICkKLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEgCi0gICAgICAgICgoT01YX1U4KilwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2I0ZTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKLTsvLwotOy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSBpbiB2NiBhc3NlbWJseS4KLTsvLyBQZXJmb3JtcyBxdWFydGVyIHBlbCBpbnRlcnBvbGF0aW9uIG9mIGludGVyIGx1bWEgTUIuCi07Ly8gSXQncyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotOy8vIFBhcmFtZXRlcnM6Ci07Ly8gW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlcgotOy8vIFtpbl0gICAgc3JjU3RlcCAgICAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQotOy8vIFtpbl0gICAgZHN0U3RlcCAgICAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aAotOy8vIFtpbl0gICAgZHggICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvcgotOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdCi07Ly8gW2luXSAgICBkeSAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvcgotOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdCi07Ly8gW2luXSAgICByb2kgICAgICAgICBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0Ci07Ly8gICAgICAgICAgICAgICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LgotOy8vIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgotOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLTsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi07Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLTsvLwotOy8vIFJldHVybiBWYWx1ZToKLTsvLyBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuCi07Ly8gSXQgaXMgYXNzdWVkIHRoYXQgZm9sbG93aW5nIGNhc2VzIGFyZSBzYXRpc2ZpZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbjoKLTsvLyAgcFNyYyBvciBwRHN0IGlzIG5vdCBOVUxMLgotOy8vICBzcmNTdGVwIG9yIGRzdFN0ZXAgPj0gcm9pLndpZHRoLgotOy8vICAgICBkeCBvciBkeSBpcyBpbiB0aGUgcmFuZ2UgWzAtM10uCi07Ly8gICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG5vdCBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4KLTsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIERzdCBpcyA0IGJ5dGUgYWxpZ25lZC4KLTsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIHBEc3QgaXMgOCBieXRlIGFsaWduZWQuCi07Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byAxNiwgcERzdCBpcyAxNiBieXRlIGFsaWduZWQuCi07Ly8gICAgIHNyY1N0ZXAgYW5kIGRzdFN0ZXAgaXMgbXVsdGlwbGUgb2YgOC4KLTsvLwotOy8vCi0KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKLSAgICAgICAgCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQotICAgIEVORElGCi0KLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICBFTkRJRgotICAgIAotICAgIAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi1pSGVpZ2h0ICAgICAgICAgUk4gNAotaVdpZHRoICAgICAgICAgIFJOIDUKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotaWR4ICAgICAgICAgICAgIFJOIDYKLWlkeSAgICAgICAgICAgICBSTiA3Ci1pbmRleCAgICAgICAgICAgUk4gNgotVGVtcCAgICAgICAgICAgIFJOIDEyCi1wQXJncyAgICAgICAgICAgUk4gMTEKLQotCi0gICAgICAgIDsvLyBFbmQgb2YgQ29ydGV4QTgKLSAgICAgICAgICAgICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLQotCi0gICAgICAgIE1fQUxMT0M0IHBwRHN0LCA4Ci0gICAgICAgIE1fQUxMT0M0IHBwU3JjLCA4Ci0gICAgICAgIE1fQUxMT0M0IHBwQXJncywgMTYKLSAgICAgICAgTV9BTExPQzQgcEJ1ZmZlciwgMTIwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDEyMCA9IDEyeDEwCi0gICAgICAgIE1fQUxMT0M4IHBJbnRlckJ1ZiwgMTIwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxMjAgPSAxMio1KjIKLSAgICAgICAgTV9BTExPQzggcFRlbXBCdWYsIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDMyID0gIDgqNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICA7Ly8gSW50ZXJwb2xhdGlvbiBvZiBsdW1hIGlzIGltcGxlbWVudGVkIGJ5IHByb2Nlc3NpbmcgYmxvY2sgb2YgcGl4ZWxzLCBzaXplIDR4NCBhdCBhIHRpbWUuCi0gICAgICAgIDsvLyBEZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiBtb3Rpb24gdmVjdG9yIGZyYWN0aW9uYWwgcGFydHMgKGR4LGR5KSwgb25lIG91dCBvZiAxNiBjYXNlcyB3aWxsIGJlIHByb2Nlc3NlZC4KLSAgICAgICAgOy8vIFJlZ2lzdGVycyByNCwgcjUsIHI2IHRvIGJlIHByZXNlcnZlZCBieSBpbnRlcm5hbCB1bnNhZmUgZnVuY3Rpb25zCi0gICAgICAgIDsvLyByNCAtIGlIZWlnaHQKLSAgICAgICAgOy8vIHI1IC0gaVdpZHRoCi0gICAgICAgIDsvLyByNiAtIGluZGV4Ci0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIHIxMQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1pZHggICAgICAgICAgICAgUk4gNgotaWR5ICAgICAgICAgICAgIFJOIDcKLWluZGV4ICAgICAgICAgICBSTiA2Ci1UZW1wICAgICAgICAgICAgUk4gMTIKLXBBcmdzICAgICAgICAgICBSTiAxMQotCi1wQnVmICAgICAgICAgICAgUk4gOAotSGVpZ2h0ICAgICAgICAgIFJOIDkgCi1idWZTdGVwICAgICAgICAgUk4gOQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwdHJpZHgsIDQKLSAgICAgICAgTV9BUkcgICBwdHJpZHksIDQgICAgICAgIAotICAgICAgICBNX0FSRyAgIHB0cldpZHRoLCA0Ci0gICAgICAgIE1fQVJHICAgcHRySGVpZ2h0LCA0ICAgICAgICAKLQotICAgICAgICA7Ly8gTG9hZCBzdHJ1Y3R1cmUgZWxlbWVudHMgb2Ygcm9pIAotICAgICAgICBNX0xEUiAgIGlkeCwgcHRyaWR4Ci0gICAgICAgIE1fTERSICAgaWR5LCBwdHJpZHkKLSAgICAgICAgTV9MRFIgICBpV2lkdGgsIHB0cldpZHRoCi0gICAgICAgIE1fTERSICAgaUhlaWdodCwgcHRySGVpZ2h0Ci0gICAgICAgIAotICAgICAgICBNX1BSSU5URiAicm9pLndpZHRoICVkXG4iLCBpV2lkdGgKLSAgICAgICAgTV9QUklOVEYgInJvaS5oZWlnaHQgJWRcbiIsIGlIZWlnaHQKLQotICAgICAgICBBREQgICAgIGluZGV4LCBpZHgsIGlkeSwgTFNMICMyICAgICAgICAgICAgICAgICA7Ly8gIFtpbmRleF0gPSBbaWR5XVtpZHhdCi0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotCi1JbnRlcnBvbGF0ZUx1bWEKLUJsb2NrNHg0V2lkdGhMb29wCi1CbG9jazR4NEhlaWdodExvb3AKLQotICAgICAgICBTVE0gICAgIHBBcmdzLCB7cFNyYyxzcmNTdGVwLHBEc3QsZHN0U3RlcH0gCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIDsvLyBzd2l0Y2ggdGFibGUgdXNpbmcgbW90aW9uIHZlY3RvciBhcyBpbmRleAotICAgICAgICBNX1NXSVRDSCBpbmRleCwgTAotICAgICAgICBNX0NBU0UgIENhc2VfMAotICAgICAgICBNX0NBU0UgIENhc2VfMQotICAgICAgICBNX0NBU0UgIENhc2VfMgotICAgICAgICBNX0NBU0UgIENhc2VfMwotICAgICAgICBNX0NBU0UgIENhc2VfNAotICAgICAgICBNX0NBU0UgIENhc2VfNQotICAgICAgICBNX0NBU0UgIENhc2VfNgotICAgICAgICBNX0NBU0UgIENhc2VfNwotICAgICAgICBNX0NBU0UgIENhc2VfOAotICAgICAgICBNX0NBU0UgIENhc2VfOQotICAgICAgICBNX0NBU0UgIENhc2VfYQotICAgICAgICBNX0NBU0UgIENhc2VfYgotICAgICAgICBNX0NBU0UgIENhc2VfYwotICAgICAgICBNX0NBU0UgIENhc2VfZAotICAgICAgICBNX0NBU0UgIENhc2VfZQotICAgICAgICBNX0NBU0UgIENhc2VfZgotICAgICAgICBNX0VORFNXSVRDSAotCi1DYXNlXzAKLSAgICAgICAgOy8vIENhc2UgRwotICAgICAgICBNX1BSSU5URiAiQ2FzZSAwIFxuIgotCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLQotQ2FzZV8xCi0gICAgICAgIDsvLyBDYXNlIGEKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMSBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfMgotICAgICAgICA7Ly8gQ2FzZSBiCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDIgXG4iCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV8zCi0gICAgICAgIDsvLyBDYXNlIGMKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMyBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfNAotICAgICAgICA7Ly8gQ2FzZSBkCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDQgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzUKLSAgICAgICAgOy8vIENhc2UgZQotICAgICAgICBNX1BSSU5URiAiQ2FzZSA1IFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgCi0KLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfNgotICAgICAgICA7Ly8gQ2FzZSBmCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDYgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUgICAgCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzcKLSAgICAgICAgOy8vIENhc2UgZwotICAgICAgICBNX1BSSU5URiAiQ2FzZSA3IFxuIgotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9Ci0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0KLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfOAotICAgICAgICA7Ly8gQ2FzZSBoCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDggXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV85Ci0gICAgICAgIDsvLyBDYXNlIGkKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgOSBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYQotICAgICAgICA7Ly8gQ2FzZSBqCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGEgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9iCi0gICAgICAgIDsvLyBDYXNlIGsKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgYiBcbiIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgICAgCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2MKLSAgICAgICAgOy8vIENhc2UgbgotICAgICAgICBNX1BSSU5URiAiQ2FzZSBjIFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSBwU3JjIHRvIG9uZSByb3cgZG93bgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9kCi0gICAgICAgIDsvLyBDYXNlIHAKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgZCBcbiIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfZQotICAgICAgICA7Ly8gQ2FzZSBxCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGUgXG4iCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICM0ICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2YKLSAgICAgICAgOy8vIENhc2UgcgotICAgICAgICBNX1BSSU5URiAiQ2FzZSBmIFxuIgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9Ci0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0KLUJsb2NrNHg0TG9vcEVuZAotCi0gICAgICAgIDsvLyBXaWR0aCBMb29wCi0gICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICM0Ci0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYyxzcmNTdGVwLHBEc3QsZHN0U3RlcH0gIDsvLyBMb2FkIGFyZ3VtZW50cwotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICM0ICAgICAgCi0gICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgIzQKLSAgICAgICAgQkdUICAgICBCbG9jazR4NFdpZHRoTG9vcAotCi0gICAgICAgIDsvLyBIZWlnaHQgTG9vcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICM0Ci0gICAgICAgIE1fTERSICAgaVdpZHRoLCBwdHJXaWR0aAotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAKLSAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBpV2lkdGgKLSAgICAgICAgU1VCICAgICBwRHN0LCBwRHN0LCBpV2lkdGgKLSAgICAgICAgQkdUICAgICBCbG9jazR4NEhlaWdodExvb3AKLQotRW5kT2ZJbnRlcnBvbGF0aW9uCi0gICAgICAgIE1PViAgICAgcjAsICMwCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotICAgICAgICAgICAgICAgICAgICAKLQotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI0Y2Y2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4Ci0gICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLSAgICAgICAgIAotICAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgCi0gICAgIEFSRUEgdGFibGUsIERBVEEgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4Ci0gICAgRENEICBPTVhfVkNfQ0hST01BX0RDLCAgICAgT01YX1ZDX0NIUk9NQV9IT1IgCi0gICAgRENEICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORSAgCi0gICAgCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCwxCi0gICAgRENXICAgMywgMiwgMSw0IAotICAgIERDVyAgLTMsLTIsLTEsMAotICAgIERDVyAgIDEsIDIsIDMsNAotICAgIAotICAgIElGIEFSTTExMzZKUwotICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gQ29uc3RhbnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCi0KLUJMS19TSVpFICAgICAgICBFUVUgMHg4Ci1NVUxfQ09OU1QwICAgICAgRVFVIDB4MDEwMTAxMDEKLU1BU0tfQ09OU1QgICAgICBFUVUgMHgwMEZGMDBGRgotTVVMX0NPTlNUMSAgICAgIEVRVSAweDgwODA4MDgwCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXkgICAgICAgICAgICAgICBSTiAxMiAgIAotcGMgICAgICAgICAgICAgIFJOIDE1ICAgCi1yZXR1cm4gICAgICAgICAgUk4gMCAgICAKLXBTcmNMZWZ0MiAgICAgICBSTiAxICAgIAotcERzdDIgICAgICAgICAgIFJOIDIgICAgCi1zdW0xICAgICAgICAgICAgUk4gNiAgICAKLXN1bTIgICAgICAgICAgICBSTiA3ICAgIAotcFRhYmxlICAgICAgICAgIFJOIDkgICAgCi1kc3RTdGVweDIgICAgICAgUk4gMTEgICAKLWxlZnRTdGVweDIgICAgICBSTiAxNCAgIAotb3V0ZXJDb3VudCAgICAgIFJOIDE0ICAgCi1yMHgwMTAxMDEwMSAgICAgUk4gMTAgICAKLXIweDAwRkYwMEZGICAgICBSTiAxMSAgIAotCi10VmFsMCAgICAgICAgICAgUk4gMCAgICAKLXRWYWwxICAgICAgICAgICBSTiAxICAgIAotdFZhbDIgICAgICAgICAgIFJOIDIgICAgCi10VmFsMyAgICAgICAgICAgUk4gMyAgICAKLXRWYWw0ICAgICAgICAgICBSTiA0ICAgIAotdFZhbDUgICAgICAgICAgIFJOIDUgICAgCi10VmFsNiAgICAgICAgICAgUk4gNiAgICAKLXRWYWw3ICAgICAgICAgICBSTiA3ICAgIAotdFZhbDggICAgICAgICAgIFJOIDggICAgCi10VmFsOSAgICAgICAgICAgUk4gOSAgICAKLXRWYWwxMCAgICAgICAgICBSTiAxMCAgIAotdFZhbDExICAgICAgICAgIFJOIDExICAgCi10VmFsMTIgICAgICAgICAgUk4gMTIgICAKLXRWYWwxNCAgICAgICAgICBSTiAxNCAgIAotCi1iICAgICAgICAgICAgICAgUk4gMTQgICAKLWMgICAgICAgICAgICAgICBSTiAxMiAgIAotCi1wMnAwICAgICAgICAgICAgUk4gMCAgICAKLXAzcDEgICAgICAgICAgICBSTiAxICAgIAotcDZwNCAgICAgICAgICAgIFJOIDIgICAgCi1wN3A1ICAgICAgICAgICAgUk4gNCAgICAKLQotcHAycHAwICAgICAgICAgIFJOIDYgICAgCi1wcDNwcDEgICAgICAgICAgUk4gNyAgICAKLXBwNnBwNCAgICAgICAgICBSTiA4ICAgIAotcHA3cHA1ICAgICAgICAgIFJOIDkgICAgCi0KLXAzMjEwICAgICAgICAgICBSTiAxMCAgIAotcDc2NTQgICAgICAgICAgIFJOIDEwICAgCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gSW5wdXQgQXJndW1lbnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAotICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDggICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKLSAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCi0KLU9NWF9WQ19DSFJPTUFfREMKLSAgICAgICAgQU5EICAgICAgYXZhaWxhYmlsaXR5LCBhdmFpbGFiaWxpdHksIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKLSAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjKE9NWF9WQ19VUFBFUiArIE9NWF9WQ19MRUZUKSA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgKCNPTVhfVkNfVVBQRVIgfCAjT01YX1ZDX0xFRlQpKQotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAKLSAgICAgICAgQk5FICAgICAgVFNUX1VQUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGJvdGgKLSAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOX0gICAgICAgICAgICAgOy8vIHRWYWwgOCB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gN10KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLGxlZnRTdGVwICAgICAgIDsvLyBsZWZ0U3RlcHgyID0gMiAqIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgVUFERDE2ICAgc3VtMSwgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQotICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCi0gICAgICAgIFVBREQxNiAgIHN1bTIsIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KLSAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgc3VtMSwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQotICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCBzdW0yLCBMU1IgIzE2ICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs0XSB0byBwU3JjQWJvdmVbN10pCi0gICAgICAgIFVYVEggICAgIHN1bTEsIHN1bTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQotICAgICAgICBVWFRIICAgICBzdW0yLCBzdW0yICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0yIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs0XQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs1XQotICAgICAgICBBREQgICAgICB0VmFsMTQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gdFZhbDQgKyB0VmFsMTIKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgIHRWYWw0LCBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzZdCi0gICAgICAgIExEUkIgICAgIHRWYWwxMixbcFNyY0xlZnQyXSAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzddCi0gICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHRWYWw4ICsgdFZhbDkKLSAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsMTQgICAgICAgICAgICAgICAgOy8vIGxlZnRzdW0xICA9IHN1bShwU3JjTGVmdFswXSB0byBwU3JjTGVmdFszXSkKLSAgICAgICAgQUREICAgICAgdFZhbDQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gdFZhbDQgKyB0VmFsMTIKLSAgICAgICAgQUREICAgICAgdFZhbDE0LCB0VmFsOCwgdFZhbDQgICAgICAgICAgICAgICAgOy8vIGxlZnRzdW0yICA9IHN1bShwU3JjTGVmdFs0XSB0byBwU3JjTGVmdFs3XSkKLSAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWwxNCwgIzIgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gbGVmdHN1bTIgKyAyCi0gICAgICAgIEFERCAgICAgIHRWYWw5LCBzdW0yLCAgICMyICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHVwc3VtMiArIDIKLSAgICAgICAgQUREICAgICAgc3VtMSwgIHN1bTEsIHRWYWwyICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgPSB1cHN1bTEgKyBsZWZ0c3VtMQotICAgICAgICBBREQgICAgICBzdW0yLCAgc3VtMiwgdFZhbDE0ICAgICAgICAgICAgICAgICA7Ly8gc3VtMiA9IHVwc3VtMiArIGxlZnRzdW0yCi0gICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICM0ICAgICAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDQpCi0gICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICM0ICAgICAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDQpCi0gICAgICAgIE1PViAgICAgIHN1bTEsICBzdW0xLCAgTFNSICMzICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDQpPj4zCi0gICAgICAgIE1PViAgICAgIHRWYWw5LCB0VmFsOSwgTFNSICMyICAgICAgICAgICAgICAgIDsvLyAodFZhbDkgKyAyKT4+MgotICAgICAgICBNT1YgICAgICB0VmFsOCwgdFZhbDgsIExTUiAjMiAgICAgICAgICAgICAgICA7Ly8gKHRWYWw4ICsgMik+PjIKLSAgICAgICAgTU9WICAgICAgc3VtMiwgIHN1bTIsICBMU1IgIzMgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgNCk+PjMKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIHRWYWwwLCBzdW0xLCByMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWwxLCB0VmFsOSxyMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCxyMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw5LCBzdW0yLCByMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDAgdG8gMQotICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDAgdG8gMQotICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDAgdG8gMQotICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDAgdG8gMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgOCB0byA5Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgOCB0byA5Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgOCB0byA5Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgOCB0byA5Ci0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotVFNUX1VQUEVSCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCi0gICAgICAgIAotICAgICAgICBCTkUgICAgICBUU1RfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgotICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUse3RWYWw4LHRWYWw5fSAgICAgICAgICAgICA7Ly8gdFZhbCA4IHRvIDkgPSBwU3JjQWJvdmVbMCB0byA3XQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDgsIHRWYWw4LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBVQUREMTYgICBzdW0xLCAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzQsIDZdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsOSwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNSwgN10KLSAgICAgICAgVUFERDE2ICAgc3VtMiwgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVs0LCA2XQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgc3VtMSwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQotICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCBzdW0yLCBMU1IgIzE2ICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs0XSB0byBwU3JjQWJvdmVbN10pCi0gICAgICAgIAotICAgICAgICBVWFRIICAgICBzdW0xLCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKLSAgICAgICAgVVhUSCAgICAgc3VtMiwgc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMiAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCi0gICAgICAgIAotICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSArIDIKLSAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTIgKyAyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBzdW0xLCBzdW0xLCBMU1IgIzIgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyAyKT4+MgotICAgICAgICBNT1YgICAgICBzdW0yLCBzdW0yLCBMU1IgIzIgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyAyKT4+MgotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgc3VtMSwgc3VtMSxyMHgwMTAxMDEwMSAgICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgc3VtMiwgc3VtMixyMHgwMTAxMDEwMSAgICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotVFNUX0xFRlQgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zICAgICAgIAotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKLSAgICAgICAgQk5FICAgICAgVFNUX0NPVU5UMAotICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAotICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDQsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw0ID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEyLFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMj0gcFNyY0xlZnRbM10KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IHRWYWw4ICsgdFZhbDkKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzRdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHRWYWw0ICsgdFZhbDEyCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzVdCi0gICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzZdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzddCi0gICAgICAgIAotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHN1bTEsICB0VmFsNiwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBzdW0xICA9IHN1bShwU3JjTGVmdFswXSB0byBwU3JjTGVmdFszXSkKLSAgICAgICAgQUREICAgICAgdFZhbDQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gdFZhbDQgKyB0VmFsMTIKLSAgICAgICAgQUREICAgICAgc3VtMiwgIHRWYWw4LCB0VmFsNCAgICAgICAgICAgICAgICAgOy8vIHN1bTIgID0gc3VtKHBTcmNMZWZ0WzRdIHRvIHBTcmNMZWZ0WzddKQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgKyAyCi0gICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0yICsgMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgc3VtMSwgc3VtMSwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgMik+PjIKLSAgICAgICAgTU9WICAgICAgc3VtMiwgc3VtMiwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgMik+PjIKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIHRWYWw2LCBzdW0xLHIweDAxMDEwMTAxICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw4LCBzdW0yLHIweDAxMDEwMTAxICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICBNT1YgICAgICB0VmFsNyx0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBzdW0xCi0gICAgICAgIE1PViAgICAgIHRWYWw5LHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IHN1bTIKLSAgICAgICAgCi0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDggdG8gOQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLQotVFNUX0NPVU5UMAotICAgICAgICBMRFIgICAgICBzdW0xLCA9TVVMX0NPTlNUMSAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gMHg4MDgwODA4MCBpZihjb3VudCA9PSAwKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHRWYWw3LCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHN1bTEKLSAgICAgICAgCi0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotCi1PTVhfVkNfQ0hST01BX0hPUgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIgCi0gICAgICAgIAotICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAotICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCwgbGVmdFN0ZXAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IGxlZnRTdGVwICogMgotICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDIgPSBwRHN0ICsgZHN0U3RlcAotICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKLSAgICAgICAgU1VCICAgICAgZHN0U3RlcHgyLCBkc3RTdGVweDIsICM0ICAgICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwICBtaW51cyA0Ci0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCA9TVVMX0NPTlNUMCAgICAgICAgICAgIDsvLyBDb25zdCB0byByZXBlYXQgdGhlIGJ5dGUgaW4gcmVnIDQgdGltZXMKLSAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbM10KLSAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXSAKLSAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQotICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCi0gICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXQotICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCi0gICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KLSAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQotICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFs0XQotICAgICAgICBNX0xEUkIgICB0VmFsNywgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDcgPSBwU3JjTGVmdFs1XQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs2XQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs3XQotICAgICAgICBNVUwgICAgICB0VmFsNiwgdFZhbDYsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsNywgdFZhbDcsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOSwgdFZhbDksIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswIHRvIDNdIAotICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCi0gICAgICAgIE1fU1RSICAgIHRWYWw2LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KLSAgICAgICAgTV9TVFIgICAgdFZhbDcsIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQotICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswIHRvIDNdCi0gICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KLSAgICAgICAgTV9TVFIgICAgdFZhbDgsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQotICAgICAgICBNX1NUUiAgICB0VmFsOSwgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotT01YX1ZDX0NIUk9NQV9WRVJUCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NCAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsIHt0VmFsNix0VmFsN30gICAgICAgICAgICA7Ly8gdFZhbCA2IHRvIDcgPSBwU3JjQWJvdmVbMCB0byA3XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNwotCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLU9NWF9WQ19DSFJPTUFfUExBTkUKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBSU0IgICAgICB0VmFsMTQsIGxlZnRTdGVwLCBsZWZ0U3RlcCwgTFNMICMzICA7Ly8gNypsZWZ0U3RlcAotICAgICAgICBMRFJCICAgICB0VmFsNywgW3BTcmNBYm92ZSwgIys3XSAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzddCi0gICAgICAgIExEUkIgICAgIHRWYWw2LCBbcFNyY0xlZnQsICt0VmFsMTRdICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXQotICAgICAgICBMRFJCICAgICB0VmFsOCwgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBMRFJCICAgICB0VmFsOSwgW3BTcmNBYm92ZSwgIys2IF0gICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdCi0gICAgICAgIExEUkIgICAgIHRWYWwxMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMF0KLSAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs3XSArIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdCi0gICAgICAgIFNVQiAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBWMCA9IHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gSDAgPSBwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdICAgICAgICAKLSAgICAgICAgTFNMICAgICAgdFZhbDIsIHRWYWwyLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vIGEgPSAxNiAqIChwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbFNdKQotICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDIsICMxNiAgICAgICAgICAgICAgICAgICA7Ly8gYSArIDE2Ci0gICAgICAgIFNVQiAgICAgIHRWYWw5LCB0VmFsOSx0VmFsMTAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNl0gLSBwU3JjQWJvdmVbMF0KLSAgICAgICAgTERSQiAgICAgdFZhbDgsIFtwU3JjQWJvdmUsIys1XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XQotICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZSwjKzFdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzFdCi0gICAgICAgIEFERCAgICAgIHRWYWw5LCB0VmFsOSwgdFZhbDksIExTTCAjMSAgICAgICAgIDsvLyBIMSA9IDMgKiAocFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdKQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDksIHRWYWw3LCBMU0wgIzIgICAgICAgICA7Ly8gSCA9IEgxICsgSDAKLSAgICAgICAgU1VCICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XSAtIHBTcmNBYm92ZVsxXQotICAgICAgICBMRFJCICAgICB0VmFsOSwgW3BTcmNBYm92ZSwjKzRdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzRdCi0gICAgICAgIExEUkIgICAgIHRWYWwxMCxbcFNyY0Fib3ZlLCMrMl0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMl0KLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIEggPSBIICsgSDIKLSAgICAgICAgU1VCICAgICAgdFZhbDExLCB0VmFsMTQsbGVmdFN0ZXAgICAgICAgICAgICAgOy8vIDYqbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICAgdFZhbDExLCBwU3JjTGVmdCwgdFZhbDExICAgICAgICAgICAgOy8vIHBTcmNMZWZ0ICsgNipsZWZ0U3RlcAotICAgICAgICBNT1YgICAgICB0VmFsMTIsIHBTcmNMZWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnQKLSAgICAgICAgU1VCICAgICAgdFZhbDksIHRWYWw5LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XSAtIHBTcmNBYm92ZVsyXQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gSCA9IEggKyBIMwotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3RWYWwxMV0sLWxlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLFt0VmFsMTJdLCtsZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzBdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDcsIExTTCAjNCAgICAgICAgIDsvLyAxNyAqIEgKLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIDE3ICogSCArIDE2Ci0gICAgICAgIFNVQiAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzBdCi0gICAgICAgIEFTUiAgICAgIGIsIHRWYWw3LCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBiID0gKDE3ICogSCArIDE2KSA+PiA1Ci0gICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyBWMSA9IDMgKiAocFNyY0xlZnRbNipsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXSkKLSAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw4LCB0VmFsNiwgTFNMICMyICAgICAgICAgOy8vIFYgPSBWMCArVjEKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFtsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDcsIGIsIGIsIExTTCAjMSAgICAgICAgICAgICAgICAgOy8vIDMqYgotICAgICAgICBTVUIgICAgICB0VmFsMiwgdFZhbDIsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gYSArIDE2IC0gMypiCi0gICAgICAgIFNVQiAgICAgIHRWYWw3LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3RWYWwxMV0sLWxlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLFt0VmFsMTJdLCtsZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNywgTFNMICMxICAgICAgICAgOy8vIFYgPSBWICsgVjIKLSAgICAgICAgTERSICAgICAgcjB4MDBGRjAwRkYsID1NQVNLX0NPTlNUICAgICAgICAgICAgOy8vIHIweDAwRkYwMEZGID0gMHgwMEZGMDBGRgotICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gViA9IFYgKyBWNwotICAgICAgICBTVUIgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjNCAgICAgICAgICAgICAgICA7Ly8gZHN0U3RlcCAtIDQKLSAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNiwgTFNMICM0ICAgICAgICAgOy8vIDE3KlYKLSAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIDE3KlYgKyAxNgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIEFTUiAgICAgIGMsIHRWYWw2LCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjID0gKDE3KlYgKyAxNik+PjUKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBBREQgICAgICB0VmFsNiwgYywgYywgTFNMICMxICAgICAgICAgICAgICAgICA7Ly8gMypjCi0gICAgICAgIFVYVEggICAgIGMsIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBvbmx5IGluIGhhbGYgd29yZAotICAgICAgICBTVUIgICAgICB0VmFsNiwgdFZhbDIsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gYSAtIDMqYiAtIDMqYyArIDE2Ci0gICAgICAgIE9SUiAgICAgIGMsIGMsIGMsIExTTCAjMTYgICAgICAgICAgICAgICAgICAgIDsvLyBjIGMKLSAgICAgICAgQUREICAgICAgdFZhbDcsIGIsIGIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDJiCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsNiwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBwcDIgPSBkICsgMipiCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgYiAgICAgICAgICAgICAgICAgICAgIDsvLyAzYgotICAgICAgICBPUlIgICAgICBwMnAwLCAgIHRWYWw2LCAgdFZhbDIsICBMU0wgIzE2ICAgICA7Ly8gcDJwMCAgID0gcGFjayB7cDIsIHAwfQotICAgICAgICBVWFRIICAgICBiLCBiCi0gICAgICAgIFVYVEggICAgIHRWYWw3LCB0VmFsNwotICAgICAgICBPUlIgICAgICBiLCBiLCBiLCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8ge2IsYn0KLSAgICAgICAgT1JSICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsNywgTFNMICMxNiAgICAgICAgOy8vIHszYiwzYn0KLSAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwMnAwLCBiICAgICAgICAgICAgICAgICAgICAgOy8vIHAzcDEgICA9IHAycDAgKyB7YixifQotICAgICAgICBTQUREMTYgICBwNnA0LCAgIHAzcDEsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gcDZwNCAgID0gcDNwMSArIHszYiwzYn0KLSAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwNnA0LCBiICAgICAgICAgICAgICAgICAgICAgOy8vIHA3cDUgICA9IHA2cDQgKyB7YixifQotICAgICAgICBNT1YgICAgICBvdXRlckNvdW50LCAjQkxLX1NJWkUgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudCAgICAgICAgCi0gICAgICAgIAotTE9PUF9QTEFORSAgICAgICAgCi0KLSAgICAgICAgVVNBVDE2ICAgcDdwNSwgICAjMTMsIHA3cDUgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDcpIGNsaXAxMyhwNSkKLSAgICAgICAgVVNBVDE2ICAgcDZwNCwgICAjMTMsIHA2cDQgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDYpIGNsaXAxMyhwNCkKLSAgICAgICAgVVNBVDE2ICAgcDNwMSwgICAjMTMsIHAzcDEgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDMpIGNsaXAxMyhwMSkKLSAgICAgICAgVVNBVDE2ICAgcDJwMCwgICAjMTMsIHAycDAgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDIpIGNsaXAxMyhwMCkKLSAgICAgICAgCi0gICAgICAgIEFORCAgICAgIHBwN3BwNSwgcjB4MDBGRjAwRkYsIHA3cDUsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDcpIGNsaXA4KHA1KQotICAgICAgICBBTkQgICAgICBwcDZwcDQsIHIweDAwRkYwMEZGLCBwNnA0LCBBU1IgIzUgICAgOy8vIGNsaXA4KHA2KSBjbGlwOChwNCkKLSAgICAgICAgQU5EICAgICAgcHAzcHAxLCByMHgwMEZGMDBGRiwgcDNwMSwgQVNSICM1ICAgIDsvLyBjbGlwOChwMykgY2xpcDgocDEpCi0gICAgICAgIEFORCAgICAgIHBwMnBwMCwgcjB4MDBGRjAwRkYsIHAycDAsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDIpIGNsaXA4KHAwKQotICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgb3V0ZXJDb3VudCwgb3V0ZXJDb3VudCwgIzEgICAgICAgICAgIDsvLyBvdXRlckNvdW50LS0KLSAgICAgIAotICAgICAgICBPUlIgICAgICBwMzIxMCwgcHAycHAwLCBwcDNwcDEsIExTTCAjOCAgICAgICAgOy8vIHBhY2sge3AzLHAyLCBwMSwgcDB9Ci0gICAgICAgIFNUUiAgICAgIHAzMjEwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3BEc3RbMF0gdG8gcERzdFszXX0gIAotICAgICAgICAKLSAgICAgICAgT1JSICAgICAgcDc2NTQsIHBwNnBwNCwgcHA3cHA1LCBMU0wgIzggICAgICAgIDsvLyBwYWNrIHtwNyxwNiwgcDUsIHA0fQotICAgICAgICBNX1NUUiAgICBwNzY1NCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtwRHN0WzRdIHRvIHBEc3RbN119Ci0KLSAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwN3A1LCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDcgKyBjfSwge3A1ICsgY30KLSAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwNnA0LCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDYgKyBjfSwge3A0ICsgY30KLSAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwM3AxLCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDMgKyBjfSwge3AxICsgY30KLSAgICAgICAgU0FERDE2ICAgcDJwMCwgICBwMnAwLCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDIgKyBjfSwge3AwICsgY30KLSAgICAgIAotICAgICAgICBCTkUgICAgICBMT09QX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDggdGltZXMKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBFTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzBjYmE3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTICAgIAotICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNgotICAgIERDRCAgT01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IgCi0gICAgRENEICBPTVhfVkNfMTZYMTZfREMsICAgT01YX1ZDXzE2WDE2X1BMQU5FCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gQ29uc3RhbnRzIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotQkxLX1NJWkUgICAgICAgIEVRVSAweDEwCi1NVUxfQ09OU1QwICAgICAgRVFVIDB4MDEwMTAxMDEKLU1VTF9DT05TVDEgICAgICBFUVUgMHgwMDA2MDAwNAotTVVMX0NPTlNUMiAgICAgIEVRVSAweDAwMDcwMDA1Ci1NVUxfQ09OU1QzICAgICAgRVFVIDB4MDAwMzAwMDEKLU1BU0tfQ09OU1QgICAgICBFUVUgMHgwMEZGMDBGRgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi15ICAgICAgICAgICAgICAgUk4gMTIgICAKLXBjICAgICAgICAgICAgICBSTiAxNSAgIAotCi1yZXR1cm4gICAgICAgICAgUk4gMCAgICAKLWlubmVyQ291bnQgICAgICBSTiAwICAgIAotb3V0ZXJDb3VudCAgICAgIFJOIDEgICAgCi1wU3JjTGVmdDIgICAgICAgUk4gMSAgICAKLXBEc3QyICAgICAgICAgICBSTiAyICAgIAotc3VtICAgICAgICAgICAgIFJOIDYgICAgCi1wVGFibGUgICAgICAgICAgUk4gOSAgICAKLXRlbXAxICAgICAgICAgICBSTiAxMCAgIAotdGVtcDIgICAgICAgICAgIFJOIDEyICAgCi1jTXVsMSAgICAgICAgICAgUk4gMTEgICAKLWNNdWwyICAgICAgICAgICBSTiAxMiAgIAotY291bnQgICAgICAgICAgIFJOIDEyICAgCi1kc3RTdGVweDIgICAgICAgUk4gMTEgICAKLWxlZnRTdGVweDIgICAgICBSTiAxNCAgIAotcjB4MDEwMTAxMDEgICAgIFJOIDEwICAgCi1yMHgwMEZGMDBGRiAgICAgUk4gMTEKLQotdFZhbDAgICAgICAgICAgIFJOIDAgICAgCi10VmFsMSAgICAgICAgICAgUk4gMSAgICAKLXRWYWwyICAgICAgICAgICBSTiAyICAgIAotdFZhbDMgICAgICAgICAgIFJOIDMgICAgCi10VmFsNCAgICAgICAgICAgUk4gNCAgICAKLXRWYWw1ICAgICAgICAgICBSTiA1ICAgIAotdFZhbDYgICAgICAgICAgIFJOIDYgICAgCi10VmFsNyAgICAgICAgICAgUk4gNyAgICAKLXRWYWw4ICAgICAgICAgICBSTiA4ICAgIAotdFZhbDkgICAgICAgICAgIFJOIDkgICAgCi10VmFsMTAgICAgICAgICAgUk4gMTAgICAKLXRWYWwxMSAgICAgICAgICBSTiAxMSAgIAotdFZhbDEyICAgICAgICAgIFJOIDEyICAgCi10VmFsMTQgICAgICAgICAgUk4gMTQgICAKLQotYiAgICAgICAgICAgICAgIFJOIDEyICAgCi1jICAgICAgICAgICAgICAgUk4gMTQgICAKLQotcDJwMCAgICAgICAgICAgIFJOIDAgICAgCi1wM3AxICAgICAgICAgICAgUk4gMSAgICAKLXA2cDQgICAgICAgICAgICBSTiAyICAgIAotcDdwNSAgICAgICAgICAgIFJOIDQgICAgCi1wMTBwOCAgICAgICAgICAgUk4gNiAgICAKLXAxMXA5ICAgICAgICAgICBSTiA3ICAgIAotcDE0cDEyICAgICAgICAgIFJOIDggICAgCi1wMTVwMTMgICAgICAgICAgUk4gOSAgICAKLQotcDMyMTAgICAgICAgICAgIFJOIDEwICAgCi1wNzY1NCAgICAgICAgICAgUk4gMTAgICAKLXAxMTEwOTggICAgICAgICBSTiAxMCAgIAotcDE1MTQxMzEyICAgICAgIFJOIDEwICAgCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKLWxlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWF2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAotICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNiA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAotICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50Ci0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotICAgICAgICAKLU9NWF9WQ18xNlgxNl9WRVJUCi0gICAgICAgIExETSAgICAgIHBTcmNBYm92ZSwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fTsvLyB0VmFsIDYgdG8gOSA9IHBTcmNBYm92ZVswIHRvIDE1XQotICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyLSBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RhbGwgb3V0c2lkZSB0aGUgbG9vcAotCi1MT09QX1ZFUlQKLSAgICAgICAgU1RNICAgICAgcERzdCwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICAgOy8vIHBEc3RbMCB0byAxNV0gPSB0VmFsIDYgdG8gOQotICAgICAgICBTVUJTICAgICB5LCB5LCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8geS0tCi0gICAgICAgIEFERCAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXB4MiAgICAgICAgICAgICAgIDsvLyBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKLSAgICAgICAgU1RNICAgICAgcERzdDIsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgOy8vIHBEc3QyWzE2IHRvIDMxXSA9IHRWYWwgNiB0byA5Ci0gICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0MiwgZHN0U3RlcHgyICAgICAgICAgICAgIDsvLyBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKLSAgICAgICAgQk5FICAgICAgTE9PUF9WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDggdGltZXMKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLQotICAgICAgICAKLU9NWF9WQ18xNlgxNl9IT1IKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz02IAotICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCA9TVVMX0NPTlNUMCAgICAgICAgICAgIDsvLyBDb25zdCB0byByZXBlYXQgdGhlIGJ5dGUgaW4gcmVnIDQgdGltZXMKLSAgICAgICAgTU9WICAgICAgeSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKLSAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbMCB0byAzXQotICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAotICAgICAgICBNX0xEUkIgICB0VmFsNywgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDEgPSBwU3JjTGVmdFs0IHRvIDddCi0gICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAotICAgICAgICBTVUIgICAgICBkc3RTdGVweDIsIGRzdFN0ZXB4MiwgIzEyICAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAgIG1pbnVzIDEyCi0gICAgICAgCi1MT09QX0hPUiAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzAgdG8gM10KLSAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbNCB0byA3XQotICAgICAgICBNVUwgICAgICB0VmFsNywgdFZhbDcsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBTVUJTICAgICB5LCB5LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8geS0tCi0gICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMCB0byAzXSAKLSAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQotICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzQgdG8gN10KLSAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQotICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzggdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzggdG8gMTFdCi0gICAgICAgIE1VTCAgICAgIHRWYWw5LCB0VmFsOSwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1fU1RSICAgIHRWYWw2LCBbcERzdF0sIGRzdFN0ZXB4MiAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMTIgdG8gMTVdCi0gICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzEyIHRvIDE1XQotICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzAgdG8gM10gCi0gICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KLSAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs0IHRvIDddCi0gICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs4IHRvIDExXQotICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls4IHRvIDExXQotICAgICAgICBNX1NUUiAgICB0VmFsOCwgW3BEc3RdLCBkc3RTdGVweDIgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzEyIHRvIDE1XQotICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFswIHRvIDNdCi0gICAgICAgIE1fU1RSICAgIHRWYWw5LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzEyIHRvIDE1XQotICAgICAgICBNX0xEUkIgICB0VmFsNywgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDcgPSBwU3JjTGVmdFs0IHRvIDddCi0gICAgICAgIEJORSAgICAgIExPT1BfSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciAzIHRpbWVzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotT01YX1ZDXzE2WDE2X0RDCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvdW50ID0gMAotICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIgICAgICAgICA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgI09NWF9WQ19VUFBFUikKLSAgICAgICAgQkVRICAgICAgVFNUX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKLSAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOSx0VmFsMTAsdFZhbDExfTsvLyB0VmFsIDggdG8gMTEgPSBwU3JjQWJvdmVbMCB0byAxNV0KLSAgICAgICAgQUREICAgICAgY291bnQsIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHVwcGVyIGluYyBjb3VudCBieSAxCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MgotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQotICAgICAgICBVWFRCMTYgICB0VmFsNiwgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzQsIDZdCi0gICAgICAgIFVBREQxNiAgIHRWYWwyLCB0VmFsMiwgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDgsIHRWYWw4LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCi0gICAgICAgIFVBREQxNiAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10gKyBwU3JjQWJvdmVbNSwgN10KLSAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzddKQotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs4LCAxMF0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxMiwgMTRdCi0gICAgICAgIFVBREQxNiAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOCwgMTBdICsgcFNyY0Fib3ZlWzEyLCAxNF0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDEwLCB0VmFsMTAsIFJPUiAjOCAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs5LCAxMV0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDExLCB0VmFsMTEsIFJPUiAjOCAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxMywgMTVdCi0gICAgICAgIFVBREQxNiAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOSwgMTFdICsgcFNyY0Fib3ZlWzEzLCAxNV0KLSAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbOF0gdG8gcFNyY0Fib3ZlWzE1XSkKLSAgICAgICAgCi0gICAgICAgIFVBREQxNiAgIHRWYWwyLCB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVsxNV0pCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsMiwgTFNSICMxNiAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzE1XSkKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBVWFRIICAgICBzdW0sIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXh0cmFjdCB0aGUgbG93ZXIgaGFsZiBmb3IgcmVzdWx0Ci0gICAgICAgIAotVFNUX0xFRlQgICAgICAgIAotICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAotICAgICAgICBCRVEgICAgICBUU1RfQ09VTlQKLSAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsbGVmdFN0ZXAgICAgICAgOy8vIGxlZnRTdGVweDIgPSAyICogbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHRWYWw4ICsgdFZhbDkKLSAgICAgICAgQUREICAgICAgY291bnQsIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgOy8vIEluYyBDb3VudGVyIGlmIExlZnQgaXMgYXZhaWxhYmxlCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IHRWYWwxMCArIHRWYWwxMQotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMD0gcFNyY0xlZnRbMl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDExLCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMT0gcFNyY0xlZnRbM10KLSAgICAgICAgQUREICAgICAgc3VtLCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHRWYWw4ICsgdFZhbDEwCi0gICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHRWYWw4ICsgdFZhbDkKLSAgICAgICAgQUREICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gdFZhbDEwICsgdFZhbDExCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHRWYWw4ICsgdFZhbDEwCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMD0gcFNyY0xlZnRbMl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDExLCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMT0gcFNyY0xlZnRbM10KLSAgICAgICAgQUREICAgICAgc3VtLCBzdW0sIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bSArIHRWYWw3Ci0gICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHRWYWw4ICsgdFZhbDkKLSAgICAgICAgQUREICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gdFZhbDEwICsgdFZhbDExCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHRWYWw4ICsgdFZhbDEwCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMD0gcFNyY0xlZnRbMl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDExLCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMT0gcFNyY0xlZnRbM10KLSAgICAgICAgQUREICAgICAgc3VtLCBzdW0sIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bSArIHRWYWw3Ci0gICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHRWYWw4ICsgdFZhbDkKLSAgICAgICAgQUREICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gdFZhbDEwICsgdFZhbDExCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHRWYWw4ICsgdFZhbDEwCi0gICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNwotCi1UU1RfQ09VTlQgICAgICAgIAotICAgICAgICBDTVAgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYoY291bnQgPT0gMCkKLSAgICAgICAgTU9WRVEgICAgc3VtLCAjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IDEyOCBpZihjb3VudCA9PSAwKQotICAgICAgICBCRVEgICAgICBUU1RfQ09VTlQwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYoY291bnQgPT0gMCkKLSAgICAgICAgQ01QICAgICAgY291bnQsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDEpCi0gICAgICAgIEFEREVRICAgIHN1bSwgc3VtLCAjOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gKz0gOCBpZihjb3VudCA9PSAxKQotICAgICAgICBBRERORSAgICBzdW0sIHN1bSwgdFZhbDIgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtbGVmdCArIHN1bXVwcGVyCi0gICAgICAgIEFERE5FICAgIHN1bSwgc3VtLCAjMTYgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gKz0gMTYgaWYoY291bnQgPT0gMikKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBVWFRIICAgICBzdW0sIHN1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtIG9ubHkgYnl0ZSByZXN0IGNsZWFyZWQKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBMU1JFUSAgICBzdW0sIHN1bSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID4+IDQgaWYoY291bnQgPT0gMSkKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBMU1JORSAgICBzdW0sIHN1bSwgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID4+IDUgaWYoY291bnQgPT0gMikKLQotVFNUX0NPVU5UMAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE9SUiAgICAgIHN1bSwgc3VtLCBzdW0sIExTTCAjOCAgICAgICAgICAgICAgIDsvLyBzdW0gcmVwbGljYXRlZCBpbiB0d28gaGFsZndvcmQKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBPUlIgICAgICB0VmFsNiwgc3VtLCBzdW0sIExTTCAjMTYgICAgICAgICAgICA7Ly8gc3VtICByZXBsaWNhdGVkIGluIGFsbCBieXRlcwotICAgICAgICBDUFkgICAgICB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEgPSB0VmFsMAotICAgICAgICBDUFkgICAgICB0VmFsOCwgdFZhbDYgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSB0VmFsMAotICAgICAgICBDUFkgICAgICB0VmFsOSwgdFZhbDYgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDMgPSB0VmFsMAotICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyLSBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKLSAgICAgICAgCi1MT09QX0RDICAgICAgICAKLSAgICAgICAgU1RNICAgICAgcERzdCwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICAgOy8vIHBEc3RbMCB0byAxNV0gPSB0VmFsIDYgdG8gOQotICAgICAgICBTVUJTICAgICB5LCB5LCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8geS0tCi0gICAgICAgIEFERCAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXB4MiAgICAgICAgICAgICAgIDsvLyBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKLSAgICAgICAgU1RNICAgICAgcERzdDIsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgOy8vIHBEc3QyWzE2IHRvIDMxXSA9IHRWYWwgNiB0byA5Ci0gICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0MiwgZHN0U3RlcHgyICAgICAgICAgICAgIDsvLyBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKLSAgICAgICAgQk5FICAgICAgTE9PUF9EQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDggdGltZXMKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0KLU9NWF9WQ18xNlgxNl9QTEFORQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgUlNCICAgICAgdFZhbDE0LCBsZWZ0U3RlcCwgbGVmdFN0ZXAsIExTTCAjNCAgOy8vIHRWYWwxNCA9IDE1KmxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MgotICAgICAgICBMRFJCICAgICB0VmFsMTAsIFtwU3JjTGVmdCwgIHRWYWwxNF0gICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbMTUqbGVmdFN0ZXBdCi0gICAgICAgIExEUkIgICAgIHRWYWwxMSwgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgIDsvLyB0VmFsMTEgPSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIExEUkIgICAgIHRWYWwxMiwgW3BTcmNBYm92ZSwgIzE1XQotCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCAgdFZhbDEyLCAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbGVmdFN0ZXBdCi0gICAgICAgIFNVQiAgICAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDExICAgICAgICAgICAgIDsvLyB0VmFsMTAgPSBWMCA9IHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgU1VCICAgICAgdFZhbDExLCB0VmFsMTIsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMSA9IEgwID0gcFNyY0Fib3ZlWzE1XSAtIHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgTU9WICAgICAgdFZhbDIsICB0VmFsMiwgICBMU0wgIzQgICAgICAgICAgICAgOy8vIHRWYWwyICA9IGEgPSAxNiAqIChwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbGVmdFN0ZXBdKQotCi0gICAgICAgIE1PViAgICAgdFZhbDExLCB0VmFsMTEsIExTTCAjMyAgICAgICAgICAgICAgOy8vIDgqWzE1XS1bLTFdCi0gICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMwXQotICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTRdCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgotICAgICAgICBSU0IgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMyAgICAgICAgIDsvLyA3KlsxNF0tWzBdCi0gICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4Ci0gICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMxXQotICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTNdCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgotICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgKLSAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gNipbMTNdLVsxXQotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMl0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEyXQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzIgICAgICAgICA7Ly8gNSpbMTJdLVsyXQotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjM10KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzExXQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsIExTTCAjMiAgICAgICA7Ly8gKyA0KlsxMV0tWzNdCi0gICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICM0XQotICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTBdCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgotICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyAzKlsxMF0tWzRdCi0gICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4Ci0gICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICM1XQotICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjOV0KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2Ci0gICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4LCBMU0wgIzEgICAgICAgOy8vICsgMipbOV0tWzVdCi0gICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICM2XQotICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjOF0KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gMSpbOF0tWzZdCi0gICAgICAgIEFERCAgICAgdFZhbDcsIHRWYWwxMSwgdFZhbDgKLQotICAgICAgICBBREQgICAgICB0VmFsMiwgIHRWYWwyLCAgICMxNiAgICAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSArIDE2Ci0gICAgICAgIE1PViAgICAgIHRWYWwxLCAgcFNyY0xlZnQgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNCAgPSBwU3JjTGVmdAotICAgICAgICBTVUIgICAgICB0VmFsOSwgIHRWYWwxNCwgICBsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDkgID0gMTQqbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICAgdFZhbDksICBwU3JjTGVmdCwgdFZhbDkgICAgICAgICAgICAgOy8vIHRWYWw5ICA9IHBTcmNMZWZ0ICsgMTQqbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxNCpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDExLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMSA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICB0VmFsNywgIExTTCAjMiAgICAgIDsvLyB0VmFsNyAgPSA1ICogSAotICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIzMyICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gNSAqIEggKyAzMgotICAgICAgICBTVUIgICAgICB0VmFsOCwgIHRWYWw4LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTQqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMF0KLSAgICAgICAgQVNSICAgICAgdFZhbDEyLCB0VmFsNywgICM2ICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IGIgPSAoNSAqIEggKyAzMikgPj4gNgotICAgICAgICAKLSAgICAgICAgUlNCICAgICAgdFZhbDgsICB0VmFsOCwgIHRWYWw4LCAgTFNMICMzICAgICAgOy8vIHRWYWw4ICA9IFYxID0gNyogKHBTcmNMZWZ0WzE0KmxlZnRTdGVwXS1wU3JjTGVmdFswXSkKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsOCwgIHRWYWwxMCwgTFNMICMzICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWMCArVjEKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEzKmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbbGVmdFN0ZXBdCi0gICAgICAgIFJTQiAgICAgIHRWYWw3LCAgdFZhbDEyLCAgdFZhbDEyLCAgTFNMICMzICAgIDsvLyB0VmFsNyAgPSA3KmIKLSAgICAgICAgU1VCICAgICAgdFZhbDIsICB0VmFsMiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IGEgKyAxNiAtIDcqYgotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTMqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMipsU10KLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IDIgKiAocFNyY0xlZnRbMTMqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbbGVmdFN0ZXBdKQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbMipsZWZ0U3RlcF0gICAgICAgIAotICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDcgID0gNiAqIChwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFYyCi0gICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMipsZWZ0U3RlcF0gLSBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTEqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3LCAgTFNMICMyICAgICA7Ly8gdFZhbDcgID0gNSAqIChwU3JjTGVmdFsxMipsZWZ0U3RlcF0gLSBwU3JjTGVmdFsyKmxlZnRTdGVwXSkKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjMKLSAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzExKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMCpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcsICBMU0wgIzIgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFY0Ci0gICAgICAgIFNVQiAgICAgIGRzdFN0ZXAsIGRzdFN0ZXAsICMxNiAgICAgICAgICAgICAgIDsvLyB0VmFsNSAgPSBkc3RTdGVwIC0gMTYKLSAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEwKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFs5KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMSAgICAgOy8vIHRWYWw3ICA9IDMgKiAocFNyY0xlZnRbMTAqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFY1Ci0gICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFs5KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFs4KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbNipsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNywgIExTTCAjMSAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjYKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFs4KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFY3Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw2LCAgTFNMICMyICAgICA7Ly8gdFZhbDYgID0gNSpWCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgIzMyICAgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSA1KlYgKyAzMgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgQVNSICAgICAgdFZhbDE0LCB0VmFsNiwgICAjNiAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IGMgPSAoNSpWICsgMzIpPj42Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICBSU0IgICAgICB0VmFsNiwgIHRWYWwxNCwgIHRWYWwxNCwgTFNMICMzICAgICA7Ly8gdFZhbDYgID0gNypjCi0gICAgICAgIFVYVEggICAgIHRWYWwxNCwgdFZhbDE0ICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSBDbGVhcmVkIHRoZSB1cHBlciBoYWxmIHdvcmQKLSAgICAgICAgQUREICAgICAgdFZhbDEwLCB0VmFsMTIsICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxMCA9IDIqYgotICAgICAgICBPUlIgICAgICB0VmFsMTQsIHRWYWwxNCwgIHRWYWwxNCwgTFNMICMxNiAgICA7Ly8gdFZhbDE0ID0ge2MgICwgIGN9Ci0gICAgICAgIFNVQiAgICAgIHRWYWw2LCAgdFZhbDIsICAgdFZhbDYgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBkID0gYSAtIDcqYiAtIDcqYyArIDE2Ci0gICAgICAgIEFERCAgICAgIHRWYWwxLCAgdFZhbDYsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsMSAgPSBwcDIgPSBkICsgMipiCi0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMTAgPTMqYgotICAgICAgICBPUlIgICAgICB0VmFsMCwgIHRWYWw2LCAgIHRWYWwxLCAgTFNMICMxNiAgICA7Ly8gdHZhbDAgID0gcDJwMCAgID0gcGFjayB7cDIsIHAwfQotICAgICAgICBVWFRIICAgICB0VmFsMTIsIHRWYWwxMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCi0gICAgICAgIFVYVEggICAgIHRWYWwxMCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBDbGVhcmVkIHRoZSB1cHBlciBoYWxmIHdvcmQKLSAgICAgICAgT1JSICAgICAgdFZhbDEyLCB0VmFsMTIsICB0VmFsMTIsIExTTCAjMTYgICAgOy8vIHRWYWwxMiA9IHtiICAsICBifQotICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMCwgTFNMICMxNiAgICA7Ly8gdFZhbDEwID0gezNiICwgM2J9Ci0gICAgICAgIFNBREQxNiAgIHRWYWwxLCAgdFZhbDAsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMSAgPSBwM3AxICAgPSBwMnAwICAgKyB7YixifQotICAgICAgICBTQUREMTYgICB0VmFsMiwgIHRWYWwxLCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gcDZwNCAgID0gcDNwMSAgICsgezNiLDNifQotICAgICAgICBTQUREMTYgICB0VmFsNCwgIHRWYWwyLCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDQgID0gcDdwNSAgID0gcDZwNCAgICsge2IsYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDYsICB0VmFsNCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IHAxMHA4ICA9IHA3cDUgICArIHszYiwzYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDcsICB0VmFsNiwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHAxMXA5ICA9IHAxMHA4ICArIHtiLGJ9Ci0gICAgICAgIFNBREQxNiAgIHRWYWw4LCAgdFZhbDcsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsOCAgPSBwMTRwMTIgPSBwMTFwOSAgKyB7M2IsM2J9Ci0gICAgICAgIFNBREQxNiAgIHRWYWw5LCAgdFZhbDgsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsOSAgPSBwMTVwMTMgPSBwMTRwMTIgKyB7YixifQotICAgICAgICBMRFIgICAgICByMHgwMEZGMDBGRiwgICAgID1NQVNLX0NPTlNUICAgICAgICA7Ly8gcjB4MDBGRjAwRkYgPSAweDAwRkYwMEZGCi0gICAgICAgIAotTE9PUF9QTEFORSAgICAgICAgCi0KLSAgICAgICAgVVNBVDE2ICAgdGVtcDIsICMxMywgcDNwMQotICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMnAwCi0gICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDNwMSwgICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgcDJwMCwgICBwMnAwLCAgIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICB0ZW1wMiwgcjB4MDBGRjAwRkYsIHRlbXAyLCBBU1IgIzUKLSAgICAgICAgQU5EICAgICAgdGVtcDEsIHIweDAwRkYwMEZGLCB0ZW1wMSwgQVNSICM1Ci0gICAgICAgIE9SUiAgICAgIHRlbXAxLCB0ZW1wMSwgdGVtcDIsIExTTCAjOAotICAgICAgICBTVFIgICAgICB0ZW1wMSwgW3BEc3RdLCAjNAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgdGVtcDIsICMxMywgcDdwNQotICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwNnA0Ci0gICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDdwNSwgICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwNnA0LCAgIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICB0ZW1wMiwgcjB4MDBGRjAwRkYsIHRlbXAyLCBBU1IgIzUKLSAgICAgICAgQU5EICAgICAgdGVtcDEsIHIweDAwRkYwMEZGLCB0ZW1wMSwgQVNSICM1Ci0gICAgICAgIE9SUiAgICAgIHRlbXAxLCB0ZW1wMSwgdGVtcDIsIExTTCAjOAotICAgICAgICBTVFIgICAgICB0ZW1wMSwgW3BEc3RdLCAjNAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgdGVtcDIsICMxMywgcDExcDkKLSAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDEwcDgKLSAgICAgICAgU0FERDE2ICAgcDExcDksICBwMTFwOSwgIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTQUREMTYgICBwMTBwOCwgIHAxMHA4LCAgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQotICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKLSAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4Ci0gICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0Ci0gICAgICAgIAotICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwMTVwMTMKLSAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDE0cDEyCi0gICAgICAgIFNBREQxNiAgIHAxNXAxMywgcDE1cDEzLCBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgcDE0cDEyLCBwMTRwMTIsIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICB0ZW1wMiwgcjB4MDBGRjAwRkYsIHRlbXAyLCBBU1IgIzUKLSAgICAgICAgQU5EICAgICAgdGVtcDEsIHIweDAwRkYwMEZGLCB0ZW1wMSwgQVNSICM1Ci0gICAgICAgIE9SUiAgICAgIHRlbXAxLCB0ZW1wMSwgdGVtcDIsIExTTCAjOAotICAgICAgICBTVFIgICAgICB0ZW1wMSwgW3BEc3RdLCAjNAotICAgICAgICAKLSAgICAgICAgQUREUyAgICAgcjB4MDBGRjAwRkYsIHIweDAwRkYwMEZGLCAjMTw8MjggICAgIDsvLyBMb29wIGNvdW50ZXIgdmFsdWUgaW4gdG9wIDQgYml0cwotICAgICAgICAKLSAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEJDQyAgICAgIExPT1BfUExBTkUgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMTYgdGltZXMKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUwotCi0gICAgICAgICAgICAKLSAgICAgICAgRU5ECi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgZW5kcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjEzOWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTgxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0gICAgICAgICAKLSAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKLSAgICBEQ0QgIE9NWF9WQ180eDRfVkVSVCwgICAgIE9NWF9WQ180eDRfSE9SIAotICAgIERDRCAgT01YX1ZDXzR4NF9EQywgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMCi0gICAgRENEICBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCi0gICAgRENEICBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCi0gICAgRENEICBPTVhfVkNfNHg0X0hVICAgCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0gIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBDb25zdGFudHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKLUJMS19TSVpFICAgICAgICAgICAgICBFUVUgMHg4Ci1NVUxfQ09OU1QwICAgICAgICAgICAgRVFVIDB4MDEwMTAxMDEKLUFERF9DT05TVDEgICAgICAgICAgICBFUVUgMHg4MDgwODA4MAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZXR1cm4gICAgICAgICAgUk4gMAotcFRhYmxlICAgICAgICAgIFJOIDkKLXBjICAgICAgICAgICAgICBSTiAxNQotcjB4MDEwMTAxMDEgICAgIFJOIDEKLXIweDgwODA4MDgwICAgICBSTiAwCi0KLXRWYWwwICAgICAgICAgICBSTiAwCi10VmFsMSAgICAgICAgICAgUk4gMQotdFZhbDIgICAgICAgICAgIFJOIDIKLXRWYWw0ICAgICAgICAgICBSTiA0Ci10VmFsNiAgICAgICAgICAgUk4gNgotdFZhbDcgICAgICAgICAgIFJOIDcKLXRWYWw4ICAgICAgICAgICBSTiA4Ci10VmFsOSAgICAgICAgICAgUk4gOQotdFZhbDEwICAgICAgICAgIFJOIDEwCi10VmFsMTEgICAgICAgICAgUk4gMTEKLXRWYWwxMiAgICAgICAgICBSTiAxMgotdFZhbDE0ICAgICAgICAgIFJOIDE0Ci0KLU91dDAgICAgICAgICAgICBSTiA2Ci1PdXQxICAgICAgICAgICAgUk4gNwotT3V0MiAgICAgICAgICAgIFJOIDgKLU91dDMgICAgICAgICAgICBSTiA5Ci0KLUxlZnQwICAgICAgICAgICBSTiA2Ci1MZWZ0MSAgICAgICAgICAgUk4gNwotTGVmdDIgICAgICAgICAgIFJOIDgKLUxlZnQzICAgICAgICAgICBSTiA5Ci0KLUFib3ZlMDEyMyAgICAgICBSTiAxMgotQWJvdmU0NTY3ICAgICAgIFJOIDE0Ci0KLUFib3ZlTGVmdCAgICAgICBSTiAxMAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAotICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0ICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAotICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKLQotT01YX1ZDXzR4NF9WRVJUCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gcFNyY0Fib3ZlWzAgdG8gM10KLSAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbMCAgdG8gM10gID0gQWJvdmUwMTIzCi0gICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzQgIHRvIDddICA9IEFib3ZlMDEyMwotICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFs4ICB0byAxMV0gPSBBYm92ZTAxMjMKLSAgICAgICAgU1RSICAgICAgQWJvdmUwMTIzLCAgW3BEc3RdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTIgdG8gMTVdID0gQWJvdmUwMTIzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLQotT01YX1ZDXzR4NF9IT1IKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz02IAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcwotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQotICAgICAgICBNVUwgICAgICBPdXQwLCAgIExlZnQwLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICBPdXQxLCAgIExlZnQxLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICBPdXQyLCAgIExlZnQyLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICBPdXQzLCAgIExlZnQzLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXSAKLSAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSBhdCBwRHN0IFs0ICB0byA3IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfNHg0X0RDCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NgotICAgICAgICAKLSAgICAgICAgQU5EICAgICAgYXZhaWxhYmlsaXR5LCAgYXZhaWxhYmlsaXR5LCAgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKLSAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKLSAgICAgICAgQk5FICAgICAgVXBwZXJPckxlZnRPck5vbmVBdmFpbGFibGUgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGJvdGgKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyAgPSBwU3JjQWJvdmVbMCB0byAzXQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw3LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDYsICBBYm92ZTAxMjMsICBST1IgIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBVQUREMTYgICB0VmFsMTEsIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIEFERCAgICAgIHRWYWwxMSwgdFZhbDExLCAgTFNSICMxNiAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKLSAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KLSAgICAgICAgVVhUSCAgICAgdFZhbDExLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgTGVmdDAsICBMZWZ0MSAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IExlZnQwICsgTGVmdDEKLSAgICAgICAgQUREICAgICAgdFZhbDcsICBMZWZ0MiwgIExlZnQzICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gTGVmdDIgKyBMZWZ0MwotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsNiArIHRWYWw3Ci0gICAgICAgIEFERCAgICAgIE91dDAsICAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyBPdXQwICA9IHRWYWw2ICsgdFZhbDExICAgCi0gICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICAjNCAgICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgKyA0Ci0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCi0gICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgIExTUiAjMyAgICAgICAgICAgICAgIDsvLyBPdXQwID0gKE91dDAgKyA0KT4+MwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgIHIweDAxMDEwMTAxICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotVXBwZXJPckxlZnRPck5vbmVBdmFpbGFibGUKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgICNPTVhfVkNfVVBQRVIgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQotICAgICAgICBCTkUgICAgICBMZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgotICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzICA9IHBTcmNBYm92ZVswIHRvIDNdCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDcsICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQotICAgICAgICBVWFRCMTYgICB0VmFsNiwgIEFib3ZlMDEyMywgIFJPUiAjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIFVBREQxNiAgIE91dDAsICAgdFZhbDYsICB0VmFsNyAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKLSAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgIExTUiAjMTYgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIFVYVEggICAgIE91dDAsICAgT3V0MCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQotICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzIgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgMgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzIgICAgICAgICAgICAgIDsvLyBPdXQwICA9IChPdXQwICsgMik+PjIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCAgdG8gMyBdCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgIHRvIDcgXSAKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICAKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQotICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAotICAgICAgICBCTkUgICAgICBOb25lQXZhaWxhYmxlCi0gICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIE91dDAsICAgTGVmdDAsICBMZWZ0MSAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IExlZnQwICsgTGVmdDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBBREQgICAgICBPdXQxLCAgIExlZnQyLCAgTGVmdDMgICAgICAgICAgICAgICA7Ly8gT3V0MSAgPSBMZWZ0MiArIExlZnQzCi0gICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICBPdXQxICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgICsgT3V0MQotICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzIgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgMgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzIgICAgICAgICAgICAgIDsvLyBPdXQwICA9IChPdXQwICsgMik+PjIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0gCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotCi1Ob25lQXZhaWxhYmxlCi0gICAgICAgIE1PViAgICAgIE91dDAsICAgIzEyOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXQwID0gMTI4IGlmKGNvdW50ID09IDApCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NQotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgcjB4MDEwMTAxMDEgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdIAotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfNHg0X0RJQUdfREwKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gZiA9IChhKzIqYitjKzIpPj4yCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgYXM6Ci0gICAgICAgIDsvLyBkID0gKGEgKyBjICk+PjEKLSAgICAgICAgOy8vIGUgPSAoZCAtIGInKT4+MQotICAgICAgICA7Ly8gZiA9IGUgKyAxMjgKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExETUlBICAgIHBTcmNBYm92ZSwgIHtBYm92ZTAxMjMsIEFib3ZlNDU2N30gIDsvLyBBYm92ZTAxMjMsIEFib3ZlNDU2NyA9IHBTcmNBYm92ZVswIHRvIDddCi0gICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCi0gICAgICAgIEJORSAgICAgIERMVXBwZXJSaWdodEF2YWlsYWJsZQotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQotICAgICAgICBNT1YgICAgICB0VmFsNywgIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gezAwLCAgMDAsICAwMCwgIFUzIH0KLSAgICAgICAgTU9WICAgICAgdFZhbDExLCB0VmFsNywgIExTTCAjMjQgICAgICAgICAgICAgOy8vIHtVMywgIDAwLCAgMDAsICAwMCB9Ci0gICAgICAgIE1VTCAgICAgIE91dDMsICAgdFZhbDcsICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyB7VTMsICBVMywgIFUzLCAgVTMgfSAKLSAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU1IgIzE2ICAgICAgICAgOy8vIHswMCwgIDAwLCAgVTMsICBVMiB9Ci0gICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB7MDAsICBVMywgIFUyLCAgVTEgfQotICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gezAwJywgVTMnLCBVMicsIFUxJ30KLSAgICAgICAgVUhBREQ4ICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZDEsICBkMCB9Ci0gICAgICAgIFVIQUREOCAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgdFZhbDkgICAgICAgICAgIDsvLyB7eHgsICBkMiwgIHh4LCAgeHggfQotICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw4LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBlMSwgIGUwIH0KLSAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHt4eCwgIGUyLCAgeHgsICB4eCB9Ci0gICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7eHgsICB4eCwgIGYxLCAgZjAgfQotICAgICAgICBVQUREOCAgICB0VmFsNiwgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge3h4LCAgZjIsICB4eCwgIHh4IH0KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgICB0VmFsNiwgIHRWYWw4LCAgdFZhbDYgICAgICAgICAgICAgICA7Ly8ge3h4LCAgZjIsICBmMSwgIGYwIH0KLSAgICAgICAgQklDICAgICAgdFZhbDYsICB0VmFsNiwgICMweEZGMDAwMDAwICAgICAgICAgOy8vIHswMCwgIGYyLCAgZjEsICBmMCB9Ci0gICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB7VTMsICBmMiwgIGYxLCAgZjAgfQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgIE91dDEsICAgT3V0MywgICBPdXQwLCAgQVNSICM4ICAgICAgIDsvLyB7VTMsICBVMywgIGYyLCAgZjEgfQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIFBLSFRCICAgIE91dDIsICAgT3V0MywgICBPdXQxLCAgQVNSICM4ICAgICAgIDsvLyB7VTMsICBVMywgIFUzLCAgZjIgfQotICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMyB0byBmMH0gYXQgcERzdFszICB0byAwIF0KLSAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNCB0byBmMX0gYXQgcERzdFs3ICB0byA0IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNSB0byBmMn0gYXQgcERzdFsxMSB0byA4IF0KLSAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNiB0byBmM30gYXQgcERTdFsxNSB0byAxMl0KLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLURMVXBwZXJSaWdodEF2YWlsYWJsZSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gezAwLCAgMDAsICAwMCwgIFUzIH0KLSAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMsICBMU1IgIzE2ICAgICAgICAgOy8vIHswMCwgIDAwLCAgVTMsICBVMiB9Ci0gICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB7MDAsICBVMywgIFUyLCAgVTEgfQotICAgICAgICBPUlIgICAgICB0VmFsOCwgIHRWYWw4LCAgQWJvdmU0NTY3LCBMU0wgIzggICA7Ly8ge1U2LCAgVTUsICBVNCwgIFUzIH0KLSAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIEFib3ZlNDU2NywgTFNMICMyNCAgOy8vIHtVNCwgIFUzLCAgVTIsICBVMSB9Ci0gICAgICAgIFBLSEJUICAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcsIExTTCAjMTYgIDsvLyB7VTUsICBVNCwgIFUzLCAgVTIgfQotICAgICAgICBNVk4gICAgICB0VmFsMSwgIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8ge1U2JywgVTUnLCBVNCcsIFUzJ30KLSAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHtVNCcsIFUzJywgVTInLCBVMSd9Ci0gICAgICAgIE1WTiAgICAgIHRWYWwyLCAgQWJvdmU0NTY3ICAgICAgICAgICAgICAgICAgIDsvLyB7VTcnLCBVNicsIFU1JywgVTQnfQotICAgICAgICBVSEFERDggICB0VmFsNiwgIEFib3ZlMDEyMywgIHRWYWw5ICAgICAgICAgICA7Ly8ge2QzLCAgZDIsICBkMSwgIGQwIH0KLSAgICAgICAgVUhBREQ4ICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NyAgICAgICAgICAgOy8vIHtkNSwgIGQ0LCAgZDMsICBkMiB9Ci0gICAgICAgIFVIQUREOCAgIHRWYWw4LCAgQWJvdmU0NTY3LCAgdFZhbDggICAgICAgICAgIDsvLyB7ZDYsICB4eCwgIHh4LCAgeHggfQotICAgICAgICBVSFNVQjggICB0VmFsNiwgIHRWYWw2LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge2UzLCAgZTIsICBlMSwgIGUwIH0KLSAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsOSwgIHRWYWwxICAgICAgICAgICAgICAgOy8vIHtlNSwgIGU0LCAgZTMsICBlMiB9Ci0gICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMiAgICAgICAgICAgICAgIDsvLyB7ZTYsICB4eCwgIHh4LCAgeHggfQotICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2YzLCAgZjIsICBmMSwgIGYwIH0KLSAgICAgICAgVUFERDggICAgdFZhbDksICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmNiwgIHh4LCAgeHgsICB4eCB9Ci0gICAgICAgIFVBREQ4ICAgIE91dDIsICAgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjUsICBmNCwgIGYzLCAgZjIgfQotICAgICAgICBNT1YgICAgICB0VmFsNywgIE91dDAsICAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gezAwLCAgZjMsICBmMiwgIGYxIH0KLSAgICAgICAgQU5EICAgICAgdFZhbDksICB0VmFsOSwgICMweEZGMDAwMDAwICAgICAgICAgOy8vIHtmNiwgIDAwLCAgMDAsICAwMCB9Ci0gICAgICAgIFBLSEJUICAgIE91dDEsICAgdFZhbDcsICBPdXQyLCAgTFNMICM4ICAgICAgIDsvLyB7ZjQsICBmMywgIGYyLCAgZjEgfQotICAgICAgICBPUlIgICAgICBPdXQzLCAgIHRWYWw5LCAgT3V0MiwgIExTUiAjOCAgICAgICA7Ly8ge2Y2LCAgZjUsICBmNCwgIGYzIH0KLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMyB0byBmMH0gYXQgcERzdFszICB0byAwIF0KLSAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNCB0byBmMX0gYXQgcERzdFs3ICB0byA0IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNSB0byBmMn0gYXQgcERzdFsxMSB0byA4IF0KLSAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNiB0byBmM30gYXQgcERTdFsxNSB0byAxMl0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi0KLU9NWF9WQ180eDRfRElBR19EUgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCi0gICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDEsICBMZWZ0MCwgIExTTCAjOCAgICAgIDsvLyB0VmFsNyA9IDAwIDAwIEwwIEwxCi0gICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBVMyBVMiBVMSBVMAotICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgPUFERF9DT05TVDEgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBPUlIgICAgICB0VmFsOCwgIExlZnQzLCAgTGVmdDIsICBMU0wgIzggICAgICA7Ly8gdFZhbDggPSAwMCAwMCBMMiBMMwotICAgICAgICBQS0hCVCAgICB0VmFsNywgIHRWYWw4LCAgdFZhbDcsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSBMMCBMMSBMMiBMMwotICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDggPSBVMiBVMSBVMCAwMAotICAgICAgICBNT1YgICAgICB0VmFsOSwgIHRWYWw3LCAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBMMCBMMSBMMgotICAgICAgICBPUlIgICAgICB0VmFsOCwgIHRWYWw4LCAgQWJvdmVMZWZ0ICAgICAgICAgICA7Ly8gdFZhbDggPSBVMiBVMSBVMCBVTAotICAgICAgICBPUlIgICAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmVMZWZ0LCBMU0wgIzI0ICA7Ly8gdFZhbDkgPSBVTCBMMCBMMSBMMgotICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTTCAjMjQgICAgICAgICA7Ly8gdFZhbDEwPSBVMCAwMCAwMCAwMAotICAgICAgICBVWFRCICAgICB0VmFsMTEsIHRWYWw3LCAgUk9SICMyNCAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCAwMCBMMAotICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDksICBMU1IgIzggICAgICA7Ly8gdFZhbDEwPSBVMCBVTCBMMCBMMQotICAgICAgICBPUlIgICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsICBMU0wgIzggICAgICA7Ly8gdFZhbDExPSBVMSBVMCBVTCBMMAotICAgICAgICBVSEFERDggICB0VmFsMTEsIEFib3ZlMDEyMywgIHRWYWwxMSAgICAgICAgICA7Ly8gdFZhbDExPSBkMSBkMCBkTCBnMAotICAgICAgICBVSEFERDggICB0VmFsMTAsIHRWYWw3LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBnMCBnMSBnMiBnMwotICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBVMidVMSdVMCdVTCcKLSAgICAgICAgTVZOICAgICAgdFZhbDksICB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gVUwnTDAnTDEnTDInCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IGUxIGUwIGVMIGgwCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsOSAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IGgwIGgxIGgyIGgzCi0gICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDEwLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQzICA9IGkwIGkxIGkyIGkzCi0gICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQwICA9IGYxIGYwIGZMIGkwCi0gICAgICAgIFVYVEggICAgIHRWYWwxMSwgT3V0MywgICBST1IgIzggICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIGkxIGkyCi0gICAgICAgIE1PViAgICAgIHRWYWw3LCAgT3V0MCwgICBMU0wgIzggICAgICAgICAgICAgIDsvLyB0VmFsNyA9IGYwIGZMIGkwIDAwCi0gICAgICAgIE9SUiAgICAgIE91dDEsICAgdFZhbDcsICB0VmFsMTEsICBMU1IgIzggICAgIDsvLyBPdXQxICA9IGYwIGZMIGkwIGkxCi0gICAgICAgIFBLSEJUICAgIE91dDIsICAgdFZhbDExLCBPdXQwLCAgICBMU0wgIzE2ICAgIDsvLyBPdXQyICA9IGZMIGkwIGkxIGkyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjEgdG8gaTB9IGF0IHBEc3RbMyAgdG8gMCBdCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjAgdG8gaTF9IGF0IHBEc3RbNyAgdG8gNCBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZkwgdG8gaTJ9IGF0IHBEc3RbMTEgdG8gOCBdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7aTAgdG8gaTN9IGF0IHBEc3RbMTUgdG8gMTJdIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLQotT01YX1ZDXzR4NF9WUgotCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKLSAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCAgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IDAwIDAwIDAwIFVMCi0gICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCAgICAgPSAwMCAwMCAwMCBMMAotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgICAgID0gMDAgMDAgMDAgTDEKLSAgICAgICAgTERSQiAgICAgTGVmdDIsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQyICAgICA9IDAwIDAwIDAwIEwyCi0gICAgICAgIE1PViAgICAgIHRWYWwwLCAgQWJvdmUwMTIzLCAgTFNMICM4ICAgICAgICAgIDsvLyB0VmFsMCAgICAgPSBVMiBVMSBVMCAwMAotICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgICAgID0gVTMgVTIgVTEgVTAgCi0gICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDAsICAgQWJvdmVMZWZ0ICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMiBVMSBVMCBVTAotICAgICAgICBNVk4gICAgICB0VmFsMTEsIHRWYWwxNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDExICAgID0gVTInVTEnVTAnVUwnCi0gICAgICAgIE1PViAgICAgIHRWYWwyLCAgdFZhbDE0LCAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsMiAgICAgPSBVMSBVMCBVTCAwMAotICAgICAgICBVSFNVQjggICB0VmFsMSwgIEFib3ZlMDEyMywgIHRWYWwxMSAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gZDIgZDEgZDAgZEwKLSAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCBBYm92ZUxlZnQsIExlZnQxICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IDAwIDAwIDAwIGoxICAgICAgIAotICAgICAgICBNVk4gICAgICB0VmFsNCwgIExlZnQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgTDAnCi0gICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDEwLCAgdFZhbDQgICAgICAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBrMQotICAgICAgICBPUlIgICAgICB0VmFsMTIsIHRWYWwwLCAgIExlZnQwICAgICAgICAgICAgICA7Ly8gdFZhbDEyICAgID0gVTIgVTEgVTAgTDAKLSAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMiwgICBMZWZ0MCAgICAgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUxIFUwIFVMIEwwCi0gICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCi0gICAgICAgIFVIQUREOCAgIHRWYWwxMCwgdFZhbDksICAgdFZhbDE0ICAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSBnMyBnMiBnMSBnMAotICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWwxLCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MCAgICAgID0gZTIgZTEgZTAgZUwKLSAgICAgICAgVUhTVUI4ICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IGgzIGgyIGgxIGgwCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7ZTIgdG8gZUx9IGF0IHBEc3RbMyAgdG8gMCBdCi0gICAgICAgIE1PViAgICAgIHRWYWwxLCAgdFZhbDE0LCAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBVMCBVTCBMMCAwMAotICAgICAgICBNT1YgICAgICB0VmFsNiwgIE91dDAsICAgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDYgICAgID0gZTEgZTAgZUwgMDAKLSAgICAgICAgT1JSICAgICAgdFZhbDIsICB0VmFsMiwgICBMZWZ0MSAgICAgICAgICAgICAgOy8vIHRWYWwyICAgICA9IFUxIFUwIFVMIEwxCi0gICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICAgcjB4ODA4MDgwODAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBsMSAgICAgICAgCi0gICAgICAgIFVBREQ4ICAgIE91dDEsICAgdFZhbDEwLCAgcjB4ODA4MDgwODAgICAgICAgIDsvLyBPdXQxICAgICAgPSBpMyBpMiBpMSBpMAotICAgICAgICBNVk4gICAgICB0VmFsMiwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTEnVTAnVUwnTDEnCi0gICAgICAgIE9SUiAgICAgIHRWYWwxLCAgdFZhbDEsICAgTGVmdDIgICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBVMCBVTCBMMCBMMgotICAgICAgICBPUlIgICAgICBPdXQyLCAgIHRWYWw2LCAgIHRWYWw0ICAgICAgICAgICAgICA7Ly8gT3V0MiAgICAgID0gZTEgZTAgZUwgbDEKLSAgICAgICAgVUhBREQ4ICAgdFZhbDEsICB0VmFsMSwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxICAgICA9IGcyIGcxIGcwIGoyCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7aTMgdG8gaTB9IGF0IHBEc3RbNyAgdG8gNCBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7ZTEgdG8gbDF9IGF0IHBEc3RbMTEgdG8gOCBdCi0gICAgICAgIFVIU1VCOCAgIHRWYWw5LCAgdFZhbDEsICAgdFZhbDIgICAgICAgICAgICAgIDsvLyB0VmFsOSAgICAgPSBoMiBoMSBoMCBrMgotICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWw5LCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MyAgICAgID0gaTIgaTEgaTAgbDIKLSAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtpMiB0byBsMn0gYXQgcERzdFsxNSB0byAxMl0gCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLU9NWF9WQ180eDRfSEQKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKLSAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCAgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IDAwIDAwIDAwIFVMCi0gICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IDAwIDAwIDAwIEwwCi0gICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IDAwIDAwIDAwIEwxCi0gICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IDAwIDAwIDAwIEwyCi0gICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IDAwIDAwIDAwIEwzCi0gICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCi0gICAgICAgIE9SUiAgICAgIHRWYWwyLCAgQWJvdmVMZWZ0LCBBYm92ZTAxMjMsIExTTCAjODsvLyB0VmFsMiA9IFUyIFUxIFUwIFVMCi0gICAgICAgIE1WTiAgICAgIHRWYWwxLCAgTGVmdDAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIEwwJwotICAgICAgICBPUlIgICAgICB0VmFsNCwgIExlZnQwLCAgdFZhbDIsICBMU0wgIzggICAgICA7Ly8gdFZhbDQgPSBVMSBVMCBVTCBMMAotICAgICAgICBNVk4gICAgICB0VmFsMiwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSBVMidVMSdVMCdVTCcKLSAgICAgICAgVUhBREQ4ICAgdFZhbDQsICB0VmFsNCwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHRWYWw0ID0gZzMgZzIgZzEgZzAKLSAgICAgICAgVUhTVUI4ICAgdFZhbDEsICBBYm92ZUxlZnQsICB0VmFsMSAgICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgZEwKLSAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsNCwgIHRWYWwyICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaDMgaDIgaDEgaDAKLSAgICAgICAgVUFERDggICAgdFZhbDEsICB0VmFsMSwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgZUwKLSAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw0ID0gaTMgaTIgaTEgaTAKLSAgICAgICAgT1JSICAgICAgdFZhbDIsICBMZWZ0MCwgIEFib3ZlTGVmdCwgIExTTCAjMTYgOy8vIHRWYWwyID0gMDAgVUwgMDAgTDAKLSAgICAgICAgTU9WICAgICAgdFZhbDQsICB0VmFsNCwgIExTTCAjOCAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaTIgaTEgaTAgMDAKLSAgICAgICAgT1JSICAgICAgdFZhbDExLCBMZWZ0MSwgIExlZnQwLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMT0gMDAgTDAgMDAgTDEKLSAgICAgICAgT1JSICAgICAgdFZhbDcsICBMZWZ0MiwgIExlZnQxLCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gMDAgTDEgMDAgTDIKLSAgICAgICAgT1JSICAgICAgdFZhbDEwLCBMZWZ0MywgIExlZnQyLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMD0gMDAgTDIgMDAgTDMKLSAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsNCwgIHRWYWwxICAgICAgICAgICAgICAgOy8vIE91dDAgID0gaTIgaTEgaTAgZUwKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdIAotICAgICAgICBNT1YgICAgICB0VmFsNCwgIE91dDAsICAgTFNMICMxNiAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBpMSBpMCAwMCAwMAotICAgICAgICBVSEFERDggICB0VmFsMiwgIHRWYWwyLCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBqMSAwMCBqMgotICAgICAgICBVSEFERDggICB0VmFsNiwgIHRWYWwxMSwgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBqMiAwMCBqMwotICAgICAgICBNVk4gICAgICB0VmFsMTIsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBMMCcwMCBMMScKLSAgICAgICAgTVZOICAgICAgdFZhbDE0LCB0VmFsNyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxND0gMDAgTDEnMDAgTDInCi0gICAgICAgIFVIU1VCOCAgIHRWYWwyLCAgdFZhbDIsICB0VmFsMTIgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGsxIDAwIGsyCi0gICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDcsICB0VmFsMTIgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGQxIDAwIGQyCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDYsICB0VmFsMTQgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGsyIDAwIGszCi0gICAgICAgIFVIU1VCOCAgIHRWYWw5LCAgdFZhbDEwLCB0VmFsMTQgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIGQyIDAwIGQzCi0gICAgICAgIFVBREQ4ICAgIHRWYWwyLCAgdFZhbDIsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGwxIDAwIGwyCi0gICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGUxIDAwIGUyCi0gICAgICAgIFVBREQ4ICAgIHRWYWwxMSwgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGwyIDAwIGwzCi0gICAgICAgIFVBREQ4ICAgIHRWYWw5LCAgdFZhbDksICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOSA9IDAwIGUyIDAwIGUzCi0gICAgICAgIE9SUiAgICAgIE91dDIsICAgdFZhbDgsICB0VmFsMiwgIExTTCAjOCAgICAgIDsvLyBPdXQyICA9IGwxIGUxIGwyIGUyCi0gICAgICAgIE9SUiAgICAgIE91dDMsICAgdFZhbDksICB0VmFsMTEsIExTTCAjOCAgICAgIDsvLyBPdXQzICA9IGwyIGUyIGwzIGUzCi0gICAgICAgIFBLSFRCICAgIE91dDEsICAgdFZhbDQsICBPdXQyLCAgIEFTUiAjMTYgICAgIDsvLyBPdXQxICA9IGkxIGkwIGwxIGUxCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gIGF0IHBEc3QgWzQgIHRvIDcgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9ICBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSAgYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLU9NWF9WQ180eDRfVkwKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsIHtBYm92ZTAxMjMsIEFib3ZlNDU2N30gICA7Ly8gQWJvdmUwMTIzLCBBYm92ZTQ1NjcgPSBwU3JjQWJvdmVbMCB0byA3XQotICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKLSAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKLSAgICAgICAgTU9WICAgICAgdFZhbDExLCBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgMDAgVTMKLSAgICAgICAgTVVMRVEgICAgQWJvdmU0NTY3LCB0VmFsMTEsIHIweDAxMDEwMTAxICAgICAgOy8vIEFib3ZlNDU2NyA9IFUzIFUzIFUzIFUzCi0gICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIFUzIFUyIFUxCi0gICAgICAgIE1WTiAgICAgIHRWYWwxMCwgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IFUzJ1UyJ1UxJ1UwJwotICAgICAgICBPUlIgICAgICB0VmFsMiwgIHRWYWw5LCAgQWJvdmU0NTY3LCAgTFNMICMyNCA7Ly8gdFZhbDIgPSBVNCBVMyBVMiBVMQotICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWwyLCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBkNCBkMyBkMiBkMQotICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MCA9IGU0IGUzIGUyIGUxCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBNT1YgICAgICB0VmFsOSwgIHRWYWw5LCAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCAwMCBVMyBVMgotICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlNDU2NywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDEwPSBVNiBVNSBVNCAwMAotICAgICAgICBQS0hCVCAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3LCBMU0wgIzE2ICA7Ly8gdFZhbDkgPSBVNSBVNCBVMyBVMgotICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBVNiBVNSBVNCBVMwotICAgICAgICBVSEFERDggICB0VmFsMTEsIHRWYWw5LCAgQWJvdmUwMTIzICAgICAgICAgICA7Ly8gdFZhbDExPSBnNSBnNCBnMyBnMgotICAgICAgICBVSEFERDggICB0VmFsMTQsIHRWYWwyLCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDE0PSBnNiBnNSBnNCBnMwotICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBVNCdVMydVMidVMScKLSAgICAgICAgTVZOICAgICAgdFZhbDcsICB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gVTUnVTQnVTMnVTInCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDksICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IGQ1IGQ0IGQzIGQyCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IGg1IGg0IGgzIGgyCi0gICAgICAgIFVIU1VCOCAgIHRWYWwyLCAgdFZhbDE0LCB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IGg2IGg1IGg0IGgzCi0gICAgICAgIFVBREQ4ICAgIE91dDEsICAgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQxICA9IGk1IGk0IGkzIGkyCi0gICAgICAgIFVBREQ4ICAgIE91dDIsICAgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQyICA9IGU1IGU0IGUzIGUyCi0gICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDIsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQzICA9IGk2IGk1IGk0IGkzCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gYXQgcERzdCBbNCAgdG8gNyBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIE1fU1RSICAgIE91dDMsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotT01YX1ZDXzR4NF9IVQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCi0gICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCi0gICAgICAgIE1PViAgICAgIHIweDgwODA4MDgwLCAgcjB4MDEwMTAxMDEsIExTTCAjNyAgIDsvLyAweDgwODA4MDgwCi0gICAgICAgIE9SUiAgICAgIHRWYWw2LCAgTGVmdDAsICBMZWZ0MSwgIExTTCAjMTYgICAgIDsvLyB0VmFsNiA9IDAwIEwxIDAwIEwwCi0gICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDEsICBMZWZ0MiwgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IDAwIEwyIDAwIEwxCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMSwgTGVmdDIsICBMZWZ0MywgIExTTCAjMTYgICAgIDsvLyB0VmFsMTE9IDAwIEwzIDAwIEwyCi0gICAgICAgIE1VTCAgICAgIE91dDMsICAgTGVmdDMsICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyBPdXQzICA9IEwzIEwzIEwzIEwzCi0gICAgICAgIE1WTiAgICAgIHRWYWw4LCAgdFZhbDcgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IDAwIEwyJzAwIEwxJwotICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSAwMCBMMycwMCBMMicKLSAgICAgICAgVUhBREQ4ICAgdFZhbDQsICB0VmFsNiwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gMDAgZzMgMDAgZzIKLSAgICAgICAgVVhUQjE2ICAgdFZhbDEyLCBPdXQzICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgTDMgMDAgTDMKLSAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsNCwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gMDAgaDMgMDAgaDIKLSAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gMDAgZDIgMDAgZDEKLSAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgZDMgMDAgZDIKLSAgICAgICAgVUhBREQ4ICAgdFZhbDEyLCB0VmFsMTIsIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgZzQgMDAgZzMKLSAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw0ID0gMDAgaTMgMDAgaTIKLSAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsMTIsIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgaDQgMDAgaDMKLSAgICAgICAgVUFERDggICAgdFZhbDgsICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw4ID0gMDAgZTIgMDAgZTEKLSAgICAgICAgVUFERDggICAgdFZhbDExLCB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMT0gMDAgZTMgMDAgZTIKLSAgICAgICAgVUFERDggICAgdFZhbDEyLCB0VmFsMTIsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMj0gMDAgaTQgMDAgaTMKLSAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsOCwgIHRWYWw0LCAgTFNMICM4ICAgICAgOy8vIE91dDAgID0gaTMgZTIgaTIgZTEKLSAgICAgICAgT1JSICAgICAgT3V0MSwgICB0VmFsMTEsIHRWYWwxMiwgTFNMICM4ICAgICAgOy8vIE91dDEgID0gaTQgZTMgaTMgZTIKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdCi0gICAgICAgIFBLSFRCICAgIE91dDIsICAgT3V0MywgICBPdXQxLCAgIEFTUiAjMTYgICAgIDsvLyBPdXQyICA9IEwzIEwzIGk0IGUzCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gIGF0IHBEc3QgWzQgIHRvIDcgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9ICBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSAgYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0KLSAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEVORAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgZW5kcwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODNkN2YwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgCi0KLSAgICBJRiBBUk0xMTM2SlMKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBwU3JjICAgICAgIFJOIDAKLXBEc3QgICAgICAgIFJOIDEKLVFQICAgICAgICAgIFJOIDIKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlIGZvciBVbnBhY2syeDIgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyYyAgICAgICAgUk4gOQotVmFsdWUgICAgICAgUk4gNAotVmFsdWUyICAgICAgUk4gNQotRmxhZyAgICAgICAgUk4gNgotc3RyT2Zmc2V0ICAgUk4gNwotY3N0T2Zmc2V0ICAgUk4gOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yMHcwICAgICAgICBSTiAgMwotcjB3MSAgICAgICAgUk4gIDQKLQotYzB3MCAgICAgICAgUk4gIDUKLWMxdzAgICAgICAgIFJOICA2Ci0KLXJldHVybiAgICAgIFJOICAwCi1wUVBEaXZUYWJsZSBSTiAgNQotcFFQTW9kVGFibGUgICAgUk4gIDYKLVNoaWZ0ICAgICAgICBSTiAgOQotU2NhbGUgICAgICAgIFJOICAyCi0KLVRlbXAxICAgICAgIFJOICAzCi1UZW1wMiAgICAgICBSTiAgNAotVGVtcDMgICAgICAgUk4gIDcKLVRlbXA0ICAgICAgIFJOICA4Ci0KLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIHI5Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYwotICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIFZhbHVlLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCi0gICAgICAgIE1PViAgICAgIFZhbHVlMiwgICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCi0gICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+Ci0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzBdICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAKLSAgICAgICAgCi0KLXVucGFja0xvb3AKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCi0gICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MKLSAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKLSAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKLSAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQotICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KLSAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+Ci0gICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCi0gICAgICAgIAotICAgICAgICBMRE1JQSAgICBwRHN0LCB7cjB3MCwgcjB3MX0gICAgICAgICAgICAgICAgICA7Ly8gcjB3MCA9IHxjMXxjMHwgJiByMHcxID0gfGMzfGMyfAotCi0KLSAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICBMRFIgICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICAKLSAgICAgICAgU0FERFNVQlggcjB3MCwgcjB3MCwgIHIwdzAgICAgICAgICAgICAgICAgICAgOy8vIFsgYzAwK2MwMSwgYzAwLWMwMSBdCi0gICAgICAgIFNBRERTVUJYIHIwdzEsIHIwdzEsICByMHcxICAgICAgICAgICAgICAgICAgIDsvLyBbIGMxMCtjMTEsIGMxMC1jMTEgXQotICAgICAgICAKLSAgICAgICAgTERSU0IgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCi0gICAgICAgIExEUlNCICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXQotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgYzB3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwK2QxMCwgZDAxK2QxMSBdCi0gICAgICAgIFNTVUIxNiAgIGMxdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMC1kMTAsIGQwMS1kMTEgXQotICAgICAgICAKLSAgICAgICAgTFNMICAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgIFRlbXAyLCBjMHcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZQotICAgICAgICBTTVVMVEIgICBUZW1wNCwgYzF3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUKLSAgICAgICAgU01VTEJCICAgVGVtcDEsIGMwdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlCi0gICAgICAgIFNNVUxCQiAgIFRlbXAzLCBjMXcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZQotICAgICAgICBNT1YgICAgICBUZW1wMiwgVGVtcDIsIEFTUiAjMSAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUZW1wMiA+PiAxICYgVGVtcDEgPSAoVGVtcDEgPj4gMSkgPDwgMTYKLSAgICAgICAgTU9WICAgICAgVGVtcDQsIFRlbXA0LCBBU1IgIzEgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVGVtcDQgPj4gMSAmIFRlbXAzID0gKFRlbXAzID4+IDEpIDw8IDE2Ci0gICAgICAgIFBLSEJUICAgIGMwdzAsICBUZW1wMiwgVGVtcDEsIExTTCAjMTUgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDEgfCBUZW1wMiB8Ci0gICAgICAgIFBLSEJUICAgIGMxdzAsICBUZW1wNCwgVGVtcDMsIExTTCAjMTUgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDMgfCBUZW1wNCB8Ci0gICAgICAgIFNUTUlBICAgIHBEc3QsIHtjMHcwLCBjMXcwfSAgICAgICAgICAgICAgICAgIDsvLyBTdG9yaW5nIGFsbCB0aGUgY29lZmZpY2llbnRzIGF0IG9uY2UKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc0Y2QxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKLTsvLyAKLTsvLyAKLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gSW1wb3J0L0V4cG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20vdG8gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0KLQotOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0gICAgCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQVJNMTEzNkpTIAotCi0KLTsvL0lucHV0IFJlZ2lzdGVycwotcERhdGEgICAgICAgICAgICAgICBSTiAgMAotUVAgICAgICAgICAgICAgICAgICBSTiAgMQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLQotOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKLWluMDAgICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgOy8vIFNyY1swXSAmIFNyY1sxXSAKLWluMDIgICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgOy8vIFNyY1syXSAmIFNyY1szXQotaW4xMCAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzRdICYgU3JjWzVdCi1pbjEyICAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNl0gJiBTcmNbN10KLWluMjAgICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s4XSAmIFNyY1s5XQotaW4yMiAgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEwXSAmIFNyY1sxMV0KLWluMzAgICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMl0gJiBTcmNbMTNdCi1pbjMyICAgICAgICAgICAgICAgIFJOICA5ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTRdICYgU3JjWzE1XQotCi07Ly8gVHJhbnNwb3NlIGZvciBSb3cgb3BlcmF0aW9ucyAoUm93cyB0byBjb2xzKQotdHJSb3cwMCAgICAgICAgICAgICBSTiAgMgotdHJSb3cxMCAgICAgICAgICAgICBSTiAgMTAKLXRyUm93MDIgICAgICAgICAgICAgUk4gIDMKLXRyUm93MTIgICAgICAgICAgICAgUk4gIDUKLXRyUm93MjAgICAgICAgICAgICAgUk4gIDExCi10clJvdzMwICAgICAgICAgICAgIFJOICAxMgotdHJSb3czMiAgICAgICAgICAgICBSTiAgMTQKLXRyUm93MjIgICAgICAgICAgICAgUk4gIDcKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKLXJvd1N1bTEgICAgICAgICAgICAgUk4gIDQKLXJvd1N1bTIgICAgICAgICAgICAgUk4gIDYKLXJvd0RpZmYxICAgICAgICAgICAgUk4gIDgKLXJvd0RpZmYyICAgICAgICAgICAgUk4gIDkKLQotCi07Ly8gUm93IG9wZXJhdGVkIHBpeGVscwotcm93T3AwMCAgICAgICAgICAgICBSTiAgMgotcm93T3AxMCAgICAgICAgICAgICBSTiAgMTAKLXJvd09wMjAgICAgICAgICAgICAgUk4gIDExCi1yb3dPcDMwICAgICAgICAgICAgIFJOICAxMgotcm93T3AwMiAgICAgICAgICAgICBSTiAgMwotcm93T3AxMiAgICAgICAgICAgICBSTiAgNQotcm93T3AyMiAgICAgICAgICAgICBSTiAgNwotcm93T3AzMiAgICAgICAgICAgICBSTiAgMTQKLQotOy8vIFRyYW5zcG9zZSBmb3IgY29sdWxtbiBvcGVyYXRpb25zCi10ckNvbDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAotdHJDb2wwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKLXRyQ29sMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCi10ckNvbDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAotdHJDb2wyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKLXRyQ29sMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCi10ckNvbDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAotdHJDb2wzMiAgICAgICAgICAgICBSTiAgOSAgCi0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1jb2xTdW0xICAgICAgICAgICAgIFJOICAxMAotY29sU3VtMiAgICAgICAgICAgICBSTiAgMTEKLWNvbERpZmYxICAgICAgICAgICAgUk4gIDEyCi1jb2xEaWZmMiAgICAgICAgICAgIFJOICAxNAotCi0KLTsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscwotY29sT3AwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLWNvbE9wMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi1jb2xPcDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotY29sT3AxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLWNvbE9wMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi1jb2xPcDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotY29sT3AzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLWNvbE9wMzIgICAgICAgICAgICAgUk4gIDkgIAotCi07Ly8gVGVtcG9yYXJ5IHNjcmF0Y2ggdmFyYWlibGVzCi1wUVBEaXZUYWJsZSAgICAgICAgIFJOICAwCi1wUVBNb2RUYWJsZSAgICAgICAgIFJOICAxMQotU2hpZnQgICAgICAgICAgICAgICBSTiAgMTAKLVNjYWxlICAgICAgICAgICAgICAgUk4gIDE0Ci1Sb3VuZCAgICAgICAgICAgICAgIFJOICAwCi0KLXRlbXAxICAgICAgICAgICAgICAgUk4gIDEwCi10ZW1wMiAgICAgICAgICAgICAgICBSTiAgMTEKLXRlbXAzICAgICAgICAgICAgICAgUk4gIDEyCi10ZW1wNCAgICAgICAgICAgICAgIFJOICAxCi0KLQotCi07Ly8gSW52VHJhbnNmb3JtZWQgYW5kIERlcXVhbnRpemVkIHBpeGVscwotb3V0MDAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLW91dDAyICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi1vdXQxMCAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotb3V0MTIgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLW91dDIwICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi1vdXQyMiAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotb3V0MzAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLW91dDMyICAgICAgICAgICAgICAgUk4gIDkgIAotICAgICAgCi0gICAgICAgIAotCi0gICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgTV9BTExPQzQgICAgcERhdGFPblN0YWNrLCA0Ci0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0LHIxMQotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCi0gICAgICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA4IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgIDsvLyBTdG9yZSB0aGUgNHg0IGJsb2NrIGF0IG9uZSBnbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIAotICAgICAgICBMRE1JQSAgIHBEYXRhLHtpbjAwLGluMDIsaW4xMCxpbjEyLGluMjAsaW4yMixpbjMwLGluMzJ9Ci0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgbWF0cml4IGlub3JkZXIgdG8gcGVyZm9ybSByb3cgb3BzIGFzIGNvbG91bW4gb3BzCi0gICAgICAgIDsvLyBJbnB1dDogICBpbltdW10gPSBvcmlnaW5hbCBtYXRyaXgKLSAgICAgICAgOy8vIE91dHB1dDogIHRyUm93W11bXT0gdHJhbnNwb3NlZCBtYXRyaXgKLSAgICAgICAgOy8vIFN0ZXAxOiBPYnRhaW4gdGhlIExMIHBhcnQgb2YgdGhlIHRyYW5zcG9zZWQgbWF0cml4Ci0gICAgICAgIDsvLyBTdGVwMjogT2J0YWluIHRoZSBITCBwYXJ0Ci0gICAgICAgIDsvLyBzdGVwMzogT2J0YWluIHRoZSBMSCBwYXJ0Ci0gICAgICAgIDsvLyBTdGVwNDogT2J0YWluIHRoZSBISCBwYXJ0Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgZDAgZDEgLSAtCi0gICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyUm93MTAsaW4xMCxpbjAwLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzUgNF0gPSBbZjU6ZjFdICAgIAotICAgICAgICBQS0hCVCAgIHRyUm93MDAsaW4wMCxpbjEwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQotICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFBLSFRCICAgdHJSb3czMCxpbjEyLGluMDIsQVNSICMxNiAgICAgICAgICAgICAgOy8vIFsxMyAxMl0gPSBbNyAzXQotICAgICAgICAgUEtIQlQgICB0clJvdzIwLGluMDIsaW4xMixMU0wgIzE2ICAgICAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKLSAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAotICAgICAgICA7Ly8gICAtIC0gLSAgLQotICAgICAgICA7Ly8gICAtIC0gLSAgLQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB0clJvdzAyLGluMjAsaW4zMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAotICAgICAgICBQS0hUQiAgIHRyUm93MTIsaW4zMCxpbjIwLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzcgNl0gPSBbZjEzOmY5XSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly8gSEggMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICBkMTAgZDExCi0gICAgICAgIDsvLyAgICAtIC0gIGQxNCBkMTUKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJSb3czMixpbjMyLGluMjIsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbMTUgMTRdID0gWzE1IDExXQotICAgICAgICBQS0hCVCAgIHRyUm93MjIsaW4yMixpbjMyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzExIDEwXSA9IFsxNCAxMF0KLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIGZpcnN0IHR3byBjb2x1bW5zKHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgICByb3dTdW0xLHRyUm93MDAsdHJSb3cxMCAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQotICAgICAgICBTQUREMTYgICAgICByb3dTdW0yLHRyUm93MjAsdHJSb3czMCAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQotICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMSx0clJvdzAwLHRyUm93MTAgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQotICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMix0clJvdzIwLHRyUm93MzAgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQotICAgICAgICBTQUREMTYgICAgICByb3dPcDAwLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQotICAgICAgICBTU1VCMTYgICAgICByb3dPcDEwLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQotICAgICAgICBTU1VCMTYgICAgICByb3dPcDIwLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQotICAgICAgICBTQUREMTYgICAgICByb3dPcDMwLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTEsdHJSb3cwMix0clJvdzEyICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCi0gICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTIsdHJSb3cyMix0clJvdzMyICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYxLHRyUm93MDIsdHJSb3cxMiAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCi0gICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYyLHRyUm93MjIsdHJSb3czMiAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCi0gICAgICAgIFNBREQxNiAgICAgIHJvd09wMDIscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIHJvd09wMTIscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIHJvd09wMjIscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCi0gICAgICAgIFNBREQxNiAgICAgIHJvd09wMzIscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4Ci0gICAgICAgIDsvLyBJbnB1dDogIHJvd09wW11bXQotICAgICAgICA7Ly8gT3V0cHV0OiB0ckNvbFtdW10gCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgZDAgZDEgLSAtCi0gICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyQ29sMTAscm93T3AxMCxyb3dPcDAwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0KLSAgICAgICAgUEtIQlQgICB0ckNvbDAwLHJvd09wMDAscm93T3AxMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQotICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFBLSFRCICAgdHJDb2wzMCxyb3dPcDEyLHJvd09wMDIsQVNSICMxNiAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCi0gICAgICAgICBQS0hCVCAgIHRyQ29sMjAscm93T3AwMixyb3dPcDEyLExTTCAjMTYgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCi0gICAgICAgIAotICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCi0gICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgdHJDb2wwMixyb3dPcDIwLHJvd09wMzAsTFNMICMxNiAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAotICAgICAgICBQS0hUQiAgIHRyQ29sMTIscm93T3AzMCxyb3dPcDIwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKLSAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDMyLHJvd09wMzIscm93T3AyMixBU1IgIzE2ICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCi0gICAgICAgIFBLSEJUICAgdHJDb2wyMixyb3dPcDIyLHJvd09wMzIsTFNMICMxNiAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQotICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIFN0b3JlIHBEYXRhKFJOMCkgb24gc3RhY2sgYW5kIHJlc3RvcmUgaXQgb25seSBhdCB0aGUgZmluYWwgc3RvcmUgYmFjawotICAgICAgICA7Ly8gVGhpcyBmcmVlcyB1cCBhIHJlZ2lzdGVyIChSTjApIHdoaWNoIGlzIHVzZWQgdG8gcmVkdWNlIG51bWJlciBvZiBpbnRlcm1lZGlhdGUgc3RhbGxzIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX1NUUiAgICAgICBwRGF0YSxwRGF0YU9uU3RhY2sKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIGZpcnN0IHR3byBjb2x1bW5zKHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGNvbFN1bTEsdHJDb2wwMCx0ckNvbDEwICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCi0gICAgICAgIFNBREQxNiAgICAgIGNvbFN1bTIsdHJDb2wyMCx0ckNvbDMwICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIGNvbERpZmYxLHRyQ29sMDAsdHJDb2wxMCAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCi0gICAgICAgIFNTVUIxNiAgICAgIGNvbERpZmYyLHRyQ29sMjAsdHJDb2wzMCAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCi0gICAgICAgIFNBREQxNiAgICAgIGNvbE9wMDAsY29sU3VtMSxjb2xTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMTAsY29sU3VtMSxjb2xTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMjAsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCi0gICAgICAgIFNBREQxNiAgICAgIGNvbE9wMzAsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCi0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMobmV4dCB0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCi0gICAgICAgIFNBREQxNiAgICAgIGNvbFN1bTEsdHJDb2wwMix0ckNvbDEyICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCi0gICAgICAgIFNBREQxNiAgICAgIGNvbFN1bTIsdHJDb2wyMix0ckNvbDMyICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIGNvbERpZmYxLHRyQ29sMDIsdHJDb2wxMiAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCi0gICAgICAgIFNTVUIxNiAgICAgIGNvbERpZmYyLHRyQ29sMjIsdHJDb2wzMiAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCi0gICAgICAgIFNBREQxNiAgICAgIGNvbE9wMDIsY29sU3VtMSxjb2xTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMTIsY29sU3VtMSxjb2xTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCi0gICAgICAgIExEUiAgICAgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCi0gICAgICAgIExEUlNCICAgICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQotICAgICAgICBTU1VCMTYgICAgICBjb2xPcDIyLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQotICAgICAgICBTQUREMTYgICAgICBjb2xPcDMyLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBMRFJTQiAgICAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0gCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gPERlcXVhbnRpemU+IGltcHJvdmVzIG9uIHRoZSBjLXJlZmVyZW5jZSBjb2RlCi0gICAgICAgIDsvLyBCb3RoIHRoZSAgY2FzZXMgaS5lLiwgU2hpZnQ+PTAgYW5kIFNoaWZ0PDAgY2FzZXMgYXJlIGNvdmVyZWQgdG9nZXRoZXIKLSAgICAgICAgOy8vIFdlIGRvIG5vdCBzdWJ0cmFjdCAyIGZyb20gU2hpZnQgYXMgaW4gQyByZWZlcmVuY2UsIGluc3RlYWQgcGVyZm9ybSBhCi0gICAgICAgIDsvLyBTY2FsZSA8PCBTaGlmdCBvbmNlIGluIHRoZSBiZWdpbm5pbmcgYW5kIGRvIGEgcmlnaHQgc2hpZnQgYnkgYSAKLSAgICAgICAgOy8vIGNvbnN0YW50IDIgYWZ0ZXIgdGhlIE11bHRpcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgUm91bmQgd291bGQgYmUgMiAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gQnkgZG9pbmcgdGhpcyB3ZSBhdmlvZCB0aGUgQnJhbmNoZXMgcmVxdWlyZWQgYW5kIGFsc28gCi0gICAgICAgIDsvLyByZWR1Y2UgdGhlIGNvZGUgc2l6ZSBzdWJzdGFudGlhbGx5Ci0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgUm91bmQsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSb3VuZCA9IDIKLSAgICAgICAgTFNMICAgICAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gUm93IDEKLSAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AwMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMDIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDAwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AwMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIAotICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgotICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgotICAgICAgICBQS0hCVCAgIG91dDAwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgUEtIQlQgICBvdXQwMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAyCi0gICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMTAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDEyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AxMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMTIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICAKLSAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIKLSAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKLSAgICAgICAgUEtIQlQgICBvdXQxMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIFBLSEJUICAgb3V0MTIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAzCi0gICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMjAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDIyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AyMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMjIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICAKLSAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIgCi0gICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCi0gICAgICAgIFBLSEJUICAgb3V0MjAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICBQS0hCVCAgIG91dDIyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgNAotICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDMwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AzMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMzAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDMyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgcERhdGEscERhdGFPblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmVzdG9yZSBwRGF0YSBwb2ludGVyIGZyb20gc3RhY2sKLSAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIKLSAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKLSAgICAgICAgUEtIQlQgICBvdXQzMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIFBLSEJUICAgb3V0MzIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1zdG9yZV9jb2VmZgotICAgICAgICAKLSAgICAgICAgU1RNSUEgICBwRGF0YSx7b3V0MDAsb3V0MDIsb3V0MTAsb3V0MTIsb3V0MjAsb3V0MjIsb3V0MzAsb3V0MzJ9Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQgICAgICAgIAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAKLSAgICAKLQotOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICAgICAgCi0KLQotOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wcFNyYyAgICAgICAgICAgICAgIFJOICAwCi1wRHN0ICAgICAgICAgICAgICAgIFJOICAxCi1RUFIyICAgICAgICAgICAgICAgIFJOICAyCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLXJlc3VsdCAgICAgICAgICAgICAgUk4gIDAKLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBEc3RSNCAgICAgICAgICAgICAgUk4gIDQKLXBEc3RSMCAgICAgICAgICAgICAgUk4gIDAKLVFQUjEgICAgICAgICAgICAgICAgUk4gIDEKLVFQUjUgICAgICAgICAgICAgICAgUk4gIDUKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGIEFSTTExMzZKUwotICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLHI1Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHBEc3RSNCxwRHN0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjEKLSAgICAgICAgTU9WICAgICBRUFI1LFFQUjIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIyCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwRHN0UjAscERzdFI0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMAotICAgICAgICBNT1YgICAgIFFQUjEsUVBSNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIxCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAKLSAgICAKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OWU3NTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlcy5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIEh1ZmZmbWFuIGNvZGluZyBhbmQgZGVjb2RpbmcgCi0gKiAgICAgICAgICAgICAgaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhIVUZGVEFCX0hfCi0jZGVmaW5lIF9PTVhIVUZGVEFCX0hfCi0KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludHJhVmxjTDBMMVsyMDBdOwotCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXTsKLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMzJdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XTsKLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFs3M107Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFs0MF0KLQotI2VuZGlmIC8qIF9PTVhIVUZGVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODZiYTA0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgWmlnemFnIHNjYW4gaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhaSUdaQUdUQUJfSAotI2RlZmluZSBfT01YWklHWkFHVEFCX0gKLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml07Ci0vL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdOwotLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuIFs2NF07Ci0KLSNlbmRpZiAvKiBfT01YWklHWkFHVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDFkNDQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsgLyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NsaXA4X3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgQ2xpcHBpbmcgMTYgYml0IHZhbHVlIHRvIFswLDI1NV0gUmFuZ2UKLTsgKi8gCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAKLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICAKLSAgICAgCi0gICAgICBJRiBBUk0xMTM2SlMKLSAKLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wU3JjICAgICAgICAgICAgICAgICBSTiAwCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAxCi1zdGVwICAgICAgICAgICAgICAgICBSTiAyCi0KLTsvLyBMb2NhbCB2YXJpYWJsZXMKLQoteDAgICAgICAgICAgICAgICAgICAgUk4gMwoteDEgICAgICAgICAgICAgICAgICAgUk4gNAoteDIgICAgICAgICAgICAgICAgICAgUk4gNQoteDMgICAgICAgICAgICAgICAgICAgUk4gNgotCi1Db3VudCAgICAgICAgICAgICAgICBSTiAxNAotICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0NsaXA4LHI2Ci0gICAgICAgCi0KLSAgICAgICAgTU9WICAgICAgICAgIENvdW50LCM4Ci1sb29wCi0KLSAgICAgICAgTERNSUEgICAgICAgIHBTcmMhLHt4MCwgeDF9Ci0gICAgICAgIFNVQlMgICAgICAgICBDb3VudCxDb3VudCwgIzEgICAgICAgICAgOy8vIGNvdW50IGRvd24KLSAgICAgICAgTERNSUEgICAgICAgIHBTcmMhLHt4MiwgeDN9Ci0gICAgICAgIFVTQVQxNiAgICAgICB4MCwgIzgsIHgwICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCi0gICAgICAgIFVTQVQxNiAgICAgICB4MSwgIzgsIHgxICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCi0gICAgICAgIFNUUkIgICAgICAgICB4MCwgW3BEc3RdCi0gICAgICAgIE1PViAgICAgICAgICB4MCwgeDAsIExTUiAjMTYKLSAgICAgICAgU1RSQiAgICAgICAgIHgwLCBbcERzdCwjMV0KLSAgICAgICAgU1RSQiAgICAgICAgIHgxLCBbcERzdCwjMl0KLSAgICAgICAgTU9WICAgICAgICAgIHgxLCB4MSwgTFNSICMxNgotICAgICAgICBTVFJCICAgICAgICAgeDEsIFtwRHN0LCMzXQotICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICAgeDIsICM4LCB4MiAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQotICAgICAgICBVU0FUMTYgICAgICAgeDMsICM4LCB4MyAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQotICAgICAgICBTVFJCICAgICAgICAgeDIsIFtwRHN0LCM0XQotICAgICAgICBNT1YgICAgICAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIFNUUkIgICAgICAgICB4MiwgW3BEc3QsIzVdCi0gICAgICAgIFNUUkIgICAgICAgICB4MywgW3BEc3QsIzZdCi0gICAgICAgIE1PViAgICAgICAgICB4MywgeDMsIExTUiAjMTYKLSAgICAgICAgU1RSQiAgICAgICAgIHgzLCBbcERzdCwjN10KLSAgICAgICAgQUREICAgICAgICAgIHBEc3QscERzdCxzdGVwICAgICAgICAgICAgIDsvLyBJbmNyZW1lbnQgcERzdCBieSBzdGVwIHZhbHVlCi0gICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgIGxvb3AgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb250aW51ZSBsb29wIHVudGlsIENvdW50IHJlYWNoZXMgNjQgCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjViZWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyLCBpbnRyYSBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiAKLTsgKgotOyAqIAotOyAqCi07ICogCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0gICAgIAotICAgICAgICAKLQotCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotCi1mdHlwZSAgICAgICAgICAgICAgICBSTiAwCi10ZW1wMyAgICAgICAgICAgICAgICBSTiA0Ci10ZW1wICAgICAgICAgICAgICAgICBSTiA1Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci1Fc2NhcGUgICAgICAgICAgICAgICBSTiA1Ci0KLTsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotemlnemFnICAgICAgICAgICAgICAgUk4gMAotc3RvcmVMZXZlbCAgICAgICAgICAgUk4gMQotdGVtcDIgICAgICAgICAgICAgICAgUk4gNAotdGVtcDEgICAgICAgICAgICAgICAgUk4gNQotc2lnbiAgICAgICAgICAgICAgICAgUk4gNQotTGFzdCAgICAgICAgICAgICAgICAgUk4gNwotc3RvcmVSdW4gICAgICAgICAgICAgUk4gMTQKLQotCi1wYWNrUmV0SW5kZXggICAgICAgICBSTiA1Ci0KLQotbWFya2VyYml0ICAgICAgICAgICAgUk4gNQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgUk4gOAotUkJpdEJ1ZmZlciAgICAgICAgICAgUk4gOQotUkJpdENvdW50ICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgUk4gMTEKLVQyICAgICAgICAgICAgICAgICAgIFJOIDEyCi1MUiAgICAgICAgICAgICAgICAgICBSTiAxNCAgICAgICAgCi0gICAgICAgIAotCi0KLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcE9mZnNldCw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwTGlua1JlZ2lzdGVyLDQgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLSAgICAgICAgOy8vIGdldCB0aGUgdGFibGUgYWRkcmVzc2VzIGZyb20gc3RhY2sgICAgICAgCi0gICAgICAgIE1fQVJHICAgICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQVJHICAgICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwWmlnemFnVGFibGUsNAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIEFMTCB6ZXJvcyBhdCBwRHN0Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgQ291bnQgdG8gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgICAgICBMYXN0LCMwCi0gICAgICAgIE1fU1RSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTGluayBSZWdpc3RlciBvbiBTdGFjawotICAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDIsIzAKLSAgICAgICAgTU9WICAgICAgICAgICAgIExSLCMwICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIE1hY3JvIGFuZCBTdG9yZSBhbGwgemVyb3MgdG8gcERzdCAKLSAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50ICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwcEJpdHN0cmVhbSBvbiBzdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBCaXRPZmZzZXQgb24gc3RhY2sKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICAgICAgcERzdCxwRHN0LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJlc3RvcmUgcERzdAotCi0gICAgICAgIDsvLyBUaGUgYXJtVkNNNFAyX0dldFZMQ0JpdHMgYmVnaW5zCi0KLWdldFZMQ2JpdHMKLSAgICAgICAgCi0gICAgICAgIE1fQkRfTE9PSzggICAgICBFc2NhcGUsNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBFc2NhcGUgVmFsdWUKLSAgICAgICAgTFNSICAgICAgICAgICAgIEVzY2FwZSxFc2NhcGUsIzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIEVzY2FwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBmb3IgZXNjYXBlIG1vZGUKLSAgICAgICAgTU9WTkUgICAgICAgICAgIGZ0eXBlLCMwCi0gICAgICAgIEJORSAgICAgICAgICAgICBub3RFc2NhcGVtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIGlmIG5vdCBpbiBFc2NhcGUgbW9kZSAzCi0KLSAgICAgICAgTV9CRF9WU0tJUDggICAgICM3LFQxCi0gICAgICAgIENNUCAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgc2hvcnRWaWRlb0hlYWRlciBmbGFnIHRvIGtub3cgdGhlIHR5cGUgb2YgRXNjYXBlIG1vZGUKLSAgICAgICAgQkVRICAgICAgICAgICAgIGVuZEZpbGxWTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBFc2NhcGUgTW9kZSA0Ci0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVMZXZlbCw4LFQxCi0KLSAgICAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB3aGV0aGVyIHRoZSBSZXNlcnZlZCB2YWx1ZXMgZm9yIExldmVsIGFyZSB1c2VkIGFuZCBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBpdCBpcyBzbwotCi0gICAgICAgIFRFUSAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCi0gICAgICAgIFRFUU5FICAgICAgICAgICBzdG9yZUxldmVsLCMxMjggICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50Ci0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKLSAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBlcnJvciBpZiBDb3VudCtzdG9yZVJ1biA+PSA2NAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZGluZyB0aGUgQWRkcmVzcyBvZiBaaWd6YWcgdGFibGUKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1hUQiAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIEV4dGVuZCBzdG9yZUxldmVsIHRvIDMyIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ3RoCi0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCi0gICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCi0gICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgTGV2ZWwKLSAgICAgICAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKLSAgICAgICAKLSAgICAgICAgCi0KLWVuZEZpbGxWTEQKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgRnR5cGUoIEVzY2FwZSBNb2RlKSB2YWx1ZSBiYXNlZCBvbiB0aGUgdHdvIHN1Y2Nlc3NpdmUgYml0cyBpbiB0aGUgYml0c3RyZWFtCi0gICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMSAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMxCi0gICAgICAgIEJFUSAgICAgICAgICAgICBub3RFc2NhcGVtb2RlCi0gICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMQotICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzMKLSAgICAgICAgTU9WTkUgICAgICAgICAgIGZ0eXBlLCMyCi0gICAgICAgIAotCi1ub3RFc2NhcGVtb2RlCi0KLSAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgdGFibGUgd2l0aCBsYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIENvbWJpbmVkIFZMQyBUYWJsZQotICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGZ0eXBlID49MyBnZXQgcGVyZm9ybSBGaXhlZCBMZW5ndGggRGVjb2RpbmcgKEVzY2FwZSBNb2RlIDMpCi0gICAgICAgIEJHRSAgICAgICAgICAgICBFc2NhcGVNb2RlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRWxzZSBjb250aW51ZSBub3JtYWwgVkxDIERlY29kaW5nCi0gICAgICAgIAotICAgICAgICA7Ly8gVmFyaWFibGUgbGVuZ2ggZGVjb2RpbmcsICJhcm1VblBhY2tWTEMzMiIgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgICAgICAgIHBhY2tSZXRJbmRleCxUMSxUMixwVmxjVGFibGVMMEwxLDQsMgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wMyw9MHhGRkYKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBwYWNrUmV0SW5kZXgsdGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgZm9yIGludmFsaWQgc3ltYm9sCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgaW52YWxpZCBzeW1ib2wgb2NjdXJzIGV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlCi0gICAgICAgIAotICAgICAgICBBTkQgICAgICAgICAgICAgTGFzdCxwYWNrUmV0SW5kZXgsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBMYXN0IGZyb20gcGFja2VkIEluZGV4Ci0gICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZVJ1bixwYWNrUmV0SW5kZXgsIzcgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IFJ1biBWYWx1ZSBmcm9tIFBhY2tlZCBpbmRleAotICAgICAgICBBTkQgICAgICAgICAgICAgc3RvcmVMZXZlbCxwYWNrUmV0SW5kZXgsIzB4N2MgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlTGV2ZWw9cGFja1JldEluZGV4WzItNl0sc3RvcmVMZXZlbFswLTFdPTAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIHRhYmxlCi0gICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExldmVsIHZhbHVlCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgICAgICBmdHlwZTIKLSAgICAgICAgCi0gICAgICAgIDsvLyBmdHlwZT09MTsgRXNjYXBlIG1vZGUgPTEKLSAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwTE1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgIDsvLyBJZiB0aGUgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCi0gICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsc3RvcmVSdW5dCi0KLSAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlTGV2ZWwsdGVtcDEsc3RvcmVMZXZlbCAgICAgICAgICAgICAgICAgICAgIAotCi1mdHlwZTIKLQotICAgICAgICA7Ly8gZnR5cGUgPTI7IEVzY2FwZSBtb2RlID0yCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMyCi0gICAgICAgIEJORSAgICAgICAgICAgICBGaWxsVkxETDEKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcFJNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICAgOy8vIElmIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcwotICAgICAgICBTVUIgICAgICAgICAgICAgdGVtcDIsc3RvcmVMZXZlbCwjMQotICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHRlbXAyXQotCi0gICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bixzdG9yZVJ1biwjMQotICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sdGVtcDEKLSAgICAgICAgCi1GaWxsVkxETDEgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzaWduLDEsVDEKLQotICAgICAgICBDTVAgICAgICAgICAgICAgc2lnbiwjMQotICAgICAgICBSU0JFUSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCMwCi0gCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSxzdG9yZVJ1bixDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjNjQKLSAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmdodAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotIAotc3RvcmVMZXZlbEwxCi0gICAgICAgIAotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIExldmVsIHZhbCBpcyBMYXN0IG5vbiB6ZXJvIHZhbAotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKLSAgICAgICAgTFNSICAgICAgICAgICAgIExhc3QsTGFzdCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICAgICAgZW5kCi0gICAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gCi0KLQotICAgICAgICA7Ly8gRml4ZWQgTGVuZ2ggRGVjb2RpbmcgRXNjYXBlIE1vZGUgMwotCi1Fc2NhcGVNb2RlMwotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MwotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgbWFya2VyYml0LDEsVDEKLSAgICAgICAgVEVRICAgICAgICAgICAgIG1hcmtlcmJpdCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBtYXJrZXIgYml0IGlzIHplcm8KLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotICAgICAgICAKLSAgICAgICAgTV9CRF9SRUFEMTYgICAgIHN0b3JlTGV2ZWwsMTIsVDEKLQotICAgICAgICBUU1QgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMHg4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlc3QgaWYgdGhlIGxldmVsIGlzIG5lZ2F0aXZlCi0gICAgICAgIFNVQk5FICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzQwOTYKLSAgICAgICAgQ01QICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKLSAgICAgICAgQ01QTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIy0yMDQ4Ci0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgTGV2ZWw9PTAgb3IgIC0yMDQ4IAotCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCi0gICAgICAgICAgICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgbWFya2VyYml0LDEsVDEKLSAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyICggU2lnbiBub3QgdXNlZCBhcyBzdG9yZUxldmVsIGlzIHByZXByb2Nlc3NlZCkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVuIExlbmd0aAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotCi0KLSAKLXN0b3JlTGV2ZWxMYXN0Ci0gICAgICAgIAotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgICAgIGVuZCAKLSAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gICAgICAgIAotZW5kCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCM2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL1J1biB0aGUgTG9vcCB1bnRpbGwgQ291bnQgcmVhY2hlcyA2NAotCi0gICAgICAgIEJMVCAgICAgICAgICAgICBnZXRWTENiaXRzCi0KLSAgICAgICAgCi1FeGl0T2sKLSAgICAgICAgOy8vIEV4aXQgV2hlbiBWTEMgRGVjb2RpbmcgaXMgZG9uZSBTdWNjZXNzZnVsbHkgCi0gICAKLSAgICAgICAgOy8vIExvYWRpbmcgcHBCaXRTdHJlYW0gYW5kIHBCaXRPZmZzZXQgZnJvbSBzdGFjawotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAotCi0gICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLQotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgICAgICAgIAotICAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1PVk5FICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0gICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBMaW5rIFJlZ2lzdGVyIEJhY2sKLSAgICAgICAgQiAgICAgICAgICAgICAgIGV4aXQyCi0KLUV4aXRFcnJvcgotICAgICAgICA7Ly8gRXhpdCBXaGVuIGFuIEVycm9yIG9jY3VycyAKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0Ci0gICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLQotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlcgotICAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgotCi1leGl0MgotICAgICAgIAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQ4NmVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBIdWZmbWFuIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotCi0KLQotLy8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBQYWNrZWQgVkxDIHRhYmxlcyB3aXRoIExhc3Q9MCBhbmQgTGFzdD0xCi0KLS8vICAgICAgICAgICAgICBvcHRpbWl6ZWQgUGFja2VkIFZMQyB0YWJsZSBFbnRyeSBGb3JtYXQgCi0vLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAKLS8vICAgICAgICAxNSAxNCAxMyAxMiAxMSAxMCAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vICAgICAgIHwgIExlbiAgIHwgICAgICAgUnVuICAgICAgIHwgICAgIExldmVsICAgIHxMIHwgMSB8Ci0vLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLy8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKLS8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgotLy8gICAgTGVuICAgID0gTnVtYmVyIG9mIGJpdHMgb3ZlcnJlYWQgICgwIHRvIDcpICAzIGJpdHMKLS8vICAgIFJ1biAgICA9IFJ1bkxlbmd0aCBvZiB0aGUgU3ltYm9sICAoMCB0byA2MykgNiBiaXRzCi0vLyAgICBMZXZlbCAgPSBMZXZlbCBvZiB0aGUgU3ltYm9sICAgICAgKDAgdG8gMzEpIDUgYml0cwotLy8gICAgTCAgICAgID0gTGFzdCBWYWx1ZSBvZiB0aGUgU3ltYm9sICgwIG9yIDEpICAxIGJpdAotLy8KLS8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhbiBpbnRlcm5hbCBub2RlIHRoZW4gYml0IDAgaXMgY2xlYXI6Ci0vLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQotLy8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQotLy8KLS8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKLS8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKLS8vIGlzIG9idGFpbmVkLiBUaGUgU3RlcCBzaXplcyBhcmUgc3VwcGxpZWQgdG8gdGhlIFZMRCBtYWNyby4KLQotLy8gVGhlIFZMQyB0YWJsZXMgdXNlZCBmb3IgSW50cmEgYW5kIG5vbiBpbnRhIGNvZWZmaWNpZW50cyBpbiBub24gRXNjYXBlIG1vZGUKLS8vIGNvbnRhaW5zIHN5bWJvbHMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xLgotLy8gSWYgYSBzeW1ib2wgaXMgbm90IGZvdW5kIGluIHRoZSB0YWJsZSBpdCB3aWxsIGJlIGNvZGVkIGFzIDB4RkZGCi0gCi0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludGVyVmxjTDBMMVsyMDBdID0gewotICAgIDB4MDAyMCwgMHgwMTA4LCAweDAxNDgsIDB4MDE3MCwgMHgwMTc4LCAweDAxODAsIDB4MDE4OCwgMHgxYjA5LAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHgyMTA5LCAweDIxMDksIDB4MDIwOSwgMHgwMDExLAotICAgIDB4MDAyOCwgMHgwMDYwLCAweDAwYjgsIDB4MDBlMCwgMHgwMDMwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAotICAgIDB4M2ZmZiwgMHgzZmZmLCAweDAwMzgsIDB4MDA0MCwgMHgyMTE1LCAweDIxMTUsIDB4MjAxZCwgMHgyMDFkLAotICAgIDB4MjA1OSwgMHgyMDU5LCAweDIwNTEsIDB4MjA1MSwgMHgxYzBkLCAweDFiMGQsIDB4MWEwZCwgMHgxOTBkLAotICAgIDB4MDkxMSwgMHgwODExLCAweDA3MTEsIDB4MDYxMSwgMHgwNTExLCAweDAzMTksIDB4MDIxOSwgMHgwMTIxLAotICAgIDB4MDA2OCwgMHgwMDkwLCAweDNmZmYsIDB4M2ZmZiwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAotICAgIDB4MjA2MSwgMHgyMDYxLCAweDIxMjksIDB4MjEyOSwgMHgzNzA5LCAweDM3MDksIDB4MzgwOSwgMHgzODA5LAotICAgIDB4M2QwZCwgMHgzZDBkLCAweDNlMGQsIDB4M2UwZCwgMHgzZjBkLCAweDNmMGQsIDB4MjAwZCwgMHgyMDBkLAotICAgIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMTMxLCAweDAyMjEsIDB4MDQxOSwgMHgwNTE5LAotICAgIDB4MDYxOSwgMHgwYTExLCAweDE5MDksIDB4MWEwOSwgMHgyMTBkLCAweDIyMGQsIDB4MjMwZCwgMHgyNDBkLAotICAgIDB4MjUwZCwgMHgyNjBkLCAweDI3MGQsIDB4MjgwZCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAotICAgIDB4MDA0OSwgMHgwMDQxLCAweDM4MGQsIDB4MzgwZCwgMHgzNzBkLCAweDM3MGQsIDB4MzYwZCwgMHgzNjBkLAotICAgIDB4MzUwZCwgMHgzNTBkLCAweDM0MGQsIDB4MzQwZCwgMHgzMzBkLCAweDMzMGQsIDB4MzIwZCwgMHgzMjBkLAotICAgIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDEwMCwgMHgzMTBkLCAweDMxMGQsIDB4MjAxNSwgMHgyMDE1LAotICAgIDB4MzYwOSwgMHgzNjA5LCAweDM1MDksIDB4MzUwOSwgMHgzNDA5LCAweDM0MDksIDB4MzMwOSwgMHgzMzA5LAotICAgIDB4MzIwOSwgMHgzMjA5LCAweDMxMDksIDB4MzEwOSwgMHgwMTEwLCAweDAxMzAsIDB4MDEzOCwgMHgwMTQwLAotICAgIDB4MDExOCwgMHgwMTIwLCAweDAxMjgsIDB4MTAwZCwgMHgzMDA5LCAweDMwMDksIDB4MmYwOSwgMHgyZjA5LAotICAgIDB4MjQxMSwgMHgyNDExLCAweDIzMTEsIDB4MjMxMSwgMHgyMDM5LCAweDIwMzksIDB4MjAzMSwgMHgyMDMxLAotICAgIDB4MGYwZCwgMHgwZTBkLCAweDBkMGQsIDB4MGMwZCwgMHgwYjBkLCAweDBhMGQsIDB4MDkwZCwgMHgwZTA5LAotICAgIDB4MGQwOSwgMHgwMjExLCAweDAxMTksIDB4MDAyOSwgMHgwMTUwLCAweDAxNTgsIDB4MDE2MCwgMHgwMTY4LAotICAgIDB4MjgwZCwgMHgyODBkLCAweDI3MGQsIDB4MjcwZCwgMHgyNjBkLCAweDI2MGQsIDB4MjUwZCwgMHgyNTBkLAotICAgIDB4MmMwOSwgMHgyYzA5LCAweGI3NTksIDB4Yjc1OSwgMHgyYTA5LCAweDJhMDksIDB4MjAyMSwgMHgyMDIxLAotICAgIDB4MDQwZCwgMHgwMzBkLCAweDBiMzUsIDB4MDEwZCwgMHgwOTA5LCAweDA4MDksIDB4MDcwOSwgMHgwNjA5LAotICAgIDB4MDExMSwgMHgwMDE5LCAweDI1MDksIDB4MjUwOSwgMHgyNDA5LCAweDI0MDksIDB4MjMwOSwgMHgyMzA5Ci19OwotCi0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludHJhVmxjTDBMMVsyMDBdID0gewotICAgIDB4MDAyMCwgMHgwMTA4LCAweDAxNDgsIDB4MDE3MCwgMHgwMTc4LCAweDAxODAsIDB4MDE4OCwgMHgwZjA5LAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHgyMDExLCAweDIwMTEsIDB4MDEwOSwgMHgwMDE5LAotICAgIDB4MDAyOCwgMHgwMDYwLCAweDAwYjgsIDB4MDBlMCwgMHgwMDMwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAotICAgIDB4M2ZmZiwgMHgzZmZmLCAweDAwMzgsIDB4MDA0MCwgMHgyMDNkLCAweDIwM2QsIDB4MjAzNSwgMHgyMDM1LAotICAgIDB4MjBiMSwgMHgyMGIxLCAweDIwYTksIDB4MjBhOSwgMHgwMjE1LCAweDAxMWQsIDB4MDAyZCwgMHgwZDA5LAotICAgIDB4MDUxOSwgMHgwODExLCAweDA0MTksIDB4MDMyMSwgMHgwMjIxLCAweDAxMzksIDB4MDBhMSwgMHgwMDk5LAotICAgIDB4MDA2OCwgMHgwMDkwLCAweDNmZmYsIDB4M2ZmZiwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAotICAgIDB4MjBiOSwgMHgyMGI5LCAweDIwYzEsIDB4MjBjMSwgMHgyMTQxLCAweDIxNDEsIDB4MjkxMSwgMHgyOTExLAotICAgIDB4MjMxNSwgMHgyMzE1LCAweDI0MTUsIDB4MjQxNSwgMHgyZjBkLCAweDJmMGQsIDB4MzAwZCwgMHgzMDBkLAotICAgIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMGM5LCAweDAwZDEsIDB4MDBkOSwgMHgwMTQ5LAotICAgIDB4MDYxOSwgMHgwMTUxLCAweDAyMjksIDB4MDcxOSwgMHgwZTA5LCAweDAwNDUsIDB4MDUxNSwgMHgwNjE1LAotICAgIDB4MTEwZCwgMHgxMjBkLCAweDEzMGQsIDB4MTQwZCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAotICAgIDB4MDA5MSwgMHgwMDg5LCAweDJlMGQsIDB4MmUwZCwgMHgyZDBkLCAweDJkMGQsIDB4MmMwZCwgMHgyYzBkLAotICAgIDB4MmIwZCwgMHgyYjBkLCAweDJhMGQsIDB4MmEwZCwgMHgyMTE1LCAweDIxMTUsIDB4MjAyNSwgMHgyMDI1LAotICAgIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDEwMCwgMHgyYzA5LCAweDJjMDksIDB4MmIwOSwgMHgyYjA5LAotICAgIDB4MjcxMSwgMHgyNzExLCAweDI2MTEsIDB4MjYxMSwgMHgyNTExLCAweDI1MTEsIDB4MjMxOSwgMHgyMzE5LAotICAgIDB4MjIxOSwgMHgyMjE5LCAweDIxMzEsIDB4MjEzMSwgMHgwMTEwLCAweDAxMzAsIDB4MDEzOCwgMHgwMTQwLAotICAgIDB4MDExOCwgMHgwMTIwLCAweDAxMjgsIDB4MDgwZCwgMHgyMTI5LCAweDIxMjksIDB4MjA4MSwgMHgyMDgxLAotICAgIDB4MjQxMSwgMHgyNDExLCAweDIwNzksIDB4MjA3OSwgMHgyMDcxLCAweDIwNzEsIDB4MjA2OSwgMHgyMDY5LAotICAgIDB4MWJiNSwgMHgwNjBkLCAweDAwMWQsIDB4ZDNmOSwgMHgwOTA5LCAweDA4MDksIDB4MDkwZCwgMHgwMzExLAotICAgIDB4MDEyMSwgMHgwMDYxLCAweDAwNTksIDB4MDA1MSwgMHgwMTUwLCAweDAxNTgsIDB4MDE2MCwgMHgwMTY4LAotICAgIDB4MjQwZCwgMHgyNDBkLCAweDIzMGQsIDB4MjMwZCwgMHgyNjA5LCAweDI2MDksIDB4MjUwZCwgMHgyNTBkLAotICAgIDB4MjcwOSwgMHgyNzA5LCAweDIyMTEsIDB4MjIxMSwgMHgyMTE5LCAweDIxMTksIDB4MjA0OSwgMHgyMDQ5LAotICAgIDB4MDAxNSwgMHgwNTA5LCAweDAyMGQsIDB4MDEwZCwgMHgwNDA5LCAweDAzMDksIDB4MDA0MSwgMHgwMDM5LAotICAgIDB4MDExMSwgMHgwMDMxLCAweDIyMDksIDB4MjIwOSwgMHgyMDI5LCAweDIwMjksIDB4MjAyMSwgMHgyMDIxCi19OwotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywgMHgyMDAxLCAweDIwMDEsCi0gICAgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHgwMDI4LCAweDAwMGYsIDB4MjAwZCwgMHgyMDBkLCAweDAwMzAsIDB4MDAxMywgMHgyMDExLCAweDIwMTEsCi0gICAgMHgwMDM4LCAweDAwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDNmZmYsIDB4M2ZmZiwgMHgyMDE5LCAweDIwMTksCi0KLQkweDAwMjAsIDB4MDAwOSwgMHgyMDA3LCAweDIwMDcsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKLSAgICAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKLSAgICAweDAwMjgsIDB4MDAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MDAzMCwgMHgwMDExLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDAwMzgsIDB4MDAxNSwgMHgyMDEzLCAweDIwMTMsIDB4MWZmZiwgMHgwMDE5LCAweDIwMTcsIDB4MjAxNwotfTsKLQotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF0gPSB7Ci0gICAgMHgwMDEwLCAweDAwZjAsIDB4MDA0MywgMHgwMDNmLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsCi0gICAgMHgwMDE4LCAweDAwZDgsIDB4MDA0NywgMHgwMDNiLCAweDAwMjAsIDB4MDA4MCwgMHgwMGE4LCAweDAwZDAsCi0gICAgMHgwMDI4LCAweDAwNDgsIDB4MDA3MCwgMHgwMDc4LCAweDFmZmYsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsCi0gICAgMHgwMDgxLCAweDAwMDEsIDB4MDA3ZiwgMHgwMDAzLCAweDIwN2QsIDB4MjA3ZCwgMHgyMDA1LCAweDIwMDUsCi0gICAgMHgyMDdiLCAweDIwN2IsIDB4MjAwNywgMHgyMDA3LCAweDAwNTAsIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsCi0gICAgMHgyMDc5LCAweDIwNzksIDB4MjAwOSwgMHgyMDA5LCAweDIwNzcsIDB4MjA3NywgMHgyMDBiLCAweDIwMGIsCi0gICAgMHgyMDc1LCAweDIwNzUsIDB4MjAwZCwgMHgyMDBkLCAweDIwNzMsIDB4MjA3MywgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgwMDcxLCAweDAwMTEsIDB4MDA2ZiwgMHgwMDEzLCAweDAwNmQsIDB4MDAxNSwgMHgwMDZiLCAweDAwMTcsCi0gICAgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwgMHgwMGEwLCAweDAwNjksIDB4MDAxOSwgMHgwMDY3LCAweDAwMWIsCi0gICAgMHgwMDY1LCAweDAwMWQsIDB4MDA2MywgMHgwMDFmLCAweDAwNjEsIDB4MDAyMSwgMHgwMDVmLCAweDAwMjMsCi0gICAgMHgwMDVkLCAweDAwMjUsIDB4MDA1YiwgMHgwMDI3LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsCi0gICAgMHgwMDU5LCAweDAwMjksIDB4MDA1NywgMHgwMDJiLCAweDIwNTUsIDB4MjA1NSwgMHgyMDJkLCAweDIwMmQsCi0gICAgMHgyMDUzLCAweDIwNTMsIDB4MjAyZiwgMHgyMDJmLCAweDIwNTEsIDB4MjA1MSwgMHgyMDMxLCAweDIwMzEsCi0gICAgMHgyMDRmLCAweDIwNGYsIDB4MjAzMywgMHgyMDMzLCAweDAwZTAsIDB4MDBlOCwgMHgwMDQ5LCAweDAwMzksCi0gICAgMHgyMDRkLCAweDIwNGQsIDB4MjAzNSwgMHgyMDM1LCAweDIwNGIsIDB4MjA0YiwgMHgyMDM3LCAweDIwMzcsCi0gICAgMHgyMDQ1LCAweDIwNDUsIDB4MjAzZCwgMHgyMDNkCi19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQKLSAgIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgZWZmZWN0aXZlbHkKLQotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFs3M10gPSAKLXsKLSAgIDEyLCAgNiwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwgCi0gICAgMiwgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMTItMzFdIHdpdGggemVyb3MgdG8gYWNjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSB0YWJsZSBlZmZlY3RpdmVseSAqLwotCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV0gPSAKLXsKLSAgIDI2LCAxMCwgIDYsICAyLCAgMSwgIDEsICAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCTAsCTAsCTAsCTAsCTAsCTAsCi0JMCwJMCwJMCwJMCwJMCwJMCwKLQkwLAkwLAkwLAkwLAotICAgIDAsICAwLCAgMCwgIDAsICA0MCwgIDEsICAwCi19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBub24gSW50cmEgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQKLSAgIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFsxNS0zMV0gd2l0aCB6ZXJvcyB0byBhY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgZWZmZWN0aXZlbHkKLQotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFs1M10gPSAKLXsKLSAgIDI3LCAxMCwgIDUsICA0LCAgMywgIDMsICAzLCAgCi0gICAgMywgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCTAsCi0JMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAotCi0JOCwgIDMsICAyLCAgMiwgIDIsICAyLCAgMiwgIDEsIAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxCi19OwotCi0KLS8qIFJNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSB0YWJsZSBlZmZlY3RpdmVseSAqLwotCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFs0MF0gPQotewotICAgMTQsICA5LCAgNywgIDMsICAyLCAgMSwJMSwgIAotICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgCTAsICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQkwLAkwLAkwLAkwLAotCQotCTIwLCAgNiwgIDEsICAwLCAgMCwgIDAsICAwLCAgMAotCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3MzlhNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBMb29rdXAgdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSAgICAvKiAqIFRhYmxlIEVudHJpZXMgY29udGFpbiBEYyBTY2FsZXIgdmFsdWVzCi0gICAgICAgKiBhcm1WQ000UDJfRENTY2FsZXJbaV09IDggICAgICAgICAgIGZvciBpPTEgIHRvICA0IGFuZCBpPTMzIHRvIDM2Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaSAgICAgICAgIGZvciBpPTUgIHRvICA4Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGkrOCAgICAgICAgIGZvciBpPTkgIHRvICAyNQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmktMTYgICAgICBmb3IgaT0yNiB0byAgMzEKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gKGktMzIrMTMpLzIgZm9yIGk9MzcgdG8gIDU5Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGktNi0zMiAgICAgIGZvciBpPTYwIHRvICA2MwotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgICBmb3IgaT0wIGFuZCBpPTMyCi0gICAgICAgKi8KLSAgICAgICAKLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfRENTY2FsZXJbNjRdPXsKLQkweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweGEsICAweGMsICAweGUsICAKLSAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAKLSAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAotICAgIDB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MmEsIDB4MmMsIDB4MmUsCi0gICAgMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHg5LCAgMHg5LCAgMHhhLCAgCi0gICAgMHhhLCAgMHhiLCAgMHhiLCAgMHhjLCAgMHhjLCAgMHhkLCAgMHhkLCAgMHhlLCAgCi0gICAgMHhlLCAgMHhmLCAgMHhmLCAgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwgCi0gICAgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKLQotfTsKLQotICAgICAgICAgICAgICAKLSAgICAgLyogIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKLSAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNltpXT1yb3VuZCgzMjc2Ny9pKQotICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzBdPSAwCi0gICAgICAqLwotCi1jb25zdCBPTVhfUzE2IGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNls2NF09ewotCTB4MDAwMCwweDdmZmYsMHg0MDAwLDB4MmFhYSwweDIwMDAsMHgxOTk5LDB4MTU1NSwweDEyNDksCi0gICAgMHgxMDAwLDB4MGUzOSwweDBjY2QsMHgwYmEzLDB4MGFhYiwweDA5ZDksMHgwOTI1LDB4MDg4OCwKLSAgICAweDA4MDAsMHgwNzg3LDB4MDcxYywweDA2YmQsMHgwNjY2LDB4MDYxOCwweDA1ZDEsMHgwNTkxLAotICAgIDB4MDU1NSwweDA1MWYsMHgwNGVjLDB4MDRiZSwweDA0OTIsMHgwNDZhLDB4MDQ0NCwweDA0MjEsCi0gICAgMHgwNDAwLDB4MDNlMSwweDAzYzQsMHgwM2E4LDB4MDM4ZSwweDAzNzYsMHgwMzVlLDB4MDM0OCwKLSAgICAweDAzMzMsMHgwMzFmLDB4MDMwYywweDAyZmEsMHgwMmU5LDB4MDJkOCwweDAyYzgsMHgwMmI5LAotICAgIDB4MDJhYiwweDAyOWQsMHgwMjhmLDB4MDI4MiwweDAyNzYsMHgwMjZhLDB4MDI1ZiwweDAyNTQsCi0gICAgMHgwMjQ5LDB4MDIzZiwweDAyMzUsMHgwMjJiLDB4MDIyMiwweDAyMTksMHgwMjExLDB4MDIwOAotCSAgIAotfTsKLSAgICAgCi0gICAgICAvKiBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCi0gICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbaV09cm91bmQoMTMxMDcxL2kpCi0gICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbMF09IDAKLSAgICAgICAqLwotCi1jb25zdCBPTVhfUzMyIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMls2NF09ewotCTB4MDAwMDAwMDAsMHgwMDAxZmZmZiwweDAwMDEwMDAwLDB4MDAwMGFhYWEsIDB4MDAwMDgwMDAsIDB4MDAwMDY2NjYsIDB4MDAwMDU1NTUsIDB4MDAwMDQ5MjQsCi0gICAgMHgwMDAwNDAwMCwweDAwMDAzOGUzLDB4MDAwMDMzMzMsMHgwMDAwMmU4YywgMHgwMDAwMmFhYiwgMHgwMDAwMjc2MiwgMHgwMDAwMjQ5MiwgMHgwMDAwMjIyMiwKLSAgICAweDAwMDAyMDAwLDB4MDAwMDFlMWUsMHgwMDAwMWM3MiwweDAwMDAxYWYyLCAweDAwMDAxOTlhLCAweDAwMDAxODYxLCAweDAwMDAxNzQ2LCAweDAwMDAxNjQzLAotICAgIDB4MDAwMDE1NTUsMHgwMDAwMTQ3YiwweDAwMDAxM2IxLDB4MDAwMDEyZjYsIDB4MDAwMDEyNDksIDB4MDAwMDExYTgsIDB4MDAwMDExMTEsIDB4MDAwMDEwODQsCi0gICAgMHgwMDAwMTAwMCwweDAwMDAwZjg0LDB4MDAwMDBmMGYsMHgwMDAwMGVhMSwgMHgwMDAwMGUzOSwgMHgwMDAwMGRkNiwgMHgwMDAwMGQ3OSwgMHgwMDAwMGQyMSwKLSAgICAweDAwMDAwY2NkLDB4MDAwMDBjN2QsMHgwMDAwMGMzMSwweDAwMDAwYmU4LCAweDAwMDAwYmEzLCAweDAwMDAwYjYxLCAweDAwMDAwYjIxLCAweDAwMDAwYWU1LAotICAgIDB4MDAwMDBhYWIsMHgwMDAwMGE3MywweDAwMDAwYTNkLDB4MDAwMDBhMGEsIDB4MDAwMDA5ZDksIDB4MDAwMDA5YTksIDB4MDAwMDA5N2IsIDB4MDAwMDA5NGYsCi0gICAgMHgwMDAwMDkyNSwweDAwMDAwOGZiLDB4MDAwMDA4ZDQsMHgwMDAwMDhhZSwgMHgwMDAwMDg4OSwgMHgwMDAwMDg2NSwgMHgwMDAwMDg0MiwgMHgwMDAwMDgyMAotCQotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQxM2QxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsgKioKLTsgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLTsgKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLTsgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCi07ICogW291dF1wcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLTsgKiBbb3V0XXByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi07ICogICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLTsgKgotOyAqLwotCi0gICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgSU5DTFVERSBvbXhWQ19zLmgKLQotCi0gICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotCi0gICAgICAgSUYgQVJNMTEzNkpTCi0gCi07Ly8gSW5wdXQgQXJndW1lbnRzCi1CbG9ja0luZGV4ICAgICAgICAgUk4gMAotcENvZWZCdWZSb3cgICAgICAgIFJOIDEKLXBDb2VmQnVmQ29sICAgICAgICBSTiAyCi1wcmVkRGlyICAgICAgICAgICAgUk4gMwotcHJlZFFQICAgICAgICAgICAgIFJOIDQKLXBRcEJ1ZiAgICAgICAgICAgICBSTiA1Ci0KLTsvLyBMb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgIFJOIDAKLWJsb2NrRENMZWZ0ICAgICAgICBSTiA2ICAKLWJsb2NrRENUb3AgICAgICAgICBSTiA3Ci1ibG9ja0RDVG9wTGVmdCAgICAgUk4gOAotdGVtcDEgICAgICAgICAgICAgIFJOIDkKLXRlbXAyICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgTV9TVEFSVCAgICBhcm1WQ000UDJfU2V0UHJlZERpcixyOQotCi0gICAgICAgTV9BUkcgICAgICAgcHByZWRRUCw0Ci0gICAgICAgTV9BUkcgICAgICAgcHBRcEJ1Ziw0Ci0gICAgCi0gICAgICAgTERSSCAgICAgICAgYmxvY2tEQ1RvcExlZnQsW3BDb2VmQnVmUm93LCMtMTZdCi0gICAgICAgTERSSCAgICAgICAgYmxvY2tEQ0xlZnQsW3BDb2VmQnVmQ29sXQotICAgICAgIAotICAgICAgIFRFUSAgICAgICAgIEJsb2NrSW5kZXgsIzMKLSAgICAgICBMRFJFUUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZkNvbCwjLTE2XQotICAgICAgIExEUk5FSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmUm93XQotICAgICAgICAgICAgIAotICAgICAgIFNVQlMgICAgICAgIHRlbXAxLGJsb2NrRENMZWZ0LGJsb2NrRENUb3BMZWZ0Ci0gICAgICAgUlNCTFQgICAgICAgdGVtcDEsdGVtcDEsIzAKLSAgICAgICBTVUJTICAgICAgICB0ZW1wMixibG9ja0RDVG9wTGVmdCxibG9ja0RDVG9wCi0gICAgICAgUlNCTFQgICAgICAgdGVtcDIsdGVtcDIsIzAKLSAgICAgIAotICAgICAgIE1fTERSICAgICAgIHBRcEJ1ZixwcFFwQnVmCi0gICAgICAgTV9MRFIgICAgICAgcHJlZFFQLHBwcmVkUVAKLSAgICAgICBDTVAgICAgICAgICB0ZW1wMSx0ZW1wMgotICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfVkVSVElDQUwKLSAgICAgICBMRFJMVEIgICAgICB0ZW1wMSxbcFFwQnVmLCMxXQotICAgICAgIFNUUkxUICAgICAgIHRlbXAyLFtwcmVkRGlyXQotICAgICAgIFNUUkxUICAgICAgIHRlbXAxLFtwcmVkUVBdCi0gICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19IT1JJWk9OVEFMICAgICAgICAgICAKLSAgICAgICBMRFJHRUIgICAgICB0ZW1wMSxbcFFwQnVmXQotICAgICAgIFNUUkdFICAgICAgIHRlbXAyLFtwcmVkRGlyXQotICAgICAgIE1PViAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgIFNUUkdFICAgICAgIHRlbXAxLFtwcmVkUVBdIAotCi0gICAgICAgICAKLSAgICAKLSAgICAgICBNX0VORAotIAotICAgICAgIEVORElGCi0KLSAgICAgICBFTkQgICAgCi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ3NTU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSB6aWd6YWcgdGFibGVzCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0vKiBDb250YWlucyBEb3VibGUgdGhlIHZhbHVlcyBpbiB0aGUgcmVmZXJlbmNlIFppZ3phZyBUYWJsZQotICogQ29udGFpbnMgQ2xhc3NpY2FsLFZldGljYWwgYW5kIEhvcml6b250YWwgWmlnemFnc2NhbiB0YWJsZXMgaW4gb25lIGFycmF5ICAKLSAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdID0gCi17Ci0gICAgIDAsICAyLCAgMTYsIDMyLCAgMTgsICA0LCAgNiwgMjAsCi0gICAgMzQsIDQ4LCA2NCwgNTAsIDM2LCAyMiwgIDgsICAxMCwKLSAgICAyNCwgMzgsIDUyLCA2NiwgODAsIDk2LCA4MiwgNjgsCi0gICAgNTQsIDQwLCAyNiwgIDEyLCAgMTQsIDI4LCA0MiwgNTYsIAotICAgIDcwLCA4NCwgOTgsIDExMiwgMTE0LCAxMDAsIDg2LCA3MiwKLSAgICA1OCwgNDQsIDMwLCA0NiwgNjAsIDc0LCA4OCwgMTAyLAotICAgIDExNiwgMTE4LCAxMDQsIDkwLCA3NiwgNjIsIDc4LCA5MiwKLSAgICAxMDYsIDEyMCwgMTIyLCAxMDQsIDk0LCAxMTAsIDEyNCwgMTI2LAotCi0JMCwgIDE2LCAzMiwgNDgsICAyLCAgMTgsICA0LCAyMCwKLSAgICAzNCwgNTAsIDY0LCA4MCwgOTYsIDExMiwgMTE0LCA5OCwKLSAgICA4MiwgNjYsIDUyLCAzNiwgIDYsIDIyLCAgOCwgMjQsCi0gICAgMzgsIDU0LCA2OCwgODQsIDEwMCwgMTE2LCA3MCwgODYsCi0gICAgMTAyLCAxMTgsIDQwLCA1NiwgIDEwLCAyNiwgIDEyLCAyOCwKLSAgICA0MiwgNTgsIDcyLCA4OCwgMTA0LCAxMjAsIDc0LCA5MCwgCi0gICAgMTA2LCAxMjIsIDQ0LCA2MCwgIDE0LCAzMCwgNDYsIDYyLAotICAgIDc2LCA5MiwgMTA4LCAxMjQsIDc4LCA5NCwgMTEwLCAxMjYsCi0KLSAgICAwLCAgMiwgIDQsICA2LCAgMTYsICAxOCwgMzIsIDM0LAotICAgIDIwLCAyMiwgIDgsICAxMCwgIDEyLCAgMTQsIDMwLCAyOCwKLSAgICAyNiwgMjQsIDM4LCAzNiwgNDgsIDUwLCA2NCwgNjYsCi0gICAgNTIsIDU0LCA0MCwgNDIsIDQ0LCA0NiwgNTYsIDU4LAotICAgIDYwLCA2MiwgNjgsIDcwLCA4MCwgODIsIDk2LCA5OCwKLSAgICA4NCwgODYsIDcyLCA3NCwgNzYsIDc4LCA4OCwgOTAsIAotICAgIDkyLCA5NCwgMTAwLCAxMDIsIDExMiwgMTE0LCAxMTYsIDExOCwKLSAgICAxMDQsIDEwNiwgMTA4LCAxMTAsIDEyMCwgMTIyLCAxMjQsIDEyNgotCi0KLX07Ci0KLQotCi0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3NzcyYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotICogCi0gKi8KLSAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCi0gKiBwb3NpdGlvbmluZyBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKLSAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5Ci0gKiBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvcgotICogZnVydGhlciByZWNvbnN0cnVjdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5Ci0gKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICoJCQkJCQkJCVswLTddCi0gKiBbaW5dCVFQCQkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgaW5kaWNhdGVzIHVzaW5nIHF1YW50aXphdGlvbiBtZXRob2QgZGVmaW5lZCBpbiBzaG9ydAotICogICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBoZWFkZXIgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgaW5kaWNhdGVzIG5vcm1haWwgcXVhbnRpemF0aW9uIG1ldGhvZC4KLSAqIFtvdXRdIHBwQml0U3RyZWFtIAkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSBwRHN0CQkJcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cyBvZgotICogICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBkYXRhIHR5cGUpLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0Ci0gKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOgotICogICAtICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIFFQIDw9IDA7Ci0gKgkgLSBwRHN0IG5vdCAxNi1ieXRlIGFsaWduZWQKLSAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcigKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQKLSAgICAxNSBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KLSAgICBPTVhfUzE2IHRlbXBCdWZbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMTsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1Zik7Ci0gICAgCi0gICAgCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogRGVxdWFudGl6YXRpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAotICAgICBwVGVtcEJ1ZjEsCi0gICAgIFFQKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0JICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjRmYzA3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIHJlY29uc3RydWN0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKLSAqIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKLSAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGZyYW1lL3BsYW5lIG9uCi0gKiBhIHBpeGVsIGJhc2lzLiBGb3IgSU5UUkEgYmxvY2ssIHRoZSBvdXRwdXQgdmFsdWVzIGFyZSBjbGlwcGVkIHRvIFswLCAyNTVdIGFuZAotICogd3JpdHRlbiB0byBjb3JyZXNwb25kaW5nIGJsb2NrIGJ1ZmZlciB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKLSAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKgkJCQkJCQkJWzAtN10uCi0gKiBbaW5dCXN0ZXAJCQl3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUKLSAqIFtpbi9vdXRdCXBDb2VmQnVmUm93CQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgcndvIGJ1ZmZlcgotICogW2luL291dF0JcENvZWZCdWZDb2wJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbaW5dCWN1clFQCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaAotICoJCQkJCQkJCXRoZSBjdXJyZW50IGJsb2NrIGJlbG9uZ3MgdG8KLSAqIFtpbl0JcFFwQnVmCQkgUG9pbnRlciB0byBhIDItZWxlbWVudCBRUCBhcnJheS4gcFFwQnVmWzBdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGxlZnQgdG8KLSAqICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrKFFQYSkuIHBRcEJ1ZlsxXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBqdXN0IGFib3ZlIHRoZQotICogICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jayhRUGMpLgotICogICAgICAgICAgICAgICAgICAgTm90ZSwgaW4gY2FzZSB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpcyBvdXQgb2YgVk9QIGJvdW5kLCB0aGUgUVAgdmFsdWUgd2lsbCBoYXZlCi0gKiAgICAgICAgICAgICAgICAgICBubyBlZmZlY3QgdG8gdGhlIGludHJhLXByZWRpY3Rpb24gcHJvY2Vzcy4gUmVmZXIgdG8gc3ViY2xhdXNlICAiNy40LjMuMyBBZGFwdGl2ZQotICogICAgICAgICAgICAgICAgICAgYWMgY29lZmZpY2llbnQgcHJlZGljdGlvbiIgb2YgSVNPL0lFQyAxNDQ5Ni0yKE1QRUc0IFBhcnQyKSBmb3IgYWNjdXJhdGUgZGVzY3JpcHRpb24uCi0gKiBbaW5dCWJsb2NrSW5kZXgJCWJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICoJCQkJCQkJCXBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsCi0gKgkJCQkJCQkJRmlndXJlIDYtNSBvZiBJU08vSUVDIDE0NDk2LTIuIAotICogW2luXQlpbnRyYURDVkxDCQlhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4KLSAqCQkJCQkJCQlUaGlzIGFsbG93cyBhIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDCi0gKgkJCQkJCQkJZm9yIGNvZGluZyBvZiBJbnRyYSBEQyBjb2VmZmljaWVudHMgYXMgcGVyIFRhYmxlCi0gKgkJCQkJCQkJNi0yMSBvZiBJU08vSUVDIDE0NDk2LTIuIAotICogW2luXQlBQ1ByZWRGbGFnCQlhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcKLSAqCQkJCQkJCQlpZiB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QKLSAqCQkJCQkJCQljb2x1bW4gYXJlIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZAotICoJCQkJCQkJCW1hY3JvYmxvY2suCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi0gKgkJCQkJCQlhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotICoJCQkJCQkJCWRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLSAqCQkJCQkJCQlpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLSAqIFtvdXRdCXBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkJCSpwcEJpdFN0cmVhbQotICogW291dF0JcERzdAkJCXBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KLSAqCQkJCQkJCQlwRHN0IHNob3VsZCBiZSAxNi1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwQ29lZkJ1ZlJvdwkJcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgIC0JQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUVBCdWYsIHBEc3QuCi0gKiAgICAgIG9yCi0gKiAgIC0gIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZTogKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgY3VyUVAgZXhjZWVkcyAoMSwgMzEpLAotICogICAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsOV0sIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4LCBpbnRyYURDVkxDIGlzIHplcm8gd2hpbGUKLSAqICAgICAgYmxvY2tJbmRleCBncmVhdGVyIHRoYW4gNS4KLSAqICAgICAgb3IKLSAqICAgLQlwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQKLSAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIE9NWF9VOCAqcERzdCwKLSAgICAgT01YX0lOVCBzdGVwLAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9VOCBjdXJRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX0lOVCBpbnRyYURDVkxDLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotICkKLXsKLSAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMjsKLSAgICBPTVhfSU5UIHByZWREaXIsIHByZWRBQ0RpcjsKLSAgICBPTVhfSU5UICBwcmVkUVA7Ci0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgCi0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7Ci0gICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOwotICAgIAotICAgIC8qIFNldHRpbmcgdGhlIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIGFuZCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAqLwotICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICAgICBibG9ja0luZGV4LAotICAgICAgICBwQ29lZkJ1ZlJvdywKLSAgICAgICAgcENvZWZCdWZDb2wsCi0gICAgICAgICZwcmVkRGlyLAotICAgICAgICAmcHJlZFFQLAotICAgICAgICBwUVBCdWYpOwotCi0gICAgcHJlZEFDRGlyID0gcHJlZERpcjsKLQotICAgIAotICAgIGlmIChBQ1ByZWRGbGFnID09IDApCi0gICAgewotICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKLSAgICB9Ci0KLSAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KLSAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQotICAgIHsKLSAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOwotICAgIH0KLSAgICAKLQotICAgIC8qIFZMRCBhbmQgemlnemFnICovCi0gICAgaWYgKGludHJhRENWTEMgPT0gMSkKLSAgICB7Ci0gICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKLSAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgICAgIHByZWRBQ0RpciwKLSAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICB2aWRlb0NvbXApOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAotICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICAgICAgcHJlZEFDRGlyLAotICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIH0KLQotICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAotICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgIHBDb2VmQnVmUm93LAotICAgICAgICBwQ29lZkJ1ZkNvbCwKLSAgICAgICAgY3VyUVAsCi0gICAgICAgIHByZWRRUCwKLSAgICAgICAgcHJlZERpciwKLSAgICAgICAgQUNQcmVkRmxhZywKLSAgICAgICAgdmlkZW9Db21wKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBEZXF1YW50aXphdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCi0gICAgIHBUZW1wQnVmMSwKLSAgICAgY3VyUVAsCi0gICAgIHZpZGVvQ29tcCwKLSAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKLSAgICAgICBpdCB0byAwIHRvIDI1NSAqLwotICAgIAotCWFybVZDTTRQMl9DbGlwOChwVGVtcEJ1ZjIscERzdCxzdGVwKTsKLQkKLQkKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhMDFkNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07ICoqKioqKioqKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKioKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIERlY29kZXMgYW5kIHBhZHMgZm91ciBtb3Rpb24gdmVjdG9ycyBvZiB0aGUgbm9uLWludHJhIG1hY3JvYmxvY2sgaW4gUC1WT1AuCi07ICogVGhlIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBwcm9jZXNzIGlzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy42LjEuNiBvZgotOyAqIElTTy9JRUMgMTQ0OTYtMi4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgotOyAqIFtpbl0gICAgcFNyY01WTGVmdE1CICAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCi07ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCi07ICogW2luXSAgICBwU3JjTVZVcHBlck1CICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXIgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCi07ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCi07ICogW2luXSAgICBwU3JjTVZVcHBlclJpZ2h0TUIgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCi07ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCi07ICogW2luXSAgICBmY29kZUZvcndhcmQgICAgICAgYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNAotOyAqICAgICAgICAgICAgICAgICAgICAgYml0IHN0cmVhbSBzeW50YXgKLTsgKiBbaW5dICAgIE1CVHlwZSAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZQotOyAqICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24KLTsgKiAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIGZpbGxlZCB3aXRoIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgc2FtZSBkZWNvZGVkIHZlY3Rvci4KLTsgKiBbb3V0XSAgIHBwQml0U3RyZWFtICAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsCi07ICogICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLTsgKiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICBwRHN0TVZDdXJNQiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIHdoaWNoIGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycwotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLW5vIGVycm9yCi07ICogCi07ICogICAgICAgICAgICAgICAgICAgICAKLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqCi07ICoKLSAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLSAgICAgICAgSU5DTFVERSBvbXhWQ19zLmgKLSAgICAgICAgCi0gICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgIElGIEFSTTExMzZKUwotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgICBSTiAxCi1wU3JjTVZMZWZ0TUIgICAgICAgICAgUk4gMgotcFNyY01WVXBwZXJNQiAgICAgICAgIFJOIDMKLXBTcmNNVlVwcGVyUmlnaHRNQiAgICBSTiA0Ci1wRHN0TVZDdXJNQiAgICAgICAgICAgUk4gNQotZmNvZGVGb3J3YXJkICAgICAgICAgIFJOIDYKLU1CVHlwZSAgICAgICAgICAgICAgICBSTiA3Ci0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi16ZXJvICAgICAgICAgICAgICAgICAgUk4gNAotb25lICAgICAgICAgICAgICAgICAgIFJOIDQKLXNjYWxlRmFjdG9yICAgICAgICAgICBSTiAxCi0KLQotUmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKLQotVmxjTVZEICAgICAgICAgICAgICAgIFJOIDAKLWluZGV4ICAgICAgICAgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICAgUk4gNwotCi1tdkhvckRhdGEgICAgICAgICAgICAgUk4gNAotbXZIb3JSZXNpZHVhbCAgICAgICAgIFJOIDAKLQotbXZWZXJEYXRhICAgICAgICAgICAgIFJOIDQgICAgICAgICAgICAgCi1tdlZlclJlc2lkdWFsICAgICAgICAgUk4gMAotCi10ZW1wICAgICAgICAgICAgICAgICAgUk4gMQotCi10ZW1wMSAgICAgICAgICAgICAgICAgUk4gMwotSGlnaCAgICAgICAgICAgICAgICAgIFJOIDQKLUxvdyAgICAgICAgICAgICAgICAgICBSTiAyCi1SYW5nZSAgICAgICAgICAgICAgICAgUk4gMQotCi1CbGtDb3VudCAgICAgICAgICAgICAgUk4gMTQKLQotZGlmZk1WZHggICAgICAgICAgICAgIFJOIDAKLWRpZmZNVmR5ICAgICAgICAgICAgICBSTiAxCi0KLTsvLyBTY3JhdGNoIFJlZ2lzdGVycwotCi1SQml0U3RyZWFtICAgICAgICAgICAgUk4gOAotUkJpdENvdW50ICAgICAgICAgICAgIFJOIDkKLVJCaXRCdWZmZXIgICAgICAgICAgICBSTiAxMAotCi1UMSAgICAgICAgICAgICAgICAgICAgUk4gMTEKLVQyICAgICAgICAgICAgICAgICAgICBSTiAxMgotTFIgICAgICAgICAgICAgICAgICAgIFJOIDE0Ci0KLSAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FWbGNNVkQKLSAgICAgICBJTVBPUlQgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKLQotICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgICAgICAgIAotICAgICAgIAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcERzdE1WQ3VyTUIsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwRHN0TVZQcmVkTUUsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwQmxrQ291bnQsNAotICAgICAgIAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcEJpdE9mZnNldCw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZMZWZ0TUIsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WVXBwZXJNQiw0Ci0gICAgICAgCi0gICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeCw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeSw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBIaWdoLDQKLSAgICAgICAKLSAgICAgICAgICAgICAgCi0KLQotICAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCxyMTEKLSAgICAgICAKLSAgICAgICBNX0FSRyAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1Cb25TdGFjayw0ICAgICAgICAgICA7Ly8gcG9pbnRlciB0byAgcFNyY01WVXBwZXJSaWdodE1CIG9uIHN0YWNrCi0gICAgICAgTV9BUkcgICAgICAgICAgIHBEc3RNVkN1ck1Cb25TdGFjayw0ICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gcERzdE1WQ3VyTUIgb24gc3RhY2sKLSAgICAgICBNX0FSRyAgICAgICAgICAgZmNvZGVGb3J3YXJkb25TdGFjayw0ICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBmY29kZUZvcndhcmQgb24gc3RhY2sgCi0gICAgICAgTV9BUkcgICAgICAgICAgIE1CVHlwZW9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gTUJUeXBlIG9uIHN0YWNrCi0KLSAgICAgIAotICAgICAgIAotICAgICAgIAotICAgICAgIAotICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIEJpdFN0cmVhbSBNYWNybwotCi0gICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBNQlR5cGUgZnJvbSBzdGFjawotICAgICAgIE1fTERSICAgICAgICAgICBwRHN0TVZDdXJNQixwRHN0TVZDdXJNQm9uU3RhY2sgICAgICAgIDsvLyBMb2FkIHBEc3RNVkN1ck1CIGZyb20gc3RhY2sKLSAgICAgICBNT1YgICAgICAgICAgICAgemVybywjMAotCi0gICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkEKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkFfUSAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQV9RCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CXQotICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBNT1YgICAgICAgICAgICAgQmxrQ291bnQsIzAKLSAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCi0gICAgICAgCi0gICAgICAgQkVRICAgICAgICAgICAgIEV4aXRPSwotCi0gICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFYgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0VgotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWX1EgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFZfUQotICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjNAotCi0gICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVIKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUl9RCi0gICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCMxCi0gICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIGZjb2RlRm9yd2FyZCxmY29kZUZvcndhcmRvblN0YWNrICAgICAgOy8vIExvYWQgZmNvZGVGb3J3YXJkICBmcm9tIHN0YWNrCi0KLSAgICAgICA7Ly8gU3RvcmluZyB0aGUgdmFsdWVzIHRlbXBvcmFyaWx5IG9uIHN0YWNrCi0KLSAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAKLSAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAotICAgICAgICAgICAgCi0KLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1mY29kZUZvcndhcmQtMQotICAgICAgIE1PViAgICAgICAgICAgICBvbmUsIzEKLSAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKLSAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isb25lLHRlbXAgICAgICAgICAgICAgICAgICA7Ly8gc2NhbGVGYWN0b3I9MTw8KGZjb2RlRm9yd2FyZC0xKQotICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCi0gICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLHNjYWxlRmFjdG9yLCM1ICAgICAgICAgICAgCi0gICAgICAgTV9TVFIgICAgICAgICAgIHNjYWxlRmFjdG9yLHBIaWdoICAgICAgICAgICAgICAgICAgICAgOy8vIFtwSGlnaF09MzIqc2NhbGVGYWN0b3IKLSAgICAgICAgICAgICAgCi0gICAgICAgOy8vIFZMRCBEZWNvZGluZwotCi0KLUxvb3AKLQotICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWQgdGhlIG9wdGltaXplZCBNVkQgVkxDIHRhYmxlCi0KLSAgICAgICA7Ly8gSG9yaXpvbnRhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgotCi0gICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIHZhcmlhYmxlIGxlbmdodCBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KLSAgICAgIAotICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCi0gICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIHRoZSBkZWNvZGVkIHN5bWJvbCBpcyBhbiBpbnZhbGllZCBzeW1ib2wgCi0gICAgICAgCi0gICAgICAgU1VCICAgICAgICAgICAgIG12SG9yRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCwjMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JSZXNpZHVhbD0xCi0gICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQotICAgICAgIFRFUU5FICAgICAgICAgICBtdkhvckRhdGEsIzAKLSAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZIb3JEYXRhPTAgZGlmZk1WZHg9bXZIb3JEYXRhICAgICAgICAgCi0gICAgICAgQkVRICAgICAgICAgICAgIFZlcnRpY2FsRGF0YQotICAgICAgIAotICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQotICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdkhvclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBnZXQgbXZIb3JSZXNpZHVhbCBmcm9tIGJpdHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbXZIb3JEYXRhIT0wICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgbXZIb3JEYXRhLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIG12SG9yRGF0YSxtdkhvckRhdGEsIzAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1hYnMobXZIb3JEYXRhKQotICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLG12SG9yUmVzaWR1YWwsZmNvZGVGb3J3YXJkCi0gICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSxmY29kZUZvcndhcmQsbXZIb3JSZXNpZHVhbCA7Ly8gZGlmZk1WZHg9YWJzKG12SG9yRGF0YSkqZmNvZGVGb3J3YXJkK212SG9yUmVzaWR1YWwtZmNvZGVGb3J3YXJkCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMxCi0gICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMwCi0gICAgICAgCi0gICAgICAgOy8vIFZlcnRpY2FsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCi0KLVZlcnRpY2FsRGF0YQotCi0gICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSBkaWZmTVZkeCBvbiBzdGFjawotICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWRpbmcgdGhlIGFkZHJlc3Mgb2Ygb3B0aW1pemVkIFZMQyB0YWJsZXMKLQotICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRgotICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyBWTEMgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCi0gICAgICAgCi0gICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKLSAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgYW4gSW52YWxpZWQgU3ltYm9sIG9jY3VycwotICAgICAgIAotICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdlZlckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsIzEgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKLSAgICAgICBURVFORSAgICAgICAgICAgbXZWZXJEYXRhLCMwCi0gICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR5ID0gbXZWZXJEYXRhIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12VmVyRGF0YT0wCi0gICAgICAgQkVRICAgICAgICAgICAgIEZpbmRNVlByZWQKLQotICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQotICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdlZlclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBHZXQgbXZWZXJSZXNpZHVhbCBmcm9tIGJpdCBzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG1uVmVyRGF0YSE9MAotICAgICAgICAgICAgIAotCi0gICAgICAgQ01QICAgICAgICAgICAgIG12VmVyRGF0YSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICBtdlZlckRhdGEsbXZWZXJEYXRhLCMwCi0gICAgICAgU1VCICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsbXZWZXJSZXNpZHVhbCxmY29kZUZvcndhcmQKLSAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhLGZjb2RlRm9yd2FyZCxtdlZlclJlc2lkdWFsIDsvLyBkaWZmTVZkeT1hYnMobXZWZXJEYXRhKSpmY29kZUZvcndhcmQrbXZWZXJSZXNpZHVhbC1mY29kZUZvcndhcmQKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzEKLSAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzAKLQotICAgICAgIDsvL0NhbGxpbmcgdGhlIEZ1bmN0aW9uIG9teFZDTTRQMl9GaW5kTVZwcmVkCi0gICAgICAgIAotRmluZE1WUHJlZAotCi0gICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR5LHBkaWZmTVZkeQotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHBEc3RNVkN1ck1CLEJsa0NvdW50LExTTCAjMiAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQotICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBwRHN0TVZDdXJNQiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wIG9uIHN0YWNrIGZvciBwYXNzaW5nIGFzIGFuIGFyZ3VtZW50IHRvIEZpbmRNVlByZWQKLSAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCwjMAotICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBEc3RNVlByZWRNRSAgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzIHBEc3RNVlByZWRNRT1OVUxMIGFzIGFuIGFyZ3VtZW50ICAgICAgICAgCi0gICAgICAgTV9TVFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3NzIEJsa0NvdW50IGFzIEFyZ3VtZW50IHRocm91Z2ggc3RhY2sKLQotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLHBTcmNNVkxlZnRNQiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wIChSTiAxKT1wU3JjTVZMZWZ0TUIKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2sKLSAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WTGVmdE1CLHBTcmNNVlVwcGVyTUIgICAgICAgICAgICA7Ly8gcFNyY01WTGVmdE1CICggUk4gMikgPSBwU3JjTVZVcHBlck1CCi0gICAgICAgTU9WICAgICAgICAgICAgIHBwQml0U3RyZWFtLHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgOy8vIHBwQml0U3RyZWFtICAoIFJOIDApID0gcERzdE1WQ3VyTUIKLSAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WVXBwZXJNQixwU3JjTVZVcHBlclJpZ2h0TUIgICAgICA7Ly8gcFNyY01WVXBwZXJNQiggUk4gMykgPSBwU3JjTVZVcHBlclJpZ2h0TUIgICAgICAKLSAgICAgICBCTCAgICAgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gc3Vicm91dGluZSBvbXhWQ000UDJfRmluZE1WcHJlZAotCi0gICAgICAgOy8vIFN0b3JlIEhvcml6b250YWwgTW90aW9uIFZlY3RvcgotICAgICAKLSAgICAgICBNX0xEUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBCbGtDb3VudCBmcm9tIHN0YWNrCi0gICAgICAgTV9MRFIgICAgICAgICAgIEhpZ2gscEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9MzIqc2NhbGVGYWN0b3IKLSAgICAgICBMU0wgICAgICAgICAgICAgdGVtcDEsQmxrQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1CbGtDb3VudCo0Ci0gICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHgKLSAgICAgICAKLSAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KLSAgICAgICAKLSAgICAgICAKLSAgICAgICBSU0IgICAgICAgICAgICAgTG93LEhpZ2gsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG93ID0gLTMyKnNjYWxlRmFjdG9yCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4PXBEc3RNVkN1ck1CW0Jsa0NvdW50XStkaWZmTVZkeAotICAgICAgIEFERCAgICAgICAgICAgICBSYW5nZSxIaWdoLEhpZ2ggICAgICAgICAgICAgICAgICAgICAgIDsvLyBSYW5nZT02NCpTY2FsZUZhY3RvcgotICAgICAgIFNVQiAgICAgICAgICAgICBIaWdoLEhpZ2gsIzEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPSAzMipzY2FsZUZhY3Rvci0xCi0KLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHg8TG93ICAgICAgICAgIAotICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeCs9UmFuZ2UKLSAgICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4ID4gSGlnaCBkaWZmTVZkeC09UmFuZ2UKLSAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXQotCi0gICAgICAgOy8vIFN0b3JlIFZlcnRpY2FsCi0KLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsdGVtcDEsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9NCpCbGtDb3VudCsyCi0gICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeSAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHkKLSAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0uZGlmZk1WZHkKLSAgICAgICBBREQgICAgICAgICAgICAgQmxrQ291bnQsQmxrQ291bnQsIzEgICAgICAgICAgICAgICAgICA7Ly8gQmxrQ291bnQ9QmxrQ291bnQrMQotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cKLSAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHk8TG93ICBkaWZmTVZkeSs9UmFuZ2UgICAgICAgICAgICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2gKLSAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHkgPiBIaWdoIGRpZmZNVmR5LT1SYW5nZQotICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgIAotICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBCbGtDb3VudCxDb3VudAotICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgotICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCi0KLSAgICAgICBCTFQgICAgICAgICAgICAgTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgQmxrQ291bnQ8Q291bnQgQ29udGludWUgdGhlIExvb3AKLQotCi0gICAgICAgOy8vIElmIE1CVHlwZT1PTVhfVkNfSU5URVIgb3IgTUJ0eXBlPU9NWF9WQ19JTlRFUl9RIGNvcHkgcERzdE1WQ3VyTUJbMF0gdG8KLSAgICAgICA7Ly8gcERzdE1WQ3VyTUJbMV0sIHBEc3RNVkN1ck1CWzJdLCBwRHN0TVZDdXJNQlszXSAKLQotICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjawotCi0gICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgTERSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CXQotICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzRdCi0gICAgICAgCi0gICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM4XQotICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjMTJdCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKLSAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0gICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hpbmcgdGhlIE1hY3JvICAgICAgIAotCi0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKLSAKLUV4aXRFcnJvcgotCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0Ci0gICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0Ci0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKLQotRXhpdE9LICAgICAgICAgICAgIAotCi0gICAgICAgTV9FTkQKLSAgICAgICBFTkRJRgotICAgICAgIEVORAotCi0KLSAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUzM2Q4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotICAgICAKLSAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgotCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0Ci0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLQotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIHRoZSBWTEMsWmlnemFnLExNQVggYW5kIFJNQVggdGFibGVzCi0gICAgIAotICAgICAgICAKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLHIxMgotCi0gICAgICAgIAotCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgIDsvLyBMb2FkIHppZ3phZyB0YWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrIHRvIHBhc3MgYXMgYXJndW1lbnQgdG8gdW5zYWZlIGZ1bmN0aW9uCi0gICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIFZMQyB0YWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgb3B0aW1pemVkIFZMQyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgTE1BWCBUYWJsZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIFJNQVggVGFibGVzCi0gICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzZXQgc3RhcnQ9MAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgUk1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICA7Ly8gY2FsbCBVbnNhZmUgRnVuY3Rpb24gZm9yIFZMQyBaaWd6YWcgRGVjb2RpbmcKLSAgICAgICAgIAotICAgICAgIAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTk0MGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotICAgICAKLSAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgotCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0Ci0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLVByZWREaXIgICAgICAgICAgICAgIFJOIDMKLXNob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAotICAgICAKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0KLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLHIxMgotCi0gICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBJbnB1dCBBcmd1bWVudCBvbiBzdGFjayAgICAgICAgICAgCi0KLSAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIExvYWQgQWRkcmVzcyBvZiB0aGUgWmlnemFnIHRhYmxlICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgOy8vIExvYWRpbmcgRGlmZmVyZW50IHR5cGUgb2YgemlnemFnIHRhYmxlcyBiYXNlZCBvbiBQcmVkRGlyCi0gICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgWmlnemFnIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgVGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBWTEMgVGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCBUYWJsZSBhZGRyZXNzIG9uIFN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKLSAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgU3RhcnQ9MCAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFJNQVggVGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICAgICAgICAKLQotICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgOy8vIGdldCB0aGUgSW5wdXQgQXJndW1lbnQgZnJvbSBzdGFjawotCi0gICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgIDsvLyBDYWxsIFVuc2FmZSBGdW5jdGlvbgotCi0KLQotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2YTYyYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLTsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi07ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLTsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKLTsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCi07ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCi07ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCi07ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQotOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAotOyAqCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLSAgICAgIAotCi0KLSAgICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotCi0gICAgIAotICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCi0KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIENMYXNzaWNhbCwgSG9yaXpvbnRhbCwgVmVydGljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4ICA7Ly8gQ29udGFpbnMgT3B0aW1pemVkIERDTHVtYSBhbmQgRENDaHJvbWEgSW5kZXggdGFibGUgRW50cmllcwotICAgICAgICAKLQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLVByZWREaXIgICAgICAgICAgICAgIFJOIDMKLXNob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKLXZpZGVvQ29tcCAgICAgICAgICAgIFJOIDUKLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBEQ0x1bWFDaHJvbWFJbmRleCAgIFJOIDQKLXBEQ0Nocm9tYUluZGV4ICAgICAgIFJOIDcKLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLURDVmFsdWVTaXplICAgICAgICAgIFJOIDYKLXBvd09mU2l6ZSAgICAgICAgICAgIFJOIDcKLXRlbXAxICAgICAgICAgICAgICAgIFJOIDUKLQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgUk4gOAotUkJpdEJ1ZmZlciAgICAgICAgICAgUk4gOQotUkJpdENvdW50ICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgUk4gMTEKLVQyICAgICAgICAgICAgICAgICAgIFJOIDEyCi1EQ1ZhbCAgICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKLSAgICAgCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcERDQ29lZmYsNAotICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMscjEyCi0KLSAgICAgICAgTV9BUkcgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXJvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sgIAotICAgICAgICBNX0FSRyAgICAgICAgICAgdmlkZW9Db21wb25zdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjawotCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIERDIENvZWZmaWNpZW50Ci0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgsID1hcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggOy8vIExvYWQgT3B0aW1pemVkIFZMQyBUYWJsZSBmb3IgTHVtaW5hbmNlIGFuZCBDaHJvbWluYW5jZQotCi0gICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIEJpdHN0cmVhbSBNYWNybwotCi0gICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50Ci0gICAgICAgIE1fTERSICAgICAgICAgICB2aWRlb0NvbXAsdmlkZW9Db21wb25zdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgICBBREQgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LHBEQ0x1bWFDaHJvbWFJbmRleCx2aWRlb0NvbXAsIExTTCAjNiAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKLSAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVkxEICAgICAgICBEQ1ZhbHVlU2l6ZSxUMSxUMixwRENMdW1hQ2hyb21hSW5kZXgsNCwyICAgICAgICAgICAgICAgICAgICA7Ly8gVkxDIERlY29kZSB1c2luZyBvcHRpbWl6ZWQgTHVtaW5hbmNlIGFuZCBDaHJvbWluYW5jZSBWTEMgVGFibGUKLQotICAgIAotICAgICAgIAotCi1EZWNvZGVEQwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzEyICAgICAKLSAgICAgICAgQkdUICAgICAgICAgICAgIEV4aXRFcnJvcgotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMwCi0gICAgICAgIE1PVkVRICAgICAgICAgICBEQ1ZhbCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgaXMgemVybyB0aGVuIERDIGNvZWZmID0wCi0gICAgICAgIEJFUSAgICAgICAgICAgICBBQ0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHBlcmZvcm0gQUMgQ29lZmYgRGVjb2RpbmcKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVlJFQUQxNiAgICBEQ1ZhbCxEQ1ZhbHVlU2l6ZSxUMSxUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IERDIFZhbHVlIEZyb20gQml0IHN0cmVhbQotICAgICAgICAgCi0KLSAgICAgICAgTU9WICAgICAgICAgICAgIHBvd09mU2l6ZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBMU0wgICAgICAgICAgICAgcG93T2ZTaXplLERDVmFsdWVTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvd09mU2l6ZT1wb3coMixEQ1ZhbHVlU2l6ZSkKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsLHBvd09mU2l6ZSxMU1IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIERDVmFsIHdpdGggcG93T2ZTaXplLzIgCi0gICAgICAgIEFERExUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCwjMQotICAgICAgICBTVUJMVCAgICAgICAgICAgRENWYWwsRENWYWwscG93T2ZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIExlc3N0aGFuIHBvd09mU2l6ZS8yIERDVmFsPURDVmFsLXBvd09mU2l6ZSsxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRWxzZSBEQ1ZhbD0gZmV0Y2hiaXRzIGZyb20gYml0IHN0cmVhbQotCi1DaGVja0RDVmFsdWVTaXplCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGdyZWF0ZXIgdGhhbiA4IGNoZWNrIG1hcmtlciBiaXQKLQotICAgICAgICBCTEUgICAgICAgICAgICAgQUNEZWNvZGUKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQotICAgICAgICBURVEgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIE1hcmtlciBiaXQgaXMgemVybyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZQotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgICAgCi0KLSAgICAgICAgOy8vIERlY29kZSBBQyBDb2VmZmljaWVudAotCi1BQ0RlY29kZQotCi0gICAgICAgIE1fU1RSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBEZWNvZGVkIERDIENvZWZmIG9uIFN0YWNrCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IHN0cmVhbSBNYWNybwotICAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgICAgICAgOy8vIExvYWQgWmlnemFnIHRhbGJlIGFkZHJlc3MgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgICAgICAgOy8vIE1vZGlmeSB0aGUgWmlnemFnIHRhYmxlIGFkcmVzcyBiYXNlZCBvbiBQcmVkRGlyICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICAgICAgOy8vIExvYWQgT3B0aW1pemVkIFZMQyBUYWJsZSBXaXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEgRW50cmllcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgT3B0aW1pemVkIFZMQyBUYWJsZSBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIExNQVggVGFibGUKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCi0gICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgU3RhcnQgPTEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFJNQVggVGFibGUgb24gU3RhY2sKLSAgICAgICAgCi0gICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLHNob3J0VmlkZW9IZWFkZXJvblN0YWNrICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBJbnB1dCBBcmd1bWVudCBGcm9tIFN0YWNrCi0gICAgICAgIAotICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICAgICAgIDsvLyBDYWxsIHRoZSBVbnNhZmUgRnVuY3Rpb24KLQotICAgICAgICBNX0xEUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IHRoZSBEZWNvZGVkIERDIFZhbHVlIEZyb20gU3RhY2sKLSAgICAgICAgU1RSSCAgICAgICAgICAgIERDVmFsLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSBEQyBWYWx1ZSAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPSwotICAgICAgICAKLSAgICAgICAgICAgICAgCi0KLUV4aXRFcnJvcgotIAotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBTdHJlYW0gTWFjcm8gaW4gY2FzZSBvZiBhbiBFcnJvcgotICAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgCi1FeGl0T0sKLSAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhY2Q1MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCi07Ly8KLSAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycwotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIElOQ0xVREUgYXJtVkNDT01NX3MuaAotCi0gICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICBNX1RBQkxFIGFybVZDTTRQMl9wQmxrSW5kZXhUYWJsZQotICAgICAgICBEQ0QgIE9NWFZDQmxrMCwgT01YVkNCbGsxCi0gICAgICAgIERDRCAgT01YVkNCbGsyLCBPTVhWQ0JsazMKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi1wU3JjTVZDdXJNQiAgICAgICAgICAgIFJOIDAKLXBTcmNDYW5kTVYxICAgICAgICAgICAgUk4gMQotcFNyY0NhbmRNVjIgICAgICAgICAgICBSTiAyCi1wU3JjQ2FuZE1WMyAgICAgICAgICAgIFJOIDMKLXBEc3RNVlByZWQgICAgICAgICAgICAgUk4gNAotcERzdE1WUHJlZE1FICAgICAgICAgICBSTiA1Ci1pQmxrICAgICAgICAgICAgICAgICAgIFJOIDYKLQotcFRhYmxlICAgICAgICAgICAgICAgICBSTiA0Ci1DYW5kTVYgICAgICAgICAgICAgICAgIFJOIDEyCi0KLXBDYW5kTVYxICAgICAgICAgICAgICAgUk4gNwotcENhbmRNVjIgICAgICAgICAgICAgICBSTiA4Ci1wQ2FuZE1WMyAgICAgICAgICAgICAgIFJOIDkKLQotQ2FuZE1WMWR4ICAgICAgICAgICAgICBSTiAwIAotQ2FuZE1WMWR5ICAgICAgICAgICAgICBSTiAxIAotQ2FuZE1WMmR4ICAgICAgICAgICAgICBSTiAyCi1DYW5kTVYyZHkgICAgICAgICAgICAgIFJOIDMKLUNhbmRNVjNkeCAgICAgICAgICAgICAgUk4gMTAKLUNhbmRNVjNkeSAgICAgICAgICAgICAgUk4gMTEKLQotdGVtcCAgICAgICAgICAgICAgICAgICBSTiAxNAotCi16ZXJvICAgICAgICAgICAgICAgICAgIFJOIDE0Ci1yZXR1cm4gICAgICAgICAgICAgICAgIFJOIDAKLSAgICAgICAgCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFpbiByb3V0aW5lCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIAotCi0gICAgICAgIE1fQUxMT0M0IE1WLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9GaW5kTVZwcmVkLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWQsICA0Ci0gICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWRNRSwgNAotICAgICAgICBNX0FSRyAgIEJsaywgNAotICAgICAgICAKLSAgICAgICAgTV9BRFIgQ2FuZE1WLCBNVgotICAgICAgICBNT1YgICB6ZXJvLCAjMAotICAgICAgICBNX0xEUiBpQmxrLCBCbGsKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlCi0gICAgICAgIDsvLyB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwKLSAgICAgICAgTU9WICAgcENhbmRNVjEsIENhbmRNVgotICAgICAgICBNT1YgICBwQ2FuZE1WMiwgQ2FuZE1WCi0gICAgICAgIE1PViAgIHBDYW5kTVYzLCBDYW5kTVYKLSAgICAKLSAgICAgICAgU1RSICAgemVybywgW0NhbmRNVl0KLQotICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGJsayBudW1iZXIKLSAgICAgICAgTV9TV0lUQ0ggaUJsawotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazAgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMSAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGsyICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazMgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fRU5EU1dJVENICi0gICAgICAgIAotT01YVkNCbGswCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICM0Ci0gICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjOAotCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4Ci0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYxLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjIKLSAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMiwgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYzCi0gICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMwotICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCi0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKLSAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCi0gICAgICAgIAotICAgICAgICBCICAgICBCbGtFbmQKLSAgICAKLU9NWFZDQmxrMQotICAgICAgICBNT1YgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKLSAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICMxMgotICAgIAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCi0gICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQotICAgICAgICAgICAgCi0gICAgICAgIEIgICAgIEJsa0VuZAotCi1PTVhWQ0JsazIKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCi0gICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgotICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0Ci0gICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzEyCi0gICAgICAgIEIgICAgIEJsa0VuZAotCi1PTVhWQ0JsazMKLSAgICAgICAgQUREICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CLCAjOAotICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKLSAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAotICAgIAotQmxrRW5kCi0KLSAgICAgICAgOy8vIFVzaW5nIHRoZSB0cmFuc3BlcmFuY3kgaW5mbywgemVybwotICAgICAgICA7Ly8gb3V0IHRoZSBjYW5kaWRhdGUgTVYgaWYgbmVjY2VzYXJ5Ci0gICAgICAgIExEUlNIIENhbmRNVjFkeCwgW3BDYW5kTVYxXSwgIzIKLSAgICAgICAgTERSU0ggQ2FuZE1WMmR4LCBbcENhbmRNVjJdLCAjMgotICAgICAgICBMRFJTSCBDYW5kTVYzZHgsIFtwQ2FuZE1WM10sICMyCi0gICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSIHBEc3RNVlByZWRNRSwgcHBEc3RNVlByZWRNRQotCi0gICAgICAgIExEUlNIIENhbmRNVjFkeSwgW3BDYW5kTVYxXQotICAgICAgICBMRFJTSCBDYW5kTVYyZHksIFtwQ2FuZE1WMl0KLSAgICAgICAgTERSU0ggQ2FuZE1WM2R5LCBbcENhbmRNVjNdCi0KLSAgICAgICAgQ01QIHBEc3RNVlByZWRNRSwgIzAgICAgICAgIAotCi0gICAgICAgIDsvLyBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCAKLSAgICAgICAgOy8vIHRoZXNlIGNhbiBiZSB1c2VkIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAKLQotICAgICAgICBTVFJITkUgQ2FuZE1WMWR4LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjFkeSwgW3BEc3RNVlByZWRNRV0sICMyICAgICAgICAKLSAgICAgICAgU1RSSE5FIENhbmRNVjJkeCwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYyZHksIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WM2R4LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjNkeSwgW3BEc3RNVlByZWRNRV0KLSAgICAgICAgICAgCi0gICAgICAgIDsgRmluZCB0aGUgbWVkaWFuIG9mIHRoZSAzIGNhbmRpZGF0ZSBNVidzCi0gICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHgsIENhbmRNVjJkeCwgQ2FuZE1WM2R4LCB0ZW1wCi0KLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgcERzdE1WUHJlZCwgcHBEc3RNVlByZWQKLQotICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR5LCBDYW5kTVYyZHksIENhbmRNVjNkeSwgdGVtcAotICAgIAotICAgICAgICBTVFJIIENhbmRNVjNkeCwgW3BEc3RNVlByZWRdLCAjMgotICAgICAgICBTVFJIIENhbmRNVjNkeSwgW3BEc3RNVlByZWRdCi0KLSAgICAgICAgTU9WIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAKLSAgICAgICAgTV9FTkQKLSAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0gICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmOTFmYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9JRENUOHg4YmxrX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsKLTsvLwotICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cwotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9JRENUX3MuaCAgICAgICAgCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtQ09NTV9JRENUUHJlU2NhbGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBGdW5jdGlvbiBwcm90b3R5cGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAgICAgT01YUmVzdWx0Ci0gICAgICAgIDsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsoY29uc3QgT01YX1MxNiogcFNyYywKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiogcERzdCkKLSAgICAgICAgOy8vICAgIAotICAgICAgICAKLSAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLSAgICAgICAgTV9BTExPQzQgIHBwRGVzdCwgNAotICAgICAgICBNX0FMTE9DNCAgcFN0cmlkZSwgNAotICAgICAgICBNX0FMTE9DOCAgcEJsaywgMio4KjgKLSAgICBFTkRJRgotICAgIAotICAgIElGIEFSTTExMzZKUwotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9JRENUOHg4YmxrLCByMTEKLSAgICBFTkRJRgotICAgIAotICAgICAgICAKLSAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLSAgICAgICAgCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1wRHN0ICAgICAgICAgICAgUk4gMQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1SZXN1bHQgICAgICAgICAgUk4gMAotCi07Ly8gUHJvdG90eXBlIGZvciBtYWNybyBNX0lEQ1QKLTsvLyBwU3JjICAgICAgICAgICAgUk4gMCAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgotOy8vIFN0cmlkZSAgICAgICAgICBSTiAxICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCi07Ly8gcERlc3QgICAgICAgICAgIFJOIDIgIDsvLyBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcgotOy8vIHBTY2FsZSAgICAgICAgICBSTiAzICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCi0KLXBTcmMgICAgUk4gMCAgICAKLVN0cmlkZSAgUk4gMSAgICAKLXBEZXN0ICAgUk4gMiAgICAKLXBTY2FsZSAgUk4gMyAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcERlc3QsIHBEc3QKLSAgICAgICAgTERSICAgICAgICAgcFNjYWxlLCA9YXJtQ09NTV9JRENUUHJlU2NhbGUgICAgICAgIAotICAgICAgICBNX0lEQ1QgICAgICBzOSwgczE2LCAxNiAgICAgIAotICAgICAgICBNT1YgICAgICAgICBSZXN1bHQsICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5EICAgICAgIAotICAgIEVORElGICAKLSAgICAgICAgOy8vIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYzZmZjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8KLTsvLwotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0gICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi0KLSAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQVJNMTEzNkpTIGltcGxlbWVudGF0aW9uCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgSUYgIEFSTTExMzZKUwotICAgIAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIE1BQ1JPIERFRklOSVRJT05TCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLwotICAgIDsvLyAgIGRlc3Rbal0gPSAoeFtqXSArIHlbal0gKyByb3VuZCkgPj4gMSwgICBqPTAuLjMKLSAgICA7Ly8KLSAgICA7Ly8gU2ltaWxhciB0byBVSEFERDggaW5zdHJ1Y3Rpb24sIGJ1dCB3aXRoIGEgcm91bmRpbmcgdmFsdWUgb2YgMSBhZGRlZCB0bwotICAgIDsvLyBlYWNoIHN1bSBiZWZvcmUgZGl2aWRpbmcgYnkgdHdvLCBpZiByb3VuZCBpcyAxCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9VSEFERDhSICAgJGRlc3QsICR4LCAkeSwgJHJvdW5kLCAkbWFzawotICAgIDsvLwotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICR4ICAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB4WzNdIDogIHhbMl0gIDogIHhbMV0gIDogIHhbMF0KLSAgICA7Ly8gJHkgICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHlbM10gOiAgeVsyXSAgOiAgeVsxXSAgOiAgeVswXQotICAgIDsvLyAkcm91bmQgICAgMCBpZiBubyByb3VuZGluZyB0byBiZSBhZGRlZCwgMSBpZiByb3VuZGluZyB0byBiZSBkb25lCi0gICAgOy8vICRtYXNrICAgICBzb21lIHJlZ2lzdGVyIHNldCB0byAweDgwODA4MDgwCi0gICAgOy8vCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vICRkZXN0ICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzNdIDogIHpbMl0gIDogIHpbMV0gIDogIHpbMF0KLQotICAgIE1BQ1JPCi0gICAgTV9VSEFERDhSICAgJGRlc3QsICR4LCAkeSwgJHJvdW5kLCAkbWFzawotICAgIElGICRyb3VuZCA9IDEKLSAgICAgICAgSUYgICRkZXN0IC89ICR5Ci0gICAgICAgICAgICBNVk4gICAgICAgICAkZGVzdCwgJHgKLSAgICAgICAgICAgIFVIU1VCOCAgICAgICRkZXN0LCAkeSwgJGRlc3QKLSAgICAgICAgICAgIEVPUiAgICAgICAgICRkZXN0LCAkZGVzdCwgJG1hc2sKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTVZOICAgICAgICAgJGRlc3QsICR5Ci0gICAgICAgICAgICBVSFNVQjggICAgICAkZGVzdCwgJHgsICRkZXN0Ci0gICAgICAgICAgICBFT1IgICAgICAgICAkZGVzdCwgJGRlc3QsICRtYXNrCi0gICAgICAgIEVORElGCi0gICAgRUxTRQotICAgICAgICBVSEFERDggICAgICAkZGVzdCwgJHgsICR5Ci0gICAgRU5ESUYKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBMb2FkIDggYnl0ZXMgZnJvbSAkcFNyYyAoYWxpZ25lZCBvciB1bmFsaWduZWQgbG9jYXRpb25zKQotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTE9BRF9YICAgICRwU3JjLCAkc3JjU3RlcCwgJG91dDAsICRvdXQxLCAkc2NyYXRjaCwgJG9mZnNldAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkcFNyYyAgICAgICA0IGJ5dGUgYWxpZ25lZCBzb3VyY2UgcG9pbnRlciB0byBhbiBhZGRyZXNzIGp1c3QgbGVzcyB0aGFuIAotICAgIDsvLyAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgZGF0YSBsb2NhdGlvbgotICAgIDsvLyAkc3JjU3RlcCAgICBUaGUgc3RyaWRlIG9uIHNvdXJjZQotICAgIDsvLyAkc2NyYXRjaCAgICBBIHNjcmF0Y2ggcmVnaXN0ZXIsIHVzZWQgaW50ZXJuYWxseSBmb3IgdGVtcCBjYWxjdWxhdGlvbnMKLSAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKLSAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKLSAgICA7Ly8KLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJHBTcmMgICAgICAgSW4gY2FzZSB0aGUgbWFjcm8gYWNjZXB0cyBzdHJpZGUsIGl0IGluY3JlbWVudHMgdGhlIHBTcmMgYnkgCi0gICAgOy8vICAgICAgICAgICAgIHRoYXQgdmFsdWUsIGVsc2UgdW5jaGFuZ2VkCi0gICAgOy8vICRvdXQwICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHpbM10gOiAgelsyXSAgOiAgelsxXSAgOiAgelswXQotICAgIDsvLyAkb3V0MSAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzddIDogIHpbNl0gIDogIHpbNV0gIDogIHpbNF0KLSAgICA7Ly8KLSAgICA7Ly8gTm90ZTogeyRvdXQwLCAkb3V0MSwgJHNjcmF0Y2h9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKLSAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nLiBJbiBjYXNlIG9mZnNldCBpcyAwLCAkc2NyYXRjaCBpcyBub3QgbW9kaWZpZWQuCi0KLSAgICBNQUNSTwotICAgIE1fTE9BRF9YICAgICRwU3JjLCAkc3JjU3RlcCwgJG91dDAsICRvdXQxLCAkc2NyYXRjaCwgJG9mZnNldAotICAgICAgICBJRiAkb2Zmc2V0ID0gMAotICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskb3V0MCwgJG91dDF9Ci0gICAgICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JG91dDAsICRvdXQxLCAkc2NyYXRjaH0gCi0gICAgICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgICAgICRvdXQwLCAkb3V0MCwgTFNSICM4ICogJG9mZnNldAotICAgICAgICAgICAgT1JSICAgICAgICAgJG91dDAsICRvdXQwLCAkb3V0MSwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQotICAgICAgICAgICAgTU9WICAgICAgICAgJG91dDEsICRvdXQxLCBMU1IgIzggKiAkb2Zmc2V0Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkb3V0MSwgJG91dDEsICRzY3JhdGNoLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCi0gICAgICAgIEVORElGCi0gICAgTUVORAotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBMb2FkcyB0aHJlZSB3b3JkcyBmb3IgWCBpbnRlcnBvbGF0aW9uLCB1cGRhdGUgcG9pbnRlciB0byBuZXh0IHJvdy4gRm9yIAotICAgIDsvLyBYIGludGVycG9sYXRpb24sIGdpdmVuIGEgdHJ1bmNhdGVkLTRieXRlQWxpZ25lZCBzb3VyY2UgcG9pbnRlciwgCi0gICAgOy8vIGludmFyaWFibHkgdGhyZWUgY29udGlub3VzIHdvcmRzIGFyZSByZXF1aXJlZCBmcm9tIHRoZXJlIHRvIGdldCB0aGUKLSAgICA7Ly8gbmluZSBieXRlcyBmcm9tIHRoZSBzb3VyY2UgcG9pbnRlciBmb3IgZmlsdGVyaW5nLiAKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0xPQURfWElOVCAkcFNyYywgJHNyY1N0ZXAsICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkcFNyYyAgICAgICA0IGJ5dGUgYWxpZ25lZCBzb3VyY2UgcG9pbnRlciB0byBhbiBhZGRyZXNzIGp1c3QgbGVzcyB0aGFuIAotICAgIDsvLyAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgZGF0YSBsb2NhdGlvbgotICAgIDsvLwotICAgIDsvLyAkc3JjU3RlcCAgICBUaGUgc3RyaWRlIG9uIHNvdXJjZQotICAgIDsvLwotICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgotICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQotICAgIDsvLwotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyAkcFNyYyAgICAgICBJbmNyZW1lbnRlZCBieSAkc3JjU3RlcAotICAgIDsvLwotICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICA7Ly8gICAgICAgICAgICAgVGhyZWUgb2YgdGhlc2UgYXJlIG91dHB1dHMgYmFzZWQgb24gdGhlICRvZmZzZXQgcGFyYW1ldGVyLiAKLSAgICA7Ly8gICAgICAgICAgICAgVGhlIG91dHB1dHMgYXJlIHNwZWNpZmljYWxseSBnZW5lcmF0ZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IAotICAgIDsvLyAgICAgICAgICAgICB0aGUgTV9FWFRfWElOVCBtYWNyby4gRm9sbG93aW5nIGlzIHRoZSBpbGx1c3RyYXRpb24gdG8gc2hvdyAKLSAgICA7Ly8gICAgICAgICAgICAgaG93IHRoZSBuaW5lIGJ5dGVzIGFyZSBzcGFubmVkIGZvciBkaWZmZXJlbnQgb2Zmc2V0cyBmcm9tIAotICAgIDsvLyAgICAgICAgICAgICBub3RUcnVuY2F0ZWRGb3JBbGlnbm1lbnRTb3VyY2VQb2ludGVyLgotICAgIDsvLwotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOy8vICAgICAgICAgICAgIHwgT2Zmc2V0IHwgQWxpZ25lZCBQdHIgfCB3b3JkMCB8IHdvcmQxIHwgd29yZDIgfCB3b3JkMyB8Ci0gICAgOy8vICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gICAgOy8vICAgICAgICAgICAgIHwgICAgMCAgIHwgICAgICAgMCAgICAgfCAwMTIzICB8IDQ1NjcgIHwgOHh4eCAgfCAgICAgICB8Ci0gICAgOy8vICAgICAgICAgICAgIHwgICAgMSAgIHwgICAgICAtMSAgICAgfCB4MDEyICB8IDM0NTYgIHwgNzh4eCAgfCAgICAgICB8Ci0gICAgOy8vICAgICAgICAgICAgIHwgICAgMiAgIHwgICAgICAtMiAgICAgfCB4eDAxICB8IDIzNDUgIHwgNjc4eCAgfCAgICAgICB8Ci0gICAgOy8vICAgICAgICAgICAgIHwgICAgMyAgIHwgICAgICAtMyAgICAgfCB4eHgwICB8ICAgICAgIHwgMTIzNCAgfCA1Njc4ICB8Ci0gICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7Ly8gCi0gICAgOy8vICAgICAgICAgICAgIHdoZXJlIHRoZSBudW1iZXJpbmcgKDAtOCkgaXMgdG8gZGVzaWduYXRlIHRoZSA5IGJ5dGVzIGZyb20KLSAgICA7Ly8gICAgICAgICAgICAgc3RhcnQgb2YgYSBwYXJ0aWN1bGFyIHJvdy4gVGhlIGlsbHVzdHJhdGlvbiBkb2Vzbid0IHRha2UgaW4gCi0gICAgOy8vICAgICAgICAgICAgIGFjY291bnQgdGhlIHBvc2l0aW9uaW5nIG9mIGJ5dGVzIHdpdGggaW4gdGhlIHdvcmQgYW5kIHRoZSAKLSAgICA7Ly8gICAgICAgICAgICAgbWFjcm8gY29tYmluYXRpb24gd2l0aCBNX0VYVF9YSU5UIHdpbGwgd29yayBvbmx5IGluIGxpdHRsZSAKLSAgICA7Ly8gICAgICAgICAgICAgZW5kaWFuIGVudmlyb25zCi0gICAgOy8vIAotICAgIDsvLyBOb3RlOiB7JHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzfSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCi0gICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZwotCi0gICAgTUFDUk8KLSAgICBNX0xPQURfWElOVCAkcFNyYywgJHNyY1N0ZXAsICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgICAgICBJRiAkb2Zmc2V0IC89IDMKLSAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JHdvcmQwLCAkd29yZDEsICR3b3JkMn0KLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskd29yZDAsICR3b3JkMiwgJHdvcmQzfQotICAgICAgICBFTkRJRgotICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCi0gICAgTUVORAotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBFeHRyYWN0IGZvdXIgcmVnaXN0ZXJzIG9mIGZvdXIgcGl4ZWxzIGZvciBYIGludGVycG9sYXRpb24gCi0gICAgOy8vIAotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fRVhUX1hJTlQgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCi0gICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCi0gICAgOy8vIAotICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICA7Ly8gICAgICAgICAgICAgVGhyZWUgb2YgdGhlc2UgYXJlIGlucHV0cyBiYXNlZCBvbiB0aGUgJG9mZnNldCBwYXJhbWV0ZXIuIAotICAgIDsvLyAgICAgICAgICAgICBUaGUgaW5wdXRzIGFyZSBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IAotICAgIDsvLyAgICAgICAgICAgICB0aGUgTV9FWFRfWElOVCBtYWNyby4KLSAgICA7Ly8KLSAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLyAgICAgICAgICAgICB8IE9mZnNldCB8IEFsaWduZWQgUHRyIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAotICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDAgICB8ICAgICAgIDAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDh4eHggIHwgeXl5eSAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDEgICB8ICAgICAgLTEgICAgIHwgeDAxMiAgfCAzNDU2ICB8IDc4eHggIHwgeXl5eSAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDIgICB8ICAgICAgLTIgICAgIHwgeHgwMSAgfCAyMzQ1ICB8IDY3OHggIHwgeXl5eSAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDMgICB8ICAgICAgLTMgICAgIHwgeHh4MCAgfCB5eXl5ICB8IDEyMzQgIHwgNTY3OCAgfAotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICA7Ly8gICAgICAgICAgICAgQnl0ZXMgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIHBvaW50ZXIgKG5vdCB0cnVuY2F0ZWQgZm9yCi0gICAgOy8vICAgICAgICAgICAgIDQgYnl0ZSBhbGlnbm1lbnQpIGFzIHNob3duIGluIHRoZSB0YWJsZS4gCi0gICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOy8vICAgICAgICAgICAgIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAotICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAgICA7Ly8gICAgICAgICAgICAgfCAwMTIzICB8IDQ1NjcgIHwgMTIzNCAgfCA1Njc4ICB8Ci0gICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOy8vCi0gICAgOy8vIE5vdGU6IHskd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDN9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKLSAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nCi0KLSAgICBNQUNSTwotICAgIE1fRVhUX1hJTlQgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgICAgIElGICRvZmZzZXQgPSAwCi0gICAgICAgICAgICA7ICR3b3JkMCBhbmQgJHdvcmQxIGFyZSBvawotICAgICAgICAgICAgOyAkd29yZDIsICR3b3JkMyBhcmUganVzdCA4IHNoaWZ0ZWQgdmVyc2lvbnMKLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMywgJHdvcmQxLCBMU1IgIzgKLSAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMywgJHdvcmQzLCAkd29yZDIsIExTTCAjMjQKLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMiwgJHdvcmQwLCBMU1IgIzgKLSAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMiwgJHdvcmQyLCAkd29yZDEsIExTTCAjMjQKLSAgICAgICAgRUxJRiAkb2Zmc2V0ID0gMwotICAgICAgICAgICAgOyAkd29yZDIgYW5kICR3b3JkMyBhcmUgb2sgKHRha2VuIGNhcmUgd2hpbGUgbG9hZGluZyBpdHNlbGYpCi0gICAgICAgICAgICA7IHNldCAkd29yZDAgJiAkd29yZDEKLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMCwgJHdvcmQwLCBMU1IgIzI0Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDAsICR3b3JkMCwgJHdvcmQyLCBMU0wgIzgKLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMSwgJHdvcmQyLCBMU1IgIzI0Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDEsICR3b3JkMSwgJHdvcmQzLCBMU0wgIzgKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQwLCAkd29yZDAsIExTUiAjOCAqICRvZmZzZXQKLSAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMCwgJHdvcmQwLCAkd29yZDEsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMSwgJHdvcmQxLCBMU1IgIzggKiAkb2Zmc2V0Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDEsICR3b3JkMSwgJHdvcmQyLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCi0KLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMywgJHdvcmQxLCBMU1IgIzgKLSAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMywgJHdvcmQzLCAkd29yZDIsIExTTCAjKDMyIC0gOCAqICgoJG9mZnNldCkrMSkpCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDIsICR3b3JkMCwgTFNSICM4Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDIsICR3b3JkMiwgJHdvcmQxLCBMU0wgIzI0Ci0gICAgICAgIEVORElGCi0gICAgTUVORAotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBDb21wdXRlcyBoYWxmLXN1bSBhbmQgeG9yIG9mIHR3byBpbnB1dHMgYW5kIHB1dHMgdGhlbSBpbiB0aGUgaW5wdXQgCi0gICAgOy8vIHJlZ2lzdGVycyBpbiB0aGF0IG9yZGVyCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9IU1VNX1hPUiAgICAgICR2MCwgJHYxLCAkdG1wCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICR2MCAgICAgICAgIGEsIGZpcnN0IGlucHV0Ci0gICAgOy8vICR2MSAgICAgICAgIGIsIHNlY29uZCBpbnB1dAotICAgIDsvLyAkdG1wICAgICAgICBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyAkdjAgICAgICAgICAoYSArIGIpLzIKLSAgICA7Ly8gJHYxICAgICAgICAgYSBeIGIKLQotICAgIE1BQ1JPCi0gICAgTV9IU1VNX1hPUiAgICAgICR2MCwgJHYxLCAkdG1wCi0gICAgICAgIFVIQUREOCAgICAgICR0bXAsICR2MCwgJHYxICAgICA7Ly8gczAgPSBhICsgYgotICAgICAgICBFT1IgICAgICAgICAkdjEsICR2MCwgJHYxICAgICAgOy8vIGwwID0gYSBeIGIKLSAgICAgICAgTU9WICAgICAgICAgJHYwLCAkdG1wICAgICAgICAgIDsvLyBzMAotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIENhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0IHZhbHVlcyAoYSxiLGMsZCkgZm9yIEhhbGZQaXhlbFhZIHByZWRpY3QgdHlwZSBpbiAKLSAgICA7Ly8gbWNSZWNvbkJsb2NrIG1vZHVsZS4gVmVyeSBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgCi0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZIGRvbmUgaGVyZS4gVXNlcyAidG1wIiBhcyBzY3JhdGNoIHJlZ2lzdGVyIGFuZCAKLSAgICA7Ly8gInlNYXNrIiBmb3IgbWFzayB2YXJpYWJsZSAiMHgxMDEwMTAxeCIgc2V0IGluIGl0LiBJbiB5TWFzayA0IGxzYnMgYXJlIAotICAgIDsvLyBub3Qgc2lnbmlmaWNhbnQgYW5kIGFyZSB1c2VkIGJ5IHRoZSBjYWxsZWUgZm9yIHJvdyBjb3VudGVyICh5KQotICAgIDsvLwotICAgIDsvLyBTb21lIHBvaW50cyB0byBub3RlIGFyZToKLSAgICA7Ly8gMS4gSW5wdXQgaXMgcGFpciBvZiBwYWlyLWF2ZXJhZ2VzIGFuZCBYb3JzCi0gICAgOy8vIDIuICRzdW0xIGFuZCAkbHNiMSBhcmUgbm90IG1vZGlmaWVkIGFuZCBoZW5jZSBjYW4gYmUgcmV1c2VkIGluIGFub3RoZXIgCi0gICAgOy8vICAgIHJ1bm5pbmcgYXZlcmFnZQotICAgIDsvLyAzLiBPdXRwdXQgaXMgaW4gdGhlIGZpcnN0IGFyZ3VtZW50Ci0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9BVkc0ICAgICAgICAgJHN1bTAsICRsc2IwLCAkc3VtMSwgJGxzYjEsICRybmRWYWwKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHN1bTAgICAgICAgKGEgKyBiKSA+PiAxLCB3aGVyZSBhIGFuZCBiIGFyZSAxc3QgYW5kIDJuZCBpbnB1dHMgdG8gYmUgYXZlcmFnZWQKLSAgICA7Ly8gJGxzYjAgICAgICAgKGEgXiBiKQotICAgIDsvLyAkc3VtMSAgICAgICAoYyArIGQpID4+IDEuIE5vdCBtb2RpZmllZAotICAgIDsvLyAkbHNiMSAgICAgICAoYyBeIGQpICAgICAgIE5vdCBtb2RpZmllZAotICAgIDsvLyAkcm5kVmFsICAgICBBc3NlbWJsZXIgVmFyaWFibGUuIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZwotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJHN1bTAgICAgICAgKGEgKyBiICsgYyArIGQgKyAxKSAvIDQgOiBJZiBubyByb3VuZGluZwotICAgIDsvLyAgICAgICAgICAgICAoYSArIGIgKyBjICsgZCArIDIpIC8gNCA6IElmIHJvdW5kaW5nCi0KLSAgICBNQUNSTwotICAgIE1fQVZHNCAgICAgICAgICAkc3VtMCwgJGxzYjAsICRzdW0xLCAkbHNiMSwgJHJuZFZhbAotICAgICAgICBMQ0xTIE9QMQotICAgICAgICBMQ0xTIE9QMgotICAgICAgICBJRiAkcm5kVmFsID0gMCA7Ly8gcm91bmRpbmcgY2FzZQotT1AxIFNFVFMgIkFORCIKLU9QMiBTRVRTICJPUlIiCi0gICAgICAgIEVMU0UgICAgICAgICAgIDsvLyBOb3Qgcm91bmRpbmcgY2FzZQotT1AxIFNFVFMgIk9SUiIKLU9QMiBTRVRTICJBTkQiCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBMQ0xTIGxzYjIKLSAgICAgICAgTENMUyBzdW0yCi0gICAgICAgIExDTFMgZGVzdAotICAgIAotbHNiMiAgU0VUUyAidG1wIgotc3VtMiAgU0VUUyAiJGxzYjAiCi1kZXN0ICBTRVRTICIkc3VtMCIKLQotICAgICAgICAkT1AxICAgICAgICAkbHNiMCwgJGxzYjAsICRsc2IxICAgICAgICAgIDsvLyBlMCA9IGUwICYgZTEKLSAgICAgICAgRU9SICAgICAgICAgJGxzYjIsICRzdW0wLCAkc3VtMSAgICAgICAgICA7Ly8gZTIgPSBzMCBeIHMxCi0gICAgICAgICRPUDIgICAgICAgICRsc2IyLCAkbHNiMiwgJGxzYjAgICAgICAgICAgOy8vIGUyID0gZTIgfCBlMAotICAgICAgICBBTkQgICAgICAgICAkbHNiMiwgJGxzYjIsIHlNYXNrLCBMU1IgIyA0IDsvLyBlMiA9IGUyICYgbWFzawotICAgICAgICBVSEFERDggICAgICAkc3VtMiwgJHN1bTAsICRzdW0xICAgICAgICAgIDsvLyBzMiA9IChzMCArIHMxKS8yCi0gICAgICAgIFVBREQ4ICAgICAgICRkZXN0LCAkc3VtMiwgJGxzYjIgICAgICAgICAgOy8vIGRlc3QgPSAgczIgKyBlMgotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGhhbmRsZXIgbWFjcm9zCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBJbXBsZW1lbnQgbW90aW9uIGNvbXBlbnNhdGlvbiByb3V0aW5lcyB1c2luZyB0aGUgbmFtZWQgcmVnaXN0ZXJzIGluIAotICAgIDsvLyBjYWxsZWUgZnVuY3Rpb24uIEVhY2ggb2YgdGhlIGZvbGxvd2luZyA0IGltcGxlbWVudCB0aGUgNCBwcmVkaWN0IHR5cGUKLSAgICA7Ly8gRWFjaCBoYW5kbGVzIDggY2FzZXMgZWFjaCBpZSBhbGwgdGhlIGNvbWJpbmF0aW9ucyBvZiA0IHR5cGVzIG9mIHNvdXJjZSAKLSAgICA7Ly8gYWxpZ25tZW50IG9mZnNldHMgYW5kIDIgdHlwZXMgb2Ygcm91bmRpbmcgZmxhZwotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCAkcm5kVmFsLCAkb2Zmc2V0Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggICAkcm5kVmFsLCAkb2Zmc2V0Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgICAkcm5kVmFsLCAkb2Zmc2V0Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZICAkcm5kVmFsLCAkb2Zmc2V0Ci0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRybmRWYWwgICAgIEFzc2VtYmxlciBWYXJpYWJsZS4gMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCi0gICAgOy8vICRvZmZzZXQgICAgICRwU3JjIE1PRCA0IHZhbHVlLiBPZmZzZXQgZnJvbSA0IGJ5dGUgYWxpZ25lZCBsb2NhdGlvbi4KLSAgICA7Ly8gCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vIE91dHB1dHMgY29tZSBpbiB0aGUgbmFtZWQgcmVnaXN0ZXJzIG9mIHRoZSBjYWxsZWUgZnVuY3Rpb25zCi0gICAgOy8vIFRoZSBtYWNybyBsb2FkcyB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2UgcG9pbnRlciwgcHJvY2Vzc2VzIGl0IGFuZCAKLSAgICA7Ly8gc3RvcmVzIGluIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyLiBEb2VzIHRoZSB3aG9sZSBwcmVkaWN0aW9uIGN5Y2xlCi0gICAgOy8vIG9mIE1vdGlvbiBDb21wZW5zYXRpb24gcm91dGluZSBmb3IgYSBwYXJ0aWN1bGFyIHByZWRpY3RUeXBlCi0gICAgOy8vIEFmdGVyIHRoaXMgb25seSByZXNpZHVlIGFkZGl0aW9uIHRvIHRoZSBwcmVkaWN0ZWQgdmFsdWVzIHJlbWFpbgotCi0gICAgTUFDUk8KLSAgICBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEludGVnZXJQaXhlbCBwcmVkaWN0VHlwZS4gQm90aAotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlIGJhc2UuIEl0IGlzIGp1c3QgYSBjb3B5Ci0gICAgOy8vIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLiBUd28gbGluZXMgYXJlIGRvbmUgcGVyIGxvb3AgdG8gcmVkdWNlIAotICAgIDsvLyBzdGFsbHMuIExvb3AgaGFzIGJlZW4gc29mdHdhcmUgcGlwZWxpbmVkIGFzIHdlbGwgZm9yIHRoYXQgcHVycG9zZS4KLSAgICA7Ly8gCi0gICAgOy8vIE1fTE9BRF9YIGxvYWRzIGEgd2hvbGUgcm93IGluIHR3byByZWdpc3RlcnMgYW5kIHRoZW4gdGhleSBhcmUgc3RvcmVkCi0gICAgCi1DYXNlSW50ZWdlclBpeGVsUm5kME9mZnNldCRvZmZzZXQKLUNhc2VJbnRlZ2VyUGl4ZWxSbmQxT2Zmc2V0JG9mZnNldAotICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDMsICRvZmZzZXQKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0Ci1ZbG9vcEludGVnZXJQaXhlbE9mZnNldCRvZmZzZXQKLSAgICBTVUJTICAgICAgICB5LCB5LCAjMgotICAgIFNUUkQgICAgICAgIHRtcDEsIHRtcDIsIFtwRHN0XSwgZHN0U3RlcAotICAgIFNUUkQgICAgICAgIHRtcDMsIHRtcDQsIFtwRHN0XSwgZHN0U3RlcAotICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDMsICRvZmZzZXQKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0Ci0gICAgQkdUICAgICAgICAgWWxvb3BJbnRlZ2VyUGl4ZWxPZmZzZXQkb2Zmc2V0Ci0KLSAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBNQUNSTwotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFggcHJlZGljdFR5cGUuIFRoZSB0d28KLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCi0gICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gTG9vcCBoYXMgYmVlbiBzb2Z0d2FyZSBwaXBlbGluZWQgdG8gcmVkdWNlIAotICAgIDsvLyBzdGFsbHMuCi0gICAgOy8vIAotICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCBob3Jpem9udGFsIHBpeGVsLgotICAgIDsvLyBNX0xPQURfWElOVCBhbmQgTV9FWFRfWElOVCBjb21iaW5hdGlvbiBnZW5lcmF0ZSA0IHJlZ2lzdGVycywgMiB3aXRoIAotICAgIDsvLyBhbGwgcGl4ZWxzIGluIGEgcm93IHdpdGggNCBwaXhlbCBpbiBlYWNoIHJlZ2lzdGVyIGFuZCBhbm90aGVyIDIKLSAgICA7Ly8gcmVnaXN0ZXJzIHdpdGggcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gb25lIGhvcml6b250YWxseSBzaGlmdGVkIHBpeGVsCi0gICAgOy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluaXRpYWwgcm93IHBpeGVscy4gVGhlc2UgYXJlIHNldCBvZiBwYWNrZWQgCi0gICAgOy8vIHJlZ2lzdGVycyBhcHByb3ByaWF0ZSB0byBkbyA0IGxhbmUgU0lNRC4KLSAgICA7Ly8gQWZ0ZXIgdGhhdCBNX1VIQUREOFIgbWFjcm8gZG9lcyB0aGUgYXZlcmFnaW5nIHRha2luZyBjYXJlIG9mIHRoZSAKLSAgICA7Ly8gcm91bmRpbmcgYXMgcmVxdWlyZWQKLSAgICAKLUNhc2VIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgSUYgJHJuZFZhbCA9IDAKLSAgICAgICAgTERSIG1hc2ssID0weDgwODA4MDgwCi0gICAgRU5ESUYKLQotICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKLVlsb29wSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotICAgIFNVQlMgICAgICAgIHksIHksICMxCi0gICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAotICAgIE1fVUhBREQ4UiAgIHRtcDUsIHRtcDEsIHRtcDMsICgxLSRybmRWYWwpLCBtYXNrCi0gICAgTV9VSEFERDhSICAgdG1wNiwgdG1wMiwgdG1wNCwgKDEtJHJuZFZhbCksIG1hc2sKLSAgICBTVFJEICAgICAgICB0bXA1LCB0bXA2LCBbcERzdF0sIGRzdFN0ZXAKLSAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0Ci0gICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0KLSAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBNQUNSTwotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFkgcHJlZGljdFR5cGUuIFRoZSB0d28KLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCi0gICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gUHJlTG9hZGluZyBpcyB1c2VkIHRvIGF2b2lkIHJlbG9hZCBvZiBzYW1lIGRhdGEuIAotICAgIDsvLyAKLSAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgdmVydGljYWwgcGl4ZWwuCi0gICAgOy8vIE1fTE9BRF9YIGdlbmVyYXRlcyAyIHJlZ2lzdGVycyB3aXRoIGFsbCBwaXhlbHMgaW4gYSByb3cgd2l0aCA0IHBpeGVsIGluIAotICAgIDsvLyBlYWNoIHJlZ2lzdGVyLiBUaGVzZSBhcmUgc2V0IG9mIHBhY2tlZCByZWdpc3RlcnMgYXBwcm9wcmlhdGUgdG8gZG8gCi0gICAgOy8vIDQgbGFuZSBTSU1ELiBBZnRlciB0aGF0IE1fVUhBREQ4UiBtYWNybyBkb2VzIHRoZSBhdmVyYWdpbmcgdGFraW5nIGNhcmUgCi0gICAgOy8vIG9mIHRoZSByb3VuZGluZyBhcyByZXF1aXJlZAotICAgIAotQ2FzZUhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLSAgICBJRiAkcm5kVmFsID0gMAotICAgICAgICBMRFIgbWFzaywgPTB4ODA4MDgwODAKLSAgICBFTkRJRgotCi0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wNSwgJG9mZnNldCA7Ly8gUHJlLWxvYWQKLVlsb29wSGFsZlBpeGVsWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotICAgIFNVQlMgICAgICAgIHksIHksICMyCi0gICAgOy8vIFByb2Nlc3Npbmcgb25lIGxpbmUKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0Ci0gICAgTV9VSEFERDhSICAgdG1wMSwgdG1wMSwgdG1wMywgKDEtJHJuZFZhbCksIG1hc2sKLSAgICBNX1VIQUREOFIgICB0bXAyLCB0bXAyLCB0bXA0LCAoMS0kcm5kVmFsKSwgbWFzawotICAgIFNUUkQgICAgICAgIHRtcDEsIHRtcDIsIFtwRHN0XSwgZHN0U3RlcAotICAgIDsvLyBQcm9jZXNzaW5nIGFub3RoZXIgbGluZQotICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDUsICRvZmZzZXQKLSAgICBNX1VIQUREOFIgICB0bXAzLCB0bXAzLCB0bXAxLCAoMS0kcm5kVmFsKSwgbWFzawotICAgIE1fVUhBREQ4UiAgIHRtcDQsIHRtcDQsIHRtcDIsICgxLSRybmRWYWwpLCBtYXNrCi0gICAgU1RSRCAgICAgICAgdG1wMywgdG1wNCwgW3BEc3RdLCBkc3RTdGVwCi0KLSAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLQotICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIE1BQ1JPCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFhZIHByZWRpY3RUeXBlLiBUaGUgdHdvCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAotICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIFByZUxvYWRpbmcgaXMgdXNlZCB0byBhdm9pZCByZWxvYWQgb2Ygc2FtZSBkYXRhLiAKLSAgICA7Ly8gCi0gICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IHZlcnRpY2FsLCBob3Jpem9udGFsIAotICAgIDsvLyBhbmQgcmlnaHQtZG93biBkaWFnb25hbCBwaXhlbHMuIEp1c3QgYXMgaW4gSGFsZlBpeGVsWCBjYXNlLCBNX0xPQURfWElOVAotICAgIDsvLyBhbmQgTV9FWFRfWElOVCBjb21iaW5hdGlvbiBnZW5lcmF0ZXMgNCByZWdpc3RlcnMgd2l0aCBhIHJvdyBhbmQgaXRzCi0gICAgOy8vIDEgcGl4ZWwgcmlnaHQgc2hpZnRlZCB2ZXJzaW9uLCB3aXRoIDQgcGl4ZWxzIGluIG9uZSByZWdpc3Rlci4gQW5vdGhlciAKLSAgICA7Ly8gY2FsbCBvZiB0aGF0IG1hY3JvLWNvbWJpbmF0aW9uIGdldHMgYW5vdGhlciByb3cuIFRoZW4gTV9IU1VNX1hPUiBpcyAKLSAgICA7Ly8gY2FsbGVkIHRvIGdldCBtdXR1YWwgaGFsZi1zdW0gYW5kIHhvciBjb21iaW5hdGlvbnMgb2YgYSByb3cgd2l0aCBpdHMKLSAgICA7Ly8gc2hpZnRlZCB2ZXJzaW9uIGFzIHRoZXkgYXJlIGlucHV0cyB0byB0aGUgTV9BVkc0IG1hY3JvIHdoaWNoIGNvbXB1dGVzCi0gICAgOy8vIHRoZSA0IGVsZW1lbnQgYXZlcmFnZSB3aXRoIHJvdW5kaW5nLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGhhbGYtc3VtL3hvciAKLSAgICA7Ly8gdmFsdWVzIHRoYXQgYXJlIHByZXNlcnZlZCBmb3IgbmV4dCByb3cgYXMgdGhleSBjYW4gYmUgcmUtdXNlZCBpbiB0aGUgCi0gICAgOy8vIG5leHQgY2FsbCB0byB0aGUgTV9BVkc0IGFuZCBzYXZlcyByZWNvbXB1dGF0aW9uLgotICAgIDsvLyBEdWUgdG8gbGFjayBvZiByZWdpc3RlciwgdGhlIHJvdyBjb3VudGVyIGFuZCBhIG1hc2tpbmcgdmFsdWUgcmVxdWlyZWQgCi0gICAgOy8vIGluIE1fQVZHNCBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgcmVnaXN0ZXIgeU1hc2sgd2hlcmUgdGhlIGxhc3QgbmliYmxlCi0gICAgOy8vIGhvbGRzIHRoZSByb3cgY291bnRlciB2YWx1ZXMgYW5kIHJlc3QgaG9sZHMgdGhlIG1hc2tpbmcgdmFyaWFibGUgbGVmdCAKLSAgICA7Ly8gc2hpZnRlZCBieSA0Ci0gICAgCi1DYXNlSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLSAgICBMRFIgICAgICAgICB5TWFzaywgPSgoMHgwMTAxMDEwMSA8PCA0KSArIDgpCi0KLSAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEgOy8vIExvYWQgYSwgYScsIGIsIGInCi0gICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExCi0gICAgTV9IU1VNX1hPUiAgdDAwLCB0MTAsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMCwgbDAKLSAgICBNX0hTVU1fWE9SICB0MDEsIHQxMSwgdG1wICAgICAgICAgICAgICAgOy8vIHMwJywgbDAnCi0KLVlsb29wSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLSAgICA7Ly8gUHJvY2Vzc3Npbmcgb25lIGxpbmUKLSAgICA7Ly8gdDAwLCB0MDEsIHQxMCwgdDExIHJlcXVpcmVkIGZyb20gcHJldmlvdXMgbG9vcAotICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHQyMCwgdDIxLCB0MzAsIHQzMSA7Ly8gTG9hZCBjLCBjJywgZCwgZCcKLSAgICBTVUIgICAgICAgICB5TWFzaywgeU1hc2ssICMyCi0gICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDIwLCB0MjEsIHQzMCwgdDMxCi0gICAgTV9IU1VNX1hPUiAgdDIwLCB0MzAsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMSwgbDEKLSAgICBNX0hTVU1fWE9SICB0MjEsIHQzMSwgdG1wICAgICAgICAgICAgICAgOy8vIHMxJywgbDEnCi0gICAgTV9BVkc0ICAgICAgdDAwLCB0MTAsIHQyMCwgdDMwLCAkcm5kVmFsIDsvLyBzMCwgbDAsIHMxLCBsMQotICAgIE1fQVZHNCAgICAgIHQwMSwgdDExLCB0MjEsIHQzMSwgJHJuZFZhbCA7Ly8gczAnLCBsMCcsIHMxJywgbDEnCi0gICAgU1RSRCAgICAgICAgdDAwLCB0MDEsIFtwRHN0XSwgZHN0U3RlcCAgIDsvLyBzdG9yZSB0aGUgYXZlcmFnZQotICAgIAotICAgIDsvLyBQcm9jZXNzc2luZyBhbm90aGVyIGxpbmUKLSAgICA7Ly8gdDIwLCB0MjEsIHQzMCwgdDMxIHJlcXVpcmVkIGZyb20gYWJvdmUKLSAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEgOy8vIExvYWQgYSwgYScsIGIsIGInCi0gICAgVFNUICAgICAgICAgeU1hc2ssICM3Ci0gICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExCi0gICAgTV9IU1VNX1hPUiAgdDAwLCB0MTAsIHRtcAotICAgIE1fSFNVTV9YT1IgIHQwMSwgdDExLCB0bXAKLSAgICBNX0FWRzQgICAgICB0MjAsIHQzMCwgdDAwLCB0MTAsICRybmRWYWwKLSAgICBNX0FWRzQgICAgICB0MjEsIHQzMSwgdDAxLCB0MTEsICRybmRWYWwKLSAgICBTVFJEICAgICAgICB0MjAsIHQyMSwgW3BEc3RdLCBkc3RTdGVwCi0KLSAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0KLSAgICBJRiAkb2Zmc2V0Lz0zIDpMT1I6ICRybmRWYWwvPTEKLSAgICAgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBFTkRJRgotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGhhbmRsZXIgbWFjcm9zIGVuZCBoZXJlCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBQb3B1bGF0ZXMgYWxsIDQga2luZHMgb2Ygb2Zmc2V0cyAiY2FzZXMiIGZvciBlYWNoIHByZWRpY3RUeXBlIGFuZCBybmRWYWwKLSAgICA7Ly8gY29tYmluYXRpb24gaW4gdGhlICJzd2l0Y2giIHRvIHByZWRpY3Rpb24gcHJvY2Vzc2luZyBjb2RlIHNlZ21lbnQKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0NBU0VfT0ZGU0VUICRybmQsICRwcmVkaWN0VHlwZQotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkcm5kICAgICAgICAgICAgMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCi0gICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9DQVNFInMgZm9yIHRoZSAiTV9TV0lUQ0giIG1hY3JvCi0KLSAgICBNQUNSTwotICAgIE1fQ0FTRV9PRkZTRVQgJHJuZCwgJHByZWRpY3RUeXBlCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQwCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQxCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQyCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQzCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gUG9wdWxhdGVzIGFsbCAyIGtpbmRzIG9mIHJvdW5kaW5nICJjYXNlcyIgZm9yIGVhY2ggcHJlZGljdFR5cGUgaW4gdGhlIAotICAgIDsvLyAic3dpdGNoIiB0byBwcmVkaWN0aW9uIHByb2Nlc3NpbmcgY29kZSBzZWdtZW50Ci0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9DQVNFX09GRlNFVCAkcHJlZGljdFR5cGUKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHByZWRpY3RUeXBlICAgIFRoZSBwcmVkaWN0aW9uIG1vZGUKLSAgICA7Ly8gCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vIFBvcHVsYXRlZCBsaXN0IG9mICJNX0NBU0VfT0ZGU0VUIiBtYWNyb3MKLQotICAgIE1BQ1JPCi0gICAgTV9DQVNFX01DUkVDT05CTE9DSyAkcHJlZGljdFR5cGUKLSAgICAgICAgTV9DQVNFX09GRlNFVCAgMCwgJHByZWRpY3RUeXBlIDsvLyAwIGZvciByb3VuZGluZwotICAgICAgICBNX0NBU0VfT0ZGU0VUICAxLCAkcHJlZGljdFR5cGUgOy8vIDEgZm9yIG5vIHJvdW5kaW5nCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gUG9wdWxhdGVzIGFsbCA4IGtpbmRzIG9mIHJvdW5kaW5nIGFuZCBvZmZzZXQgY29tYmluYXRpb25zIGhhbmRsaW5nIG1hY3JvcyAKLSAgICA7Ly8gZm9yIHRoZSBzcGVjaWZpZWQgcHJlZGljdFR5cGUuIEluIGNhc2Ugb2YgIkludGVnZXJQaXhlbCIgcHJlZGljdFR5cGUsIAotICAgIDsvLyByb3VuZGluZyBpcyBub3QgcmVxdWlyZWQgc28gc2FtZSBjb2RlIHNlZ21lbnQgaGFuZGxlcyBib3RoIGNhc2VzCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0sgICAgJHByZWRpY3RUeXBlCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9NQ1JFQ09OQkxPQ0tfPHByZWRpY3RUeXBlPiIgbWFjcm9zIGZvciBzcGVjaWZpZWQgCi0gICAgOy8vIHByZWRpY3RUeXBlLiBFYWNoIAotICAgIDsvLyAgICAgICAgICAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfPHByZWRpY3RUeXBlPiAkcm5kLCAkb2Zmc2V0IAotICAgIDsvLyBpcyBhbiBjb2RlIHNlZ21lbnQgKHN0YXJ0aW5nIHdpdGggYSBsYWJlbCBpbmRpY2F0aW5nIHRoZSBwcmVkaWN0VHlwZSwgCi0gICAgOy8vIHJvdW5kaW5nIGFuZCBvZmZzZXQgY29tYmluYXRpb24pCi0gICAgOy8vIEZvdXIgY2FsbHMgb2YgdGhpcyBtYWNybyB3aXRoIHRoZSA0IHByZWRpY3Rpb24gbW9kZXMgcG9wdWxhdGUgYWxsIHRoZSAzMiAKLSAgICA7Ly8gaGFuZGxlcnMKLQotICAgIE1BQ1JPCi0gICAgTV9NQ1JFQ09OQkxPQ0sgJHByZWRpY3RUeXBlCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAwCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAxCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAyCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAzCi0gICAgSUYgIiRwcmVkaWN0VHlwZSIgLz0gIkludGVnZXJQaXhlbCIgOy8vIElmIG5vdCBJbnRlZ2VyUGl4ZWwgdGhlbiByb3VuZGluZyBtYWtlcyBhIGRpZmZlcmVuY2UKLSAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDAKLSAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDEKLSAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDIKLSAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDMKLSAgICBFTkRJRgotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBJbnB1dC9PdXRwdXQgUmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgICAgICAgIFJOIDEKLWFyZ19wU3JjUmVzaWR1ZSAgICAgICBSTiAyCi1wU3JjUmVzaWR1ZSAgICAgICAgICAgUk4gMTIKLXBEc3QgICAgICAgICAgICAgICAgICBSTiAzCi1kc3RTdGVwICAgICAgICAgICAgICAgUk4gMgotcHJlZGljdFR5cGUgICAgICAgICAgIFJOIDEwCi1ybmRWYWwgICAgICAgICAgICAgICAgUk4gMTEKLW1hc2sgICAgICAgICAgICAgICAgICBSTiAxMQotCi07Ly8gTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXplcm8gICAgICAgICAgICAgICAgICBSTiAxMgoteSAgICAgICAgICAgICAgICAgICAgIFJOIDE0Ci0KLXRtcDEgICAgICAgICAgICAgICAgICBSTiA0Ci10bXAyICAgICAgICAgICAgICAgICAgUk4gNQotdG1wMyAgICAgICAgICAgICAgICAgIFJOIDYKLXRtcDQgICAgICAgICAgICAgICAgICBSTiA3Ci10bXA1ICAgICAgICAgICAgICAgICAgUk4gOAotdG1wNiAgICAgICAgICAgICAgICAgIFJOIDkKLXRtcDcgICAgICAgICAgICAgICAgICBSTiAxMAotdG1wOCAgICAgICAgICAgICAgICAgIFJOIDExCi10bXA5ICAgICAgICAgICAgICAgICAgUk4gMTIKLQotdDAwICAgICAgICAgICAgICAgICAgIFJOIDQKLXQwMSAgICAgICAgICAgICAgICAgICBSTiA1Ci10MTAgICAgICAgICAgICAgICAgICAgUk4gNgotdDExICAgICAgICAgICAgICAgICAgIFJOIDcKLXQyMCAgICAgICAgICAgICAgICAgICBSTiA4Ci10MjEgICAgICAgICAgICAgICAgICAgUk4gOQotdDMwICAgICAgICAgICAgICAgICAgIFJOIDEwCi10MzEgICAgICAgICAgICAgICAgICAgUk4gMTEKLXRtcCAgICAgICAgICAgICAgICAgICBSTiAxMgotCi15TWFzayAgICAgICAgICAgICAgICAgUk4gMTQKLQotZHN0ICAgICAgICAgICAgICAgICAgIFJOIDEKLXJldHVybiAgICAgICAgICAgICAgICBSTiAwCi0KLSAgICA7Ly8gQWxsb2NhdGUgbWVtb3J5IG9uIHN0YWNrCi0gICAgTV9BTExPQzQgICAgU3RrX3BEc3QsICAgICAgICAgICA0Ci0gICAgTV9BTExPQzQgICAgU3RrX3BTcmNSZXNpZHVlLCAgICA0Ci0gICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgIE1fU1RBUlQgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2ssIHIxMQotICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgTV9BUkcgICAgICAgQXJnX2RzdFN0ZXAsICAgICAgICA0Ci0gICAgTV9BUkcgICAgICAgQXJnX3ByZWRpY3RUeXBlLCAgICA0Ci0gICAgTV9BUkcgICAgICAgQXJnX3JuZFZhbCwgICAgICAgICA0Ci0gICAgOy8vIFNhdmUgb24gc3RhY2sKLSAgICBNX1NUUiAgICAgICBwRHN0LCBTdGtfcERzdAotICAgIE1fU1RSICAgICAgIGFyZ19wU3JjUmVzaWR1ZSwgU3RrX3BTcmNSZXNpZHVlCi0gICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICBNX0xEUiAgICAgICBkc3RTdGVwLCBBcmdfZHN0U3RlcAotICAgIE1fTERSICAgICAgIHByZWRpY3RUeXBlLCBBcmdfcHJlZGljdFR5cGUKLSAgICBNX0xEUiAgICAgICBybmRWYWwsIEFyZ19ybmRWYWwKLSAgICAKLSAgICBNT1YgICAgICAgICB5LCAjOAotICAgIAotICAgIEFORCAgICAgICAgIHRtcDEsIHBTcmMsICMzCi0gICAgT1JSICAgICAgICAgcHJlZGljdFR5cGUsIHRtcDEsIHByZWRpY3RUeXBlLCBMU0wgIzMKLSAgICBPUlIgICAgICAgICBwcmVkaWN0VHlwZSwgcHJlZGljdFR5cGUsIHJuZFZhbCwgTFNMICMyCi0gICAgOy8vIFRydW5jYXRpbmcgc291cmNlIHBvaW50ZXIgdG8gYWxpZ24gdG8gNCBieXRlIGxvY2F0aW9uCi0gICAgQklDICAgICAgICAgcFNyYywgcFNyYywgIzMKLQotICAgIDsvLyBJbXBsZW1lbnRhdGlvbiB0YWtlcyBjYXJlIG9mIGFsbCBjb21iaW5hdGlvbnMgb2YgZGlmZmVyZW50IAotICAgIDsvLyBwcmVkaWN0VHlwZXMsIHJvdW5kaW5nIGNhc2VzIGFuZCBzb3VyY2UgcG9pbnRlciBvZmZzZXRzIHRvIGFsaWdubWVudCAKLSAgICA7Ly8gb2YgNCBieXRlcyBpbiBkaWZmZXJlbnQgY29kZSBiYXNlcyB1bmxlc3Mgb25lIG9mIHRoZXNlIHBhcmFtZXRlciB3YXNuJ3QgCi0gICAgOy8vIG1ha2luZyBhbnkgZGlmZmVyZW5jZSB0byB0aGUgaW1wbGVtZW50YXRpb24uIEJlbG93IE1fQ0FTRV9NQ1JFQ09OQkxPQ0sKLSAgICA7Ly8gbWFjcm9zIGJyYW5jaCBpbnRvIDggTV9DQVNFIG1hY3JvcyBmb3IgYWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgMiAKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYW5kIDQgb2Zmc2V0cyBvZiB0aGUgcFNyYyBwb2ludGVyIHRvIHRoZSA0IGJ5dGUgCi0gICAgOy8vIGFsaWdubWVudC4gCi0gICAgTV9TV0lUQ0ggICAgcHJlZGljdFR5cGUKLSAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBJbnRlZ2VyUGl4ZWwKLSAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYCi0gICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWQotICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFhZCi0gICAgTV9FTkRTV0lUQ0gKLQotICAgIDsvLyBUaGUgTV9NQ1JFQ09OQkxPQ0sgbWFjcm9zIHBvcHVsYXRlIHRoZSBjb2RlIGJhc2VzIGJ5IGNhbGxpbmcgYWxsIDggCi0gICAgOy8vIHBhcnRpY3VsYXIgbWFjcm9zICg0IGluIGNhc2Ugb2YgSW50ZWdlclBpeGVsIGFzIHJvdW5kaW5nIG1ha2VzIG5vIAotICAgIDsvLyBkaWZmZXJlbmNlIHRoZXJlKSB0byBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgYWxsIGNhc2VzIG9mIHJvdW5kaW5nIGFuZCAKLSAgICA7Ly8gb2Zmc2V0cy4gTFRPUkcgaXMgdXNlZCB0byBzZWdtZW50IHRoZSBjb2RlIGFzIGNvZGUgc2l6ZSBibG9hdGVkIGJleW9uZCAKLSAgICA7Ly8gNEtCLgotICAgIE1fTUNSRUNPTkJMT0NLIEludGVnZXJQaXhlbAotICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFgKLSAgICBMVE9SRwotICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFkKLSAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYWQotU3dpdGNoUHJlZGljdFR5cGVFbmQKLQotICAgIDsvLyBSZXNpZHVlIEFkZGl0aW9uCi0gICAgOy8vIFRoaXMgaXMgZG9uZSBpbiAyIGxhbmUgU0lNRCB0aG91Z2ggbG9hZHMgYXJlIGZ1cnRoZXIgb3B0aW1pemVkIGFuZAotICAgIDsvLyA0IGJ5dGVzIGFyZSBsb2FkZWQgaW4gY2FzZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIuIEFsZ29yaXRobWljIAotICAgIDsvLyBkZXRhaWxzIGFyZSBpbiBpbmxpbmVkIGNvbW1lbnRzCi0gICAgTV9MRFIgICAgICAgcFNyY1Jlc2lkdWUsIFN0a19wU3JjUmVzaWR1ZQotICAgIENNUCAgICAgICAgIHBTcmNSZXNpZHVlLCAjMAotICAgIEJFUSAgICAgICAgIHBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCi1wU3JjUmVzaWR1ZU5vdE51bGwgICAgCi0gICAgTV9MRFIgICAgICAgcERzdCwgU3RrX3BEc3QKLSAgICBNT1YgICAgICAgICB5LCAjOAotICAgIFNVQiAgICAgICAgIGRzdFN0ZXAsIGRzdFN0ZXAsICM0Ci1ZbG9vcF9wU3JjUmVzaWR1ZU5vdE51bGwKLSAgICBTVUJTICAgICAgICB5LCB5LCAjMQotICAgIExEUiAgICAgICAgIGRzdCwgW3BEc3RdICAgICAgICAgICAgICAgIDsvLyBkc3QgPSBbZGNiYV0KLSAgICBMRE1JQSAgICAgICBwU3JjUmVzaWR1ZSEsIHt0bXAxLCB0bXAyfSA7Ly8gdG1wMT1bRENdIHRtcDI9W0JBXQotICAgIFBLSEJUICAgICAgIHRtcDMsIHRtcDEsIHRtcDIsIExTTCAjMTYgIDsvLyBEZWx0YXZhbDEgPSBbQyBBXQotICAgIFBLSFRCICAgICAgIHRtcDQsIHRtcDIsIHRtcDEsIEFTUiAjMTYgIDsvLyBEZWx0YVZhbDIgPSBbRCBCXQotICAgIFVYVEIxNiAgICAgIHRtcDEsIGRzdCAgICAgICAgICAgICAgICAgIDsvLyB0bXAxID0gWzBjMGFdCi0gICAgVVhUQjE2ICAgICAgdG1wMiwgZHN0LCBST1IgIzggICAgICAgICAgOy8vIHRtcDIgPSBbMGQwYl0KLSAgICBRQUREMTYgICAgICB0bXAxLCB0bXAxLCB0bXAzICAgICAgICAgICA7Ly8gQWRkIGFuZCBzYXR1cmF0ZSB0byAxNiBiaXRzCi0gICAgUUFERDE2ICAgICAgdG1wMiwgdG1wMiwgdG1wNAotICAgIFVTQVQxNiAgICAgIHRtcDEsICM4LCB0bXAxCi0gICAgVVNBVDE2ICAgICAgdG1wMiwgIzgsIHRtcDIgICAgICAgICAgICAgOy8vIGFybUNsaXAoMCwgMjU1LCB0bXAyKQotICAgIE9SUiAgICAgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOCAgIDsvLyB0bXAxID0gW2RjYmFdCi0gICAgU1RSICAgICAgICAgdG1wMSwgW3BEc3RdLCAjNAotICAgIAotICAgIExEUiAgICAgICAgIGRzdCwgW3BEc3RdCi0gICAgTERNSUEgICAgICAgcFNyY1Jlc2lkdWUhLCB7dG1wMSwgdG1wMn0KLSAgICBQS0hCVCAgICAgICB0bXAzLCB0bXAxLCB0bXAyLCBMU0wgIzE2Ci0gICAgUEtIVEIgICAgICAgdG1wNCwgdG1wMiwgdG1wMSwgQVNSICMxNgotICAgIFVYVEIxNiAgICAgIHRtcDEsIGRzdAotICAgIFVYVEIxNiAgICAgIHRtcDIsIGRzdCwgUk9SICM4Ci0gICAgUUFERDE2ICAgICAgdG1wMSwgdG1wMSwgdG1wMwotICAgIFFBREQxNiAgICAgIHRtcDIsIHRtcDIsIHRtcDQKLSAgICBVU0FUMTYgICAgICB0bXAxLCAjOCwgdG1wMQotICAgIFVTQVQxNiAgICAgIHRtcDIsICM4LCB0bXAyCi0gICAgT1JSICAgICAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4Ci0gICAgU1RSICAgICAgICAgdG1wMSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgCi0gICAgQkdUICAgICAgICAgWWxvb3BfcFNyY1Jlc2lkdWVOb3ROdWxsCi1wU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAotCi0gICAgTU9WICAgICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotCi0gICAgTV9FTkQKLSAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBDb3J0ZXhBOCBpbXBsZW1lbnRhdGlvbgotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgZW5kcwotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTZjODFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAqKioqKioqKioqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBDb250YWlucyBtb2R1bGUgZm9yIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24KLTsgKgotOyAqIAotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKLTsgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAotOyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCAKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gVGhlIAotOyAqICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIAotOyAqICAgICAgICAgICAgICAgICAgICBbLTIwNDgsIDIwNDddLgotOyAqIFtpbl0gIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi07ICogW2luXSAgcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgCi07ICogICAgICAgICAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi07ICogW2luXSAgY3VyUVAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSAKLTsgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi07ICogW2luXSAgcHJlZFFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotOyAqIFtpbl0gIHByZWREaXIgICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotOyAqICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLTsgKiBbaW5dICBBQ1ByZWRGbGFnICAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKLTsgKiAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAotOyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAotOyAqIFtpbl0gIHZpZGVvQ29tcCAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotOyAqICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLTsgKiBbb3V0XSBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2sKLTsgKiBbb3V0XSBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCi07ICogW291dF0gcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCi07ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4KLTsgKiAtIEF0IGxlYXN0IG9uZSB0aGUgZm9sbG93aW5nIGNhc2VzOiBjdXJRUCA8PSAwLCBwcmVkUVAgPD0gMCwgY3VyUVAgPjMxLCAKLTsgKiAgIHByZWRRUCA+IDMxLCBwcmVEaXIgZXhjZWVkcyBbMSwyXS4KLTsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCAKLTsgKiAgIDQtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICoqKioqKioqKgotICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgIAotICAgICAgICAgICAgIAotCi0gICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIKLSAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNgotICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCi0gICAgICAgCi0KLQotICAgICAgICBJRiBBUk0xMTM2SlMKLQotCi07Ly8gSW5wdXQgQXJndW1lbnRzCi0KLXBTcmNEc3QgICAgICAgICAgUk4gMAotcFByZWRCdWZSb3cgICAgICBSTiAxCi1wUHJlZEJ1ZkNvbCAgICAgIFJOIDIKLWN1clFQICAgICAgICAgICAgUk4gMwotUVAgICAgICAgICAgICAgICBSTiAzCi1wcmVkUVAgICAgICAgICAgIFJOIDQKLXByZWREaXIgICAgICAgICAgUk4gNQotQUNQcmVkRmxhZyAgICAgICBSTiA2Ci12aWRlb0NvbXAgICAgICAgIFJOIDcgIAotCi07Ly8gTG9jYWwgVmFyaWFibGVzCi0KLXRlbXAyICAgICAgICAgICAgUk4gNQotbmVnQ3VyUVAgICAgICAgICBSTiA3Ci1uZWdkY1NjYWxlciAgICAgIFJOIDcKLXRlbXBQcmVkICAgICAgICAgUk4gOAotCi1kY1NjYWxlciAgICAgICAgIFJOIDQKLUNvZWZmVGFibGUgICAgICAgUk4gOQotYWJzQ29lZmZEQyAgICAgICBSTiA5Ci10ZW1wMyAgICAgICAgICAgIFJOIDYKLWFic0NvZWZmQUMgICAgICAgUk4gNgotCi1zaG9ydFZpZGVvSGVhZGVyIFJOIDkKLXByZWRDb2VmZlRhYmxlICAgUk4gMTAKLUNvdW50ICAgICAgICAgICAgUk4gMTAKLXRlbXAxICAgICAgICAgICAgUk4gMTIKLWluZGV4ICAgICAgICAgICAgUk4gMTIKLVJlbSAgICAgICAgICAgICAgUk4gMTQKLXRlbXAgICAgICAgICAgICAgUk4gMTEKLVJldHVybiAgICAgICAgICAgUk4gMAotCi0gICAgICAgCi0KLSAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSxyMTIKLSAgICAgICAKLSAgICAgICA7Ly8gQXNzaWduaW5nIHBvaW50ZXJzIHRvIElucHV0IGFyZ3VtZW50cyBvbiBTdGFjawotICAgIAotICAgICAgIE1fQVJHICAgICAgICAgICBwcmVkUVBvblN0YWNrLDQgIAotICAgICAgIE1fQVJHICAgICAgICAgICBwcmVkRGlyb25TdGFjayw0Ci0gICAgICAgTV9BUkcgICAgICAgICAgIEFDUHJlZEZsYWdvblN0YWNrLDQKLSAgICAgICBNX0FSRyAgICAgICAgICAgdmlkZW9Db21wb25TdGFjayw0Ci0gICAgICAgCi0gICAgICAgOy8vIERDIFByZWRpY3Rpb24KLQotICAgICAgIE1fTERSICAgICAgICAgICB2aWRlb0NvbXAsdmlkZW9Db21wb25TdGFjayAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHZpZGVvQ29tcCBGcm9tIFN0YWNrICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIHByZWREaXIscHJlZERpcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUHJlZGljdGlvbiBkaXJlY3Rpb24KLSAgICAgICAKLSAgICAgICA7Ly8gZGNTY2FsZXIgQ2FsY3VsYXRpb24KLQotICAgICAgIExEUiAgICAgICAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgIEFERCAgICAgICAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1Ci0gICAgICAgTERSQiAgICAgICAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KLSAgICAgICAgICAgCi0gICAgCi1jYWxEQ1ZhbAotICAgICAgCi0gICAgICAgCi0gICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2ICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAzMjc2Ny8oMSB0byA2MykgCi0gICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIHZlcnRpY2FsCi0KLSAgICAgICA7Ly8gQ2F1bHVjYXRlIHRlbXAgcHJlZCBieSBwZXJmb3JtaW5nIERpdmlzaW9uCi0gICAgICAgICAgICAKLSAgICAgICBMRFJFUVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgdmV0aWNhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIFJvdyBQcmVkaWN0aW9uIEJ1ZmZlcgotICAgICAgIExEUk5FU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBob3Jpem9udGFsIGxvYWQgdGhlIGNvZWZmIGZyb20gY29sdW1uIFByZWRpY3Rpb24gQnVmZmVyCi0gICAgICAgCi0gICAgICAgUlNCICAgICAgICAgICAgIG5lZ2RjU2NhbGVyLGRjU2NhbGVyLCMwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5lZ2RjU2NhbGVyPS1kY1NjYWxlciAgCi0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXByZWRpY3Rpb24gY29lZmYKLSAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZEQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9hYnNDb2VmZkRDPWFicyh0ZW1wMSkKLSAgICAgICAKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxkY1NjYWxlcixkY1NjYWxlcgotICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwcmVkQ29lZmZUYWJsZSx0ZW1wXSAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHZhbHVlIGZyb20gY29lZmYgdGFibGUgZm9yIHBlcmZvcm1pbmcgZGl2aXNpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KLSAgICAgICAKLSAgICAgICBTTVVMQkIgICAgICAgICAgdGVtcFByZWQsdGVtcCxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3coQ29sKVswXSozMjc2Ny9kY1NjYWxlcgotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMyxkY1NjYWxlciwjMQotICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTUgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdL2RjU2NhbGVyICAgICAgICAgIAotICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wMyx0ZW1wMywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMz1yb3VuZChkY1NjYWxlci8yKQotICAgICAgIAotICAgICAgIE1MQSAgICAgICAgICAgICBSZW0sbmVnZGNTY2FsZXIsdGVtcFByZWQsYWJzQ29lZmZEQyAgICAgICAgICAgIDsvLyBSZW0gPSBwUHJlZEJ1ZlJvdyhDb2wpWzBdLXRlbXBQcmVkKmRjU2NhbGVyICAgICAgCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmQ29sXQotICAgICAgIENNUCAgICAgICAgICAgICBSZW0sdGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBSZW0+PXJvdW5kKGRjU2NhbGVyLzIpO3RlbXBQcmVkPXRlbXBQcmVkKzEKLSAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8gaWYgcFByZWRCdWZSb3coQ29sKVswXTwwOyB0ZW1wUHJlZD0tdGVtcFByZWQKLSAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFByZWRCdWZSb3csIy0xNl0gICAgICAKLQotICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0KLSAgICAgICBNX0xEUiAgICAgICAgICAgQUNQcmVkRmxhZyxBQ1ByZWRGbGFnb25TdGFjawotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0rdGVtcFByZWQKLSAgICAgICBTU0FUMTYgICAgICAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0ZW1wIHRvIFstMjA0OCwyMDQ3XQotICAgICAgIAotICAgICAgIFNNVUxCQiAgICAgICAgICB0ZW1wMSx0ZW1wLGRjU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1jbGlwcGVkKHBTcmNEc3RbMF0pKmRjU2NhbGVyICAgICAgICAgICAKLSAgICAgICBNX0xEUiAgICAgICAgICAgcHJlZFFQLHByZWRRUG9uU3RhY2sKLSAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgQUNQcmVkRmxhZywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIEFDIHByZWRpY3Rpb24gZmxhZyBpcyBzZXQgb3Igbm90Ci0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAxLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHRlbXAxIHRvIHBQcmVkQnVmQ29sCi0gCi0gICAgICAgOy8vIEFDIFByZWRpY3Rpb24KLQotICAgICAgICAgICAgICAKLSAgICAgICBCTkUgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgbm90IHNldCBFeGl0Ci0gICAgICAgCi0gICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAweDFmZmZmLygxIHRvIDYzKQotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSwjNAotICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wMSxjdXJRUCx0ZW1wMQotICAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24KLSAgICAgICBSU0IgICAgICAgICAgICAgbmVnQ3VyUVAsY3VyUVAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgTERSICAgICAgICAgICAgIENvZWZmVGFibGUsW3ByZWRDb2VmZlRhYmxlLHRlbXAxXSAgICAgICAgICAgICAgOy8vIENvZWZmVGFibGU9MHgxZmZmZi9jdXJRUAotICAgICAgIEFERCAgICAgICAgICAgICBjdXJRUCxjdXJRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD1jdXJRUCsxCi0gICAgICAgTFNSICAgICAgICAgICAgIGN1clFQLGN1clFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGN1clFQPXJvdW5kKGN1clFQLzIpICAgICAgICAgICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIExvb3AgQ291bnQKLSAgICAgICBCTkUgICAgICAgICAgICAgSG9yaXpvbnRhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIGhvcml6b250YWwgYnJhbmNoIHRvIEhvcml6b250YWwKLQotICAgICAgIAotCi1sb29wMSAgICAgICAKLSAgICAgICA7Ly8gQ2FsY3VsYXRlIHRlbXBQcmVkCi0gICAgICAgCi0gICAgICAgTERSU0ggICAgICAgICAgIGFic0NvZWZmQUMsW3BQcmVkQnVmUm93LENvdW50XSAgICAgICAgICAgICAgICAgOy8vIGFic0NvZWZmQUM9cFByZWRCdWZSb3dbaV0sIDE9PGk8PTcKLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZBQwotICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIHBQcmVkQnVmUm93W2ldIHdpdGggemVybywgMT08aTw9NwotICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkFDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPSBhYnMocFByZWRCdWZSb3dbaV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFNNVUxCQiAgICAgICAgICBhYnNDb2VmZkFDLGFic0NvZWZmQUMscHJlZFFQICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wUHJlZEJ1ZlJvd1tpXSpwcmVkUVAKLSAgICAgICBNVUwgICAgICAgICAgICAgdGVtcFByZWQsYWJzQ29lZmZBQyxDb2VmZlRhYmxlICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3dbaV0qcHJlZFFQKjB4MWZmZmYvY3VyUVAKLSAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE3ICAgICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgIE1MQSAgICAgICAgICAgICBSZW0sbmVnQ3VyUVAsdGVtcFByZWQsYWJzQ29lZmZBQyAgICAgICAgICAgICAgIDsvLyBSZW09YWJzKHBQcmVkQnVmUm93W2ldKS10ZW1wUHJlZCpjdXJRUAotICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbaV0sMTw9aTw4Ci0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIFJlbSxjdXJRUAotICAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBSZW0+PXJvdW5kKGN1clFQLzIpOyB0ZW1wUHJlZD10ZW1wUHJlZCsxCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHBQcmVkQnVmUm93W2ldPDAgOyB0ZW1wUHJlZD0tdGVtcFByZWQKLSAgICAgICAgICAgICAgCi0gICAgICAgOy8vIFVwZGF0ZSBzb3VyY2UgYW5kIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcnMKLSAgICAgICAKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD10ZW1wUHJlZCtwU3JjRHN0W2ldCi0gICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KLSAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0KLSAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFByZWRCdWZSb3csQ291bnRdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFByZWRCdWZSb3dbaV09dGVtcAotICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpPWkrMQotICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIGlmIGk9OAotICAgICAgIEJMVCAgICAgICAgICAgICBsb29wMQotICAgICAgIEIgICAgICAgICAgICAgICBFeGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdAotCi1Ib3Jpem9udGFsCi0KLSAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIGk9OAotCi1sb29wMiAgCi0gICAgIAotICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wMixDb3VudCwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMj1pPj4zCi0gICAgICAgCi0gICAgICAgOy8vIENhbGN1bGF0ZSB0ZW1wUHJlZAotICAgICAgIAotICAgICAgIExEUkggICAgICAgICAgICBhYnNDb2VmZkFDLFtwUHJlZEJ1ZkNvbCx0ZW1wMl0gICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmQUM9cFByZWRCdWZDb2xbaT4+M10gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkFDCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgcFByZWRCdWZSb3dbaV0gd2l0aCB6ZXJvLCAxPTxpPD03Ci0gICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmQUMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGFic0NvZWZmQUM9YWJzKHBQcmVkQnVmQ29sW2k+PjNdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBTTVVMQkIgICAgICAgICAgYWJzQ29lZmZBQyxhYnNDb2VmZkFDLHByZWRRUCAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cFByZWRCdWZDb2xbaT4+M10qcHJlZFFQCi0gICAgICAgTVVMICAgICAgICAgICAgIHRlbXBQcmVkLGFic0NvZWZmQUMsQ29lZmZUYWJsZSAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUCoweDFmZmZmL2N1clFQCi0gICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUC9jdXJRUAotICAgICAgIAotICAgICAgIE1MQSAgICAgICAgICAgICBSZW0sbmVnQ3VyUVAsdGVtcFByZWQsYWJzQ29lZmZBQwotICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbaV0KLSAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgUmVtLGN1clFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBSZW0gd2l0aCByb3VuZChjdXJRUC8yKQotICAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD10ZW1wUHJlZCsxIGlmIFJlbT49cm91bmQoY3VyUVAvMikKLSAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgcFByZWRCdWZDb2xbaT4+MyA8MCB0ZW1wUHJlZD0tdGVtcFByZWQKLSAgICAgICAKLSAgICAgICA7Ly8gVXBkYXRlIHNvdXJjZSBhbmQgUm93IFByZWRpY3Rpb24gYnVmZmVycwotICAgICAgIAotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbaV0rdGVtcFByZWQKLSAgICAgICBTU0FUMTYgICAgICAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2xpcCB0ZW1wIHRvIFstMjA0OCwyMDQ3XQotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdPSBjbGlwcGVkIHZhbHVlCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmQ29sLHRlbXAyXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBQcmVkQnVmQ29sW2k+PjNdPXRlbXAKLSAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaT1pKzgKLSAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBpIHdpdGggNjQKLSAgICAgICBCTFQgICAgICAgICAgICAgbG9vcDIKLQotICAgICAgICAgICAgIAotRXhpdAotICAKLSAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyIAotCi0gICAgICAgTV9FTkQKLSAgICAgICBFTkRJRgotICAgICAgIEVORAotCi0KLSAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTcxNjBmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLTsgKiAKLTsgKgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBpbnZlcnNlIHF1YW50aXphdGlvbiBvbiBpbnRyYS9pbnRlciBjb2RlZCBibG9jay4KLTsgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gTWlzbWF0Y2ggY29udHJvbAotOyAqIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IE1QRUctNCBtb2RlIGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2U6IFstMjA0OCwgMjA0N10uCi07ICogTWlzbWF0Y2ggY29udHJvbCBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dIHBTcmNEc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqIFtpbl0gUVAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKLTsgKiBbaW5dIHZpZGVvQ29tcCAgICAgIChJbnRyYSB2ZXJzaW9uIG9ubHkuKSBWaWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0FMUEhBLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKLTsgKiAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCi07ICogW291dF0gICAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiAgTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAgLSBJZiBwU3JjRHN0IGlzIE5VTEwgb3IgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiAgICAgIG9yCi07ICogICAgLSBJZiBRUCA8PSAwLgotOyAqICAgICAgb3IKLTsgKiAgICAtIHZpZGVvQ29tcCBpcyBub25lIG9mIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSBhbmQgT01YX1ZDX0FMUEhBLgotOyAqCi07ICovCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgIAotCi0gICAgIElGIEFSTTExMzZKUwotCi07Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmNEc3QgICAgICAgICAgICBSTiAwCi1RUCAgICAgICAgICAgICAgICAgUk4gMQotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLVJldHVybiAgICAgICAgICAgICBSTiAwCi1Db3VudCAgICAgICAgICAgICAgUk4gNCAgICAgIAotdGVtcFZhbDIxICAgICAgICAgIFJOIDIKLXRlbXBWYWw0MyAgICAgICAgICBSTiAzCi1RUDEgICAgICAgICAgICAgICAgUk4gNQotWDIgICAgICAgICAgICAgICAgIFJOIDYKLVgzICAgICAgICAgICAgICAgICBSTiAxNAotUmVzdWx0MSAgICAgICAgICAgIFJOIDgKLVJlc3VsdDIgICAgICAgICAgICBSTiA5Ci10d28gICAgICAgICAgICAgICAgUk4gNwotCi0gICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLHI5Ci0gICAgICAgCi0gICAgICAgIE1PViAgICAgIENvdW50LCM2NAotICAgICAgICBUU1QgICAgICBRUCwjMQotICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3RdICAgICAgOy8vIExvYWRzIGZpcnN0IHR3byB2YWx1ZXMgb2YgcFNyY0RzdCB0byB0ZW1wVmFsMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmV4dCB0d28gdmFsdWVzIHRvIHRlbXBWYWw0MwotICAgICAgICBTVUJFUSAgICBRUDEsUVAsIzEgICAgICAgICAgICAgICAgOy8vIFFQMT1RUCBpZiBRUCBpcyBvZGQgLCBRUDE9UVAtMSBpZiBRUCBpcyBldmVuCi0gICAgICAgIE1PVk5FICAgIFFQMSxRUAotICAgICAgICBNT1YgICAgICB0d28sIzIKLSAgICAgICAgCi0gICAgICAgIAotCi1Mb29wCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCi0gICAgICAgIENNUCAgICAgIFgyLCMwCi0gICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMixYMiwjMCAgICAgICAgICAgICAgICAgOy8vIFgyPWFic29sdXRldmFsKGZpcnN0IHZhbCkKLSAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQIGlmIFFQIGlzIG9kZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQLTEgaWYgUVAgaXMgZXZlbiAKLSAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMz0gc2Vjb25kIHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKLSAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgIFgzLCMwCi0gICAgICAgICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCi0gICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBQS0hCVCAgICBSZXN1bHQxLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDFbMC0xNV09WDJbMC0xNV0sUmVzdWx0MVsxNi0zMV09WDNbMTYtMzFdCi0gICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWw0MykqMgotICAgICAgICBTU0FUMTYgICBSZXN1bHQxLCMxMixSZXN1bHQxICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCi0gICAgICAgIENNUCAgICAgIFgyLCMwCi0gICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQkxFICAgIFgyLFgyLCMwCi0gICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMQotICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCi0gICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCi0gICAgICAgIENNUCAgICAgIFgzLCMwCi0gICAgICAgIAotICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3QsIzhdICAgOy8vIExvYWQgbmV4dCBmb3VyIFZhbHVlcyB0byB0ZW1wVmFsMjEsdGVtcFZhbDQzCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBQS0hCVCAgICBSZXN1bHQyLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDJbMC0xNV09WDJbMC0xNV0sUmVzdWx0MlsxNi0zMV09WDNbMC0xNV0KLSAgICAgICAgU1NBVDE2ICAgUmVzdWx0MiwjMTIsUmVzdWx0MiAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQotICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzQgICAgICAgICAgIDsvLyBEZWNyZW1lbnQgQ291bnQgYnkgNCBhbmQgY29udGludWUgaWYgaXQgaGFzIG5vdCByZWFjaGVkIDAgICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgUmVzdWx0MSxbcFNyY0RzdF0sIzggICAgIDsvLyBTdG9yZSBEb3VibGUgd29yZHMgYW5kIGluY3JlbWVudCB0aGUgcG9pbnRlciB0byBwb2ludCB0aGUgbmV4dCBzdG9yZSBhZGRyZXNzCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBCR1QgICAgICBMb29wCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4MmRhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi07ICogCi07ICoKLTsgKgotOyAqCi07ICoKLTsgKiAKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50cmFfSQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCi07ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKLTsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgotOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICogW2luXSAgICBRUCAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKLTsgKiBbaW5dICAgIHZpZGVvQ29tcCAgICAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCi07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KLTsgKiBbaW5dICAgIHNob3J0VmlkZW9IZWFkZXIgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKLTsgKiAgICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KLTsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgIC0gICAgSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCi07ICogICAgICBvcgotOyAqICAgIC0gSWYgUVAgPD0gMC4KLTsgKiAgICAgIG9yCi07ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KLTsgKgotIAotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgCi0gICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgCi0gICAKLSAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCi0gCi0gICAgICAgICAKLQotICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjRHN0ICAgICAgICAgICAgUk4gMAotUVAgICAgICAgICAgICAgICAgIFJOIDEKLXZpZGVvQ29tcCAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgUk4gMwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLVJldHVybiAgICAgICAgICAgICBSTiAwCi1kY1NjYWxlciAgICAgICAgICAgUk4gNAotdGVtcCAgICAgICAgICAgICAgIFJOIDEyCi1pbmRleCAgICAgICAgICAgICAgUk4gNgotICAgICAgCi10ZW1wVmFsMjEgICAgICAgICAgUk4gNAotdGVtcFZhbDQzICAgICAgICAgIFJOIDUKLVFQMSAgICAgICAgICAgICAgICBSTiA2Ci1YMiAgICAgICAgICAgICAgICAgUk4gNwotWDMgICAgICAgICAgICAgICAgIFJOIDE0Ci1SZXN1bHQxICAgICAgICAgICAgUk4gOAotUmVzdWx0MiAgICAgICAgICAgIFJOIDkKLXR3byAgICAgICAgICAgICAgICBSTiAxMAotQ291bnQgICAgICAgICAgICAgIFJOIDExCi0KLQotCi0gICAKLSAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludHJhX0kscjExCi0KLQotICAgICAgICAKLSAgICAgICAgOy8vIFBlcmZvcm0gSW52ZXJzZSBRdWFudGl6YXRpb24gZm9yIERDIGNvZWZmaWNpZW50Ci0KLSAgICAgICAgVEVRICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICA7Ly8gVGVzdCBpZiBzaG9ydCBWaWRlbyBIZWFkZXIgZmxhZyA9MCAgICAgICAgICAgICAKLSAgICAgICAgTU9WTkUgICAgIGRjU2NhbGVyLCM4ICAgICAgICAgICAgICA7Ly8gaWYgc2hvcnRWaWRlb0hlYWRlciBpcyBub24gemVybyBkY1NjYWxlcj04Ci0gICAgICAgIEJORSAgICAgICBjYWxEQ1ZhbAotICAgICAgICBMRFIgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKLSAgICAgIEFERCAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1Ci0gICAgICBMRFJCICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQotCi0KLSAgICAgICAgOy8vTV9DYWxEQ1NjYWxhciAgc2hvcnRWaWRlb0hlYWRlcix2aWRlb0NvbXAsIFFQCi0KLWNhbERDVmFsCi0KLSAgICAgICAgTERSSCAgICAgdGVtcCxbcFNyY0RzdF0KLSAgICAgICAgU01VTEJCICAgdGVtcCx0ZW1wLGRjU2NhbGVyICAgICAgIDsvLyBkY0NvZWZmID0gZGNTY2FsZXIgKiBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQoZnJvbSBtZW1vcnkpCi0gICAgICAgIFNTQVQgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICA7Ly8gU2F0dXJhdGluZyB0byAxMiBiaXRzCi0gICAgICAgIAotCi0gICAgICAgIE1PViAgICAgIENvdW50LCM2NAotICAgICAgICBUU1QgICAgICBRUCwjMQotICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3RdICAgICAgOy8vIExvYWRzIGZpcnN0IHR3byB2YWx1ZXMgb2YgcFNyY0RzdCB0byB0ZW1wVmFsMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmV4dCB0d28gdmFsdWVzIHRvIHRlbXBWYWw0MwotICAgICAgICBTVUJFUSAgICBRUDEsUVAsIzEgICAgICAgICAgICAgICAgOy8vIFFQMT1RUCBpZiBRUCBpcyBvZGQgLCBRUDE9UVAtMSBpZiBRUCBpcyBldmVuCi0gICAgICAgIE1PVk5FICAgIFFQMSxRUAotICAgICAgICBNT1YgICAgICB0d28sIzIKLQotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIAotCi1Mb29wCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCi0gICAgICAgIENNUCAgICAgIFgyLCMwCi0gICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMixYMiwjMCAgICAgICAgICAgICAgICAgOy8vIFgyPWFic29sdXRldmFsKGZpcnN0IHZhbCkKLSAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQIGlmIFFQIGlzIG9kZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQLTEgaWYgUVAgaXMgZXZlbiAKLSAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMz0gc2Vjb25kIHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKLSAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgIFgzLCMwCi0gICAgICAgICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCi0gICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBQS0hCVCAgICBSZXN1bHQxLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDFbMC0xNV09WDJbMC0xNV0sUmVzdWx0MVsxNi0zMV09WDNbMTYtMzFdCi0gICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWw0MykqMgotICAgICAgICBTU0FUMTYgICBSZXN1bHQxLCMxMixSZXN1bHQxICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCi0gICAgICAgIENNUCAgICAgIFgyLCMwCi0gICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQkxFICAgIFgyLFgyLCMwCi0gICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMQotICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCi0gICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCi0gICAgICAgIENNUCAgICAgIFgzLCMwCi0gICAgICAgIAotICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3QsIzhdICAgOy8vIExvYWQgbmV4dCBmb3VyIFZhbHVlcyB0byB0ZW1wVmFsMjEsdGVtcFZhbDQzCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBQS0hCVCAgICBSZXN1bHQyLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDJbMC0xNV09WDJbMC0xNV0sUmVzdWx0MlsxNi0zMV09WDNbMTYtMzFdCi0gICAgICAgIFNTQVQxNiAgIFJlc3VsdDIsIzEyLFJlc3VsdDIgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM0ICAgICAgICAgICA7Ly8gRGVjcmVtZW50IENvdW50IGJ5IDQgYW5kIGNvbnRpbnVlIGlmIGl0IGhhcyBub3QgcmVhY2hlZCAwICAgICAgICAgCi0gICAgICAgIFNUUkQgICAgIFJlc3VsdDEsW3BTcmNEc3RdLCM4ICAgICA7Ly8gU3RvcmUgRG91YmxlIHdvcmRzIGFuZCBpbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdGhlIG5leHQgc3RvcmUgYWRkcmVzcwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgQkdUICAgICAgTG9vcAotCi0gICAgICAgIFNVQiAgICAgIHBTcmNEc3QscFNyY0RzdCwjMTI4Ci0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmluZyB0aGUgSW52ZXJzZSBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQKLQotICAgICAgICBTVFJIICAgICB0ZW1wLFtwU3JjRHN0XSwjMgotICAgICAgICAKLSAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MzY4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9WZXJzaW9uLmgiCi0KLSNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbiA9ICJBUk0gT3Blbk1BWCBETCB2IiBBUk1fVkVSU0lPTl9TVFJJTkcgIiAgIFJlbD0iIE9NWF9BUk1fUkVMRUFTRV9UQUcgIiAgIEFyY2g9IiBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiICAgVG9vbHM9IiAgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX0RFTElWRVJZLlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzJkNzBhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgYnkgSGVkbGV5IEZyYW5jaXMKLW9mIEFSTSBvbiAxOS1GZWItMjAwOC4KLQotSXQgY29udGFpbnMgdGhlIEFSTSBkYXRhIHZlcnNpb25zIGxpc3RlZCBiZWxvdy4KLQotVGhpcyBkYXRhLCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgaXMgQVJNIFByb3ByaWV0YXJ5IGFuZCBhY2Nlc3MgdG8gaXQKLWlzIHN1YmplY3QgdG8gdGhlIGFncmVlbWVudHMgaW5kaWNhdGVkIGJlbG93LgotCi1JZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoaXMgZGF0YSwgcGxlYXNlIGNvbnRhY3QgQVJNIHN1cHBvcnQKLXF1b3RpbmcgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIDw5NzQxND4uCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotLSBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MQotICBWaWRlbyBjb2RlY3MgLSBvcHRpbWlzZWQgY29kZQotICBWNyBjb2RlIHJlbGVhc2UgZm9yIEhhbnRybyAoVmVyIDEuMC4yKQotICBpbnRlcm5hbCBhY2Nlc3MKLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi1UaGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zIGRlbGl2ZXJhYmxlcyB3aGljaCBhcmUgZGVzaWduYXRlZCBhcyBiZWluZyBvZgotYmV0YSByZWxlYXNlIHN0YXR1cyAoQkVUKS4KLQotQmV0YSByZWxlYXNlIHN0YXR1cyBoYXMgYSBwYXJ0aWN1bGFyIG1lYW5pbmcgdG8gQVJNIG9mIHdoaWNoIHRoZSByZWNpcGllbnQKLW11c3QgYmUgYXdhcmUuIEJldGEgaXMgYSBwcmUtcmVsZWFzZSBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWxpdmVyYWJsZQotc28gZGVzY3JpYmVkIGlzIGJlbGlldmVkIHRvIHJvYnVzdGx5IGRlbW9uc3RyYXRlIHNwZWNpZmllZCBiZWhhdmlvdXIsIHRvIGJlCi1jb25zaXN0ZW50IGFjcm9zcyBpdHMgaW5jbHVkZWQgYXNwZWN0cyBhbmQgYmUgcmVhZHkgZm9yIGdlbmVyYWwgZGVwbG95bWVudC4KLUJ1dCBCZXRhIGFsc28gaW5kaWNhdGVzIHRoYXQgcHJlLXJlbGVhc2UgcmVsaWFiaWxpdHkgdHJpYWxzIGFyZSBvbmdvaW5nIGFuZAotdGhhdCBpdCBpcyBwb3NzaWJsZSByZXNpZHVhbCBkZWZlY3RzIG9yIGVycm9ycyBpbiBvcGVyYXRpb24sIGNvbnNpc3RlbmN5Ci1hbmQgZG9jdW1lbnRhdGlvbiBtYXkgc3RpbGwgYmUgZW5jb3VudGVyZWQuIFRoZSByZWNpcGllbnQgc2hvdWxkIGNvbnNpZGVyCi10aGlzIHBvc2l0aW9uIHdoZW4gdXNpbmcgdGhpcyBCZXRhIG1hdGVyaWFsIHN1cHBsaWVkLiBBUk0gd2lsbCBub3JtYWxseQotYXR0ZW1wdCB0byBwcm92aWRlIGZpeGVzIG9yIGEgd29yay1hcm91bmQgZm9yIGRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUKLXJlY2lwaWVudCwgYnV0IHRoZSBwcm92aXNpb24gb3IgdGltZWxpbmVzcyBvZiB0aGlzIHN1cHBvcnQgY2Fubm90IGJlCi1ndWFyYW50ZWVkLiBBUk0gc2hhbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvciBkaXJlY3Qgb3IgY29uc2VxdWVudGlhbAotZGFtYWdlcyBhcyBhIHJlc3VsdCBvZiBlbmNvdW50ZXJpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVzaWR1YWwgZGVmZWN0cy4KLUJ5IGFjY2VwdGluZyBhIEJldGEgcmVsZWFzZSwgdGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gdGhlc2UgY29uc3RyYWludHMgYW5kCi10byBwcm92aWRpbmcgcmVhc29uYWJsZSBpbmZvcm1hdGlvbiB0byBBUk0gdG8gZW5hYmxlIHRoZSByZXBsaWNhdGlvbiBvZiB0aGUKLWRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUgcmVjaXBpZW50LiBUaGUgc3BlY2lmaWMgQmV0YSB2ZXJzaW9uIHN1cHBsaWVkCi13aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYWZ0ZXIgcmVsZWFzZSBvZiBhIGxhdGVyIG9yIGhpZ2hlciBzdGF0dXMgdmVyc2lvbi4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IFN1cHBvcnQgZm9yIHRoZSBCZXRhIHJlbGVhc2Ugb2YgdGhlIGRlbGl2ZXJhYmxlCi13aWxsIG9ubHkgYmUgcHJvdmlkZWQgYnkgQVJNIHRvIGEgcmVjaXBpZW50IHdobyBoYXMgYSBjdXJyZW50IHN1cHBvcnQgYW5kCi1tYWludGVuYW5jZSBjb250cmFjdCBmb3IgdGhlIGRlbGl2ZXJhYmxlLgotCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotSW4gYWRkaXRpb24gdG8gdGhlIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGFib3ZlLCB0aGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zCi10d28gYWRkaXRpb25hbCBmaWxlcyBhdCB0aGUgdG9wIGxldmVsLgotCi1UaGUgZmlyc3QgaXMgdGhpcyBmaWxlLCBBUk1fREVMSVZFUllfOTc0MTQuVFhULCB3aGljaCBpcyB0aGUgZGVsaXZlcnkKLW5vdGUuCi0KLVRoZSBzZWNvbmQgaXMgQVJNX01BTklGRVNUXzk3NDE0LlRYVCB3aGljaCBjb250YWlucyBhIG1hbmlmZXN0IG9mIGFsbCB0aGUKLWZpbGVzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIHRvZ2V0aGVyIHdpdGggdGhlaXIgY2hlY2tzdW1zLgotCi1UaGUgY2hlY2tzdW1zIHByb3ZpZGVkIGFyZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgotTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobS4KLQotVGhlIGNoZWNrc3VtcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGlzIGRhdGEgdXNpbmcgdGhlCi0ibWQ1c3VtIiB0b29sICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBHTlUgInRleHR1dGlscyIgcGFja2FnZSkgYnkgcnVubmluZzoKLQotICAlIG1kNXN1bSAtLWNoZWNrIEFSTV9NQU5JRkVTVF85NzQxNC5UWFQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX01BTklGRVNULlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxMGY2Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX01BTklGRVNULlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxLwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLwotZTA0OTc5MWNmYWI2MDYwYTA4Y2JhYzdiM2FkNzY3ZDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX3MuaAotZWQ3OThmYWNlMjU0OTdiMjcwM2VkZTczNmQ2ZDUyYjYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlc19zLmgKLTRlZWJkNjNhZjA4NzM3NjgxMWQ2NzQ5ZjA2NDZiODY0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCi00M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAotOGYyNDhjZWFhYzhmNjAyZTI3N2E1MjFiNjc5ZGNiYmUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCi04YWM1ZmE4MGVhOThlMzkxZjU3MzBhMzc1MjgwYjViZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCi0zYTJmNDIwZGRmNmExYjk1MDQ3MGJkMGY1ZWJkNWM2MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVF9zLmgKLTUxMWMwYmI1MzRmZTIyMzU5OWUyYzg0ZWZmMjRjOWVkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAotODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCi1mODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCi04ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKLTMyMzAwOGI3MmU5ZjA0MDk5YThjYjQyZTk5YTFmYWNlICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAotZTcyZDk2YzBhNDE1NDU5NzQ4ZGY5ODA3ZjNkYWU3MmYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLwotNWVlYWU2NTlhMjk0NzdmNWM1MjI5NmQyNGFmZmZkM2MgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCi1kNjRjZGNmMzhmNzc0OWRjN2Y3NzQ2NWU1YjdkMzU2ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCi1lN2UwYzMyMDk3ODU2NGE3YzliMmM3MjM3NDlhOThkNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotNGFkY2QwZGYwODE5OTBiZGZjNDcyOTA0MWEyYTkxNTIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLTg1MmUwNDA0MTQyOTY1ZGMxZjNhYTdmMDBlZTUxMjdiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKLTcwNTQxNTFjNWJmZWE2YjVlNzRmZWVlODZiMmQ3YjAxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi01ZjcyMTNhNGYzNzYyN2IzYzU4ZjYyOTRiYTQ3N2UzMCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKLTMyZmY0YjhiZTYyZTJmMGYzZTc2NGI4M2MxZTVlMmZkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotZDA2NmUzYzgxZDgyNjE2ZjM3ZWMxODEwZWE0OWU3YjcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKLWZlNjI5YTNlOWQ1NTM5NWE2MDk4YmRmMjQzMWI1ZjAyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKLTViMTNmYjk1NGI3Njc5ZGUyMDA3NmJiNmE3ZjRlZTFkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCi0wMWJhNjBlZmY2NmVhNDlhNGY4MzNjZTYyNzlmOGUyZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi1mYTEwNzJjZjFkMTdlOTY2NmM5ZjFlMjE1ZmEzMDJiMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwotZGIzODdiOWU2NmQzMjc4N2Y0N2VmOWNmMDM0N2RhMmEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCi1lYTUzN2U0ZTJhZDAzYTE5NDA5ODEwNTVmYTNhY2UwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwotMjlhNDI4Mzg4NWI5NDczYTM1NTBhODFlZmYyNTU5ZDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotMmRkY2FmNjBhOGVhMWU2ZTZiNzc3MzdmNzY4YmZiOWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwotYzMwMDJhYWQ1NjAwZjg3MmI3MGE1ZDdmZTM5MTU4NDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCi1hMjkwMGYyYzQ3ZjFjNjFkMjBiZDZjMWVkYTMzZDZkNCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwotYzkyMWRmNzMzOTdhMzJjOTQ3ZGM5OTZiYTY4NTg1NTMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCi0zNzY5ZTE0ZjJmYzNmNTE0ZDAyNWZlNmFiNzNmZjY3YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwotYzAyOWQxY2ViZWEwYTA5ZTFkMjM1YTM3ZTIxNTUwMDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwotMDc2YTAzM2Y4MTYxNzUwYTY4NTc1NmY5ZjUxZjA0YzkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCi1jNWI1ZDIyODQyODIyZTZlNWUzMTA5NDg4MmNiZWI0NiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwotZjZiZGY2ZDkxNGE0YTE0NzlmNTI0OTUxYTM0MDk4NDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwotZWJlYjA3MTNhOWIyZWEyNTk4NjM2MGVmMjYyMTM4YzQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLTc4ZWQ5ZWEyMDBmYWE3YmU2NjU0NDVhNzEzODU5YWYxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCi1jMmQ5OTVmNzg3YjZmNDRlZjEwYzc1MWMxMmQxOTM1ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKLTQwYmVkNjc5YTlmNmUwZDNlZmUyMTZiN2Q0YTljZjQ1ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwotNGE1MmIzZTllMjY4YjhhOGYwNzgyOWJmNTAwZDAzYWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKLTExMjQ5ZjhhOThjNWQ0Yjg0Y2I1NTc1YjBlMzdjYTljICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKLTI1MTNiNjA1NTliYTcxYWU0OTVjNjA1M2ZiNzc5ZmE5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCi0yZmIxZWUxN2MzNmUzYzE0NjljMTcwZjZkYWMxMWJmMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCi1jYzRhNmYzMmRiMGI3MmE5MWQzZjI3OGY2ODU1ZGY2OSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCi02ZTUzMGRkYWE3YzJiNTdmZmU4ODE2MmMwMjBjYjY2MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLwotYmVjNmRlMzQ4YjExMzQzODQ5ODg2N2I4NjkwMDE2MjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKLWRiYTk4MjRlOTU5YjIxZDQwMWNhYzkyNWU2OGExMWE2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotZGZhN2U1YjU4MDI3YmUzNTQyZGRhMDU5M2I3N2IyZDMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCi00ZmJhNGM0MzFhNzgzYTc4YTJlYjY0OTdhOTRhYzk2NyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotMzk5OTE5NjExNzljYTAzYjYzODFiNmU2NTNiMWYxNGIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCi0xYjBiMjk5MGMyNjY5ZGZiODdjZjZiODEwNjExYzAxYiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0xYzliODdhYmYzMjgzZTk1NzgxNmIzOTM3YzY4MDcwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCi00ZmUxYWZjYTY1OWE5MDU1ZmMxMTcyZTU4Zjc4YTUwNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0yZWEwNjdmMDQzNmY5MWJhMTM1MWVkYWY0MTFjYjRlYSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotNmNlMzYzYWFkYzlkNjVjMzA4YjQwY2NhODkwMmU0ZjYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwotYmYyMTJmNzg2NzcyYWVkMmJjNzA1ZDIyZmY0ZTc0ZjUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucwotMjkzYTQ4YTY0OGEzMDg1NDU2ZTY2NjViYjczNjZmYWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwotMmJiNDdlZDljOWUyNWM1NzA5YzZkOWI0YWQzOWEzOGEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCi00MzdkZmEyMDQ1MDg4NTBkNjFkNGI4NzA5MTQ0NmU5ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwotYmM5Nzc4ODk4ZGQ0MTEwMWRjMGZiMDEzOWVhZjgzY2MgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKLWZjMTkxZWVhZTQzZjhjZTczNWRiZDMxMWNjN2JjYjhkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwotYTBkODVmNGY1MTdjOTQ1YTRjOTMxN2FjMDIxZjJkMDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwotMzg2MDIwZGVlOGI3MjVjN2ZlMjUyNmYxZmMyMTFkN2QgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCi00NjI0ZTdjODM4ZTEwYTI0OWFiY2MzZDNmNGY0MDc0OCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi02NWUxMDU3ZDA0ZTJjYjg0NDU1OWRjOWY2ZTA5Nzk1YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLwotZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KLTdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAotMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCi0xMTcyNmUyODZhODEyNTdjYjQ1ZjU1NDdmYjRkMzc0YyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDX3MuaAotYTViMmFmNjA1YzMxOWNkMjQ5MTMxOWU0MzA3NDEzNzcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCi0xZjgxMTg3YjQ4NDg3YThlYTZkYmMzMjc2NDhlM2U0ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKLTkzNmQzZjIwMzhhNmY4NjEzZWMyNWU1MGNjNjAxZmU4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKLThmNjcwOGEyNDkxMzA5NjJlMGJjNWMwNDRhYzZkZDkzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKLWFhYjc3MTM0MTQ0MjhlOTVkZTBiYTc5OWEyNjc5YjM2ICBBUk1fREVMSVZFUllfOTc0MTQuVFhUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTkyODg1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogICAKLSAqIEZpbGU6IGFybUNPTU0uaAotICogQnJpZWY6IERlY2xhcmVzIENvbW1vbiBBUElzL0RhdGEgVHlwZXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncwotICoKLSAqLwotIAotICAKLSNpZm5kZWYgX2FybUNvbW1vbl9IXwotI2RlZmluZSBfYXJtQ29tbW9uX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfRjMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9GMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLSAgICAgICAgCi19IE9NWF9GQzMyOyAvKiogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfRjY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9GNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLSAgICAgICAgCi19IE9NWF9GQzY0OyAvKiogZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIFVzZWQgYnkgYm90aCBJUCBhbmQgSUMgZG9tYWlucyBmb3IgOHg4IEpQRUcgYmxvY2tzLiAqLwotdHlwZWRlZiBPTVhfUzE2IEFSTV9CTE9DSzh4OFs2NF07Ci0KLQotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jZGVmaW5lICBhcm1QSSAoT01YX0Y2NCkoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENvbXBpbGVyIGV4dGVuc2lvbnMgKi8KLSNpZmRlZiBBUk1fREVCVUcKLS8qIGRlYnVnIHZlcnNpb24gKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBhcm1FcnJvcihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7IGV4aXQoLTEpO30KLSNkZWZpbmUgYXJtV2FybihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7fQotI2RlZmluZSBhcm1JZ25vcmUoYSkgKCh2b2lkKWEpCi0jZGVmaW5lIGFybUFzc2VydChhKSBhc3NlcnQoYSkKLSNlbHNlIAotLyogcmVsZWFzZSB2ZXJzaW9uICovCi0jZGVmaW5lIGFybUVycm9yKHN0cikgKCh2b2lkKSAoc3RyKSkKLSNkZWZpbmUgYXJtV2FybihzdHIpICAoKHZvaWQpIChzdHIpKQotI2RlZmluZSBhcm1JZ25vcmUoYSkgICgodm9pZCkgKGEpKQotI2RlZmluZSBhcm1Bc3NlcnQoYSkgICgodm9pZCkgKGEpKQotI2VuZGlmIC8qIEFSTV9ERUJVRyAqLwotCi0vKiBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotI2RlZmluZSBhcm1NaW4oYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYik6KGEpICkKLSNkZWZpbmUgYXJtTWF4KGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGEpOihiKSApCi0jZGVmaW5lIGFybUFicyhhKSAgICAgICAgICAgICAgICggKGEpIDwgIDAgID8gLShhKTooYSkgKQotCi0vKiBBbGlnbm1lbnQgb3BlcmF0aW9uICovCi0KLSNkZWZpbmUgYXJtQWxpZ25Ub0J5dGVzKFB0cixOKSAgICAgIChQdHIgKyAoICgoTi0oaW50cHRyX3QpUHRyKSYoTi0xKSkgLyBzaXplb2YoKlB0cikgKSkKLSNkZWZpbmUgYXJtQWxpZ25UbzJCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMikKLSNkZWZpbmUgYXJtQWxpZ25UbzRCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsNCkKLSNkZWZpbmUgYXJtQWxpZ25UbzhCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsOCkKLSNkZWZpbmUgYXJtQWxpZ25UbzE2Qnl0ZXMoUHRyKSAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMTYpCi0KLS8qIEVycm9yIGFuZCBBbGlnbm1lbnQgY2hlY2sgKi8KLQotI2RlZmluZSBhcm1SZXRBcmdFcnJJZihjb25kaXRpb24sIGNvZGUpICBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQotI2RlZmluZSBhcm1SZXREYXRhRXJySWYoY29uZGl0aW9uLCBjb2RlKSBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQotCi0jaWZuZGVmIEFMSUdOTUVOVF9ET0VTTlRfTUFUVEVSCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoKCgoaW50cHRyX3QpKFB0cikpICUgTik9PTApCi0jZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50cHRyX3QpKFB0cikpICUgTikhPTApCi0jZWxzZQotI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKDEpCi0jZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIGFybUlzMkJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwyKQotI2RlZmluZSBhcm1JczRCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsNCkKLSNkZWZpbmUgYXJtSXM4Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDgpCi0jZGVmaW5lIGFybUlzMTZCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwxNikKLQotI2RlZmluZSBhcm1Ob3QyQnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDIpCi0jZGVmaW5lIGFybU5vdDRCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsNCkKLSNkZWZpbmUgYXJtTm90OEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw4KQotI2RlZmluZSBhcm1Ob3QxNkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDE2KQotI2RlZmluZSBhcm1Ob3QzMkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDMyKQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTZfcmVmL2FybVJvdW5kRmxvYXRUb1MzMl9yZWYvYXJtUm91bmRGbG9hdFRvUzY0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1UzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNi9PTVhfVTMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNpZ25DaGVjawotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6Ci0gKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKi8gCi0gCi1PTVhfSU5UIGFybVNpZ25DaGVjayAoT01YX1MxNiB2YXIpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1DbGlwICgKLSAgICAgICAgT01YX0lOVCBtaW4sCi0gICAgICAgIE9NWF9JTlQgbWF4LCAKLSAgICAgICAgT01YX1MzMiBzcmMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfRjMyIGFybUNsaXBfRjMyICgKLSAgICAgICAgT01YX0YzMiBtaW4sCi0gICAgICAgIE9NWF9GMzIgbWF4LCAKLSAgICAgICAgT01YX0YzMiBzcmMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCi0gKgotICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKLSAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCi0gKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKLSAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAotICogdmFsdWUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgotICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKLSAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKAotICAgICAgICBPTVhfRjMyIHYsIAotICAgICAgICBPTVhfSU5UIHNoaWZ0LCAKLSAgICAgICAgT01YX0lOVCBzYXRCaXRzCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KLSAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KLSAqLwotT01YUmVzdWx0IGFybVN3YXBFbGVtKE9NWF9VOCAqcEJ1ZjEsIE9NWF9VOCAqcEJ1ZjIsIE9NWF9JTlQgZWxlbVNpemUpOwotCi0KLS8qKgotICogRnVuY3Rpb246IGFybU1lZGlhbk9mMwotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5Ci0gKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5Ci0gKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybU1lZGlhbk9mMyAoCi0gICAgT01YX1MzMiBmRW50cnksCi0gICAgT01YX1MzMiBzRW50cnksIAotICAgIE9NWF9TMzIgdEVudHJ5IAotICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUxvZ1NpemUKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1U4IC0tICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcG9zaXRpdmUgdmFsdWUKLSAqLyAKLSAKLU9NWF9VOCBhcm1Mb2dTaXplICgKLSAgICBPTVhfVTE2IHZhbHVlIAotICAgICk7ICAgIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdEFkZF9TMzIoCi0gICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKLSAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0KLU9NWF9TNjQgYXJtU2F0QWRkX1M2NCgKLSAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMSwKLSAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMgotICAgICAgICAgICAgICAgICk7Ci0KLS8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCi0gKiAKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0U3ViX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCi0gKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICoqLwotCi1PTVhfUzMyIGFybVNhdE1hY19TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgTWFjLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTIKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCi0gKgotICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCi0gKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKLSAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBtYWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBkZWxheUVsZW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBmaWxUYXAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKLSAqCi0gKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2NhbGVGYWN0b3IgKSApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KLSAqIFtpbl0gc2NhbGVGYWN0b3IgVGhlIHNoaWZ0IG51bWJlcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzY2FsZUZhY3Rvcik7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBpbnB1dDEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKLSAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybwotICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAotICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogRGVidWdnaW5nIG1hY3JvcwotICoKLSAqLwotCi0KLS8qCi0gKiBEZWZpbml0aW9uIG9mIG91dHB1dCBzdHJlYW0gLSBjaGFuZ2UgdG8gc3RkZXJyIGlmIG5lY2Vzc2FyeQotICovCi0jZGVmaW5lIERFQlVHX1NUUkVBTSBzdGRvdXQKLQotLyoKLSAqIERlYnVnIHByaW50ZiBtYWNyb3MsIG9uZSBmb3IgZWFjaCBhcmd1bWVudCBjb3VudC4KLSAqIEFkZCBtb3JlIGlmIG5lZWRlZC4KLSAqLwotI2lmZGVmIERFQlVHX09OCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjKQotI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQpCi0jZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmKQotI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcpCi0jZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKQotI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKQotI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKQotI2Vsc2UgLyogREVCVUdfT04gKi8KLSNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAKLSNlbmRpZiAvKiBERUJVR19PTiAqLwotCi0KLS8qCi0gKiBEb21haW4gYW5kIHN1YiBkb21haW4gZGVmaW5pdGlvbnMKLSAqCi0gKiBJbiBvcmRlciB0byB0dXJuIG9uIGRlYnVnIGZvciBhbiBlbnRpcmUgZG9tYWluIG9yIHN1Yi1kb21haW4KLSAqIGF0IGNvbXBpbGUgdGltZSwgb25lIG9mIHRoZSBERUJVR19ET01BSU5fKiBiZWxvdyBtYXkgYmUgZGVmaW5lZCwKLSAqIHdoaWNoIHdpbGwgYWN0aXZhdGUgZGVidWcgaW4gYWxsIG9mIHRoZSBkZWZpbmVzIGl0IGNvbnRhaW5zLgotICovCi0KLSNpZmRlZiBERUJVR19ET01BSU5fQUMKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFRfTVBFRzQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFREFUU1RSRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUZJTExFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFSVNTVEVSRU9fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TUE5TX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1NURVJFT19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVQUkdDRkdFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFVE5TX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFSU5URVJMRUFWRVNQRUNUUlVNX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19FTkNPREVUTlNfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1QUkVESUNUX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVJFQ09OU1RSVUNUX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENURldEX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENUSU5WX1MzMl9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTk9JU0VMRVNTREVDT0RFCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1FVQU5USU5WX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FESUZIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURUU0ZSQU1FSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJNQlBfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX01EQ1RJTlZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVTRkJfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRV9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ01QM19TWU5USFBRTUZfUzMyX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tGUkFNRUhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTQ0FMRUZBQ1RPUlNfUzgKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0lERUlORk8KLSNlbmRpZiAvKiBERUJVR19ET01BSU5fQUMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX1ZDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tDSFJPTUFfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tMVU1BX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDSFJPTUFEQ0NPRUZGU1RPUEFJUkNBVkxDX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSQ0FWTENfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERVFVQU5UVFJBTlNGT1JNQUNGUk9NUEFJUl9VOF9TMTZfQzFfRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRVhQQU5ERlJBTUUKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX0hPUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfVkVSRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfSE9SRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfVkVSRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBQ0hST01BOFg4X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV8xNlgxNl9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfNFg0X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FURF80WDQKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UQ0hST01BRENGUk9NUEFJUl9VOF9TMTZfQzEKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UTFVNQURDRlJPTVBBSVJfVThfUzE2X0MxCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfQ0hST01BREMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9MVU1BREMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl8xNlgxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzhYOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzE2WDE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfOFg4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfU0FEX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRENUOFg4QkxLRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVCTE9DS0NPRUZfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVQQURNVl9QVk9QCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFTVZfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRklORE1WUFJFRAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfSURDVDhYOEJMS0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfTElNSVRNVlRPUkVDVAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfTU9USU9ORVNUSU1BVElPTk1CCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkdSQVlfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CSE9SSVpPTlRBTF9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJWRVJUSUNBTF9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETVYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5URVJfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5UUkFfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5URVJfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5UUkFfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVEVSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRSQQotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9WQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fSUMKLS8qIFRvIGJlIGZpbGxlZCBpbiAqLwotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fU1AKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0NPUFlfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMTZTMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMTZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzE2X1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMlMxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0lTRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2Ci0jZW5kaWYgLyogREVCVUdfRE9NQUlOX1NQICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9JUAotI2RlZmluZSBERUJVR19PTVhJUEJNX0FERENfVThfQzFSX1NGUwotI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9NSVJST1JfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fTVVMQ19VOF9DMVJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfQ09MT1JUV0lTVFExNF9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIwTFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjJMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQ0NExTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFJTWlJPVF9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1X1U4X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pDU0NST1RSR0JfVThfQzJSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pST1RfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NV9VOF9VMTZfQzJDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JfVThfQzJDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfQzJQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0JfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQUFBfR0VUQ0VOVFJBTE1PTUVOVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRTUEFUSUFMTU9NRU5UX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVEdFVFNUQVRFU0laRV9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRJTklUX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DM1IKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fSVAgKi8KLQotCi0jZW5kaWYgLyogX2FybUNvbW1vbl9IXyAqLwotCi0vKkVuZCBvZiBGaWxlKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0RGVjX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzNDRlMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0RGVjX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4NCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXREZWNfcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLyBPcGVuTUFYIG9wdGltaXplZCBiaXRzdHJlYW0gZGVjb2RlIG1vZHVsZQotOy8vCi07Ly8gWW91IG11c3QgaW5jbHVkZSBhcm1DT01NX3MuaCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZQotOy8vCi07Ly8gVGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFjcm9zIHRvIHBlcmZvcm0gYXNzZW1ibHkgb3B0aW1pemVkIGZpeGVkIGFuZAotOy8vIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGluZyBmcm9tIGEgcmVhZC1vbmx5IGJpdHN0cmVhbS4gVGhlIHZhcmlhYmxlCi07Ly8gbGVuZ3RoIGRlY29kZSBtb2R1bGVzIHRha2UgYXMgaW5wdXQgYSBwb2ludGVyIHRvIGEgdGFibGUgb2YgMTYtYml0Ci07Ly8gZW50cmllcyBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdC4KLTsvLwotOy8vIFZMRCBUYWJsZSBFbnRyeSBmb3JtYXQKLTsvLwotOy8vICAgICAgICAxNSAxNCAxMyAxMiAxMSAxMCAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi07Ly8gICAgICAgfCAgTGVuICAgfCAgICAgICAgICAgICAgIFN5bWJvbCAgICAgICAgICAgICAgfCAxIHwKLTsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotOy8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8Ci07Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLTsvLwotOy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6Ci07Ly8gICAgTGVuICAgID0gTnVtYmVyIG9mIGJpdHMgb3ZlcnJlYWQgKDAgdG8gNykKLTsvLyAgICBTeW1ib2wgPSBTeW1ib2wgcGF5bG9hZCAodW5zaWduZWQgMTIgYml0cykKLTsvLwotOy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhbiBpbnRlcm5hbCBub2RlIHRoZW4gYml0IDAgaXMgY2xlYXI6Ci07Ly8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKLTsvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCi07Ly8KLTsvLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCi07Ly8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQotOy8vIGlzIG9idGFpbmVkLiBUaGUgU3RlcCBzaXplcyBhcmUgc3VwcGxpZWQgdG8gdGhlIFZMRCBtYWNyby4KLTsvLwotOy8vIFVTQUdFOgotOy8vCi07Ly8gVG8gdXNlIGFueSBvZiB0aGUgbWFjcm9zIGluIHRoaXMgcGFja2FnZSwgZmlyc3QgY2FsbDoKLTsvLwotOy8vICAgIE1fQkRfSU5JVCBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LCBUbXAKLTsvLwotOy8vIFRoaXMgY2FjaGVzIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBwb3NpdGlvbiBhbmQgbmV4dCBhdmFpbGFibGUKLTsvLyBiaXRzIGluIHJlZ2lzdGVycyBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQuIFRoZXNlIHJlZ2lzdGVycwotOy8vIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBiaXRzdHJlYW0gZGVjb2RlIHBhY2thZ2UgdW50aWwgeW91Ci07Ly8gY2FsbCBNX0JEX0ZJTkkuCi07Ly8KLTsvLyBOZXh0IGNhbGwgdGhlIGZvbGxvd2luZyBtYWNybyhzKSBhcyBtYW55IHRpbWVzIGFzIHlvdSBuZWVkOgotOy8vCi07Ly8gICAgTV9CRF9MT09LOCAgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX0xPT0sxNiAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfUkVBRDggICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9SRUFEMTYgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1ZSRUFEOCAgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfVlJFQUQxNiAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9WTEQgICAgICAgICAtIFBlcmZvcm0gdmFyaWFibGUgbGVuZ3RoIGRlY29kZSB1c2luZyBsb29rdXAgdGFibGUKLTsvLwotOy8vIEZpbmFsbHkgY2FsbCB0aGUgbWFjcm86Ci07Ly8KLTsvLyAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQKLTsvLwotOy8vIFRoaXMgd3JpdGVzIHRoZSBiaXRzdHJlYW0gc3RhdGUgYmFjayB0byBtZW1vcnkuCi07Ly8KLTsvLyBUaGUgdGhyZWUgYml0c3RyZWFtIGNhY2hlIHJlZ2lzdGVyIG5hbWVzIGFyZSBhc3NpZ25lZCB0byB0aGUgZm9sbG93aW5nIGdsb2JhbAotOy8vIHZhcmlhYmxlczoKLTsvLwotCi0gICAgICAgIEdCTFMgICAgcEJpdFN0cmVhbSAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIHBCaXRTdHJlYW0KLSAgICAgICAgR0JMUyAgICBCaXRCdWZmZXIgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0QnVmZmVyCi0gICAgICAgIEdCTFMgICAgQml0Q291bnQgICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdENvdW50Ci0gICAKLTsvLyAgICAgICAgCi07Ly8gVGhlc2UgcmVnaXN0ZXIgdmFyaWFibGVzIG11c3QgaGF2ZSBhIGNlcnRhaW4gZGVmaW5lZCBzdGF0ZSBvbiBlbnRyeSB0byBldmVyeSBiaXRzdHJlYW0KLTsvLyBtYWNybyAoZXhjZXB0IE1fQkRfSU5JVCkgYW5kIG9uIGV4aXQgZnJvbSBldmVyeSBiaXRzdHJlYW0gbWFjcm8gKGV4Y2VwdCBNX0JEX0ZJTkkpLgotOy8vIFRoZSBzdGF0ZSBtYXkgZGVwZW5kIG9uIGltcGxlbWVudGF0aW9uLgotOy8vCi07Ly8gRm9yIHRoZSBkZWZhdWx0IChBUk0xMSkgaW1wbGVtZW50YXRpb24gdGhlIGZvbGxvd2luZyBob2xkOgotOy8vICAgIHBCaXRTdHJlYW0gLSBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgbm90IGhlbGQgaW4gdGhlIEJpdEJ1ZmZlcgotOy8vICAgIEJpdEJ1ZmZlciAgLSBpcyBhIGNhY2hlIG9mICg0IGJ5dGVzKSAzMiBiaXRzLCBiaXQgMzEgdGhlIGZpcnN0IGJpdAotOy8vICAgIEJpdENvdW50ICAgLSBpcyBvZmZzZXQgKGZyb20gdGhlIHRvcCBiaXQpIHRvIHRoZSBuZXh0IHVudXNlZCBiaXRzdHJlYW0gYml0Ci07Ly8gICAgMDw9Qml0Q291bnQ8PTE1IChzbyBCaXRCdWZmZXIgaG9sZHMgYXQgbGVhc3QgMTcgdW51c2VkIGJpdHMpCi07Ly8KLTsvLwotCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gRGVjb2RlIGluaXRpYWxpc2UKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbml0aWFsaXNlcyB0aGUgYml0c3RyZWFtIGRlY29kZSBnbG9iYWwgcmVnaXN0ZXJzIGZyb20KLSAgICAgICAgOy8vIGJpdHN0cmVhbSBwb2ludGVycy4gVGhpcyBtYWNybyBpcyBzcGxpdCBpbnRvIDMgcGFydHMgdG8gZW5hYmxlCi0gICAgICAgIDsvLyBzY2hlZHVsaW5nLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKLSAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKLSAgICAgICAgOy8vICRSQml0U3RyZWFtICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgcEJpdFN0cmVhbSAoY2FuIGJlICRwcEJpdFN0cmVhbSkKLSAgICAgICAgOy8vICRSQml0QnVmZmVyICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0QnVmZmVyCi0gICAgICAgIDsvLyAkUkJpdENvdW50ICAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdENvdW50ICAgKGNhbiBiZSAkcEJpdE9mZnNldCkKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSwkVDIsJFQzICAgICAtIHJlZ2lzdGVycyB0aGF0IG11c3QgYmUgcHJlc2VydmVkIGJldHdlZW4gY2FsbHMgdG8KLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIE1fQkRfSU5JVDEgYW5kIE1fQkRfSU5JVDIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9JTklUMCAgJHBwQml0U3RyZWFtLCAkcEJpdE9mZnNldCwgJFJCaXRTdHJlYW0sICRSQml0QnVmZmVyLCAkUkJpdENvdW50Ci0KLXBCaXRTdHJlYW0gIFNFVFMgIiRSQml0U3RyZWFtIgotQml0QnVmZmVyICAgU0VUUyAiJFJCaXRCdWZmZXIiCi1CaXRDb3VudCAgICBTRVRTICIkUkJpdENvdW50IiAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZCBpbnB1dHMKLSAgICAgICAgTERSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KLSAgICAgICAgTERSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9JTklUMSAgJFQxLCAkVDIsICRUMwotICAgICAgICBMRFJCICAgICRUMiwgWyRwQml0U3RyZWFtLCAjMl0KLSAgICAgICAgTERSQiAgICAkVDEsIFskcEJpdFN0cmVhbSwgIzFdCi0gICAgICAgIExEUkIgICAgJEJpdEJ1ZmZlciwgIFskcEJpdFN0cmVhbV0sICMzCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDIgICRUMSwgJFQyLCAkVDMKLSAgICAgICAgT1JSICAgICAkVDIsICRUMiwgJFQxLCBMU0wgIzgKLSAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDIsICRCaXRCdWZmZXIsIExTTCAjMTYKLSAgICAgICAgTUVORCAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD04IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKLSAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4yNCBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0xPT0s4ICAkU3ltYm9sLCAkTgotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cwotICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjE2IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfTE9PSzE2ICAkU3ltYm9sLCAkTiwgJFQxCi0gICAgICAgIEFTU0VSVCAgKCROID49IDEpOkxBTkQ6KCROIDw9IDE2KQotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBTa2lwcyBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfU0tJUDggJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9SRUFEOCAkU3ltYm9sLCAkTiwgJFQxCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1JFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD0xNikKLSAgICAgICAgQVNTRVJUICAkU3ltYm9sPD4kVDEKLSAgICAgICAgSUYgKCROPD04KQotICAgICAgICAgICAgTV9CRF9SRUFEOCAgJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBFTFNFICAgICAgICAKLSAgICAgICAgICAgIDsvLyBOPjggc28gd2Ugd2lsbCBiZSBhYmxlIHRvIHJlZmlsbCBhdCBsZWFzdCBvbmUgYnl0ZSAgICAgICAgICAgIAotICAgICAgICAgICAgTERSQiAgICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygxNi0kTikKLSAgICAgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKLSAgICAgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9OAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZTS0lQOCAkTiwgJFQxCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD0xNgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZTS0lQMTYgJE4sICRUMSwgJFQyCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9OAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WUkVBRDggJFN5bWJvbCwgJE4sICRUMSwgJFQyCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgJFQyCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD0xNgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgJFQyCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDAwMDAuLi4wMDEgd2hlcmUgdGhlcmUKLSAgICAgICAgOy8vIGFyZSBOIHplcm9zIGJlZm9yZSB0aGUgMSBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0NMWjE2ICRTeW1ib2wsICRUMSwgJFQyCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMTExMS4uLjExMCB3aGVyZSB0aGVyZQotICAgICAgICA7Ly8gYXJlIE4gb25lcyBiZWZvcmUgdGhlIDAgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9DTE8xNiAkU3ltYm9sLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTVZOICAgICAkU3ltYm9sLCAkU3ltYm9sCi0gICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgIAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBWYXJpYWJsZSBMZW5ndGggRGVjb2RlIG1vZHVsZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlY29kZXMgb25lIFZMRCBTeW1ib2wgZnJvbSBhIGJpdHN0cmVhbSBhbmQgcmVmaWxsIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vIGJ1ZmZlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBWTERUYWJsZSAgICAgIC0gcG9pbnRlciB0byBWTEQgZGVjb2RlIHRhYmxlIG9mIDE2LWJpdCBlbnRyaWVzLgotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgYWJvdmUgYXQgdGhlIHN0YXJ0IG9mCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICB0aGlzIGZpbGUuCi0gICAgICAgIDsvLyAkUzAgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgdGhlIGZpcnN0IHN0ZXAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIDE8PSRTMDw9OAotICAgICAgICA7Ly8gJFMxICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIGVhY2ggc3Vic2VxdWVudAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgc3RlcCAxPD0kUzE8PSRTMC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSBkZWNvZGVkIFZMRCBzeW1ib2wgdmFsdWUKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WTEQgJFN5bWJvbCwgJFQxLCAkVDIsICRwVkxEVGFibGUsICRTMCwgJFMxCi0gICAgICAgIEFTU0VSVCAoMTw9JFMwKTpMQU5EOigkUzA8PTgpCi0gICAgICAgIEFTU0VSVCAoMTw9JFMxKTpMQU5EOigkUzE8PSRTMCkKLSAgICAgICAgCi0gICAgICAgIDsvLyBOb3RlIDA8PUJpdENvdW50PD0xNSBvbiBlbnRyeSBhbmQgZXhpdAotICAgICAgICAKLSAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXRzCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgIygyPDwkUzApLTIgICAgICAgICAgICAgICAgIDsvLyBjcmVhdGUgbWFzawotICAgICAgICBBTkQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMwKSA7Ly8gMioobmV4dCAkUzAgYml0cykKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIENTIGlmIGJ1ZmZlciBjYW4gYmUgZmlsbGVkCi0wMQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAgICA7Ly8gbG9hZCByZWZpbGwgYnl0ZQotICAgICAgICBMRFJIICAgICRTeW1ib2wsIFskcFZMRFRhYmxlLCAkU3ltYm9sXSAgICAgICA7Ly8gbG9hZCB0YWJsZSBlbnRyeQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gcmVmaWxsIG5vdCBwb3NzaWJsZQotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjJFMwICAgICAgICAgICA7Ly8gYXNzdW1lICRTMCBiaXRzIHVzZWQKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgOy8vIG1lcmdlIGluIHJlZmlsbCBieXRlCi0gICAgICAgIE1PVlMgICAgJFQxLCAkU3ltYm9sLCBMU1IgIzEgICAgICAgICAgICAgICAgIDsvLyBDUz1sZWFmIGVudHJ5Ci0gICAgICAgIEJDUyAgICAgJUZUMDIKLSAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0Ci0gICAgICAgIElGICgyKiRTMC0kUzE8PTgpCi0gICAgICAgICAgICA7Ly8gQ2FuIGNvbWJpbmUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgYW5kIGtlZXAgJEJpdENvdW50PD0xNQotICAgICAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgrKCRTMC0kUzEpCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBTZXBhcmF0ZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBvZmZzZXQKLSAgICAgICAgICAgIFNVQlMgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICAgICAgU1VCICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoJFMwLSRTMSkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgQUREICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMSkgOy8vIGFkZCAyKihuZXh0ICRTMSBiaXRzKSB0bwotICAgICAgICBCSUMgICAgICRTeW1ib2wsICRTeW1ib2wsICMxICAgICAgICAgICAgICAgICA7Ly8gICB0YWJsZSBvZmZzZXQKLSAgICAgICAgQiAgICAgICAlQlQwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCB0YWJsZSBlbnRyeQotMDIKLSAgICAgICAgOy8vIEJpdENvdW50IHJhbmdlIG5vdyBkZXBlbmQgb24gdGhlIHJvdXRlIGhlcmUKLSAgICAgICAgOy8vIGlmIChmaXJzdCBzdGVwKSAgICAgICBTMCA8PSBCaXRDb3VudCA8PSA3K1MwICAgICAgICA8PTE1Ci0gICAgICAgIDsvLyBlbHNlIGlmICgyKlMwLVMxPD04KSAgUzAgPD0gQml0Q291bnQgPD0gNysoMipTMC1TMSkgPD0xNQotICAgICAgICA7Ly8gZWxzZSAgICAgICAgICAgICAgICAgIFMxIDw9IEJpdENvdW50IDw9IDcrUzEgICAgICAgIDw9MTUKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wsIExTUiMxMwotICAgICAgICBCSUMgICAgICRTeW1ib2wsICRUMSwgIzB4RjAwMAotICAgICAgICBNRU5ECi0gICAgICAgIAotCi0gICAgICAgIDsvLyBBZGQgYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cyAKLSAgICAgICAgOy8vIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgaXMgdXNlZCB0byBjb21wYXJlIGJpdHN0cmVhbSBwb3NpdGlvbnMgdXNpbmcuIE1fQkRfQ01QLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkT2Zmc2V0ICAgICAgICAgLSBPZmZzZXQgdG8gYmUgYWRkZWQgaW4gYml0cy4KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIGFkZGluZyB0aGUgT2Zmc2V0LiAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSA0IGJ5dGUgYWhlYWQgYW5kIG5lZWRzIHRvIHN1YnRyYWN0IGJ5IDQgdG8gZ2V0IGV4YWN0IAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgcG9pbnRlciAoYXMgaW4gTV9CRF9GSU5JKS4gQnV0IGZvciB1c2luZyB3aXRoIE1fQkRfQ01QIHN1YnRyYWN0IGlzIG5vdCBuZWVkZWQuCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgYWRkaXRpb24gb2YgT2Zmc2V0IG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0FERCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkT2Zmc2V0Ci0KLSAgICAgICAgOy8vICgkQnl0ZUluZGV4LCRCaXRJbmRleCkgPSBDdXJyZW50IHBvc2l0aW9uICsgJE9mZnNldCBiaXRzCi0gICAgICAgIEFERCAgICAgJE9mZnNldCwgJE9mZnNldCwgJEJpdENvdW50Ci0gICAgICAgIEFORCAgICAgJEJpdEluZGV4LCAkT2Zmc2V0LCAjNwotICAgICAgICBBREQgICAgICRCeXRlSW5kZXgsICRwQml0U3RyZWFtLCAkT2Zmc2V0LCBBU1IgIzMgICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIE1vdmUgYml0c3RyZWFtIHBvaW50ZXJzIHRvIHRoZSBsb2NhdGlvbiBnaXZlbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byAgCi0gICAgICAgIDsvLyB0aGUgY3VycmVudCBsb2NhdGlvbiBnaXZlbiAoY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCkuIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBtb3ZlLiAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSA0IGJ5dGUgYWhlYWQgYW5kIG5lZWRzIHRvIHN1YnRyYWN0IGJ5IDQgdG8gZ2V0IGV4YWN0IAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgcG9pbnRlciAoYXMgaW4gTV9CRF9GSU5JKS4KLSAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBtb3ZlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuICAKLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9NT1YgICRCeXRlSW5kZXgsICRCaXRJbmRleAotCi0gICAgICAgIDsvLyAoJHBCaXRTdHJlYW0sICRPZmZzZXQpID0gKCRCeXRlSW5kZXgsJEJpdEluZGV4KQotICAgICAgICBNT1YgICAgICRCaXRDb3VudCwgJEJpdEluZGV4Ci0gICAgICAgIE1PViAgICAgJHBCaXRTdHJlYW0sICRCeXRlSW5kZXgKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gQ29tcGFyZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvbXBhcmVzIGJpdHN0cmVhbSBwb3NpdGlvbiB3aXRoIHRoYXQgb2YgYSBkZXN0aW5hdGlvbiBwb3NpdGlvbi4gRGVzdGluYXRpb24gcG9zaXRpb24gCi0gICAgICAgIDsvLyBpcyBoZWxkIGluIHR3byBpbnB1dCByZWdpc3RlcnMgd2hpY2ggYXJlIGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQgbWFjcm8KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyLCAoNCBieXRlIGFoZWFkIGFzIGRlc2NyaWJlZCBpbiBNX0JEX0FERCkKLSAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEZMQUdTICAgICAgICAgICAtIEdFIGlmIGRlc3RpbmF0aW9uIGlzIHJlYWNoZWQsIExUID0gaXMgZGVzdGluYXRpb24gaXMgYWhlYWQKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQ01QICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRUMQotICAgICAgICAKLSAgICAgICAgOy8vIFJldHVybiBmbGFncyBzZXQgYnkgKGN1cnJlbnQgcG9zaXRvbiktKCRCeXRlSW5kZXgsJEJpdEluZGV4KQotICAgICAgICA7Ly8gc28gR0UgbWVhbnMgdGhhdCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGluZGljYXRlZCBwb3NpdGlvbgotCi0gICAgICAgIEFERCAgICAgICAgICRUMSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSICMzCi0gICAgICAgIENNUCAgICAgICAgICRUMSwgJEJ5dGVJbmRleAotICAgICAgICBBTkQgICAgICAgICAkVDEsICRCaXRDb3VudCwgIzcKLSAgICAgICAgQ01QRVEgICAgICAgJFQxLCAkQml0SW5kZXggICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gRGVjb2RlIGZpbmFsaXNlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gV3JpdGVzIGJhY2sgdGhlIGJpdHN0cmVhbSBzdGF0ZSB0byB0aGUgYml0c3RyZWFtIHBvaW50ZXJzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCi0gICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSB0aGVzZSByZWdpc3RlciBhcmUgY29ycnVwdGVkCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfRklOSSAgJHBwQml0U3RyZWFtLCAkcEJpdE9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vIEFkdmFuY2UgcG9pbnRlciBieSB0aGUgbnVtYmVyIG9mIGZyZWUgYml0cyBpbiB0aGUgYnVmZmVyCi0gICAgICAgIEFERCAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiMzCi0gICAgICAgIEFORCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3Ci0gICAgICAgIAotICAgICAgICA7Ly8gTm93IG1vdmUgYmFjayAzMiBiaXRzIHRvIHJlYWNoIHRoZSBmaXJzdCB1c3VlZCBiaXQKLSAgICAgICAgU1VCICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICM0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgb3V0IGJpdHN0cmVhbSBzdGF0ZQotICAgICAgICBTVFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQotICAgICAgICBTVFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGVmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiBhcm1DT01NX0JpdHN0cmVhbS5oCi0gKiBCcmllZjogRGVjbGFyZXMgY29tbW9uIEFQSSdzL0RhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NYXggRW5jb2RlcnMvRGVjb2RlcnMuCi0gKgotICovCi0KLSNpZm5kZWYgX2FybUNvZGVjX0hfCi0jZGVmaW5lIF9hcm1Db2RlY19IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9VOCAgIGNvZGVMZW47Ci0gICAgT01YX1UzMgkgY29kZVdvcmQ7Ci19IEFSTV9WTEMzMjsKLQotLyogVGhlIGFib3ZlIHNob3VsZCBiZSByZW5hbWVkIGFzICJBUk1fVkxDMzIiICovCi0KLS8qKgotICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLi4zMgotICoKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotICogICAgCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4zMgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0gCi1PTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KTsKLQotLyoqIAotICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLQotT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQotICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCi0gKiBwb2ludGVkIGJ5IHBDb2RlQm9vawotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIHBDb2RlQm9vawotICogCi0gKiBbb3V0XSAgICAqKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAotICogICAgICAgICA6ICJBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAweEZGRkYiIGlmIHNlYXJjaCBmYWlscy4KLSAqKi8KLQotI2RlZmluZSBBUk1fTk9fQ09ERUJPT0tfSU5ERVggKE9NWF9VMTYpKDB4RkZGRikKLQotT01YX1UxNiBhcm1VblBhY2tWTEMzMigKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCi0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwT2Zmc2V0CSAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQljb2RlV29yZAkJQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqIFtpbl0JY29kZUxlbmd0aAkJTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrQml0cyAoCi0gICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIE9NWF9VMzIgY29kZVdvcmQsIAotICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKLSk7Ci0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIEFSTV9WTEMzMiBjb2RlIAotKTsKLQotI2VuZGlmICAgICAgLypfYXJtQ29kZWNfSF8qLwotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2MWY2MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGUgICAgICAgICA6IGFybUNPTU1fSURDVFRhYmxlLmgKLSAqIERlc2NyaXB0aW9uICA6IENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0YWJsZXMgZm9yIElEQ1QgY2FsY3VsYXRpb24uCi0gKgotICovCi0gIAotI2lmbmRlZiBfYXJtQ09NTV9JRENUVGFibGVfSF8KLSNkZWZpbmUgX2FybUNPTU1fSURDVFRhYmxlX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0gICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKLSAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1Ci0gICAgICAqICBzKDYpPTIuMAotICAgICAgKiAgcyg3KT00LjAKLSAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKLSAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQotCSAgKi8KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF07Ci1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XTsKLQotI2VuZGlmIC8qIF9hcm1DT01NX0lEQ1RUYWJsZV9IXyAqLwotCi0KLS8qIEVuZCBvZiBGaWxlICovCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzMDIyMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDU5ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8KLTsvLyBJRENUX3MucwotOy8vCi07Ly8gSW52ZXJzZSBEQ1QgbW9kdWxlCi07Ly8KLTsvLyAKLTsvLyBBTEdPUklUSE0gREVTQ1JJUFRJT04KLTsvLwotOy8vIFRoZSA4eDggMkQgSURDVCBpcyBwZXJmb3JtZWQgYnkgY2FsY3VsYXRpbmcgYSAxRCBJRENUIGZvciBlYWNoCi07Ly8gY29sdW1uIGFuZCB0aGVuIGEgMUQgSURDVCBmb3IgZWFjaCByb3cuCi07Ly8KLTsvLyBUaGUgOC1wb2ludCAxRCBJRENUIGlzIGRlZmluZWQgYnkKLTsvLyAgIGYoeCkgPSAoQygwKSpUKDApKmMoMCx4KSArIC4uLiArIEMoNykqVCg3KSpjKDcseCkpLzIKLTsvLwotOy8vICAgQyh1KSA9IDEvc3FydCgyKSBpZiB1PTAgb3IgMSBpZiB1IT0wCi07Ly8gICBjKHUseCkgPSBjb3MoICgyeCsxKSp1KnBpLzE2ICkKLTsvLwotOy8vIFdlIGNvbXB1dGUgdGhlIDgtcG9pbnQgMUQgSURDVCB1c2luZyB0aGUgcmV2ZXJzZSBvZgotOy8vIHRoZSBBcmFpLUFndWktTmFrYWppbWEgZmxvdyBncmFwaCB3aGljaCB3ZSBzcGxpdCBpbnRvCi07Ly8gNSBzdGFnZXMgbmFtZWQgaW4gcmV2ZXJzZSBvcmRlciB0byBpZGVudGlmeSB3aXRoIHRoZQotOy8vIGZvcndhcmQgRENULiBEaXJlY3QgaW52ZXJzaW9uIG9mIHRoZSBmb3J3YXJkIGZvcm11bGFlCi07Ly8gaW4gZmlsZSBGRENUX3MucyBnaXZlczoKLTsvLwotOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkgIFsgQSh1KT00KkModSkqYyh1LDApIF0KLTsvLyAgICAgICAgICAgICBbIEEoMCkgPSAyKnNxcnQoMikKLTsvLyAgICAgICAgICAgICAgIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKSBdCi07Ly8KLTsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKLTsvLyAgICAgICAgICAgICBpMyA9IChqMitqNikvMiAgICAgIGkyID0gKGoyLWo2KS8yCi07Ly8gICAgICAgICAgICAgaTcgPSAoajUrajMpLzIgICAgICBpNCA9IChqNS1qMykvMgotOy8vICAgICAgICAgICAgIGk1ID0gKGoxK2o3KS8yICAgICAgaTYgPSAoajEtajcpLzIKLTsvLwotOy8vIElTdGFnZSAzOiAgIGgwID0gKGkwK2kxKS8yICAgICAgaDEgPSAoaTAtaTEpLzIKLTsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKLTsvLyAgICAgICAgICAgICBoNCA9ICBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYKLTsvLyAgICAgICAgICAgICBoNiA9IC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYKLTsvLyAgICAgICAgICAgICBbIFRoZSBhYm92ZSB0d28gbGluZXMgcm90YXRlIGJ5IC0ocGkvOCkgXQotOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KS9zcXJ0MiAgaDcgPSAoaTUraTcpLzIgCi07Ly8gICAgICAgICAgICAgCi07Ly8gSVN0YWdlIDI6ICAgZzAgPSAoaDAraDMpLzIgICAgICBnMyA9IChoMC1oMykvMgotOy8vICAgICAgICAgICAgIGcxID0gKGgxK2gyKS8yICAgICAgZzIgPSAoaDEtaDIpLzIKLTsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNwotOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Ci07Ly8KLTsvLyBJU3RhZ2UgMTogICBmMCA9IChnMCtnNykvMiAgICAgIGY3ID0gKGcwLWc3KS8yCi07Ly8gICAgICAgICAgICAgZjEgPSAoZzErZzYpLzIgICAgICBmNiA9IChnMS1nNikvMgotOy8vICAgICAgICAgICAgIGYyID0gKGcyK2c1KS8yICAgICAgZjUgPSAoZzItZzUpLzIKLTsvLyAgICAgICAgICAgICBmMyA9IChnMytnNCkvMiAgICAgIGY0ID0gKGczLWc0KS8yCi07Ly8KLTsvLyBOb3RlIHRoYXQgbW9zdCBjb2VmZmljaWVudHMgYXJlIGhhbHZlZCAzIHRpbWVzIGR1cmluZyB0aGUKLTsvLyBhYm92ZSBjYWxjdWxhdGlvbi4gV2UgY2FuIHJlc2NhbGUgdGhlIGFsZ29yaXRobSBkaXZpZGluZwotOy8vIHRoZSBpbnB1dCBieSA4IHRvIHJlbW92ZSB0aGUgaGFsdmluZ3MuCi07Ly8KLTsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpLzgKLTsvLwotOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAotOy8vICAgICAgICAgICAgIGkzID0gajIgKyBqNiAgICAgICAgaTIgPSBqMiAtIGo2Ci07Ly8gICAgICAgICAgICAgaTcgPSBqNSArIGozICAgICAgICBpNCA9IGo1IC0gajMKLTsvLyAgICAgICAgICAgICBpNSA9IGoxICsgajcgICAgICAgIGk2ID0gajEgLSBqNwotOy8vCi07Ly8gSVN0YWdlIDM6ICAgaDAgPSBpMCArIGkxICAgICAgICBoMSA9IGkwIC0gaTEKLTsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKLTsvLyAgICAgICAgICAgICBoNCA9IDIqKCBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYpCi07Ly8gICAgICAgICAgICAgaDYgPSAyKigtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2KQotOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KSpzcXJ0MiAgaDcgPSBpNSArIGk3IAotOy8vICAgICAgICAgICAgIAotOy8vIElTdGFnZSAyOiAgIGcwID0gaDAgKyBoMyAgICAgICAgZzMgPSBoMCAtIGgzCi07Ly8gICAgICAgICAgICAgZzEgPSBoMSArIGgyICAgICAgICBnMiA9IGgxIC0gaDIKLTsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNwotOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Ci07Ly8KLTsvLyBJU3RhZ2UgMTogICBmMCA9IGcwICsgZzcgICAgICAgIGY3ID0gZzAgLSBnNwotOy8vICAgICAgICAgICAgIGYxID0gZzEgKyBnNiAgICAgICAgZjYgPSBnMSAtIGc2Ci07Ly8gICAgICAgICAgICAgZjIgPSBnMiArIGc1ICAgICAgICBmNSA9IGcyIC0gZzUKLTsvLyAgICAgICAgICAgICBmMyA9IGczICsgZzQgICAgICAgIGY0ID0gZzMgLSBnNAotOy8vCi07Ly8gTm90ZToKLTsvLyAxLiBUaGUgc2NhbGluZyBieSBBKHUpLzggY2FuIG9mdGVuIGJlIGNvbWJpbmVkIHdpdGggaW52ZXJzZQotOy8vICAgIHF1YW50aXphdGlvbi4gVGhlIGNvbHVtbiBhbmQgcm93IHNjYWxpbmdzIGNhbiBiZSBjb21iaW5lZC4KLTsvLyAyLiBUaGUgZmxvd2dyYXBoIGluIHRoZSBBQU4gcGFwZXIgaGFzIGg0LGc2IG5lZ2F0ZWQgY29tcGFyZWQKLTsvLyAgICB0byB0aGUgYWJvdmUgY29kZSBidXQgaXMgb3RoZXJ3aXNlIGlkZW50aWNhbC4KLTsvLyAzLiBUaGUgcm90YXRpb24gYnkgLXBpLzggY2FuIGJlIHBlZm9ybWVkIHVzaW5nIHRocmVlIG11bHRpcGxpZXMKLTsvLyAgICBFZyAgYyppNCtzKmk2ID0gKGk2LWk0KSpzICsgKGMrcykqaTQKLTsvLyAgICAgICAtcyppNCtjKmk2ID0gKGk2LWk0KSpzICsgKGMtcykqaTYKLTsvLyA0LiBJZiB8VCh1KXw8PTEgdGhlbiBmcm9tIHRoZSBJRENUIGRlZmluaXRpb24sCi07Ly8gICAgfGYoeCl8IDw9ICgoMS9zcXJ0MikgKyB8YygxLHgpfCArIC4uICsgfGMoNyx4KXwpLzIKLTsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIGNvcyhwaS8xNikgKyAuLi4gKyBjb3MoNypwaS8xNikpLzIKLTsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIChjb3QocGkvMzIpLTEpLzIpLzIKLTsvLyAgICAgICAgICAgID0gKDEgKyBjb3MocGkvMTYpICsgY29zKDJwaS8xNikgKyBjb3MoM3BpLzE2KSkvc3FydCgyKQotOy8vICAgICAgICAgICAgPSAoYXBwcm94KTIuNjQKLTsvLyAgICBTbyB0aGUgbWF4IGdhaW4gb2YgdGhlIDJEIElEQ1QgaXMgfng3LjAgPSAzIGJpdHMuCi07Ly8gICAgVGhlIHRhYmxlIGJlbG93IHNob3dzIGlucHV0IHBhdHRlcm5zIGdlbmVyYXRpbmcgdGhlIG1heGltdW0KLTsvLyAgICB2YWx1ZSBvZiB8Zih1KXwgZm9yIGlucHV0IGluIHRoZSByYW5nZSB8VCh4KXw8PTEuIE09LTEsIFA9KzEKLTsvLyAgICBJbnB1dFBhdHRlcm4gICAgICBNYXggfGYoeCl8Ci07Ly8gICAgICBQUFBQUFBQUCAgICAgICAgfGYwfCA9ICAyLjY0Ci07Ly8gICAgICBQUFBNTU1NTSAgICAgICAgfGYxfCA9ICAyLjY0Ci07Ly8gICAgICBQUE1NTVBQUCAgICAgICAgfGYyfCA9ICAyLjY0Ci07Ly8gICAgICBQUE1NUFBNTSAgICAgICAgfGYzfCA9ICAyLjY0Ci07Ly8gICAgICBQTU1QUE1NUCAgICAgICAgfGY0fCA9ICAyLjY0Ci07Ly8gICAgICBQTU1QTU1QTSAgICAgICAgfGY1fCA9ICAyLjY0Ci07Ly8gICAgICBQTVBQTVBNUCAgICAgICAgfGY2fCA9ICAyLjY0Ci07Ly8gICAgICBQTVBNUE1QTSAgICAgICAgfGY3fCA9ICAyLjY0Ci07Ly8gICBOb3RlIHRoYXQgdGhpcyBpbnB1dCBwYXR0ZXJuIGlzIHRoZSB0cmFuc3Bvc2Ugb2YgdGhlCi07Ly8gICBjb3JyZXNwb25kaW5nIG1heCBpbnB1dCBwYXR0ZXIgZm9yIHRoZSBGRENULgotCi07Ly8gQXJndW1lbnRzCi0KLXBTcmMgICAgUk4gMCAgICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCi1TdHJpZGUgIFJOIDEgICAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcwotcERlc3QgICBSTiAyICAgIDsvLyBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcgotcFNjYWxlICBSTiAzICAgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKLQotCi0gICAgICAgIDsvLyBEQ1QgSW52ZXJzZSBNYWNybwotICAgICAgICA7Ly8gVGhlIERDVCBjb2RlIHNob3VsZCBiZSBwYXJhbWV0cml6ZWQgYWNjb3JkaW5nCi0gICAgICAgIDsvLyB0byB0aGUgZm9sbG93aW5nIGlucHV0czoKLSAgICAgICAgOy8vICRvdXRzaXplID0gInU4IiAgOiAgOC1iaXQgdW5zaWduZWQgZGF0YSBzYXR1cmF0ZWQgKDAgdG8gKzI1NSkKLSAgICAgICAgOy8vICAgICAgICAgICAgInM5IiAgOiAxNi1iaXQgc2lnbmVkIGRhdGEgc2F0dXJhdGVkIHRvIDktYml0ICgtMjU2IHRvICsyNTUpCi0gICAgICAgIDsvLyAgICAgICAgICAgICJzMTYiIDogMTYtYml0IHNpZ25lZCBkYXRhIG5vdCBzYXR1cmF0ZWQgKG1heCBzaXplIH4rLy0xNDI3MykKLSAgICAgICAgOy8vICRpbnNjYWxlID0gInMxNiIgOiBzaWduZWQgMTYtYml0IGFhbi1zY2FsZSB0YWJsZSwgUTE1IGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDsvLyAgICAgICAgICAgICJzMzIiIDogc2lnbmVkIDMyLWJpdCBhYW4tc2NhbGUgdGFibGUsIFEyMyBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0czoKLSAgICAgICAgOy8vIHBTcmMgICA9IHIwID0gUG9pbnRlciB0byBpbnB1dCBkYXRhCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgIFJhbmdlIGlzIC0yNTYgdG8gKzI1NSAoOS1iaXQpCi0gICAgICAgIDsvLyBTdHJpZGUgPSByMSA9IFN0cmlkZSBiZXR3ZWVuIGlucHV0IGxpbmVzCi0gICAgICAgIDsvLyBwRGVzdCAgPSByMiA9IFBvaW50ZXIgdG8gb3V0cHV0IGRhdGEKLSAgICAgICAgOy8vIHBTY2FsZSA9IHIzID0gUG9pbnRlciB0byBhYW4tc2NhbGUgdGFibGUgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGJ5ICRpbnNjYWxlCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVCAgJG91dHNpemUsICRpbnNjYWxlLCAkc3RyaWRlCi0gICAgICAgIExDTEEgICAgU0hJRlQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly8gUkVHSVNURVIgQUxMT0NBVElPTgotOy8vIFRoaXMgaXMgaGFyZCBzaW5jZSB3ZSBoYXZlIDggdmFsdWVzLCA5IGZyZWUgcmVnaXN0ZXJzIGFuZCBlYWNoCi07Ly8gYnV0dGVyZmx5IHJlcXVpcmVzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiBXZSBhbHNvIHdhbnQgdG8gCi07Ly8gbWFpbnRhaW4gcmVnaXN0ZXIgb3JkZXIgc28gd2UgY2FuIHVzZSBMRE0vU1RNLiBUaGUgdGFibGUgYmVsb3cKLTsvLyBzdW1tYXJpc2VzIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIHRoYXQgbWVldHMgYWxsIHRoZXNlIGNyaXRlcmlhLgotOy8vIGE9MXN0Y29sLCBiPTJuZGNvbCwgZixnLGgsaSBhcmUgZGF0YWZsb3cgcG9pbnRzIGRlc2NyaWJlZCBhYm92ZS4KLTsvLwotOy8vIHIxICBhMDEgICAgIGcwICBoMAotOy8vIHI0ICBiMDEgZjAgIGcxICBoMSAgaTAKLTsvLyByNSAgYTIzIGYxICBnMiAgICAgIGkxCi07Ly8gcjYgIGIyMyBmMiAgZzMgIGgyICBpMgotOy8vIHI3ICBhNDUgZjMgICAgICBoMyAgaTMKLTsvLyByOCAgYjQ1IGY0ICBnNCAgaDQgIGk0Ci07Ly8gcjkgIGE2NyBmNSAgZzUgIGg1ICBpNQotOy8vIHIxMCBiNjcgZjYgIGc2ICBoNiAgaTYKLTsvLyByMTEgICAgIGY3ICBnNyAgaDcgIGk3Ci07Ly8KLXJhMDEgICAgUk4gMQotcmIwMSAgICBSTiA0Ci1yYTIzICAgIFJOIDUKLXJiMjMgICAgUk4gNgotcmE0NSAgICBSTiA3Ci1yYjQ1ICAgIFJOIDgKLXJhNjcgICAgUk4gOQotcmI2NyAgICBSTiAxMAotcnRtcCAgICBSTiAxMQotY3NQaUJ5OCBSTiAxMiAgIDsvLyBbIChTaW4ocGkvOClAUTE1KSwgKENvcyhwaS84KUBRMTUpIF0KLUxvb3BSUjIgUk4gMTQgICA7Ly8gWyBMb29wTnVtYmVyPDwxMyAsICgxL1NxcnQoMikpQFExNSBdCi07Ly8gVHJhbnNwb3NlIGFsbG9jYXRpb24KLXhmdCAgICAgUk4gcmEwMQoteGYwICAgICBSTiByYjAxCi14ZjEgICAgIFJOIHJhMjMKLXhmMiAgICAgUk4gcmIyMwoteGYzICAgICBSTiByYTQ1Ci14ZjQgICAgIFJOIHJiNDUKLXhmNSAgICAgUk4gcmE2NwoteGY2ICAgICBSTiByYjY3Ci14ZjcgICAgIFJOIHJ0bXAKLTsvLyBJU3RhZ2UgMSBhbGxvY2F0aW9uCi14ZzAgICAgIFJOIHhmdAoteGcxICAgICBSTiB4ZjAKLXhnMiAgICAgUk4geGYxCi14ZzMgICAgIFJOIHhmMgoteGd0ICAgICBSTiB4ZjMKLXhnNCAgICAgUk4geGY0Ci14ZzUgICAgIFJOIHhmNQoteGc2ICAgICBSTiB4ZjYKLXhnNyAgICAgUk4geGY3Ci07Ly8gSVN0YWdlIDIgYWxsb2NhdGlvbgoteGgwICAgICBSTiB4ZzAKLXhoMSAgICAgUk4geGcxCi14aHQgICAgIFJOIHhnMgoteGgyICAgICBSTiB4ZzMKLXhoMyAgICAgUk4geGd0Ci14aDQgICAgIFJOIHhnNAoteGg1ICAgICBSTiB4ZzUKLXhoNiAgICAgUk4geGc2Ci14aDcgICAgIFJOIHhnNwotOy8vIElTdGFnZSAzLDQgYWxsb2NhdGlvbgoteGl0ICAgICBSTiB4aDAKLXhpMCAgICAgUk4geGgxCi14aTEgICAgIFJOIHhodAoteGkyICAgICBSTiB4aDIKLXhpMyAgICAgUk4geGgzCi14aTQgICAgIFJOIHhoNAoteGk1ICAgICBSTiB4aDUKLXhpNiAgICAgUk4geGg2Ci14aTcgICAgIFJOIHhoNwotICAgICAgICAKLSAgICAgICAgTV9TVFIgICBwRGVzdCwgIHBwRGVzdAotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBNX1NUUiAgIFN0cmlkZSwgcFN0cmlkZQotICAgICAgICBFTkRJRgotICAgICAgICBNX0FEUiAgIHBEZXN0LCAgcEJsawotICAgICAgICBMRFIgICAgIGNzUGlCeTgsID0weDMwZmM3NjQyCi0gICAgICAgIExEUiAgICAgTG9vcFJSMiwgPTB4MDAwMDVhODIKLSAgCi12Nl9pZGN0X2NvbCRfRgotICAgICAgICA7Ly8gTG9hZCBldmVuIHZhbHVlcwotICAgICAgICBMRFIgICAgIHhpNCwgW3BTcmNdLCAjNCAgOy8vIGowCi0gICAgICAgIExEUiAgICAgeGk1LCBbcFNyYywgIzQqMTYtNF0gIDsvLyBqNAotICAgICAgICBMRFIgICAgIHhpNiwgW3BTcmMsICMyKjE2LTRdICA7Ly8gajIKLSAgICAgICAgTERSICAgICB4aTcsIFtwU3JjLCAjNioxNi00XSAgOy8vIGo2Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2NhbGUgRXZlbiBWYWx1ZXMKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiA7Ly8gMTZ4MTYgbXVsCi1TSElGVCAgICAgICBTRVRBICAgIDEyCi0gICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM0Ci0gICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzQqMTYtNF0gICAgICAgIAotICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICMyKjE2LTRdCi0gICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQotICAgICAgICAgICAgU01MQUJCICB4aTMsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk0LCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBQkIgIHhpMCwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTUsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTMsIHhpNCwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMTYtNF0KLSAgICAgICAgICAgIFNNTEFCQiAgeGkxLCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNiwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMCwgeGk1LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIFNNTEFCQiAgeGkyLCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNywgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTEsIHhpMSwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMSwgeGk2LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpNywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAotU0hJRlQgICAgICAgU0VUQSAgICAoMTIrOC0xNikKLSAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCi0gICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM4Ci0gICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzAqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM0KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzQqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTUsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk1LCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGUsICMyKjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzIqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM2KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTcsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk3LCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBvZGQgdmFsdWVzCi0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTYtNF0gICAgICA7Ly8gajEKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNi00XSAgICAgIDsvLyBqNwotICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2LTRdICAgICAgOy8vIGo1Ci0gICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTYtNF0gICAgICA7Ly8gajMKLSAgICAgICAgCi0gICAgICAgIElGICB7VFJVRX0KLSAgICAgICAgICAgIDsvLyBzaG9ydGN1dCBpZiBvZGQgdmFsdWVzIDAKLSAgICAgICAgICAgIFRFUSAgICAgeGkwLCAjMAotICAgICAgICAgICAgVEVRRVEgICB4aTEsICMwCi0gICAgICAgICAgICBURVFFUSAgIHhpMiwgIzAKLSAgICAgICAgICAgIFRFUUVRICAgeGkzLCAjMAotICAgICAgICAgICAgQkVRICAgICB2Nk9kZFplcm8kX0YKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBzY2FsZWQgZXZlbiB2YWx1ZXMKLSAgICAgICAgU1RNSUEgICBwRGVzdCwge3hpNCwgeGk1LCB4aTYsIHhpN30KLSAgICAgICAgCi0gICAgICAgIDsvLyBTY2FsZSBvZGQgdmFsdWVzCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIKLSAgICAgICAgICAgIDsvLyBQZXJmb3JtIEFBTiBTY2FsZQotICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjE2LTRdCi0gICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzcqMTYtNF0gICAgICAgIAotICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM1KjE2LTRdCi0gICAgICAgICAgICBTTUxBQkIgIHhpNywgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTAsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFCQiAgeGk0LCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMSwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTcsIHhpNywgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNywgeGkwLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyoxNi00XQotICAgICAgICAgICAgU01MQUJCICB4aTUsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkyLCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk0LCB4aTEsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgU01MQUJCICB4aTYsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkzLCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpNSwgeGk1LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk1LCB4aTIsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGkzLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCi0gICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjMSozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzcqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjNyozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTAsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkwLCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMSwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTEsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzUqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNSozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzMqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTIsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkyLCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMywgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTMsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAotICAgICAgICBTQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBTSEFERDE2IHhpNSwgeGk1LCB4aXQKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3Ci0gICAgICAgIFNBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgIFNIQUREMTYgeGk3LCB4aTcsIHhpdAotICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQotICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCi0gICAgICAgIAotICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCi0gICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KLSAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKLSAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKLSAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAotICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80Ci0gICAgICAgIExEUkQgICAgeGkwLCBbcERlc3QsICM4XSAgICAgICAgOy8vIGoyLGo2IHNjYWxlZAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83Ci0gICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNwotICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYgICAgICAgIAotICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KQotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKLSAgICAgICAgCi0gICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdF0gICAgICAgICAgICA7Ly8gajAsIGo0IHNjYWxlZAotICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKLSAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMQotICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgotICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKLSAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCi0gICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMwotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFNBREQxNiAgeGYzLCB4ZzMsIHhnNAotICAgICAgICBTU1VCMTYgIHhmNCwgeGczLCB4ZzQKLSAgICAgICAgU0FERDE2ICB4ZjIsIHhnMiwgeGc1Ci0gICAgICAgIFNTVUIxNiAgeGY1LCB4ZzIsIHhnNQotICAgICAgICBTQUREMTYgIHhmMSwgeGcxLCB4ZzYKLSAgICAgICAgU1NVQjE2ICB4ZjYsIHhnMSwgeGc2Ci0gICAgICAgIFNBREQxNiAgeGYwLCB4ZzAsIHhnNwotICAgICAgICBTU1VCMTYgIHhmNywgeGcwLCB4ZzcKLSAgICAgICAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UsIHN0b3JlIGFuZCBsb29wCi0gICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAotICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2Ci0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQotICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCi0gICAgICAgIEVORElGCi0gICAgICAgIEIgICAgICAgdjZfaWRjdF9yb3ckX0YKLSAgICAgICAgCi12Nk9kZFplcm8kX0YKLSAgICAgICAgU1NVQjE2ICB4aTIsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyLWo2KQotICAgICAgICBTSEFERDE2IHhpMywgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAotICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKLSAgICAgICAgCi0gICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGgwLCB4aTQsIHhpNQotICAgICAgICBTSFNVQjE2IHhoMSwgeGk0LCB4aTUgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgotICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKLSAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCi0gICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMwotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBNT1YgIHhmMywgeGczCi0gICAgICAgIE1PViAgeGY0LCB4ZzMKLSAgICAgICAgTU9WICB4ZjIsIHhnMgotICAgICAgICBNT1YgIHhmNSwgeGcyCi0gICAgICAgIE1PViAgeGYxLCB4ZzEKLSAgICAgICAgTU9WICB4ZjYsIHhnMQotICAgICAgICBNT1YgIHhmMCwgeGcwCi0gICAgICAgIE1PViAgeGY3LCB4ZzAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UKLSAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKLSAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAotICAgICAgICAKLSAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgotICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCi0gICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgIAotICAgICAgICAKLXY2X2lkY3Rfcm93JF9GCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzNHRvNyB4MS80Ci0gICAgICAgIExEUiAgICAgeGl0LCA9MHgwMDAxMDAwMSAgICAgICAgOy8vIHJvdW5kaW5nIGNvbnN0YW50Ci0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTZdICAgICAgOy8vIGoxCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTZdICAgICAgOy8vIDQqajcKLSAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNl0gICAgICA7Ly8gajUKLSAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNl0gICAgICA7Ly8gajMKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIDIqajcKLSAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajcgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgU1NVQjE2ICB4aTYsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gajEtajcKLSAgICAgICAgU0hBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCi0gICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKLSAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgotICAgICAgICAKLSAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQotICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCi0gICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCi0gICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgotICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80Ci0gICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKLSAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMyKjE2XSAgICAgIDsvLyBqMgotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM2KjE2XSAgICAgIDsvLyAyKmo2Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83Ci0gICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNwotICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYKLSAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1Ci0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNgotICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80Ci0gICAgICAgIAotICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzQqMTZdICAgICAgOy8vIGo0Ci0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyY10sICM0ICAgICAgICAgOy8vIGowCi0KLSAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCi0gICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHhpMCwgeGkwLCB4aXQsIExTTCAjMiAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAotICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKLSAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCi0gICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgotICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKLSAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgU0hBREQxNiB4ZjMsIHhnMywgeGc0Ci0gICAgICAgIFNIU1VCMTYgeGY0LCB4ZzMsIHhnNAotICAgICAgICBTSEFERDE2IHhmMiwgeGcyLCB4ZzUKLSAgICAgICAgU0hTVUIxNiB4ZjUsIHhnMiwgeGc1Ci0gICAgICAgIFNIQUREMTYgeGYxLCB4ZzEsIHhnNgotICAgICAgICBTSFNVQjE2IHhmNiwgeGcxLCB4ZzYKLSAgICAgICAgU0hBREQxNiB4ZjAsIHhnMCwgeGc3Ci0gICAgICAgIFNIU1VCMTYgeGY3LCB4ZzAsIHhnNwotICAgICAgICAKLSAgICAgICAgOy8vIFNhdHVyYXRlCi0gICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICBVU0FUMTYgIHhmMCwgIzgsIHhmMAotICAgICAgICAgICAgVVNBVDE2ICB4ZjEsICM4LCB4ZjEKLSAgICAgICAgICAgIFVTQVQxNiAgeGYyLCAjOCwgeGYyCi0gICAgICAgICAgICBVU0FUMTYgIHhmMywgIzgsIHhmMwotICAgICAgICAgICAgVVNBVDE2ICB4ZjQsICM4LCB4ZjQKLSAgICAgICAgICAgIFVTQVQxNiAgeGY1LCAjOCwgeGY1Ci0gICAgICAgICAgICBVU0FUMTYgIHhmNiwgIzgsIHhmNgotICAgICAgICAgICAgVVNBVDE2ICB4ZjcsICM4LCB4ZjcgICAgICAgIAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQotICAgICAgICAgICAgU1NBVDE2ICB4ZjAsICM5LCB4ZjAKLSAgICAgICAgICAgIFNTQVQxNiAgeGYxLCAjOSwgeGYxCi0gICAgICAgICAgICBTU0FUMTYgIHhmMiwgIzksIHhmMgotICAgICAgICAgICAgU1NBVDE2ICB4ZjMsICM5LCB4ZjMKLSAgICAgICAgICAgIFNTQVQxNiAgeGY0LCAjOSwgeGY0Ci0gICAgICAgICAgICBTU0FUMTYgIHhmNSwgIzksIHhmNQotICAgICAgICAgICAgU1NBVDE2ICB4ZjYsICM5LCB4ZjYKLSAgICAgICAgICAgIFNTQVQxNiAgeGY3LCAjOSwgeGY3ICAgICAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdG8gUm93LCBQYWNrIGFuZCBzdG9yZQotICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgT1JSICAgICB4ZjAsIHhmMCwgeGYxLCBMU0wgIzggOy8vIFsgYjEgYjAgYTEgYTAgXQotICAgICAgICAgICAgT1JSICAgICB4ZjIsIHhmMiwgeGYzLCBMU0wgIzggOy8vIFsgYjMgYjIgYTMgYTIgXQotICAgICAgICAgICAgT1JSICAgICB4ZjQsIHhmNCwgeGY1LCBMU0wgIzggOy8vIFsgYjUgYjQgYTUgYTQgXQotICAgICAgICAgICAgT1JSICAgICB4ZjYsIHhmNiwgeGY3LCBMU0wgIzggOy8vIFsgYjcgYjYgYTcgYTYgXQotICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMiwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjIsIHhmMCwgQVNSICMxNgotICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjQsIHhmNiwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjYsIHhmNCwgQVNSICMxNgotICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjN9Ci0gICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5Iik6TE9SOigiJG91dHNpemUiPSJzMTYiKSAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgotICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCi0gICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEJDQyAgICAgdjZfaWRjdF9yb3ckX0YKLSAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUwotCi0KLSAgICAgICAgSUYgQ29ydGV4QTgKLSAgICAgICAgCi1TcmMwICAgICAgICAgICAgRVFVICA3ICAgICAgICAgICAgICAKLVNyYzEgICAgICAgICAgICBFUVUgIDggICAgICAgICAgICAgIAotU3JjMiAgICAgICAgICAgIEVRVSAgOSAgICAgICAgICAgICAgCi1TcmMzICAgICAgICAgICAgRVFVICAxMCAgICAgICAgICAgICAgCi1TcmM0ICAgICAgICAgICAgRVFVICAxMSAgICAgICAgICAgICAgCi1TcmM1ICAgICAgICAgICAgRVFVICAxMiAgICAgICAgICAgICAgCi1TcmM2ICAgICAgICAgICAgRVFVICAxMwotU3JjNyAgICAgICAgICAgIEVRVSAgMTQKLVRtcCAgICAgICAgICAgICBFUVUgIDE1Ci0KLXFYajAgICAgICAgICAgICBRTiBTcmMwLlMxNiAKLXFYajEgICAgICAgICAgICBRTiBTcmMxLlMxNgotcVhqMiAgICAgICAgICAgIFFOIFNyYzIuUzE2Ci1xWGozICAgICAgICAgICAgUU4gU3JjMy5TMTYKLXFYajQgICAgICAgICAgICBRTiBTcmM0LlMxNgotcVhqNSAgICAgICAgICAgIFFOIFNyYzUuUzE2Ci1xWGo2ICAgICAgICAgICAgUU4gU3JjNi5TMTYKLXFYajcgICAgICAgICAgICBRTiBTcmM3LlMxNgotcVhqdCAgICAgICAgICAgIFFOIFRtcC5TMTYKLQotZFhqMGxvICAgICAgICAgIEROIChTcmMwKjIpLlMxNgotZFhqMGhpICAgICAgICAgIEROIChTcmMwKjIrMSkuUzE2Ci1kWGoxbG8gICAgICAgICAgRE4gKFNyYzEqMikuUzE2Ci1kWGoxaGkgICAgICAgICAgRE4gKFNyYzEqMisxKS5TMTYKLWRYajJsbyAgICAgICAgICBETiAoU3JjMioyKS5TMTYKLWRYajJoaSAgICAgICAgICBETiAoU3JjMioyKzEpLlMxNgotZFhqM2xvICAgICAgICAgIEROIChTcmMzKjIpLlMxNgotZFhqM2hpICAgICAgICAgIEROIChTcmMzKjIrMSkuUzE2Ci1kWGo0bG8gICAgICAgICAgRE4gKFNyYzQqMikuUzE2Ci1kWGo0aGkgICAgICAgICAgRE4gKFNyYzQqMisxKS5TMTYKLWRYajVsbyAgICAgICAgICBETiAoU3JjNSoyKS5TMTYKLWRYajVoaSAgICAgICAgICBETiAoU3JjNSoyKzEpLlMxNgotZFhqNmxvICAgICAgICAgIEROIChTcmM2KjIpLlMxNgotZFhqNmhpICAgICAgICAgIEROIChTcmM2KjIrMSkuUzE2Ci1kWGo3bG8gICAgICAgICAgRE4gKFNyYzcqMikuUzE2Ci1kWGo3aGkgICAgICAgICAgRE4gKFNyYzcqMisxKS5TMTYKLWRYanRsbyAgICAgICAgICBETiAoVG1wKjIpLlMxNgotZFhqdGhpICAgICAgICAgIEROIChUbXAqMisxKS5TMTYKLQotcVhpMCAgICAgICAgICAgIFFOIHFYajAKLXFYaTEgICAgICAgICAgICBRTiBxWGo0Ci1xWGkyICAgICAgICAgICAgUU4gcVhqMgotcVhpMyAgICAgICAgICAgIFFOIHFYajcKLXFYaTQgICAgICAgICAgICBRTiBxWGo1Ci1xWGk1ICAgICAgICAgICAgUU4gcVhqdAotcVhpNiAgICAgICAgICAgIFFOIHFYajEKLXFYaTcgICAgICAgICAgICBRTiBxWGo2Ci1xWGl0ICAgICAgICAgICAgUU4gcVhqMwotCi1kWGkwbG8gICAgICAgICAgRE4gZFhqMGxvCi1kWGkwaGkgICAgICAgICAgRE4gZFhqMGhpCi1kWGkxbG8gICAgICAgICAgRE4gZFhqNGxvCi1kWGkxaGkgICAgICAgICAgRE4gZFhqNGhpCi1kWGkybG8gICAgICAgICAgRE4gZFhqMmxvCi1kWGkyaGkgICAgICAgICAgRE4gZFhqMmhpCi1kWGkzbG8gICAgICAgICAgRE4gZFhqN2xvCi1kWGkzaGkgICAgICAgICAgRE4gZFhqN2hpCi1kWGk0bG8gICAgICAgICAgRE4gZFhqNWxvCi1kWGk0aGkgICAgICAgICAgRE4gZFhqNWhpCi1kWGk1bG8gICAgICAgICAgRE4gZFhqdGxvCi1kWGk1aGkgICAgICAgICAgRE4gZFhqdGhpCi1kWGk2bG8gICAgICAgICAgRE4gZFhqMWxvCi1kWGk2aGkgICAgICAgICAgRE4gZFhqMWhpCi1kWGk3bG8gICAgICAgICAgRE4gZFhqNmxvCi1kWGk3aGkgICAgICAgICAgRE4gZFhqNmhpCi1kWGl0bG8gICAgICAgICAgRE4gZFhqM2xvCi1kWGl0aGkgICAgICAgICAgRE4gZFhqM2hpCi0KLXFYaDAgICAgICAgICAgICBRTiBxWGl0Ci1xWGgxICAgICAgICAgICAgUU4gcVhpMAotcVhoMiAgICAgICAgICAgIFFOIHFYaTIKLXFYaDMgICAgICAgICAgICBRTiBxWGkzCi1xWGg0ICAgICAgICAgICAgUU4gcVhpNwotcVhoNSAgICAgICAgICAgIFFOIHFYaTUKLXFYaDYgICAgICAgICAgICBRTiBxWGk0Ci1xWGg3ICAgICAgICAgICAgUU4gcVhpMQotcVhodCAgICAgICAgICAgIFFOIHFYaTYKLQotZFhoMGxvICAgICAgICAgIEROIGRYaXRsbwotZFhoMGhpICAgICAgICAgIEROIGRYaXRoaQotZFhoMWxvICAgICAgICAgIEROIGRYaTBsbwotZFhoMWhpICAgICAgICAgIEROIGRYaTBoaQotZFhoMmxvICAgICAgICAgIEROIGRYaTJsbwotZFhoMmhpICAgICAgICAgIEROIGRYaTJoaQotZFhoM2xvICAgICAgICAgIEROIGRYaTNsbwotZFhoM2hpICAgICAgICAgIEROIGRYaTNoaQotZFhoNGxvICAgICAgICAgIEROIGRYaTdsbwotZFhoNGhpICAgICAgICAgIEROIGRYaTdoaQotZFhoNWxvICAgICAgICAgIEROIGRYaTVsbwotZFhoNWhpICAgICAgICAgIEROIGRYaTVoaQotZFhoNmxvICAgICAgICAgIEROIGRYaTRsbwotZFhoNmhpICAgICAgICAgIEROIGRYaTRoaQotZFhoN2xvICAgICAgICAgIEROIGRYaTFsbwotZFhoN2hpICAgICAgICAgIEROIGRYaTFoaQotZFhodGxvICAgICAgICAgIEROIGRYaTZsbwotZFhodGhpICAgICAgICAgIEROIGRYaTZoaQotCi1xWGcwICAgICAgICAgICAgUU4gcVhoMgotcVhnMSAgICAgICAgICAgIFFOIHFYaHQKLXFYZzIgICAgICAgICAgICBRTiBxWGgxCi1xWGczICAgICAgICAgICAgUU4gcVhoMAotcVhnNCAgICAgICAgICAgIFFOIHFYaDQKLXFYZzUgICAgICAgICAgICBRTiBxWGg1Ci1xWGc2ICAgICAgICAgICAgUU4gcVhoNgotcVhnNyAgICAgICAgICAgIFFOIHFYaDcKLXFYZ3QgICAgICAgICAgICBRTiBxWGgzCi0KLXFYZjAgICAgICAgICAgICBRTiBxWGc2Ci1xWGYxICAgICAgICAgICAgUU4gcVhnNQotcVhmMiAgICAgICAgICAgIFFOIHFYZzQKLXFYZjMgICAgICAgICAgICBRTiBxWGd0Ci1xWGY0ICAgICAgICAgICAgUU4gcVhnMwotcVhmNSAgICAgICAgICAgIFFOIHFYZzIKLXFYZjYgICAgICAgICAgICBRTiBxWGcxCi1xWGY3ICAgICAgICAgICAgUU4gcVhnMAotcVhmdCAgICAgICAgICAgIFFOIHFYZzcKLQotCi1xWHQwICAgICAgICAgICAgUU4gMS5TMzIKLXFYdDEgICAgICAgICAgICBRTiAyLlMzMgotcVQwbG8gICAgICAgICAgIFFOIDEuUzMyICAgICAgICAgCi1xVDBoaSAgICAgICAgICAgUU4gMi5TMzIgICAgICAgICAKLXFUMWxvICAgICAgICAgICBRTiAzLlMzMiAgICAgICAgIAotcVQxaGkgICAgICAgICAgIFFOIDQuUzMyICAgICAgICAgCi1xU2NhbGVsbyAgICAgICAgUU4gNS5TMzIgICAgICAgIDsvLyB1c2VkIHRvIHJlYWQgcG9zdCBzY2FsZSB2YWx1ZXMKLXFTY2FsZWhpICAgICAgICBRTiA2LlMzMgotcVRlbXAwICAgICAgICAgIFFOIDUuUzMyICAgICAgICAgCi1xVGVtcDEgICAgICAgICAgUU4gNi5TMzIgICAgCi0KLQotU2NhbGUxICAgICAgICAgIEVRVSA2Ci1TY2FsZTIgICAgICAgICAgRVFVIDE1Ci1xU2NhbGUxICAgICAgICAgUU4gU2NhbGUxLlMxNiAgICAgCi1xU2NhbGUyICAgICAgICAgUU4gU2NhbGUyLlMxNiAgICAgCi1kU2NhbGUxbG8gICAgICAgRE4gKFNjYWxlMSoyKS5TMTYgICAgIAotZFNjYWxlMWhpICAgICAgIEROIChTY2FsZTEqMisxKS5TMTYKLWRTY2FsZTJsbyAgICAgICBETiAoU2NhbGUyKjIpLlMxNiAgICAgCi1kU2NhbGUyaGkgICAgICAgRE4gKFNjYWxlMioyKzEpLlMxNgotCi1kQ29lZnMgICAgICAgICAgRE4gMC5TMTYgICAgICAgIDsvLyBTY2FsZSBjb2VmZmljaWVudHMgaW4gZm9ybWF0IHtbMF0gW0NdIFtTXSBbSW52U3FydDJdfQotSW52U3FydDIgICAgICAgIEROIGRDb2Vmc1swXSAgICA7Ly8gMS9zcXJ0KDIpIGluIFExNQotUyAgICAgICAgICAgICAgIEROIGRDb2Vmc1sxXSAgICA7Ly8gU2luKFBJLzgpIGluIFExNQotQyAgICAgICAgICAgICAgIEROIGRDb2Vmc1syXSAgICA7Ly8gQ29zKFBJLzgpIGluIFExNQotCi1wVGVtcCAgICAgICAgICAgUk4gMTIKLQotICAgICAgICAgICAgICAgIAotICAgICAgICBJTVBPUlQgIGFybUNPTU1fSURDVENvZWYKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGowLHFYajF9LCBbcFNyYyBANjRdIQotICAgICAgICBWTEQxICAgICAgICB7cVhqMixxWGozfSwgW3BTcmMgQDY0XSEKLSAgICAgICAgVkxEMSAgICAgICAge3FYajQscVhqNX0sIFtwU3JjIEA2NF0hCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGo2LHFYajd9LCBbcFNyYyBANjRdIQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgUHJlU2NhbGUgYW5kIG11bHRpcGx5IHdpdGggU3JjCi0gICAgICAgIDsvLyBJU3RhZ2UgNAotICAgICAgICAKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTZYMTYgTXVsCi0gICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzJYMzIgLHVsCi0gICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgotICAgICAgICBFTkRJRgotCi0gICAgICAgIDsvLyBJU3RhZ2UgMwotICAgICAgICBWUURNVUxIICAgICBxWGkyLCBxWGkyLCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBpMi9zcXJ0KDIpCi0gICAgICAgIFZIQUREICAgICAgIHFYaDAsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMCtpMSkvMgotICAgICAgICBWSFNVQiAgICAgICBxWGgxLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAtaTEpLzIKLSAgICAgICAgVkhBREQgICAgICAgcVhoNywgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgIFZTVUIgICAgICAgIHFYaDUsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICBWUURNVUxIICAgICBxWGg1LCBxWGg1LCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBoNS9zcXJ0KDIpCi0gICAgICAgIFZTVUIgICAgICAgIHFYaDIsIHFYaTIsIHFYaTMgICAgICAgICAgICAgICAgOy8vIGgyLCBoMwotCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTRsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTQKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFhpNmxvLCBTICAgICAgICAgICAgICAgICA7Ly8gYyppNCtzKmk2Ci0gICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTRoaSwgQwotICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWGk2aGksIFMKLSAgICAgICAgVlNIUk4gICAgICAgZFhoNGxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDQKLSAgICAgICAgVlNIUk4gICAgICAgZFhoNGhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTZsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTYKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFhpNGxvLCBTICAgICAgICAgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2Ci0gICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTZoaSwgQwotICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWGk0aGksIFMKLSAgICAgICAgVlNIUk4gICAgICAgZFhoNmxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDYKLSAgICAgICAgVlNIUk4gICAgICAgZFhoNmhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMgotICAgICAgICBWU1VCICAgICAgICBxWGc2LCBxWGg2LCBxWGg3Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZzUsIHFYaDUsIHFYZzYKLSAgICAgICAgVlNVQiAgICAgICAgcVhnNCwgcVhoNCwgcVhnNQotICAgICAgICBWSEFERCAgICAgICBxWGcxLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxK2gyKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFYZzIsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKLSAgICAgICAgVkhBREQgICAgICAgcVhnMCwgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMCtoMykvMgotICAgICAgICBWSFNVQiAgICAgICBxWGczLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwLWgzKS8yCi0KLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFZBREQgICAgICAgIHFYZjMsIHFYZzMsIHFYZzQgICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBxWGY0LCBxWGczLCBxWGc0ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMiwgcVhnMiwgcVhnNSAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIHFYZjUsIHFYZzIsIHFYZzUgICAgICAgIAotICAgICAgICBWQUREICAgICAgICBxWGYxLCBxWGcxLCBxWGc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZjYsIHFYZzEsIHFYZzYgICAgICAgIAotICAgICAgICBWQUREICAgICAgICBxWGYwLCBxWGcwLCBxWGc3Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZjcsIHFYZzAsIHFYZzcgICAgICAKLQotICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAotWFRSMCAgICAgICAgICAgIEVRVSBTcmM1Ci1YVFIxICAgICAgICAgICAgRVFVIFRtcAotWFRSMiAgICAgICAgICAgIEVRVSBTcmM2Ci1YVFIzICAgICAgICAgICAgRVFVIFNyYzcKLVhUUjQgICAgICAgICAgICBFUVUgU3JjMwotWFRSNSAgICAgICAgICAgIEVRVSBTcmMwCi1YVFI2ICAgICAgICAgICAgRVFVIFNyYzEKLVhUUjcgICAgICAgICAgICBFUVUgU3JjMgotWFRSdCAgICAgICAgICAgIEVRVSBTcmM0Ci0gICAgICAgICAgICAgICAgCi1xQTAgICAgICAgICAgICAgUU4gIFhUUjAuUzMyICA7Ly8gZm9yIFhUUnBvc2UKLXFBMSAgICAgICAgICAgICBRTiAgWFRSMS5TMzIKLXFBMiAgICAgICAgICAgICBRTiAgWFRSMi5TMzIKLXFBMyAgICAgICAgICAgICBRTiAgWFRSMy5TMzIKLXFBNCAgICAgICAgICAgICBRTiAgWFRSNC5TMzIKLXFBNSAgICAgICAgICAgICBRTiAgWFRSNS5TMzIKLXFBNiAgICAgICAgICAgICBRTiAgWFRSNi5TMzIKLXFBNyAgICAgICAgICAgICBRTiAgWFRSNy5TMzIKLQotZEIwICAgICAgICAgICAgIEROICBYVFIwKjIrMSAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAotZEIxICAgICAgICAgICAgIEROICBYVFIxKjIrMQotZEIyICAgICAgICAgICAgIEROICBYVFIyKjIrMQotZEIzICAgICAgICAgICAgIEROICBYVFIzKjIrMQotZEI0ICAgICAgICAgICAgIEROICBYVFI0KjIKLWRCNSAgICAgICAgICAgICBETiAgWFRSNSoyCi1kQjYgICAgICAgICAgICAgRE4gIFhUUjYqMgotZEI3ICAgICAgICAgICAgIEROICBYVFI3KjIKLQotICAgICAgICAgIAotICAgICAgICBWVFJOICAgICAgICBxWGYwLCBxWGYxCi0gICAgICAgIFZUUk4gICAgICAgIHFYZjIsIHFYZjMKLSAgICAgICAgVlRSTiAgICAgICAgcVhmNCwgcVhmNQotICAgICAgICBWVFJOICAgICAgICBxWGY2LCBxWGY3Ci0gICAgICAgIFZUUk4gICAgICAgIHFBMCwgcUEyCi0gICAgICAgIFZUUk4gICAgICAgIHFBMSwgcUEzCi0gICAgICAgIFZUUk4gICAgICAgIHFBNCwgcUE2Ci0gICAgICAgIFZUUk4gICAgICAgIHFBNSwgcUE3ICAgICAgICAKLSAgICAgICAgVlNXUCAgICAgICAgZEIwLCBkQjQKLSAgICAgICAgVlNXUCAgICAgICAgZEIxLCBkQjUKLSAgICAgICAgVlNXUCAgICAgICAgZEIyLCBkQjYKLSAgICAgICAgVlNXUCAgICAgICAgZEIzLCBkQjcKLSAgICAgICAgCi0KLXFZajAgICAgICAgICAgICBRTiBxWGYwCi1xWWoxICAgICAgICAgICAgUU4gcVhmMQotcVlqMiAgICAgICAgICAgIFFOIHFYZjIKLXFZajMgICAgICAgICAgICBRTiBxWGYzCi1xWWo0ICAgICAgICAgICAgUU4gcVhmNAotcVlqNSAgICAgICAgICAgIFFOIHFYZjUKLXFZajYgICAgICAgICAgICBRTiBxWGY2Ci1xWWo3ICAgICAgICAgICAgUU4gcVhmNwotcVlqdCAgICAgICAgICAgIFFOIHFYZnQKLQotZFlqMGxvICAgICAgICAgIEROIChYVFIwKjIpLlMxNgotZFlqMGhpICAgICAgICAgIEROIChYVFIwKjIrMSkuUzE2Ci1kWWoxbG8gICAgICAgICAgRE4gKFhUUjEqMikuUzE2Ci1kWWoxaGkgICAgICAgICAgRE4gKFhUUjEqMisxKS5TMTYKLWRZajJsbyAgICAgICAgICBETiAoWFRSMioyKS5TMTYKLWRZajJoaSAgICAgICAgICBETiAoWFRSMioyKzEpLlMxNgotZFlqM2xvICAgICAgICAgIEROIChYVFIzKjIpLlMxNgotZFlqM2hpICAgICAgICAgIEROIChYVFIzKjIrMSkuUzE2Ci1kWWo0bG8gICAgICAgICAgRE4gKFhUUjQqMikuUzE2Ci1kWWo0aGkgICAgICAgICAgRE4gKFhUUjQqMisxKS5TMTYKLWRZajVsbyAgICAgICAgICBETiAoWFRSNSoyKS5TMTYKLWRZajVoaSAgICAgICAgICBETiAoWFRSNSoyKzEpLlMxNgotZFlqNmxvICAgICAgICAgIEROIChYVFI2KjIpLlMxNgotZFlqNmhpICAgICAgICAgIEROIChYVFI2KjIrMSkuUzE2Ci1kWWo3bG8gICAgICAgICAgRE4gKFhUUjcqMikuUzE2Ci1kWWo3aGkgICAgICAgICAgRE4gKFhUUjcqMisxKS5TMTYKLWRZanRsbyAgICAgICAgICBETiAoWFRSdCoyKS5TMTYKLWRZanRoaSAgICAgICAgICBETiAoWFRSdCoyKzEpLlMxNgotCi1xWWkwICAgICAgICAgICAgUU4gcVlqMAotcVlpMSAgICAgICAgICAgIFFOIHFZajQKLXFZaTIgICAgICAgICAgICBRTiBxWWoyCi1xWWkzICAgICAgICAgICAgUU4gcVlqNwotcVlpNCAgICAgICAgICAgIFFOIHFZajUKLXFZaTUgICAgICAgICAgICBRTiBxWWp0Ci1xWWk2ICAgICAgICAgICAgUU4gcVlqMQotcVlpNyAgICAgICAgICAgIFFOIHFZajYKLXFZaXQgICAgICAgICAgICBRTiBxWWozCi0KLWRZaTBsbyAgICAgICAgICBETiBkWWowbG8KLWRZaTBoaSAgICAgICAgICBETiBkWWowaGkKLWRZaTFsbyAgICAgICAgICBETiBkWWo0bG8KLWRZaTFoaSAgICAgICAgICBETiBkWWo0aGkKLWRZaTJsbyAgICAgICAgICBETiBkWWoybG8KLWRZaTJoaSAgICAgICAgICBETiBkWWoyaGkKLWRZaTNsbyAgICAgICAgICBETiBkWWo3bG8KLWRZaTNoaSAgICAgICAgICBETiBkWWo3aGkKLWRZaTRsbyAgICAgICAgICBETiBkWWo1bG8KLWRZaTRoaSAgICAgICAgICBETiBkWWo1aGkKLWRZaTVsbyAgICAgICAgICBETiBkWWp0bG8KLWRZaTVoaSAgICAgICAgICBETiBkWWp0aGkKLWRZaTZsbyAgICAgICAgICBETiBkWWoxbG8KLWRZaTZoaSAgICAgICAgICBETiBkWWoxaGkKLWRZaTdsbyAgICAgICAgICBETiBkWWo2bG8KLWRZaTdoaSAgICAgICAgICBETiBkWWo2aGkKLWRZaXRsbyAgICAgICAgICBETiBkWWozbG8KLWRZaXRoaSAgICAgICAgICBETiBkWWozaGkKLQotcVloMCAgICAgICAgICAgIFFOIHFZaXQKLXFZaDEgICAgICAgICAgICBRTiBxWWkwCi1xWWgyICAgICAgICAgICAgUU4gcVlpMgotcVloMyAgICAgICAgICAgIFFOIHFZaTMKLXFZaDQgICAgICAgICAgICBRTiBxWWk3Ci1xWWg1ICAgICAgICAgICAgUU4gcVlpNQotcVloNiAgICAgICAgICAgIFFOIHFZaTQKLXFZaDcgICAgICAgICAgICBRTiBxWWkxCi1xWWh0ICAgICAgICAgICAgUU4gcVlpNgotCi1kWWgwbG8gICAgICAgICAgRE4gZFlpdGxvCi1kWWgwaGkgICAgICAgICAgRE4gZFlpdGhpCi1kWWgxbG8gICAgICAgICAgRE4gZFlpMGxvCi1kWWgxaGkgICAgICAgICAgRE4gZFlpMGhpCi1kWWgybG8gICAgICAgICAgRE4gZFlpMmxvCi1kWWgyaGkgICAgICAgICAgRE4gZFlpMmhpCi1kWWgzbG8gICAgICAgICAgRE4gZFlpM2xvCi1kWWgzaGkgICAgICAgICAgRE4gZFlpM2hpCi1kWWg0bG8gICAgICAgICAgRE4gZFlpN2xvCi1kWWg0aGkgICAgICAgICAgRE4gZFlpN2hpCi1kWWg1bG8gICAgICAgICAgRE4gZFlpNWxvCi1kWWg1aGkgICAgICAgICAgRE4gZFlpNWhpCi1kWWg2bG8gICAgICAgICAgRE4gZFlpNGxvCi1kWWg2aGkgICAgICAgICAgRE4gZFlpNGhpCi1kWWg3bG8gICAgICAgICAgRE4gZFlpMWxvCi1kWWg3aGkgICAgICAgICAgRE4gZFlpMWhpCi1kWWh0bG8gICAgICAgICAgRE4gZFlpNmxvCi1kWWh0aGkgICAgICAgICAgRE4gZFlpNmhpCi0KLXFZZzAgICAgICAgICAgICBRTiBxWWgyCi1xWWcxICAgICAgICAgICAgUU4gcVlodAotcVlnMiAgICAgICAgICAgIFFOIHFZaDEKLXFZZzMgICAgICAgICAgICBRTiBxWWgwCi1xWWc0ICAgICAgICAgICAgUU4gcVloNAotcVlnNSAgICAgICAgICAgIFFOIHFZaDUKLXFZZzYgICAgICAgICAgICBRTiBxWWg2Ci1xWWc3ICAgICAgICAgICAgUU4gcVloNwotcVlndCAgICAgICAgICAgIFFOIHFZaDMKLQotcVlmMCAgICAgICAgICAgIFFOIHFZZzYKLXFZZjEgICAgICAgICAgICBRTiBxWWc1Ci1xWWYyICAgICAgICAgICAgUU4gcVlnNAotcVlmMyAgICAgICAgICAgIFFOIHFZZ3QKLXFZZjQgICAgICAgICAgICBRTiBxWWczCi1xWWY1ICAgICAgICAgICAgUU4gcVlnMgotcVlmNiAgICAgICAgICAgIFFOIHFZZzEKLXFZZjcgICAgICAgICAgICBRTiBxWWcwCi1xWWZ0ICAgICAgICAgICAgUU4gcVlnNwotCi0gICAgICAgIFZSU0hSICAgICAgIHFZajcsIHFZajcsICMyCi0gICAgICAgIFZSU0hSICAgICAgIHFZajYsIHFZajYsICMxCi0gICAgICAgIAotICAgICAgICBWSEFERCAgICAgICBxWWk1LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTUgPSAoajErajcpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVlpNiwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk2ID0gajEtajcKLSAgICAgICAgVkhBREQgICAgICAgcVlpMywgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkzID0gKGoyK2o2KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaTIsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMiA9IGoyLWo2Ci0gICAgICAgIFZIQUREICAgICAgIHFZaTcsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNyA9IChqNStqMykvMgotICAgICAgICBWU1VCICAgICAgICBxWWk0LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTQgPSBqNS1qMwotCi0gICAgICAgIFZRRE1VTEggICAgIHFZaTIsIHFZaTIsIEludlNxcnQyICAgIDsvLyBpMi9zcXJ0KDIpCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcFRlbXAsICMweDQgICAgICAgICAgICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCi0gICAgICAgIFZEVVAgICAgICAgIHFTY2FsZTEsIHBUZW1wICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0Ci0gICAgICAgIFZBREQgICAgICAgIHFZaTAsIHFZaTAsIHFTY2FsZTEKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgIHFZaDAsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAraTEpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVloMSwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMC1pMSkvMgotCi0gICAgICAgIFZIQUREICAgICAgIHFZaDcsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgVlNVQiAgICAgICAgcVloNSwgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICBWU1VCICAgICAgICBxWWgyLCBxWWkyLCBxWWkzICAgICAgICA7Ly8gaDIsIGgzCi0gICAgICAgIFZRRE1VTEggICAgIHFZaDUsIHFZaDUsIEludlNxcnQyICAgIDsvLyBoNS9zcXJ0KDIpCi0KLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNGxvLCBDICAgICAgICAgOy8vIGMqaTQKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFlpNmxvLCBTICAgICAgICAgOy8vIGMqaTQrcyppNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk0aGksIEMKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFlpNmhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRZaDRsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNAotICAgICAgICBWU0hSTiAgICAgICBkWWg0aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNmxvLCBDICAgICAgICAgOy8vIGMqaTYKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFlpNGxvLCBTICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk2aGksIEMKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFlpNGhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRZaDZsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNgotICAgICAgICBWU0hSTiAgICAgICBkWWg2aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVlnNiwgcVloNiwgcVloNwotICAgICAgICBWU1VCICAgICAgICBxWWc1LCBxWWg1LCBxWWc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFZZzQsIHFZaDQsIHFZZzUKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgVkhBREQgICAgICAgcVlnMSwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMStoMikvMgotICAgICAgICBWSFNVQiAgICAgICBxWWcyLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxLWgyKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFZZzAsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAraDMpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVlnMywgcVloMCwgcVloMyAgICAgICAgOy8vIChoMC1oMykvMgotICAgICAgICAKLQotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjMsIHFZZzMsIHFZZzQgICAgICAgIAotICAgICAgICBWSFNVQiAgICAgICAgcVlmNCwgcVlnMywgcVlnNCAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgICBxWWYyLCBxWWcyLCBxWWc1ICAgICAgICAKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjUsIHFZZzIsIHFZZzUgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMSwgcVlnMSwgcVlnNgotICAgICAgICBWSFNVQiAgICAgICAgcVlmNiwgcVlnMSwgcVlnNiAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgICBxWWYwLCBxWWcwLCBxWWc3Ci0gICAgICAgIFZIU1VCICAgICAgICBxWWY3LCBxWWcwLCBxWWc3ICAgICAgCi0KLVlUUjAgICAgICAgICAgICBFUVUgU3JjMAotWVRSMSAgICAgICAgICAgIEVRVSBTcmM0Ci1ZVFIyICAgICAgICAgICAgRVFVIFNyYzEKLVlUUjMgICAgICAgICAgICBFUVUgU3JjMgotWVRSNCAgICAgICAgICAgIEVRVSBTcmM3Ci1ZVFI1ICAgICAgICAgICAgRVFVIFNyYzUKLVlUUjYgICAgICAgICAgICBFUVUgVG1wCi1ZVFI3ICAgICAgICAgICAgRVFVIFNyYzYKLVlUUnQgICAgICAgICAgICBFUVUgU3JjMwotCi1xQzAgICAgICAgICAgICAgUU4gIFlUUjAuUzMyICAgICAgICAgICAgICAgIDsvLyBmb3IgWVRScG9zZQotcUMxICAgICAgICAgICAgIFFOICBZVFIxLlMzMgotcUMyICAgICAgICAgICAgIFFOICBZVFIyLlMzMgotcUMzICAgICAgICAgICAgIFFOICBZVFIzLlMzMgotcUM0ICAgICAgICAgICAgIFFOICBZVFI0LlMzMgotcUM1ICAgICAgICAgICAgIFFOICBZVFI1LlMzMgotcUM2ICAgICAgICAgICAgIFFOICBZVFI2LlMzMgotcUM3ICAgICAgICAgICAgIFFOICBZVFI3LlMzMgotCi1kRDAgICAgICAgICAgICAgRE4gIFlUUjAqMisxICAgICAgICAgICAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAotZEQxICAgICAgICAgICAgIEROICBZVFIxKjIrMQotZEQyICAgICAgICAgICAgIEROICBZVFIyKjIrMQotZEQzICAgICAgICAgICAgIEROICBZVFIzKjIrMQotZEQ0ICAgICAgICAgICAgIEROICBZVFI0KjIKLWRENSAgICAgICAgICAgICBETiAgWVRSNSoyCi1kRDYgICAgICAgICAgICAgRE4gIFlUUjYqMgotZEQ3ICAgICAgICAgICAgIEROICBZVFI3KjIKLSAgICAgICAgICAKLSAgICAgICAgVlRSTiAgICAgICAgcVlmMCwgcVlmMQotICAgICAgICBWVFJOICAgICAgICBxWWYyLCBxWWYzCi0gICAgICAgIFZUUk4gICAgICAgIHFZZjQsIHFZZjUKLSAgICAgICAgVlRSTiAgICAgICAgcVlmNiwgcVlmNwotICAgICAgICBWVFJOICAgICAgICBxQzAsIHFDMgotICAgICAgICBWVFJOICAgICAgICBxQzEsIHFDMwotICAgICAgICBWVFJOICAgICAgICBxQzQsIHFDNgotICAgICAgICBWVFJOICAgICAgICBxQzUsIHFDNyAgICAgICAgCi0gICAgICAgIFZTV1AgICAgICAgIGREMCwgZEQ0Ci0gICAgICAgIFZTV1AgICAgICAgIGREMSwgZEQ1Ci0gICAgICAgIFZTV1AgICAgICAgIGREMiwgZEQ2Ci0gICAgICAgIFZTV1AgICAgICAgIGREMywgZEQ3Ci0KLSAgICAgICAgCi1kWWYwVTggICAgICAgICAgRE4gWVRSMCoyLlU4Ci1kWWYxVTggICAgICAgICAgRE4gWVRSMSoyLlU4Ci1kWWYyVTggICAgICAgICAgRE4gWVRSMioyLlU4Ci1kWWYzVTggICAgICAgICAgRE4gWVRSMyoyLlU4Ci1kWWY0VTggICAgICAgICAgRE4gWVRSNCoyLlU4Ci1kWWY1VTggICAgICAgICAgRE4gWVRSNSoyLlU4Ci1kWWY2VTggICAgICAgICAgRE4gWVRSNioyLlU4Ci1kWWY3VTggICAgICAgICAgRE4gWVRSNyoyLlU4Ci0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERvIHNhdHVyYXRpb24gaWYgb3V0c2l6ZSBpcyBvdGhlciB0aGFuIFMxNgotICAgICAgICA7Ly8KLSAgICAgICAgCi0gICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFswLTI1NV0KLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjBVOCwgcVlmMAotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMVU4LCBxWWYxCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYyVTgsIHFZZjIKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjNVOCwgcVlmMwotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNFU4LCBxWWY0Ci0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY1VTgsIHFZZjUKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjZVOCwgcVlmNgotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmN1U4LCBxWWY3Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQotICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbLTI1NiB0byArMjU1XQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQotICAgICAgICAgICAgCi0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05Ci0gICAgICAgIEVORElGCi0KLSAgICAgICAgOy8vIFN0b3JlIG91dHB1dCBkZXBlbmRpbmcgb24gdGhlIFN0cmlkZSBzaXplCi0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdICAgICAgICAgICAgCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMFU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYxVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjJVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmM1U4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY0VTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjVVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNlU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY3VTgsIFtwRGVzdCBANjRdCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgOy8vICgiJG91dHNpemUiPSJzOSIpIG9yICgiJG91dHNpemUiPSJzMTYiKQotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORElGCi0KLQotCi0gICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAotCi0KLQotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICA7Ly8gU2NhbGUgVFdPIGlucHV0IHJvd3Mgd2l0aCBUV08gcm93cyBvZiAxNiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIGJ5IE1fSURDVF9QUkVTQ0FMRTE2IHRvIHByZS1zY2FsZSBvbmUgcm93Ci0gICAgICAgIDsvLyBpbnB1dCAoRWlnaHQgaW5wdXQgdmFsdWVzKSB3aXRoIG9uZSByb3cgb2Ygc2NhbGUgdmFsdWVzLiBBbHNvIAotICAgICAgICA7Ly8gTG9hZHMgbmV4dCBzY2FsZSB2YWx1ZXMgZnJvbSBwU2NhbGUsIGlmICRMYXN0Um93IGZsYWcgaXMgbm90IHNldC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgotICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCi0gICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8gcVQwbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIHFUMGhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBxVDFsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gcVQxaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIGRTY2FsZTFsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCi0gICAgICAgIDsvLyBkU2NhbGUxaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgotICAgICAgICA7Ly8gZFNjYWxlMmxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQotICAgICAgICA7Ly8gZFNjYWxlMmhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IEZsYWcKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTGFzdFJvdyAgICAgICAgLSBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY3VycmVudCByb3cgaXMgbGFzdCByb3cKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbikKLSAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKQotICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCi0gICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbisxKQotICAgICAgICA7Ly8gcVNjYWxlMSAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdwotICAgICAgICA7Ly8gcVNjYWxlMiAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdysxCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1NDQUxFMTYgJGRBbG8sICRkQWhpLCAkZEJsbywgJGRCaGksICRMYXN0Um93Ci0gICAgICAgIFZNVUxMICAgICAgIHFUMGxvLCAkZEFsbywgZFNjYWxlMWxvCi0gICAgICAgIFZNVUxMICAgICAgIHFUMGhpLCAkZEFoaSwgZFNjYWxlMWhpCi0gICAgICAgIFZNVUxMICAgICAgIHFUMWxvLCAkZEJsbywgZFNjYWxlMmxvCi0gICAgICAgIFZNVUxMICAgICAgIHFUMWhpLCAkZEJoaSwgZFNjYWxlMmhpCi0gICAgICAgIElGICIkTGFzdFJvdyI9IjAiCi0gICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMQotICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEFsbywgcVQwbG8sICMxMiAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRBaGksIHFUMGhpLCAjMTIgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICAgICRkQmxvLCBxVDFsbywgIzEyICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEJoaSwgcVQxaGksICMxMiAgICAgICAgCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDE2IGJpdCBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KLSAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gcVhpbiAgICAgICAgICAgIC0gbiB0aCBvdXRwdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKLSAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKLSAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMGxvLCBkWGowaGksIGRYajFsbywgZFhqMWhpLCAwICAgICAgICA7Ly8gUHJlIHNjYWxlIHJvdyAwICYgMQotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGoybG8sIGRYajJoaSwgZFhqM2xvLCBkWGozaGksIDAgICAgICAgIAotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo0bG8sIGRYajRoaSwgZFhqNWxvLCBkWGo1aGksIDAgICAgICAgIAotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo2bG8sIGRYajZoaSwgZFhqN2xvLCBkWGo3aGksIDEgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICBxWGk1LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBWU1VCICAgICAgICBxWGk2LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIGoxLWo3Ci0gICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgVkhBREQgICAgICAgcVhpMywgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpMiwgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyBqMi1qNgotICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICBWSEFERCAgICAgICBxWGk3LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBWU1VCICAgICAgICBxWGk0LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIGo1LWozCi0gICAgICAgIE1FTkQgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAzMiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCi0gICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byAzMmJpdCBzY2FsZSB2YWx1ZXMgaW4gUTIzIGZvcm1hdAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhpbmxvICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCi0gICAgICAgIDsvLyBkWGluaGkgICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKLXFTY2FsZTBsbyAgICAgICBRTiAwLlMzMgotcVNjYWxlMGhpICAgICAgIFFOIDEuUzMyCi1xU2NhbGUxbG8gICAgICAgUU4gMi5TMzIKLXFTY2FsZTFoaSAgICAgICBRTiAzLlMzMgotcVNjYWxlMmxvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlMmhpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlM2xvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlM2hpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlNGxvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlNGhpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlNWxvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlNWhpICAgICAgIFFOIHFTY2FsZTBoaQotcVNjYWxlNmxvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlNmhpICAgICAgIFFOIHFTY2FsZTBoaQotcVNjYWxlN2xvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlN2hpICAgICAgIFFOIHFTY2FsZTBoaQotCi1xU3JjMGxvICAgICAgICAgUU4gNC5TMzIKLXFTcmMwaGkgICAgICAgICBRTiA1LlMzMgotcVNyYzFsbyAgICAgICAgIFFOIDYuUzMyCi1xU3JjMWhpICAgICAgICAgUU4gU3JjNC5TMzIKLXFTcmMybG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjMmhpICAgICAgICAgUU4gcVNyYzBoaQotcVNyYzNsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmMzaGkgICAgICAgICBRTiBxU3JjMGhpCi1xU3JjNGxvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzRoaSAgICAgICAgIFFOIHFTcmMwaGkKLXFTcmM1bG8gICAgICAgICBRTiBxU3JjMWxvCi1xU3JjNWhpICAgICAgICAgUU4gcVNyYzFoaQotcVNyYzZsbyAgICAgICAgIFFOIHFTcmMxbG8KLXFTcmM2aGkgICAgICAgICBRTiBxU3JjMWhpCi1xU3JjN2xvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzdoaSAgICAgICAgIFFOIHFTcmMwaGkKLQotcVJlczE3bG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczE3aGkgICAgICAgIFFOIHFTY2FsZTBoaQotcVJlczI2bG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczI2aGkgICAgICAgIFFOIHFTY2FsZTBoaQotcVJlczUzbG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczUzaGkgICAgICAgIFFOIHFTY2FsZTBoaQotCi0gICAgICAgICAgICBBREQgICAgICAgICBwVGVtcCwgcFNjYWxlLCAjNCo4KjcgICAgICAgICAgIDsvLyBBZGRyZXNzIG9mICBwU2NhbGVbN10KLSAgICAgICAgICAgIAotICAgICAgICAgICAgOy8vIFJvdyAwCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMGxvLCBxU2NhbGUwaGl9LCBbcFNjYWxlXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwbG8sIGRYajBsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBoaSwgZFhqMGhpLCAjKDEyLTEpICAgICAgICAgICAgCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMWxvLCBxU2NhbGUxaGl9LCBbcFNjYWxlXSEKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwbG8sIHFTY2FsZTBsbywgcVNyYzBsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBoaSwgcVNjYWxlMGhpLCBxU3JjMGhpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlN2xvLCBxU2NhbGU3aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFsbywgZFhqMWxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWhpLCBkWGoxaGksICMoMTItMSkgICAgICAgICAgICAKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBsbywgcVNyYzBsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGhpLCBxU3JjMGhpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2xvLCBkWGo3bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3aGksIGRYajdoaSwgIygxMi0xKQotICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFsbywgcVNjYWxlMWxvLCBxU3JjMWxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWhpLCBxU2NhbGUxaGksIHFTcmMxaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3bG8sIHFTY2FsZTdsbywgcVNyYzdsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdoaSwgcVNjYWxlN2hpLCBxU3JjN2hpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMmxvLCBxU2NhbGUyaGl9LCBbcFNjYWxlXSEKLQotICAgICAgICAgICAgOy8vIFJvdyAxICYgNwotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWhpLCBxUmVzMTdoaSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyBqMS1qNwotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gajEtajcKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmhpLCBxUmVzMTdoaSAgICAgIAotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJsbywgZFhqMmxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmhpLCBkWGoyaGksICMoMTItMSkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU2bG8sIHFTY2FsZTZoaX0sIFtwVGVtcF0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmxvLCBkWGo2bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2aGksIGRYajZoaSwgIygxMi0xKQotICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJsbywgcVNjYWxlMmxvLCBxU3JjMmxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmhpLCBxU2NhbGUyaGksIHFTcmMyaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2bG8sIHFTY2FsZTZsbywgcVNyYzZsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZoaSwgcVNjYWxlNmhpLCBxU3JjNmhpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlM2xvLCBxU2NhbGUzaGl9LCBbcFNjYWxlXSEKLQotICAgICAgICAgICAgOy8vIFJvdyAyICYgNgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMwotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2hpLCBxUmVzMjZoaSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyBqMi1qNgotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gajItajYKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmhpLCBxUmVzMjZoaSAgICAgIAotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNsbywgZFhqM2xvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2hpLCBkWGozaGksICMoMTItMSkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU1bG8sIHFTY2FsZTVoaX0sIFtwVGVtcF0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWxvLCBkWGo1bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1aGksIGRYajVoaSwgIygxMi0xKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNsbywgcVNjYWxlM2xvLCBxU3JjM2xvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2hpLCBxU2NhbGUzaGksIHFTcmMzaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1bG8sIHFTY2FsZTVsbywgcVNyYzVsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVoaSwgcVNjYWxlNWhpLCBxU3JjNWhpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBSb3cgMyAmIDUKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIChqNStqMykvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYqMioyCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTcKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdoaSwgcVJlczUzaGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gajUtajMKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIGo1LWozCi0gICAgICAgICAgICBWTEQxICAgICAgICBxWGo0LCBbcFNyYyBANjRdCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTQKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRoaSwgcVJlczUzaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0bG8sIGRYajRsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRoaSwgZFhqNGhpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNGxvLCBxU2NhbGU0aGl9LCBbcFNjYWxlXSAgICAgICAgICAgIAotICAgICAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgICAgIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0bG8sIHFTY2FsZTRsbywgcVNyYzRsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRoaSwgcVNjYWxlNGhpLCBxU3JjNGhpCi0gICAgICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgICAgIDsvLyBSb3cgNAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWxvLCBxU3JjNGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkxCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxaGksIHFTcmM0aGkgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTUVORAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmZjODM1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheQotICovCi0gCi0KLQotI2lmbmRlZiBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KLSNkZWZpbmUgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCi0KLSNkZWZpbmUgTWFza1RhYmxlU2l6ZSA3MgotICAKLS8qIE1hc2sgdGFibGUgKi8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjNlMWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIEd1YXJkIHRoZSBoZWFkZXIgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICovCi0jaWZuZGVmIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KLSNkZWZpbmUgX19BUk1fQ09NTV9WRVJTSU9OX0hfXwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgaW4gb214dHlwZXMuaCBidXQgaGFzbid0IGJlZW4gYXBwcm92ZWQgYnkgT3Blbk1BWCB5ZXQgKi8KLSNkZWZpbmUgT01YX1ZFUlNJT04gMTAyCi0KLS8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgI2RlZmluZSBudW1iZXIgaW50byBhICNkZWZpbmUgc3RyaW5nLiAqLwotI2RlZmluZSBBUk1fUVVPVEUoYSkgI2EKLSNkZWZpbmUgQVJNX0lORElSRUNUKEEpIEFSTV9RVU9URShBKQotCi0vKiBDb252ZXJ0IHRoZSBPTVhfVkVSU0lPTiBudW1iZXIgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgaXQgb3V0LiAqLwotI2RlZmluZSBBUk1fVkVSU0lPTl9TVFJJTkcgQVJNX0lORElSRUNUKE9NWF9WRVJTSU9OKQotCi0KLS8qIERlZmluZSB0aGlzIGluIG9yZGVyIHRvIHR1cm4gb24gQVJNIHZlcnNpb24vcmVsZWFzZS9idWlsZCBzdHJpbmdzIGluIGVhY2ggZG9tYWluICovCi0jZGVmaW5lIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi0KLSNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teEFDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SVBfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFNQX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0jZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KLQotCi0vKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgcmVsZWFzZSBzY3JpcHQgKi8KLS8qIFRoZXkgYXJlIHVzZWQgaW4gdGhlIEFSTSB2ZXJzaW9uIHN0cmluZ3MgZGVmaW5lZCBmb3IgZWFjaCBkb21haW4uICAgICAgICAgICAgICovCi0KLS8qIFRoZSByZWxlYXNlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LiAtIHVzZWQgZm9yIHNvdXJjZSBhbmQgb2JqZWN0IHJlbGVhc2VzICovCi0jZGVmaW5lIE9NWF9BUk1fUkVMRUFTRV9UQUcgICJyMXAwLTAwYmV0MCIKLQotLyogVGhlIEFSTSBhcmNoaXRlY3R1cmUgdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCi0jZGVmaW5lIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICJBUk0gQXJjaGl0ZWN0dXJlIFY3IHdpdGggTkVPTiIKLQotLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCi0jZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCi0KLQotI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWQyZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNzEgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIEFSTSBvcHRpbWl6ZWQgT3Blbk1BWCBjb21tb24gaGVhZGVyIGZpbGUKLTsvLwotCi07Ly8gUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbgotIElGIDpMTk9UOjpERUY6QVJNQ09NTV9TX0gKLSBHQkxMIEFSTUNPTU1fU19ICi0KLSAgICAgICAgUkVRVUlSRTggICAgICAgICAgICA7Ly8gUmVxdWlyZXMgOC1ieXRlIHN0YWNrIGFsaWdubWVudAotICAgICAgICBQUkVTRVJWRTggICAgICAgICAgIDsvLyBQcmVzZXJ2ZXMgOC1ieXRlIHN0YWNrIGFsaWdubWVudAotICAgICAgICAKLSAgICAgICAgR0JMTCAgICBBUk1fRVJST1JDSEVDSwotQVJNX0VSUk9SQ0hFQ0sgIFNFVEwge0ZBTFNFfQotCi07Ly8gR2xvYmFscwotCi0gICAgICAgIEdCTFMgICAgX1JSZWdMaXN0ICAgOy8vIFIgc2F2ZWQgcmVnaXN0ZXIgbGlzdAotICAgICAgICBHQkxTICAgIF9EUmVnTGlzdCAgIDsvLyBEIHNhdmVkIHJlZ2lzdGVyIGxpc3QKLSAgICAgICAgR0JMUyAgICBfVmFyaWFudCAgICA7Ly8gU2VsZWN0ZWQgcHJvY2Vzc29yIHZhcmlhbnQKLSAgICAgICAgR0JMUyAgICBfQ1BVICAgICAgICA7Ly8gQ1BVIG5hbWUKLSAgICAgICAgR0JMUyAgICBfU3RydWN0ICAgICA7Ly8gU3RydWN0dXJlIG5hbWUKLSAgICAgICAgCi0gICAgICAgIEdCTEwgICAgX0luRnVuYyAgICAgOy8vIEluc2lkZSBmdW5jdGlvbiBhc3NlbWJseSBmbGFnCi0gICAgICAgIEdCTEwgICAgX1N3TG9uZyAgICAgOy8vIExvbmcgc3dpdGNoIGZsYWcKLSAgICAgICAgCi0gICAgICAgIEdCTEEgICAgX1JCeXRlcyAgICAgOy8vIE51bWJlciBvZiByZWdpc3RlciBieXRlcyBvbiBzdGFjawotICAgICAgICBHQkxBICAgIF9TQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2Ygc2NyYXRjaCBieXRlcyBvbiBzdGFjayAKLSAgICAgICAgR0JMQSAgICBfQUJ5dGVzICAgICA7Ly8gU3RhY2sgb2Zmc2V0IG9mIG5leHQgYXJndW1lbnQKLSAgICAgICAgR0JMQSAgICBfV29ya3NwYWNlICA7Ly8gU3RhY2sgb2Zmc2V0IG9mIHNjcmF0Y2ggd29ya3NwYWNlCi0gICAgICAgIEdCTEEgICAgX0YgICAgICAgICAgOy8vIEZ1bmN0aW9uIG51bWJlcgotICAgICAgICBHQkxBICAgIF9TdE9mZiAgICAgIDsvLyBTdHJ1Y3Qgb2Zmc2V0Ci0gICAgICAgIEdCTEEgICAgX1N3TnVtICAgICAgOy8vIFN3aXRjaCBudW1iZXIKLSAgICAgICAgR0JMUyAgICBfMzIgICAgICAgICA7Ly8gU3VmZml4IGZvciAzMiBieXRlIGFsaWdubW5ldAotICAgICAgICBHQkxTICAgIF8xNiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDE2IGJ5dGUgYWxpZ25tbmV0Ci0gICAgICAgIAotX0luRnVuYyAgICAgICAgIFNFVEwgICAge0ZBTFNFfQotX1NCeXRlcyAgICAgICAgIFNFVEEgICAgMAotX0YgICAgICAgICAgICAgIFNFVEEgICAgMAotX1N3TnVtICAgICAgICAgIFNFVEEgICAgMAotXzMyICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMzIiCi1fMTYgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04xNiIKLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIE92ZXJyaWRlIHRoZSB0b29scyBzZXR0aW5ncyBvZiB0aGUgQ1BVIGlmIHRoZSAjZGVmaW5lCi07Ly8gVVNFQ1BVIGlzIHNldCwgb3RoZXJ3aXNlIHVzZSB0aGUgQ1BVIGRlZmluZWQgYnkgdGhlCi07Ly8gYXNzZW1ibGVyIHNldHRpbmdzLgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgSUYgOkRFRjogT1ZFUlJJREVDUFUKLV9DUFUgICAgICAgU0VUUyAgT1ZFUlJJREVDUFUKLSAgICAgICBFTFNFCi1fQ1BVICAgICAgIFNFVFMgICAge0NQVX0gICAgICAgCi0gICAgICAgRU5ESUYKLQotCi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBXb3JrIG91dCB3aGljaCBjb2RlIHRvIGJ1aWxkCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgSUYgOkRFRjpBUk0xMTM2SlM6TE9SOjpERUY6Q29ydGV4QTg6TE9SOjpERUY6QVJNX0dFTkVSSUMKLSAgICAgICAgICAgIElORk8gMSwiUGxlYXNlIHN3aXRjaCB0byB1c2luZyBNX1ZBUklBTlRTIgotICAgICAgICBFTkRJRgotCi0gICAgICAgIDsvLyBEZWZpbmUgYW5kIHJlc2V0IGFsbCBvZmZpY2lhbGx5IHJlY29uZ25pc2VkIHZhcmlhbnRzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UUwotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk05MjZFSlMKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKU19VCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIENvcnRleEE4Ci0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTdURE1JCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UICR2YXIKLSAgICAgICAgR0JMTCAkdmFyCi0gICAgICAgIEdCTEwgX29rJHZhcgotJHZhciAgICBTRVRMIHtGQUxTRX0KLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBWYXJpYW50IGRlY2xhcmF0aW9uCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVmaW5lIGEgbGlzdCBvZiBjb2RlIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzCi0gICAgICAgIDsvLyBzb3VyY2UgZmlsZS4gVGhpcyBtYWNybyB0aGVuIGNob29zZXMgdGhlIG1vc3QKLSAgICAgICAgOy8vIGFwcHJvcHJpYXRlIHZhcmlhbnQgdG8gYnVpbGQgZm9yIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZAotICAgICAgICA7Ly8gY29yZS4KLSAgICAgICAgOy8vICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9WQVJJQU5UUyAkdjAsJHYxLCR2MiwkdjMsJHY0LCR2NSwkdjYsJHY3ICAgICAgICAKLSAgICAgICAgOy8vIFNldCB0byBUUlVFIHZhcmlhbnRzIHRoYXQgYXJlIHN1cHBvcnRlZAotICAgICAgICBfTV9ERUZfVkFSSUFOVFMKLSAgICAgICAgX01fVkFSSUFOVCAkdjAKLSAgICAgICAgX01fVkFSSUFOVCAkdjEKLSAgICAgICAgX01fVkFSSUFOVCAkdjIKLSAgICAgICAgX01fVkFSSUFOVCAkdjMKLSAgICAgICAgX01fVkFSSUFOVCAkdjQKLSAgICAgICAgX01fVkFSSUFOVCAkdjUKLSAgICAgICAgX01fVkFSSUFOVCAkdjYKLSAgICAgICAgX01fVkFSSUFOVCAkdjcKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb29rIGZvciBmaXJzdCBhdmFpbGFibGUgdmFyaWFudCB0byBtYXRjaCBhIENQVQotICAgICAgICA7Ly8gX01fVFJZIGNwdSwgdmFyaWFudCBmYWxsIGJhY2sgbGlzdAotX1ZhcmlhbnQgU0VUUyAiIiAgICAgICAgICAgICAgICAKLSAgICAgICAgX01fVFJZIEFSTTkyNkVKLVMsICAgQVJNOTI2RUpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTc2SlotUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTE3NkpaRi1TLCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExNTZUMi1TLCAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTU2VDJGLVMsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTEzNkotUywgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExMzZKRi1TLCAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBNUENvcmUsICAgICAgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgZmFsY29uLXZmcCwgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBmYWxjb24tZnVsbC1uZW9uLCBDb3J0ZXhBOAotICAgICAgICBfTV9UUlkgQ29ydGV4LUE4Tm9OZW9uLCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIENvcnRleC1BOCwgICAgQ29ydGV4QTgsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQ29ydGV4LVI0LCAgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTdURE1JCi0gICAgICAgIAotICAgICAgICA7Ly8gU2VsZWN0IHRoZSBjb3JyZWN0IHZhcmlhbnQKLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIElGIF9WYXJpYW50PSIiCi0gICAgICAgICAgICBJTkZPIDEsICJObyBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCi0gICAgICAgIEVMU0UKLSRfVmFyaWFudCAgIFNFVEwge1RSVUV9Ci0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBSZWdpc3RlciBhIHZhcmlhbnQgYXMgYXZhaWxhYmxlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1ZBUklBTlQgJHZhcgotICAgICAgICBJRiAiJHZhciI9IiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIDpMTk9UOjpERUY6X29rJHZhcgotICAgICAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHZhcmlhbnQgJyR2YXInIgotICAgICAgICBFTkRJRgotJHZhciAgICBTRVRMIHtUUlVFfQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gRm9yIGEgZ2l2ZW4gQ1BVLCBzZWUgaWYgYW55IG9mIHRoZSB2YXJpYW50cyBzdXBwb3J0aW5nCi0gICAgICAgIDsvLyB0aGlzIENQVSBhcmUgYXZhaWxhYmxlLiBUaGUgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgaXMKLSAgICAgICAgOy8vIGNob3NlbgotICAgICAgICBNQUNSTwotICAgICAgICBfTV9UUlkgJGNwdSwgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NwotICAgICAgICBJRiAiJGNwdSI8Pl9DUFUKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIF9NX1RSWTEgJHYwCi0gICAgICAgIF9NX1RSWTEgJHYxCi0gICAgICAgIF9NX1RSWTEgJHYyCi0gICAgICAgIF9NX1RSWTEgJHYzCi0gICAgICAgIF9NX1RSWTEgJHY0Ci0gICAgICAgIF9NX1RSWTEgJHY1Ci0gICAgICAgIF9NX1RSWTEgJHY2Ci0gICAgICAgIF9NX1RSWTEgJHY3Ci0gICAgICAgIDsvLyBDaGVjayBhIG1hdGNoIHdhcyBmb3VuZAotICAgICAgICBJRiBfVmFyaWFudD0iIgotICAgICAgICAgICAgSU5GTyAxLCAiTm8gdmFyaWFudCBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1RSWTEgJHZhcgotICAgICAgICBJRiAiJHZhciI9IiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIChfVmFyaWFudD0iIik6TEFORDokdmFyCi1fVmFyaWFudCBTRVRTICIkdmFyIgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gU3RydWN0dXJlIGRlZmluaXRpb24KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIG9mIGdpdmVuIG5hbWUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJVQ1QgJHNuYW1lCi1fU3RydWN0IFNFVFMgIiRzbmFtZSIKLV9TdE9mZiAgU0VUQSAwCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIGZpZWxkCi0gICAgICAgIDsvLyBUaGUgZmllbGQgaXMgY2FsbGVkICRzbmFtZV8kZm5hbWUKLSAgICAgICAgOy8vICRzaXplICAgPSB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5LCBtdXN0IGJlIHBvd2VyIG9mIDIgCi0gICAgICAgIDsvLyAkbnVtYmVyID0gKGlmIHByb3ZpZGVkKSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZm9yIGFuIGFycmF5Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRklFTEQgJGZuYW1lLCAkc2l6ZSwgJG51bWJlcgotICAgICAgICBJRiAoX1N0T2ZmOkFORDooJHNpemUtMSkpIT0wCi1fU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICgkc2l6ZSAtIChfU3RPZmY6QU5EOigkc2l6ZS0xKSkpCi0gICAgICAgIEVORElGCi0kX1N0cnVjdC5fJGZuYW1lIEVRVSBfU3RPZmYKLSAgICAgICAgSUYgIiRudW1iZXIiPD4iIgotX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAkc2l6ZSokbnVtYmVyCi0gICAgICAgIEVMU0UKLV9TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5EU1RSVUNUCi1zaXplb2ZfJF9TdHJ1Y3QgRVFVIF9TdE9mZgotX1N0cnVjdCBTRVRTICIiCi0gICAgICAgIE1FTkQKLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBTd2l0Y2ggYW5kIHRhYmxlIG1hY3JvcwotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gU3RhcnQgYSByZWxhdGl2ZSBzd2l0Y2ggdGFibGUgd2l0aCByZWdpc3RlciB0byBzd2l0Y2ggb24KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkdiA9IHRoZSByZWdpc3RlciB0byBzd2l0Y2ggb24KLSAgICAgICAgOy8vICRzID0gaWYgc3BlY2lmaWVkIG11c3QgYmUgIkwiIHRvIGluZGljYXRlIGxvbmcKLSAgICAgICAgOy8vICAgICAgdGhpcyBhbGxvd3MgYSBncmVhdGVyIHJhbmdlIHRvIHRoZSBjYXNlIGNvZGUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TV0lUQ0ggJHYsICRzCi0gICAgICAgIEFTU0VSVCAiJHMiPSIiOkxPUjoiJHMiPSJMIgotX1N3TG9uZyBTRVRMIHtGQUxTRX0KLSAgICAgICAgSUYgIiRzIj0iTCIKLV9Td0xvbmcgICAgIFNFVEwge1RSVUV9Ci0gICAgICAgIEVORElGCi1fU3dOdW0gIFNFVEEgX1N3TnVtKzEgICAgICAgIAotICAgICAgICBJRiB7Q09ORklHfT0xNgotICAgICAgICAgICAgOy8vIFRodW1iCi0gICAgICAgICAgICBJRiBfU3dMb25nCi0gICAgICAgICAgICAgICAgVEJIIFtwYywgJHYsIExTTCMxXQotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIFRCQiBbcGMsICR2XQotICAgICAgICAgICAgRU5ESUYKLV9Td2l0Y2gkX1N3TnVtCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUk0KLSAgICAgICAgICAgIEFERCBwYywgcGMsICR2LCBMU0wgIzIKLSAgICAgICAgICAgIE5PUAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gQWRkIGEgY2FzZSB0byB0aGUgc3dpdGNoIHN0YXRlbWVudAotICAgICAgICBNQUNSTwotICAgICAgICBNX0NBU0UgICRsYWJlbAotICAgICAgICBJRiB7Q09ORklHfT0xNgotICAgICAgICAgICAgOy8vIFRodW1iCi0gICAgICAgICAgICBJRiBfU3dMb25nCi0gICAgICAgICAgICAgICAgRENXICgkbGFiZWwgLSBfU3dpdGNoJF9Td051bSkvMgotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIERDQiAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUk0KLSAgICAgICAgICAgIEIgICAkbGFiZWwKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEVuZCBvZiBzd2l0Y2ggc3RhdGVtZW50Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5EU1dJVENICi0gICAgICAgIEFMSUdOIDIKLSAgICAgICAgTUVORCAgICAgICAKLQotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBEYXRhIGFyZWEgYWxsb2NhdGlvbgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIENvbnN0YW50IHRhYmxlIGFsbG9jYXRvciBtYWNybwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENyZWF0ZXMgYSBuZXcgc2VjdGlvbiBmb3IgZWFjaCBjb25zdGFudCB0YWJsZQotICAgICAgICA7Ly8gJG5hbWUgaXMgc3ltYm9sIHRocm91Z2ggd2hpY2ggdGhlIHRhYmxlIGNhbiBiZSBhY2Nlc3NlZC4KLSAgICAgICAgOy8vICRhbGlnbiBpcyB0aGUgb3B0aW9uYWwgYWxpZ25tZW50IG9mIHRoZSB0YWJsZSwgbG9nMiBvZiAKLSAgICAgICAgOy8vICB0aGUgYnl0ZSBhbGlnbm1lbnQgLSAkYWxpZ249NCBpcyAxNiBieXRlIGFsaWduZWQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9UQUJMRSAgJG5hbWUsICRhbGlnbgotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAiJGFsaWduIj0iIgotICAgICAgICAgICAgQVJFQSB8LmNvbnN0ZGF0YXwsIFJFQURPTkxZLCBEQVRBCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUkVBcyBpbmhlcml0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGRlY2xhcmF0aW9uLgotICAgICAgICAgICAgOy8vIFRoZXJlZm9yZSBmb3IgZWFjaCBhbGlnbm1lbnQgc2l6ZSB3ZSBtdXN0IGhhdmUgYW4gYXJlYQotICAgICAgICAgICAgOy8vIG9mIGEgZGlmZmVyZW50IG5hbWUuCi0gICAgICAgICAgICBBUkVBIGNvbnN0ZGF0YV9hJGFsaWduLCBSRUFET05MWSwgREFUQSwgQUxJR049JGFsaWduCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBXZSBhbHNvIGZvcmNlIGFsaWdubWVudCBpbmNhc2Ugd2UgYXJlIHRhZ2dpbmcgb250bwotICAgICAgICAgICAgOy8vIGFuIGFscmVhZHkgc3RhcnRlZCBhcmVhLgotICAgICAgICAgICAgQUxJR04gKDE8PCRhbGlnbikKLSAgICAgICAgRU5ESUYKLSRuYW1lCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBNYWNyb3MgdG8gYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrCi07Ly8KLTsvLyBUaGVzZSBhbGwgYXNzdW1lIHRoYXQgdGhlIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCi07Ly8gYXQgZW50cnkgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSAKLTsvLyAzMi1ieXRlIGFsaWdubWVudCBtYWNybyBuZWVkcyB0byB3b3JrIGluIGEKLTsvLyBiaXQgbW9yZSBvZiBhIHNwZWNpYWwgd2F5Li4uCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICAKLQotCi0gICAgICAgIDsvLyBBbGxvY2F0ZSAxLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MxICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5ECi0gICAgICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDItYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzIgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MSkhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICgyIC0gKF9TQnl0ZXM6QU5EOjEpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgNC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DNCAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDozKSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDQgLSAoX1NCeXRlczpBTkQ6MykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORAotICAgICAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0M4ICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMTYpIGJ5dGVzLgotICAgICAgICA7Ly8gVGhlIGV4dHJhIDE2IGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDE2IGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMTYgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YkXzE2ICAgRVFVIChfU0J5dGVzICsgOCkKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDgKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICgkc2l6ZSszMikgYnl0ZXMuCi0gICAgICAgIDsvLyBUaGUgZXh0cmEgMzIgYnl0ZXMgYXJlIGxhdGVyIHVzZWQgdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gMzIgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MzMiAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiRfMzIgICBFUVUgKF9TQnl0ZXMgKyAyNCkKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDI0Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEFyZ3VtZW50IERlY2xhcmF0aW9uIE1hY3JvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQWxsb2NhdGUgYW4gYXJndW1lbnQgbmFtZSAkbmFtZQotICAgICAgICA7Ly8gc2l6ZSAkc2l6ZSBieXRlcwotICAgICAgICBNQUNSTwotICAgICAgICBNX0FSRyAgICAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCBfSW5GdW5jCi0kbmFtZSRfRiAgICBFUVUgX0FCeXRlcwotX0FCeXRlcyBTRVRBIF9BQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIE1hY3JvcyB0byBhY2Nlc3Mgc3RhY2tlZCB2YXJpYWJsZXMKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBwcm9jZXNzaW5nIG9wZXJhdGlvbgotICAgICAgICA7Ly8gd2l0aCBhIGNvbnN0YW50IHNlY29uZCBvcGVyYW5kCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX09QQyAkb3AsJHJkLCRybiwkY29uc3QKLSAgICAgICAgTENMQSAgICBfc2gKLSAgICAgICAgTENMQSAgICBfY3N0Ci1fc2ggICAgIFNFVEEgICAgMAotX2NzdCAgICBTRVRBICAgICRjb25zdAotICAgICAgICBJRiBfY3N0PTAKLSAgICAgICAgJG9wICRyZCwgJHJuLCAjX2NzdAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgV0hJTEUgKF9jc3Q6QU5EOjMpPTAKLV9jc3QgICAgICAgIFNFVEEgX2NzdD4+MgotX3NoICAgICAgICAgU0VUQSBfc2grMgotICAgICAgICBXRU5ECi0gICAgICAgICRvcCAkcmQsICRybiwgIyhfY3N0OkFORDoweDAwMDAwMEZGKTw8X3NoCi0gICAgICAgIElGIF9jc3Q+PTI1NgotICAgICAgICAgICAgJG9wICRyZCwgJHJkLCAjKF9jc3Q6QU5EOjB4RkZGRkZGMDApPDxfc2gKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBhY2Nlc3Mgb3BlcmF0aW9uCi0gICAgICAgIDsvLyBTdWNoIGFzIExEUiBvciBTVFIKLSAgICAgICAgOy8vIFRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgbW9kaWZpZWQgc3VjaCB0aGF0Ci0gICAgICAgIDsvLyAxLiBJZiBubyBhZGRyZXNzIGlzIGdpdmVuIHRoZW4gdGhlIG5hbWUgaXMgdGFrZW4KLSAgICAgICAgOy8vICAgIGFzIGEgc3RhY2sgb2Zmc2V0Ci0gICAgICAgIDsvLyAyLiBJZiB0aGUgYWRkcmVzc2luZyBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZQotICAgICAgICA7Ly8gICAgc3RhdGUgYmVpbmcgYXNzZW1ibGVkIGZvciAoZWcgVGh1bWIpIHRoZW4gYSBzdWl0YWJsZQotICAgICAgICA7Ly8gICAgYWRkcmVzc2luZyBtb2RlIGlzIHN1YnN0aXR1dGVkLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE9uIEVudHJ5OgotICAgICAgICA7Ly8gJGkgPSBJbnN0cnVjdGlvbiB0byBwZXJmb3JtIChlZyAiTERSQiIpCi0gICAgICAgIDsvLyAkYSA9IFJlcXVpcmVkIGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDsvLyAkciA9IFJlZ2lzdGVyKHMpIHRvIHRyYW5zZmVyIChlZyAicjEiKQotICAgICAgICA7Ly8gJGEwLCRhMSwkYTIuIEFkZHJlc3NpbmcgbW9kZSBhbmQgY29uZGl0aW9uLiBPbmUgb2Y6Ci0gICAgICAgIDsvLyAgICAgbGFiZWwgeyxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0gICAgICAgICAgICAgICAgICAgIHssLCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0XXshfSAgICAgICAgIHssLGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlLCBvZmZzZXQsIHNoaWZ0XXshfSAgeyxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCAgICAgICAgICAgIHssLGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlXSwgb2Zmc2V0LCBzaGlmdCAgICAgeyxjY30KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fREFUQSAkaSwkYSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgSUYgIiRhMCI6TEVGVDoxPSJbIgotICAgICAgICAgICAgSUYgIiRhMSI9IiIKLSAgICAgICAgICAgICAgICAkaSRhMyAgICRyLCAkYTAKLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBJRiAiJGEwIjpSSUdIVDoxPSJdIgotICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgotICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAkYTEKLSAgICAgICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKLSAgICAgICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgICAgIElGICIkYTIiPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICRhMQotICAgICAgICAgICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICIkYTEsJGEyIgotICAgICAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICBMQ0xBICAgIF9PZmZzZXQKLV9PZmZzZXQgICAgIFNFVEEgICAgX1dvcmtzcGFjZSArICRhMCRfRgotICAgICAgICAgICAgQVNTRVJUICAoX09mZnNldDpBTkQ6KCRhLTEpKT0wCi0gICAgICAgICAgICAkaSRhMSAgICRyLCBbc3AsICNfT2Zmc2V0XQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gSGFuZGxlIHBvc3QgaW5kZXhlZCBsb2FkL3N0b3JlcwotICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2VdLCBvZmZzZXQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUE9TVElORCAkaSwkciwkYTAsJGExCi0gICAgICAgIExDTFMgX2Jhc2UKLSAgICAgICAgTENMUyBfb2Zmc2V0Ci0gICAgICAgIElGIHtDT05GSUd9PTE2IDsvLyBUaHVtYgotX2Jhc2UgICAgICAgU0VUUyAoIiRhMCI6TEVGVDooOkxFTjoiJGEwIi0xKSk6UklHSFQ6KDpMRU46IiRhMCItMikgICA7Ly8gcmVtb3ZlIFtdCi1fb2Zmc2V0ICAgICBTRVRTICIkYTEiCi0gICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iKyIKLV9vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICRpICAkciwgJGEwCi0gICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iLSIKLV9vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQotICAgICAgICAgICAgICAgIFNVQiAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRUxTRSA7Ly8gQVJNCi0gICAgICAgICAgICAkaSAgJHIsICRhMCwgJGExCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBIYW5kbGUgcHJlIGluZGV4ZWQgbG9hZC9zdG9yZQotICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2UsIG9mZnNldF17IX0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUFJFSU5EICRpLCRyLCRhMCwkYTEKLSAgICAgICAgTENMUyBfYmFzZQotICAgICAgICBMQ0xTIF9vZmZzZXQKLSAgICAgICAgSUYgKHtDT05GSUd9PTE2KTpMQU5EOigoIiRhMSI6UklHSFQ6Mik9Il0hIikKLV9iYXNlICAgICAgIFNFVFMgIiRhMCI6UklHSFQ6KDpMRU46KCIkYTAiKS0xKQotX29mZnNldCAgICAgU0VUUyAiJGExIjpMRUZUOig6TEVOOigiJGExIiktMikKLSAgICAgICAgICAgICRpICRyLCBbJF9iYXNlLCAkX29mZnNldF0KLSAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgdW5zaWduZWQgYnl0ZSBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHNpZ25lZCBieXRlIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJTQiAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSU0IiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBieXRlIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGhhbGYgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSSCAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkgiLDIsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUlNIICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJTSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIGhhbGYgd29yZCB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkggICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSICAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFIgICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSIiw0LCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgZG91YmxlIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBkb3VibGUgd29yZCB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQURSICAgJGEsICRiLCAkY2MKLSAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRikKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMTYgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BRFIxNiAkYSwgJGIsICRjYwotICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMTYpCi0gICAgICAgIAotICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAxNiBieXRlcwotICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgwRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyB0byAzMiBieXRlcwotICAgICAgICBNQUNSTwotICAgICAgICBNX0FEUjMyICRhLCAkYiwgJGNjCi0gICAgICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GJF8zMikKLSAgICAgICAgCi0gICAgICAgICAgICA7Ly8gTm93IGFsaWduICRhIHRvIDMyIGJ5dGVzCi0gICAgICAgICAgICBCSUMkY2MgICRhLCRhLCMweDFGCi0gICAgICAgIE1FTkQKLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBGdW5jdGlvbiBoZWFkZXIgYW5kIGZvb3RlciBtYWNyb3MKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gSGVhZGVyIE1hY3JvICAgIAotICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZQotICAgICAgICA7Ly8gTm90ZSB0aGF0IGZ1bmN0aW9ucyBzaG91bGQgYWxsIGJlICJzdGFjay1tb3Zlcy1vbmNlIgotICAgICAgICA7Ly8gVGhlIEZOU1RBUlQgYW5kIEZORU5EIG1hY3JvcyBzaG91bGQgYmUgdGhlIG9ubHkgcGxhY2VzCi0gICAgICAgIDsvLyB3aGVyZSB0aGUgc3RhY2sgbW92ZXMuCi0gICAgICAgIDsvLyAgICAKLSAgICAgICAgOy8vICRuYW1lICA9IGZ1bmN0aW9uIG5hbWUKLSAgICAgICAgOy8vICRycmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IHJlZ2lzdGVycwotICAgICAgICA7Ly8gICAgICAgICAgImxyIiBzdGFjayAibHIiIG9ubHkKLSAgICAgICAgOy8vICAgICAgICAgICJyTiIgc3RhY2sgcmVnaXN0ZXJzICJyNC1yTixsciIKLSAgICAgICAgOy8vICRkcmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IEQgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyAgICAgICAgICAiZE4iIHN0YWNrIHJlZ2lzdGVycyAiZDgtZE4iCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTm90ZTogQVJNIEFyY2hpY3R1cmUgcHJvY2VkdXJlIGNhbGwgc3RhbmRhcmQgQUFQQ1MKLSAgICAgICAgOy8vIHN0YXRlcyB0aGF0IHI0LXIxMSwgc3AsIGQ4LWQxNSBtdXN0IGJlIHByZXNlcnZlZCBieQotICAgICAgICA7Ly8gYSBjb21wbGlhbnQgZnVuY3Rpb24uCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RBUlQgJG5hbWUsICRycmVnLCAkZHJlZwotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBBU1NFUlQgIiRuYW1lIiE9IiIKLV9JbkZ1bmMgU0VUTCB7VFJVRX0KLV9SQnl0ZXMgU0VUQSAwCi1fV29ya3NwYWNlIFNFVEEgMAotCi0gICAgICAgIDsvLyBDcmVhdGUgYW4gYXJlYSBmb3IgdGhlIGZ1bmN0aW9uICAgICAgICAKLSAgICAgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0gICAgICAgIEVYUE9SVCAgJG5hbWUKLSRuYW1lICAgRlVOQ1RJT04KLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIFIgcmVnaXN0ZXJzCi0gICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCi0gICAgICAgIElGIF9SUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFNUTUZEICAgc3AhLCB7JF9SUmVnTGlzdCwgbHJ9Ci0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIEQgcmVnaXN0ZXJzCi0gICAgICAgIF9NX0dFVERSRUdMSVNUICAkZHJlZyAgICAgICAgCi0gICAgICAgIElGIF9EUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFZTVE1GRCAgc3AhLCB7JF9EUmVnTGlzdH0KLSAgICAgICAgRU5ESUYgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIEVuc3VyZSBzaXplIGNsYWltZWQgb24gc3RhY2sgaXMgOC1ieXRlIGFsaWduZWQKLSAgICAgICAgSUYgKChfU0J5dGVzOkFORDo3KSE9MCkKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgSUYgKF9TQnl0ZXMhPTApCi0gICAgICAgICAgICBfTV9PUEMgU1VCLCBzcCwgc3AsIF9TQnl0ZXMKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIAotX0FCeXRlcyBTRVRBIF9TQnl0ZXMgKyBfUkJ5dGVzIC0gX1dvcmtzcGFjZQotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFByaW50IGZ1bmN0aW9uIG5hbWUgaWYgZGVidWcgZW5hYmxlZAotICAgICAgICBNX1BSSU5URiAiJG5hbWVcbiIsCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgUiBzYXZlZCByZWdpc3RlcnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fR0VUUlJFR0xJU1QgJHJyZWcKLSAgICAgICAgSUYgIiRycmVnIj0iIgotX1JSZWdMaXN0ICAgU0VUUyAiIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBJRiAiJHJyZWciPSJsciI6TE9SOiIkcnJlZyI9InI0IgotX1JSZWdMaXN0ICAgU0VUUyAicjQiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjUiOkxPUjoiJHJyZWciPSJyNiIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXI2IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzE2Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyNyI6TE9SOiIkcnJlZyI9InI4IgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjgiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMjQKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InI5IjpMT1I6IiRycmVnIj0icjEwIgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEwIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyMTEiOkxPUjoiJHJyZWciPSJyMTIiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yMTIiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCByIHJlZ2lzdGVyIGxpbWl0ICckcnJlZyciCi0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFdvcmsgb3V0IGEgbGlzdCBvZiBEIHNhdmVkIHJlZ2lzdGVycwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9HRVREUkVHTElTVCAkZHJlZwotICAgICAgICBJRiAiJGRyZWciPSIiCi1fRFJlZ0xpc3QgICBTRVRTICIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIElGICIkZHJlZyI9ImQ4IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDkiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kOSIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDEwIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEwIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTEiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTEiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMzIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMiIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMiIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0MAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDEzIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEzIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQ4Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTQiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTQiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNTYKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxNSIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxNSIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys2NAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHNhdmVkIGQgcmVnaXN0ZXIgbGltaXQgJyRkcmVnJyIKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFByb2R1Y2UgZnVuY3Rpb24gcmV0dXJuIGluc3RydWN0aW9ucwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9SRVQgJGNjCi0gICAgICAgIElGIF9EUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFZQT1AkY2MgeyRfRFJlZ0xpc3R9Ci0gICAgICAgIEVORElGCi0gICAgICAgIElGIF9SUmVnTGlzdD0iIgotICAgICAgICAgICAgQlgkY2MgbHIKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTERNJGNjLkZEIHNwISwgeyRfUlJlZ0xpc3QsIHBjfQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBFYXJseSBGdW5jdGlvbiBFeGl0IE1hY3JvCi0gICAgICAgIDsvLyAkY2MgPSBjb25kaXRpb24gdG8gZXhpdCB3aXRoCi0gICAgICAgIDsvLyAoRXhhbXBsZTogTV9FWElUIEVRKQotICAgICAgICBNQUNSTwotICAgICAgICBNX0VYSVQgICRjYwotICAgICAgICBBU1NFUlQgIF9JbkZ1bmMKLSAgICAgICAgSUYgIF9TQnl0ZXMhPTAKLSAgICAgICAgICAgIDsvLyBSZXN0b3JlIHN0YWNrIGZyYW1lIGFuZCBleGl0Ci0gICAgICAgICAgICBCJGNjICBfRW5kJF9GCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBDYW4gcmV0dXJuIGRpcmVjdGx5Ci0gICAgICAgICAgICBfTV9SRVQgJGNjCi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIEZvb3RlciBNYWNybyAgICAgICAgCi0gICAgICAgIDsvLyBHZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVwaWxvZ3VlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEFTU0VSVCBfSW5GdW5jCi1fSW5GdW5jIFNFVEwge0ZBTFNFfQotX0VuZCRfRgotCi0gICAgICAgIDsvLyBSZXN0b3JlIHRoZSBzdGFjayBwb2ludGVyIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBvbiBmdW5jdGlvbiBlbnRyeQotICAgICAgICBJRiBfU0J5dGVzIT0wCi0gICAgICAgICAgICBfTV9PUEMgQURELCBzcCwgc3AsIF9TQnl0ZXMKLSAgICAgICAgRU5ESUYKLSAgICAgICAgX01fUkVUCi0gICAgICAgIEVOREZVTkMKLQotICAgICAgICA7Ly8gUmVzZXQgdGhlIGdsb2JhbCBzdGFjayB0cmFja2luZyB2YXJpYWJsZXMgYmFjayB0byB0aGVpciAKLSAgICAgICAgOy8vIGluaXRpYWwgdmFsdWVzLCBhbmQgaW5jcmVtZW50IHRoZSBmdW5jdGlvbiBjb3VudAotX1NCeXRlcyAgICAgICAgU0VUQSAwCi1fRiAgICAgICAgICAgICBTRVRBIF9GKzEKLSAgICAgICAgTUVORAotCi0gICAgICAgICAgICAgICAgCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOy8vIERlYnVnIE1hY3JvcwotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICBHQkxMICAgIERFQlVHX09OCi1ERUJVR19PTiBTRVRMICAge0ZBTFNFfQotICAgICAgICBHQkxMICAgIERFQlVHX1NUQUxMU19PTgotREVCVUdfU1RBTExTX09OIFNFVEwge0ZBTFNFfQotICAgICAgICAKLSAgICAgICAgOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgOy8vIERlYnVnIGNhbGwgdG8gcHJpbnRmCi0gICAgICAgIDsvLyAgTV9QUklOVEYgJGZvcm1hdCwgJHZhbDAsICR2YWwxLCAkdmFsMgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEV4YW1wbGVzOgotICAgICAgICA7Ly8gIE1fUFJJTlRGICJ4PSUwOHhcbiIsIHIwCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBwcmVzZXJ2ZXMgdGhlIHZhbHVlIG9mIGFsbCByZWdpc3RlcnMgaW5jbHVkaW5nIHRoZQotICAgICAgICA7Ly8gZmxhZ3MuCi0gICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9QUklOVEYgICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKLSAgICAgICAgSUYgREVCVUdfT04KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgcHJpbnRmCi0gICAgICAgIExDTEEgICAgbkFyZ3MKLW5BcmdzCVNFVEEgICAgMAotICAgICAgICAKLSAgICAgICAgOy8vIHNhdmUgcmVnaXN0ZXJzIHNvIHdlIGRvbid0IGNvcnJ1cHQgdGhlbQotICAgICAgICBTVE1GRCAgIHNwISwge3IwLXIxMiwgbHJ9Ci0gICAgICAgIAotICAgICAgICA7Ly8gRHJvcCBzdGFjayB0byBnaXZlIHVzIHNvbWUgd29ya3NwYWNlCi0gICAgICAgIFNVQiAgICAgc3AsIHNwLCAjMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyB3ZSBuZWVkIHRvIHByaW50IHRvIHRoZSBzdGFjawotICAgICAgICBJRiAiJHZhbDIiIDw+ICIiCi0gICAgICAgICAgICBBU1NFUlQgIiR2YWwxIiA8PiAiIgotICAgICAgICAgICAgU1RSICAgICR2YWwyLCBbc3AsICM4XQotbkFyZ3MgICAgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiR2YWwxIiA8PiAiIgotICAgICAgICAgICAgQVNTRVJUICIkdmFsMCIgPD4gIiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMSwgW3NwLCAjNF0KLW5BcmdzCSAgICBTRVRBICAgbkFyZ3MrMQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHZhbDAiPD4iIgotICAgICAgICAgICAgU1RSICAgICR2YWwwLCBbc3BdCi1uQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBOb3cgd2UgYXJlIHNhZmUgdG8gY29ycnVwdCByZWdpc3RlcnMKLSAgICAgICAgQURSICAgICByMCwgJUZUMDAKLSAgICAgICAgSUYgbkFyZ3M9MQotICAgICAgICAgIExEUiAgIHIxLCBbc3BdCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIG5BcmdzPTIKLSAgICAgICAgICBMRE1JQSBzcCwge3IxLHIyfQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBuQXJncz0zCi0gICAgICAgICAgTERNSUEgc3AsIHtyMSxyMixyM30KLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBwcmludCB0aGUgdmFsdWVzCi0gICAgICAgIE1SUyAgICAgcjQsIGNwc3IgICAgICAgIDsvLyBwcmVzZXJ2ZSBmbGFncwotICAgICAgICBCTCAgICAgIHByaW50ZgotICAgICAgICBNU1IgICAgIGNwc3JfZiwgcjQgICAgICA7Ly8gcmVzdG9yZSBmbGFncwotICAgICAgICBCICAgICAgICVGVDAxCi0wMCAgICAgIDsvLyBzdHJpbmcgdG8gcHJpbnQKLSAgICAgICAgRENCICAgICAiJGZvcm1hdCIsIDAKLSAgICAgICAgQUxJR04KLTAxICAgICAgOy8vIEZpbmlzaGVkCi0gICAgICAgIEFERCAgICAgc3AsIHNwLCAjMTYKLSAgICAgICAgOy8vIFJlc3RvcmUgcmVnaXN0ZXJzCi0gICAgICAgIExETUZECXNwISwge3IwLXIxMixscn0KLQotICAgICAgICBFTkRJRiAgIDsvLyBERUJVR19PTgotICAgICAgICBNRU5ECi0KLQotICAgICAgICA7Ly8gU3RhbGwgU2ltdWxhdGlvbiBNYWNybwotICAgICAgICA7Ly8gSW5zZXJ0cyBhIGdpdmVuIG51bWJlciBvZiBOT1BzIGZvciB0aGUgY3VycmVudGx5Ci0gICAgICAgIDsvLyAgZGVmaW5lZCBwbGF0Zm9ybQotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUQUxMICRwbGF0MXN0YWxsLCAkcGxhdDJzdGFsbCwgJHBsYXQzc3RhbGwsICRwbGF0NHN0YWxsLCAkcGxhdDVzdGFsbCwgJHBsYXQ2c3RhbGwKLSAgICAgICAgSUYgREVCVUdfU1RBTExTX09OCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQxc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQyc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQzc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ0c3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ1c3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ2c3RhbGwgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdHN0YWxsCi0gICAgICAgIElGICIkcGxhdHN0YWxsIiE9IiIKLSAgICAgICAgICAgIExDTEEgX3BsbGVuCi0gICAgICAgICAgICBMQ0xTIF9wbAotICAgICAgICAgICAgTENMTCBfcGxsb2cKLV9wbGxlbiAgICAgIFNFVEEgOkxFTjoiJHBsYXRzdGFsbCIKLV9wbCAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOkxFRlQ6KF9wbGxlbiAtIDIpCi0gICAgICAgICAgICBJRiA6REVGOiRfcGwKLSAgICAgICAgICAgICAgICBJRiAkX3BsCi0gICAgICAgICAgICAgICAgICAgIExDTFMgX3N0Ci0gICAgICAgICAgICAgICAgICAgIExDTEEgX3N0bnVtCi1fc3QgICAgICAgICAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOlJJR0hUOjEgICAgICAgIAotX3N0bnVtICAgICAgICAgICAgICBTRVRBICRfc3QKLSAgICAgICAgICAgICAgICAgICAgV0hJTEUgX3N0bnVtPjAKLQkJCU1PViBzcCwgc3AKLV9zdG51bSAgICAgICAgICAgICAgICAgIFNFVEEgX3N0bnVtIC0gMQotICAgICAgICAgICAgICAgICAgICBXRU5ECi0gICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07Ly8gRW5kaWFuIEludmFyaWVuY2UgTWFjcm9zCi07Ly8gCi07Ly8gVGhlIGlkZWEgYmVoaW5kIHRoZXNlIG1hY3JvcyBpcyB0aGF0IGlmIGFuIGFycmF5IGlzCi07Ly8gbG9hZGVkIGFzIHdvcmRzIHRoZW4gdGhlIFNNVUwwMCBtYWNybyB3aWxsIG11bHRpcGx5Ci07Ly8gYXJyYXkgZWxlbWVudHMgMCByZWdhcmRsZXNzIG9mIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCi07Ly8gc3lzdGVtLiBGb3IgbGl0dGxlIGVuZGlhbiBTTVVMMDA9U01VTEJCLCBmb3IgYmlnCi07Ly8gZW5kaWFuIFNNVUwwMD1TTVVMVFQgYW5kIHNpbWlsYXJseSBmb3Igb3RoZXIgcGFja2VkIG9wZXJhdGlvbnMuCi07Ly8KLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTElCSTQgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBJRiB7RU5ESUFOfT0iYmlnIgotICAgICAgICAkY29tYmkuJGNjICRhLCAkYiwgJGMsICRkCi0gICAgICAgIEVMU0UKLSAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjLCAkZAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBMSUJJMyAgICRjb21saSwgJGNvbWJpLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgSUYge0VORElBTn09ImJpZyIKLSAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjCi0gICAgICAgIEVMU0UKLSAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTTUxBeHkgbWFjcm9zCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTAxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJULCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTEwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTFUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUVCwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFCMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVQwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFUMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU01VTHh5IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDAwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMDEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwQiAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDBUICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMTAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDFCICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMVQgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxCMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTEIxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVDAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxUMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUVCwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFNNTEFXeCwgU01VTFd4IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVcwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFXQiwgU01MQVdULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFXMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBV1QsIFNNTEFXQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVzAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMV0IsIFNNVUxXVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxXMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxXVCwgU01VTFdCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBTTUxBTHh5IG1hY3JvcwotCi0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDBCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMTAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDFUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxCMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTFQwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxUMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gIEVORElGIDsvLyBBUk1DT01NX1NfSAotICAgICAgICAgICAgCi0gIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2FiZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1PTVguaAorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIFRoaXMgZmlsZSBhbGxvd3MgYSB2ZXJzaW9uIG9mIHRoZSBPTVggREwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IHdoZXJlIHNvbWUgb3IKLSAqIGFsbCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGdpdmVuIGEgdXNlciBzcGVjaWZpZWQgc3VmZml4LiAKLSAqCi0gKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgaXQgd2hlcmU6Ci0gKgotICogLSB5b3Ugd2FudCB0byByZW5hbWUgYSBmdW5jdGlvbiAib3V0IG9mIHRoZSB3YXkiIHNvIHRoYXQgeW91IGNvdWxkIHJlcGxhY2UKLSAqICAgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gKHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdvdWxkIHN0aWxsIGJlCi0gKiAgIGluIHRoZSBsaWJyYXJ5IGp1c3Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lIC0gc28geW91IGNvdWxkIGRlYnVnIHRoZSBuZXcKLSAqICAgdmVyc2lvbiBieSBjb21wYXJpbmcgaXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgb2xkKQotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHZlcnNpb25zIHdpdGggYSBzdWZmaXggc28gdGhhdCAKLSAqICAgeW91IGNhbiBpbmNsdWRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBhbmQgY2hvb3NlIGJldHdlZW4gZnVuY3Rpb25zCi0gKiAgIGF0IHJ1bnRpbWUuCi0gKgotICogICAgIGUuZy4gb214SVBCTV9Db3B5X1U4X0MxUiBjb3VsZCBiZSByZW5hbWVkIG9teElQQk1fQ29weV9VOF9DMVJfQ29ydGV4QTgKLSAqIAotICovCi0KLSAgCi0jaWZuZGVmIF9hcm1PTVhfSF8KLSNkZWZpbmUgX2FybU9NWF9IXwotCi0KLS8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgaW4gb3JkZXIgdG8gZXhwYW5kIGFuZCBjb25jYXRlbmF0ZSB0aGUgbmFtZXMgKi8KLSNkZWZpbmUgT01YQ0FUMkJBUihBLCBCKSBvbXggIyMgQSAjIyBCCi0jZGVmaW5lIE9NWENBVEJBUihBLCBCKSBPTVhDQVQyQkFSKEEsIEIpCi0KLS8qIERlZmluZSB0aGUgc3VmZml4IHRvIGFkZCB0byBhbGwgZnVuY3Rpb25zIC0gdGhlIGRlZmF1bHQgaXMgbm8gc3VmZml4ICovCi0jZGVmaW5lIEJBUkVfU1VGRklYIAotCi0KLQotLyogRGVmaW5lIHdoYXQgaGFwcGVucyB0byB0aGUgYmFyZSBzdWZmaXgtbGVzcyBmdW5jdGlvbnMsIGRvd24gdG8gdGhlIHN1Yi1kb21haW4gYWNjdXJhY3kgKi8KLSNkZWZpbmUgT01YQUNBQUNfU1VGRklYICAgIEJBUkVfU1VGRklYICAgCi0jZGVmaW5lIE9NWEFDTVAzX1NVRkZJWCAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJQ0pQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBCTV9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQ1NfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUFBQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YU1BfU1VGRklYICAgICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDQ09NTV9TVUZGSVggICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ000UDEwX1NVRkZJWCAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAyX1NVRkZJWCAgIEJBUkVfU1VGRklYCi0KLQotCi0KLS8qIERlZmluZSB3aGF0IHRoZSBlYWNoIGJhcmUsIHVuLXN1ZmZpeGVkIE9wZW5NQVggQVBJIGZ1bmN0aW9uIG5hbWVzIGlzIHRvIGJlIHJlbmFtZWQgKi8KLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlRGF0U3RyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRGF0U3RyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUZpbGxFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUZpbGxFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZVByZ0NmZ0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVByZ0NmZ0VsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0VuY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0VuY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0kgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTURDVEZ3ZF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEZ3ZF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTURDVEludl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEludl9TMzJfUzE2LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX05vaXNlbGVzc0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX05vaXNlbGVzc0RlY29kZSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19RdWFudEludl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19RdWFudEludl9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRElGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRElGSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotCi0KLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZV9TMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZV9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfTURDVEludl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfTURDVEludl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZV9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZV9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2LCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTaWRlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTaWRlSW5mbywgT01YQUNNUDNfU1VGRklYKQotCi0jZGVmaW5lIG9teElDSlBfQ29weUV4cGFuZF9VOF9DMyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfQ29weUV4cGFuZF9VOF9DMywgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENURndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENURndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQotCi0jZGVmaW5lIG9teElQQk1fQWRkQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQWRkQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DM1IsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX01pcnJvcl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX01pcnJvcl9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX011bENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX011bENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiAgICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0ZpbHRlckZJUl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlckZJUl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50R2V0U3RhdGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50R2V0U3RhdGVTaXplLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRJbml0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DM1IsIE9NWElQUFBfU1VGRklYKQotCi0jZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQ29weV9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQ29weV9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRG90UHJvZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRG90UHJvZF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV84eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaywgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5MTZ4MTYsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db3B5OHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5OHg4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fRXhwYW5kRnJhbWVfSSwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0xpbWl0TVZUb1JlY3QsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9TQURfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQotCi0jZGVmaW5lIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQXZlcmFnZV80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrTHVtYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgT01YQ0FUQkFSKFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0dldFZMQ0luZm8sIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FSW5pdCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfMTZ4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzh4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQVREXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQVREXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVBhZE1WX1BWT1AsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlTVYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRmluZE1WcHJlZCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0lEQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NQ1JlY29uQmxvY2ssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUluaXQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLCBPTVhWQ000UDJfU1VGRklYKQotCi0KLSNlbmRpZiAvKiBfYXJtT01YX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmNiMGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKgotICogRmlsZTogb214dHlwZXMuaAotICogQnJpZWY6IERlZmluZXMgYmFzaWMgRGF0YSB0eXBlcyB1c2VkIGluIE9wZW5NQVggdjEuMC4yIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqCi0gKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKLSAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCi0gKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCi0gKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAotICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAotICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAotICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCi0gKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKLSAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAotICoKLSAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAotICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCi0gKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKLSAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKLSAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAotICogbWF0ZXJpYWxzLgotICogCi0gKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKgotICovCi0gIAotI2lmbmRlZiBfT01YVFlQRVNfSF8KLSNkZWZpbmUgX09NWFRZUEVTX0hfCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4gCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNkZWZpbmUgT01YX0lOCi0jZGVmaW5lIE9NWF9PVVQKLSNkZWZpbmUgT01YX0lOT1VUCi0KLQotdHlwZWRlZiBlbnVtIHsKLSAgICAKLSAgICAvKiBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAqLwotICAgIE9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgID0gIDAsICAgIC8qIE5vIGVycm9yLCB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLwotICAgIE9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgID0gLTIsICAgIC8qIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgKi8gICAgCi0gICAgT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgPSAtMTgyLCAgLyogSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgKi8gICAgCi0gICAgT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgPSAtOSwgICAgLyogTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uICovCi0gICAgT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgPSAtMTU5LCAgLyogQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAqLwotICAgIE9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgID0gLTE2NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgKi8KLSAgICBPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICA9IC0xNjMsICAvKiBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICovICAgICAKLSAgICBPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICA9IC0xNjIsICAvKiBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAqLyAgICAKLQlPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICA9IC0xNjAsICAvKiBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yICovCi0KLSAgICAvKiBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uKi8KLSAgICBPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICA9IC01LCAgICAvKiBCYWQgQXJndW1lbnRzICovCi0KLSAgICBPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICA9IC0xNTcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAqLwotICAgIE9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgID0gLTE1NiwgIC8qIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgKi8gICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICA9IC0xNTUsICAvKiBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgKi8gICAgICAgICAgICAgICAgICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICA9IC0xNTQsICAvKiBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLwotICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgID0gLTE1MywgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8gICAgICAgICAgICAgICAgICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICA9IC0xNTIsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICovICAKLQotICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgID0gLTE4MywgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgID0gLTE4MSwgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgPSAtMTcsICAgLyogQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uICovCi0KLSAgICBPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICA9IC0xODAsICAvKiBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgKi8KLQotICAgIE9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgID0gSU5UX01BWCAgLypQbGFjZWhvbGRlciwgZm9yY2VzIGVudW0gb2Ygc2l6ZSBPTVhfSU5UKi8KLSAgICAKLSB9IE9NWFJlc3VsdDsgICAgICAgICAgLyoqIFJldHVybiB2YWx1ZSBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24uIElkZW50aWNhbCB0byBPTVhfSU5UICovCi0KLSAKLS8qIE9NWF9VOCAqLwotdHlwZWRlZiB1aW50OF90IE9NWF9VODsKLSAKLS8qIE9NWF9TOCAqLwotdHlwZWRlZiBpbnQ4X3QgT01YX1M4OwotIAotLyogT01YX1UxNiAqLwotdHlwZWRlZiB1aW50MTZfdCBPTVhfVTE2OwotCi0vKiBPTVhfUzE2ICovCi10eXBlZGVmIGludDE2X3QgT01YX1MxNjsKLQotLyogT01YX1UzMiAqLwotdHlwZWRlZiB1aW50MzJfdCBPTVhfVTMyOwotCi0vKiBPTVhfUzMyICovCi10eXBlZGVmIGludDMyX3QgT01YX1MzMjsKLQotLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KLSNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKLSAgICB0eXBlZGVmIF9faW50NjQgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMGk2NCkKLSAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMGk2NCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKLSNlbHNlCi0gICAgdHlwZWRlZiBpbnQ2NF90IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVpbnQ2NF90IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQotICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCi0jZW5kaWYKLQotLyogT01YX1NDOCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M4IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TOCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0M4OyAvKiogU2lnbmVkIDgtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMTYgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMTYgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MxNiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MxNjsgLyoqIFNpZ25lZCAxNi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0MzMiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1MzMiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzMyOyAvKiogU2lnbmVkIDMyLWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzY0ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDNjQ7IC8qKiBTaWduZWQgNjQtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX0YzMiAqLwotdHlwZWRlZiBmbG9hdCBPTVhfRjMyOyAvKiogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9GNjQgKi8KLXR5cGVkZWYgZG91YmxlIE9NWF9GNjQ7IC8qKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCi0KLQotLyogT01YX0lOVCAqLwotdHlwZWRlZiBpbnQgT01YX0lOVDsgLyoqIHNpZ25lZCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gbWFjaGluZSB3b3JkIGxlbmd0aCwgaGFzIG1heGltdW0gc2lnbmVkIHZhbHVlIElOVF9NQVgqLwotCi0KLSNkZWZpbmUgT01YX01JTl9TOCAgCSAgIAkoLTEyOCkKLSNkZWZpbmUgT01YX01JTl9VOCAgCQkwCi0jZGVmaW5lIE9NWF9NSU5fUzE2CQkgCSgtMzI3NjgpCi0jZGVmaW5lIE9NWF9NSU5fVTE2CQkJMAotI2RlZmluZSBPTVhfTUlOX1MzMgkJCSgtMjE0NzQ4MzY0Ny0xKQotI2RlZmluZSBPTVhfTUlOX1UzMgkJCTAKLQotI2RlZmluZSBPTVhfTUFYX1M4CQkJKDEyNykKLSNkZWZpbmUgT01YX01BWF9VOAkJCSgyNTUpCi0jZGVmaW5lIE9NWF9NQVhfUzE2CQkJKDMyNzY3KQotI2RlZmluZSBPTVhfTUFYX1UxNgkJCSgweEZGRkYpCi0jZGVmaW5lIE9NWF9NQVhfUzMyCQkJKDIxNDc0ODM2NDcpCi0jZGVmaW5lIE9NWF9NQVhfVTMyCQkJKDB4RkZGRkZGRkYpCi0KLXR5cGVkZWYgdm9pZCBPTVhWb2lkOwotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAoKHZvaWQqKTApCi0jZW5kaWYKLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBhIHJlY3RhbmdsZSwgCi0gICogd2hlcmUgeCx5IGRlZmluZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIKLSAgKiBvZiB0aGUgcmVjdGFuZ2xlLCB3aXRoIGRpbWVuc2lvbnMgd2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uIAotICAqIGFuZCBoZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JT01YX0lOVCB4OyAgICAgIC8qKiB4LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLwotCU9NWF9JTlQgeTsgICAgICAvKiogeS1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbi4gKi8KLQlPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24uICovCi19T01YUmVjdDsKLQotCi0vKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIG9mIGEgcG9pbnQsICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSBPTVhfSU5UIHg7IC8qKiB4LWNvb3JkaW5hdGUgKi8KLSBPTVhfSU5UIHk7CS8qKiB5LWNvb3JkaW5hdGUgKi8KLQkKLX0gT01YUG9pbnQ7Ci0KLQotLyoqIERlZmluZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSByZWN0YW5nbGUsIG9yIHJlZ2lvbiBvZiBpbnRlcmVzdCBpbiBhbiBpbWFnZSAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeC1kaXJlY3Rpb24gKi8KLSBPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KLQkKLX0gT01YU2l6ZTsKLQotI2VuZGlmIC8qIF9PTVhUWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3NDJjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXh0eXBlc19zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAKLU9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgIEVRVSAgMCAgICA7Ly8gTm8gZXJyb3IgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgCi1PTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICBFUVUgLTIgICAgOy8vIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgICAgIAotT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgRVFVIC0xODIgIDsvLyBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAgICAgCi1PTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICBFUVUgLTkgICAgOy8vIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAKLU9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgIEVRVSAtMTU5ICA7Ly8gQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAKLU9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgIEVRVSAtMTY3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAKLU9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgIEVRVSAtMTYzICA7Ly8gQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAgICAgIAotT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgRVFVIC0xNjIgIDsvLyBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAgICAgCi1PTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICBFUVUgLTE2MCAgOy8vIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgCi0KLTsvLyBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uCi1PTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICBFUVUgLTUgICAgOy8vIEJhZCBBcmd1bWVudHMgCi0KLU9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgIEVRVSAtMTU3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgCi1PTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICBFUVUgLTE1NiAgOy8vIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgICAgCi1PTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICBFUVUgLTE1NSAgOy8vIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAgICAgICAgICAgICAgICAgICAKLU9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgIEVRVSAtMTU0ICA7Ly8gQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgCi1PTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICBFUVUgLTE1MyAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgCi1PTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICBFUVUgLTE1MiAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgICAKLQotT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgRVFVIC0xODMgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgCi1PTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICBFUVUgLTE4MSAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgIAotT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgRVFVIC0xNyAgIDsvLyBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gCi0KLU9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgIEVRVSAtMTgwICA7Ly8gRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lIAotCi1PTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICBFUVUgMHg3RkZGRkZGRgotCi0KLQotT01YX01JTl9TOCAgICAgIEVRVSAJICAgCSgtMTI4KQotT01YX01JTl9VOCAgCUVRVSAgICAgCTAKLU9NWF9NSU5fUzE2CQlFUVUgICAgICAJKC0zMjc2OCkKLU9NWF9NSU5fVTE2CQlFUVUJICAgICAgICAwCi0KLQotT01YX01JTl9TMzIJCUVRVQkoLTIxNDc0ODM2NDctMSkKLU9NWF9NSU5fVTMyCQlFUVUJMAotCi1PTVhfTUFYX1M4CQlFUVUJKDEyNykKLU9NWF9NQVhfVTgJCUVRVQkoMjU1KQotT01YX01BWF9TMTYJCUVRVQkoMzI3NjcpCi1PTVhfTUFYX1UxNgkJRVFVCSgweEZGRkYpCi1PTVhfTUFYX1MzMgkJRVFVCSgyMTQ3NDgzNjQ3KQotT01YX01BWF9VMzIJCUVRVQkoMHhGRkZGRkZGRikKLQotT01YX1ZDX1VQUEVSICAgIEVRVSAweDEgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCi1PTVhfVkNfTEVGVCAgICAgRVFVIDB4MiAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgCi1PTVhfVkNfVVBQRVJfUklHSFQgICAgRVFVIDB4NDAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKLQotTlVMTCAgICBFUVUgMAotCi07Ly8gU3RydWN0dXJlcwotCi0gICAgSU5DTFVERSAgICAgYXJtQ09NTV9zLmgKLQotICAgIE1fU1RSVUNUICAgIE9NWFBvaW50Ci0gICAgTV9GSUVMRCAgICAgeCwgNAotICAgIE1fRklFTEQgICAgIHksIDQKLSAgICBNX0VORFNUUlVDVAotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2J1aWxkX3ZjLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTIwNmMwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0jIS91c3IvYmluL3BlcmwKLSMKLSMgCi0jIEZpbGUgTmFtZTogIGJ1aWxkX3ZjLnBsCi0jIE9wZW5NQVggREw6IHYxLjAuMgotIyBSZXZpc2lvbjogICAxMjI5MAotIyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSMgCi0jIAotIyAKLSMKLSMgVGhpcyBmaWxlIGJ1aWxkcyB0aGUgT3Blbk1BWCBETCB2YyBkb21haW4gbGlicmFyeSBvbXhWQy5vLgotIwotCi11c2UgRmlsZTo6U3BlYzsKLXVzZSBzdHJpY3Q7Ci0KLW15ICgkQ0MsICRDQ19PUFRTLCAkQVMsICRBU19PUFRTLCAkTElCLCAkTElCX09QVFMsICRMSUJfVFlQRSk7Ci0KLSRDQyAgICAgICA9ICdhcm1jYyc7Ci0kQ0NfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IENvcnRleC1BOCAtYyc7Ci0kQVMgICAgICAgPSAnYXJtYXNtJzsKLSRBU19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQ29ydGV4LUE4JzsKLSMgJExJQiAgICAgID0gJ2FybWxpbmsnOwotIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKLSMgJExJQl9UWVBFID0gJy5vJzsKLSRMSUIgICAgICA9ICdhcm1hcic7Ci0kTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOwotJExJQl9UWVBFID0gJy5hJzsKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1teSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7Ci0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgotQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7Ci0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgotb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7Ci1AZmlsZWxpc3QgPSA8RklMRVM+OwotY2xvc2UoRklMRVMpOwotCi0jIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKLWZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQotewotICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Ci19Ci0KLSMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgotJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKLQotIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQotbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOwotbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOwotCi0kb2JqbGlzdCA9ICcnOwotCi0jIENvbXBpbGUgZWFjaCBmaWxlCi1mb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCi17Ci0JbXkgJGY7Ci0JbXkgJGJhc2U7Ci0JbXkgJGV4dDsKLQlteSAkb2JqZmlsZTsKLQotCWNob21wKCRmaWxlKTsKLQkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7Ci0KLQkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOwotICAgICRmPX5zL1tcblxmXHJdLy9nOyAjIFJlbW92ZSBhbnkgZW5kLW9mLWxpbmUgY2hhcmFjdGVycwotCi0JaWYoKCRiYXNlLCAkZXh0KSA9ICRmID1+IC8oLispXC4oXHcpJC8pCi0JewotCQkkb2JqZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ29iaicsICRiYXNlLicubycpOwotCi0JCWlmKCRleHQgZXEgJ2MnKQotCQl7Ci0JCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKLQkJCSRjb21tYW5kID0gJENDLicgJy4kQ0NfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7Ci0JCQlwcmludCAiJGNvbW1hbmRcbiI7Ci0JCQlzeXN0ZW0oJGNvbW1hbmQpOwotCQl9Ci0JCWVsc2lmKCRleHQgZXEgJ3MnKQotCQl7Ci0JCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKLQkJCSRjb21tYW5kID0gJEFTLicgJy4kQVNfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7Ci0JCQlwcmludCAiJGNvbW1hbmRcbiI7Ci0JCQlzeXN0ZW0oJGNvbW1hbmQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJpbnQgIklnbm9yaW5nIGZpbGU6ICRmXG4iOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWRpZSAiTm8gZmlsZSBleHRlbnNpb24gZm91bmQ6ICRmXG4iOwotCX0KLX0KLQotIyBEbyB0aGUgZmluYWwgbGluayBzdGFnZSB0byBjcmVhdGUgdGhlIGxpYnJhcmllcy4KLSRsaWJmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnbGliJywgJ29teFZDJy4kTElCX1RZUEUpOwotJGNvbW1hbmQgPSAkTElCLicgJy4kTElCX09QVFMuJyAnLiRsaWJmaWxlLicgJy4kb2JqbGlzdDsKLXByaW50ICIkY29tbWFuZFxuIjsKLShzeXN0ZW0oJGNvbW1hbmQpID09IDApIGFuZCBwcmludCAiQnVpbGQgc3VjY2Vzc2Z1bFxuIjsKLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2ZpbGVsaXN0X3ZjLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjhlZWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2ZpbGVsaXN0X3ZjLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS4vYXBpL2FybUNPTU0uaAotLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCi0uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCi0uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCi0uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCi0uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCi0uL2FwaS9hcm1DT01NX3MuaAotLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKLS4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCi0uL2FwaS9vbXh0eXBlcy5oCi0uL2FwaS9vbXh0eXBlc19zLmgKLS4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKLS4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKLS4vdmMvYXBpL2FybVZDLmgKLS4vdmMvYXBpL2FybVZDQ09NTV9zLmgKLS4vdmMvYXBpL29teFZDLmgKLS4vdmMvYXBpL29teFZDX3MuaAotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi0uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKLS4vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZGJmNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU0uYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlZmluZXMgQ29tbW9uIEFQSXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncwotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIE1pc2NlbGxhbmVvdXMgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlICs9IDAuNTsKLSAgICAgICAgCi0gICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMTYpT01YX01BWF9TMTYgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gMC41OwotCi0gICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMTYpT01YX01JTl9TMTYgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgVmFsdWUgKz0gMC41OwotICAgICAgICAKLSAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MzMilPTVhfTUFYX1MzMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUFYX1MzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAwLjU7Ci0KLSAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MzMilPTVhfTUlOX1MzMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUlOX1MzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIFZhbHVlICs9IDAuNTsKLSAgICAKLSAgICBpZihWYWx1ZSA+IChPTVhfVTE2KU9NWF9NQVhfVTE2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UxNilPTVhfTUFYX1UxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTE2KVZhbHVlOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIFZhbHVlICs9IDAuNTsKLSAgICAKLSAgICBpZihWYWx1ZSA+IChPTVhfVTMyKU9NWF9NQVhfVTMyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMilPTVhfTUFYX1UzMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTMyKVZhbHVlOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzY0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIDY0IGJpdCBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzY0IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNpZ25DaGVjawotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6Ci0gKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKi8gCi0KLU9NWF9JTlQgYXJtU2lnbkNoZWNrICgKLSAgICBPTVhfUzE2IHZhcgotKQotCi17Ci0gICAgT01YX0lOVCBTaWduOwotICAgIAotICAgIGlmICh2YXIgPCAwKQotICAgIHsKLSAgICAgICAgU2lnbiA9IC0xOwotICAgIH0KLSAgICBlbHNlIGlmICggdmFyID4gMCkKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTaWduID0gMDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFNpZ247Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXAKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybUNsaXAgKAotICAgIE9NWF9JTlQgbWluLAotICAgIE9NWF9JTlQgbWF4LCAKLSAgICBPTVhfUzMyIHNyYyAKLSkKLSAKLXsKLSAgICBpZiAoc3JjID4gbWF4KQotICAgIHsKLSAgICAgICAgc3JjID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChzcmMgPCBtaW4pCi0gICAgewotICAgICAgICBzcmMgPSBtaW47Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzcmM7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXBfRjMyCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX0YzMiBhcm1DbGlwX0YzMiAoCi0gICAgT01YX0YzMiBtaW4sCi0gICAgT01YX0YzMiBtYXgsIAotICAgIE9NWF9GMzIgc3JjIAotKQotIAotewotICAgIGlmIChzcmMgPiBtYXgpCi0gICAgewotICAgICAgICBzcmMgPSBtYXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1pbjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNyYzsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCi0gKgotICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKLSAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCi0gKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKLSAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAotICogdmFsdWUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgotICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKLSAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKE9NWF9GMzIgdiwgT01YX0lOVCBzaGlmdCwgT01YX0lOVCBzYXRCaXRzKSAKLXsKLSAgICBPTVhfVTMyIGFsbE9uZXMgPSAoT01YX1UzMikoLTEpOwotICAgIE9NWF9VMzIgbWF4ViA9IGFsbE9uZXMgPj4gKDMyLXNhdEJpdHMpOwotICAgIE9NWF9GMzIgdlNoaWZ0ZWQsIHZSb3VuZGVkLCBzaGlmdERpdiA9IChPTVhfRjMyKSgxIDw8IHNoaWZ0KTsKLSAgICBPTVhfVTMyIHZJbnQ7Ci0gICAgT01YX1UzMiB2SW50U2F0OwotICAgIAotICAgIGlmKHYgPD0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgdlNoaWZ0ZWQgPSB2IC8gc2hpZnREaXY7Ci0gICAgdlJvdW5kZWQgPSAoT01YX0YzMikodlNoaWZ0ZWQgKyAwLjUpOwotICAgIHZJbnQgPSAoT01YX1UzMil2Um91bmRlZDsKLSAgICB2SW50U2F0ID0gdkludDsKLSAgICBpZih2SW50U2F0ID4gbWF4VikgCi0gICAgICAgIHZJbnRTYXQgPSBtYXhWOwotICAgIHJldHVybiB2SW50U2F0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoZXNlIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgotICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgotICovCi1PTVhSZXN1bHQgYXJtU3dhcEVsZW0oCi0gICAgICAgIE9NWF9VOCAqcEJ1ZjEsCi0gICAgICAgIE9NWF9VOCAqcEJ1ZjIsCi0gICAgICAgIE9NWF9JTlQgZWxlbVNpemUKLSAgICAgICApCi17Ci0gICAgT01YX0lOVCBpOwotICAgIE9NWF9VOCB0ZW1wOwotICAgIGFybVJldEFyZ0VycklmKCFwQnVmMSB8fCAhcEJ1ZjIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBmb3IoaSA9IDA7IGkgPCBlbGVtU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgdGVtcCA9ICoocEJ1ZjEgKyBpKTsKLSAgICAgICAgKihwQnVmMSArIGkpID0gKihwQnVmMiArIGkpOwotICAgICAgICAqKHBCdWYyICsgaSkgPSB0ZW1wOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKLSAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKLSAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtTWVkaWFuT2YzICgKLSAgICBPTVhfUzMyIGZFbnRyeSwKLSAgICBPTVhfUzMyIHNFbnRyeSwgCi0gICAgT01YX1MzMiB0RW50cnkgCi0pCi17Ci0gICAgT01YX1MzMiBhLCBiLCBjOwotICAgIAotICAgIGEgPSBhcm1NaW4gKGZFbnRyeSwgc0VudHJ5KTsKLSAgICBiID0gYXJtTWF4IChmRW50cnksIHNFbnRyeSk7Ci0gICAgYyA9IGFybU1pbiAoYiwgdEVudHJ5KTsKLSAgICByZXR1cm4gKGFybU1heCAoYSwgYykpOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9VOCAtLSAgICAgUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHBvc2l0aXZlIHZhbHVlLiAKLSAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc21hbGxlc3Qgaz49MCBzdWNoIHRoYXQgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gKDE8PGspLgotICovIAotIAotT01YX1U4IGFybUxvZ1NpemUgKAotICAgIE9NWF9VMTYgdmFsdWUgCi0pCi17Ci0gICAgT01YX1U4IGk7ICAgIAotICAgIGZvciAoIGkgPSAwOyB2YWx1ZSA+IDA7IHZhbHVlID0gdmFsdWUgPj4gMSkgCi0gICAgewotICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRBZGRfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKLSAgICB7Ci0gICAgICAgIC8qU2FtZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0QWRkX1M2NChPTVhfUzY0IFZhbHVlMSxPTVhfUzY0IFZhbHVlMikKLXsKLSAgICBPTVhfUzY0IFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCi0gICAgewotICAgICAgICAvKlNhbWUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgUmVzdWx0ID0gT01YX01BWF9TNjQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1M2NDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKLSAqIAotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRTdWJfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPCAwKQotICAgIHsKLSAgICAgICAgLypPcHBvc2l0ZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCi0gKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICoqLwotCi1PTVhfUzMyIGFybVNhdE1hY19TMzIoT01YX1MzMiBNYWMsT01YX1MxNiBWYWx1ZTEsT01YX1MxNiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gKE9NWF9TMzIpKFZhbHVlMSpWYWx1ZTIpOwotICAgIFJlc3VsdCA9IGFybVNhdEFkZF9TMzIoIE1hYyAsIFJlc3VsdCApOwotCi0gICAgcmV0dXJuIFJlc3VsdDsgICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYwotICoKLSAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAotICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCi0gKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMihPTVhfUzMyIG1hYywgT01YX1MzMiBkZWxheUVsZW0sIE9NWF9TMTYgZmlsVGFwICkKLXsKLSAgICAKLSAgICBPTVhfUzMyIHJlc3VsdDsKLQotICAgIHJlc3VsdCA9IGFybVNhdE11bFMxNlMzMl9TMzIoZmlsVGFwLGRlbGF5RWxlbSk7IAotCi0gICAgaWYgKCByZXN1bHQgPiBPTVhfTUFYX1MxNiApCi0gICAgewotICAgICAgICByZXN1bHQgPSBPTVhfTUFYX1MzMjsKLSAgICB9Ci0gICAgZWxzZSBpZiggcmVzdWx0IDwgT01YX01JTl9TMTYgKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gT01YX01JTl9TMzI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGRlbGF5RWxlbSAqIGZpbFRhcDsKLSAgICB9Ci0KLSAgICBtYWMgPSBhcm1TYXRBZGRfUzMyKG1hYyxyZXN1bHQpOwotICAgIAotICAgIHJldHVybiBtYWM7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKLSAqCi0gKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodC9MZWZ0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzaGlmdCApICkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgotICogW2luXSBzaGlmdCBUaGUgc2hpZnQgbnVtYmVyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KE9NWF9TMzIgaW5wdXQsIE9NWF9JTlQgc2hpZnQpCi17Ci0gICAgaW5wdXQgPSBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoaW5wdXQsLXNoaWZ0KTsKLQotICAgIGlmICggaW5wdXQgPiBPTVhfTUFYX1MxNiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IDwgT01YX01JTl9TMTYpCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgcmV0dXJuIChPTVhfUzE2KWlucHV0OwotICAgIH0KLQotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICogICAgIAotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBTaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKE9NWF9TMzIgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCi17Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgIGlmIChTaGlmdCA8IDApCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDsKLSAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCAoMSA8PCAoU2hpZnQgLSAxKSkpOwotICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoT01YX1M2NCBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgCi0gICAgaWYgKFNoaWZ0IDwgMCkKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OwotICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsICgoT01YX1M2NCkxIDw8IChTaGlmdCAtIDEpKSk7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsIFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVmFsdWU7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoT01YX1MxNiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCi17Ci0gICAgT01YX1MxNiBoaTIsbG8xOwotICAgIE9NWF9VMTYgbG8yOwotICAgIAotICAgIE9NWF9TMzIgdGVtcDEsdGVtcDI7Ci0gICAgT01YX1MzMiByZXN1bHQ7Ci0gICAgCi0gICAgbG8xICA9IGlucHV0MTsKLQotICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKLSAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7Ci0gICAgCi0gICAgdGVtcDEgPSBoaTIgKiBsbzE7Ci0gICAgdGVtcDIgPSAoIGxvMiogbG8xICkgPj4gMTY7Ci0KLSAgICByZXN1bHQgPSAgYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMihPTVhfUzMyIGlucHV0MSxPTVhfUzMyIGlucHV0MikKLXsKLSAgICBPTVhfUzE2IGhpMSxoaTI7Ci0gICAgT01YX1UxNiBsbzEsbG8yOwotICAgIAotICAgIE9NWF9TMzIgdGVtcDEsdGVtcDIsdGVtcDM7Ci0gICAgT01YX1MzMiByZXN1bHQ7Ci0KLSAgICBoaTEgID0gKCBpbnB1dDEgPj4gIDE2ICk7Ci0gICAgbG8xICA9ICggKE9NWF9VMzIpKCBpbnB1dDEgPDwgMTYgKSA+PiAxNiApOwotCi0gICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOwotICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKLSAgICAKLSAgICB0ZW1wMSA9ICAgaGkxICogaGkyOwotICAgIHRlbXAyID0gKCBoaTEqIGxvMiApID4+IDE2OwotICAgIHRlbXAzID0gKCBoaTIqIGxvMSApID4+IDE2OwotCi0gICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7Ci0gICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMihyZXN1bHQsdGVtcDMpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKLSAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybwotICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAotICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKQotewotICAgIE9NWF9GNjQgcmVzdWx0OwotICAgIAotICAgIHJlc3VsdCA9ICgoT01YX0Y2NClOdW0pLygoT01YX0Y2NClEZW5vKTsKLSAgICAKLSAgICBpZiAocmVzdWx0ID49IDApCi0gICAgewotICAgICAgICByZXN1bHQgKz0gMC41OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgLT0gMC41OwotICAgIH0KLQotICAgIHJldHVybiAoT01YX1MzMikocmVzdWx0KTsKLX0KLQotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY1M2NhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlZmluZXMgYml0c3RyZWFtIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIGNvZGVjcwotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uLjMyCi0gKgotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKLXsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBSZXR1cm4gTiBiaXRzICovCi0gICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotICogICAgCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4zMgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotCi1PTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKLXsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgIAotICAgIGlmKE4gPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0gICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCi0gICAgT2Zmc2V0ICs9IE47Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKLQotICAgIC8qIFJldHVybiBOIGJpdHMgKi8KLSAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0gCi1PTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KQotewotICAgIGlmKCpwT2Zmc2V0ID4gMCkKLSAgICB7Ci0gICAgICAgICpwcEJpdFN0cmVhbSArPSAxOwotICAgICAgICAqcE9mZnNldCA9IDA7Ci0gICAgfSAgICAKLX0KLQotLyoqIAotICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLQotCi1PTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKQotewotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgCi0gICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KLSAgICBPZmZzZXQgKz0gTjsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgcENvZGVCb29rCi0gKiAKLSAqIFtvdXRdICAgICpwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAotICogICAgICAgICA6IEFSTV9OT19DT0RFQk9PS19JTkRFWCA9IC0xIGlmIHNlYXJjaCBmYWlscy4KLSAqKi8KLSNpZm5kZWYgQ19PUFRJTUlaRURfSU1QTEVNRU5UQVRJT04gCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKQoteyAgICAKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgIE9NWF9JTlQgSW5kZXg7Ci0gICAgICAgIAotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBTZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJvb2sgKi8gICAgCi0gICAgZm9yIChJbmRleD0wOyBwQ29kZUJvb2stPmNvZGVMZW4gIT0gMDsgSW5kZXgrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQ29kZUJvb2stPmNvZGVXb3JkID09IChWYWx1ZSA+PiAoMzIgLSBwQ29kZUJvb2stPmNvZGVMZW4pKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ICAgICAgID0gT2Zmc2V0ICsgcENvZGVCb29rLT5jb2RlTGVuOwotICAgICAgICAgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQgPj4gMykgOwotICAgICAgICAgICAgKnBPZmZzZXQgICAgID0gT2Zmc2V0ICYgNzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIEluZGV4OwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgcENvZGVCb29rKys7Ci0gICAgfQotCi0gICAgLyogTm8gY29kZSBtYXRjaCBmb3VuZCAqLwotICAgIHJldHVybiBBUk1fTk9fQ09ERUJPT0tfSU5ERVg7Ci19Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXSBwT2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXSBjb2RlV29yZCAgICAgICAgQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqIFtpbl0gY29kZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tCaXRzICgKLSAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgT01YX1UzMiBjb2RlV29yZCwgCi0gICAgT01YX0lOVCBjb2RlTGVuZ3RoIAotKQotewotICAgIE9NWF9VOCAgKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgICAgICAKLSAgICAvKiBjaGVja2luZyBhcmd1bWVudCB2YWxpZGl0eSAqLwotICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPiA3LCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA8IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoID4gMzIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIFByZXBhcmUgdGhlIGZpcnN0IGJ5dGUgKi8KLSAgICBjb2RlV29yZCA9IGNvZGVXb3JkIDw8ICgzMi1jb2RlTGVuZ3RoKTsKLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdID4+ICg4LU9mZnNldCkpIDw8ICg4LU9mZnNldCk7Ci0gICAgVmFsdWUgPSBWYWx1ZSB8IChjb2RlV29yZCA+PiAoMjQrT2Zmc2V0KSk7Ci0KLSAgICAvKiBXcml0ZSBvdXQgd2hvbGUgYnl0ZXMgKi8KLSAgICB3aGlsZSAoOC1PZmZzZXQgPD0gY29kZUxlbmd0aCkKLSAgICB7Ci0gICAgICAgICpwQml0U3RyZWFtKysgPSAoT01YX1U4KVZhbHVlOwotICAgICAgICBjb2RlV29yZCAgID0gY29kZVdvcmQgIDw8ICg4LU9mZnNldCk7Ci0gICAgICAgIGNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoIC0gKDgtT2Zmc2V0KTsKLSAgICAgICAgT2Zmc2V0ID0gMDsKLSAgICAgICAgVmFsdWUgPSBjb2RlV29yZCA+PiAyNDsKLSAgICB9Ci0KLSAgICAvKiBXcml0ZSBvdXQgZmluYWwgcGFydGlhbCBieXRlICovCi0gICAgKnBCaXRTdHJlYW0gID0gKE9NWF9VOClWYWx1ZTsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICsgY29kZUxlbmd0aDsKLSAgICAKLSAgICByZXR1cm4gIE9NWF9TdHNfTm9FcnI7Ci19Ci0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIEFSTV9WTEMzMiBjb2RlIAotKQotewotICAgIHJldHVybiAoYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGNvZGUuY29kZVdvcmQsIGNvZGUuY29kZUxlbikpOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkNGM2Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAgIAotICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYwotICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgotICoKLSAqLwotCi0jaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKLQotICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1Ci0gICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQotICAgICAgKiAgcyg2KT0yLjAKLSAgICAgICogIHMoNyk9NC4wCi0gICAgICAqICBBKDApID0gMipzcXJ0KDIpCi0gICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKLQkgICovCi0JICAKLV9fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KLXsKLSAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKLSAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKLSAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKLSAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKLSAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKLSAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKLSAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKLSAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKLX07Ci0gICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCi1jb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQotewotICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKLSAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCi0gICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAotICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKLSAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCi0gICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAotICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKLSAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKLX07Ci0gICAKLWNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQotewotICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KLSAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCi0gICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLwotICAgIDB4MDAwMCAgICAKLX07Ci0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNjlhMTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkuCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSNkZWZpbmUgTWFza1RhYmxlU2l6ZSA3MgotCi1jb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdID0gCi17Ci0gICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiAgICAKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdID0gCi17Ci0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGICAgIAotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzN2E1ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiBhcm1WaWRlby5oCi0gKiBCcmllZjogRGVjbGFyZXMgQVBJJ3MvQmFzaWMgRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1BWCBWaWRlbyBkb21haW4KLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9hcm1WaWRlb19IXwotI2RlZmluZSBfYXJtVmlkZW9fSF8KLQotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqCi0gKiBBUk0gc3BlY2lmaWMgc3RhdGUgc3RydWN0dXJlIHRvIGhvbGQgTW90aW9uIEVzdGltYXRpb24gaW5mb3JtYXRpb24uCi0gKi8KLSAKLXN0cnVjdCBtNHAyX01FU3BlYwotewotICAgIE9NWFZDTTRQMk1FUGFyYW1zIE1FUGFyYW1zOwotICAgIE9NWFZDTTRQMk1FTW9kZSAgIE1FTW9kZTsKLX07Ci0KLXN0cnVjdCBtNHAxMF9NRVNwZWMKLXsKLSAgICBPTVhWQ000UDEwTUVQYXJhbXMgTUVQYXJhbXM7Ci0gICAgT01YVkNNNFAxME1FTW9kZSAgIE1FTW9kZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IG00cDJfTUVTcGVjICBBUk1WQ000UDJfTUVTcGVjOwotdHlwZWRlZiBzdHJ1Y3QgbTRwMTBfTUVTcGVjIEFSTVZDTTRQMTBfTUVTcGVjOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ29tcGFyZU1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIHRoZQotICogYmVzdCBNViBhbmQgU0FECi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgbXZYICAgICB4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBtdlkgICAgIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGNhbmRTQUQgQ2FuZGlkYXRlIFNBRAotICogW2luXSAgICAgYmVzdE1WWCB4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgYmVzdE1WWSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgYmVzdFNBRCBiZXN0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdAotICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAotICovCi0KLU9NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCi0gICAgT01YX1MxNiBtdlgsCi0gICAgT01YX1MxNiBtdlksCi0gICAgT01YX0lOVCBjYW5kU0FELAotICAgIE9NWF9TMTYgYmVzdE1WWCwKLSAgICBPTVhfUzE2IGJlc3RNVlksCi0gICAgT01YX0lOVCBiZXN0U0FEKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCi0gKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jawotICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCi0gKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00Ci0gKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCi0gKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQotICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgotICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCi0gKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKLSAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQotICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cwotICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCi0gICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgIE9NWF9JTlQgcHJlZFFQLAotICAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgIHZpZGVvQ29tcCwKLSAgICAgT01YX1U4IGZsYWcsCi0gICAgIE9NWF9JTlQgKnBTdW1FcnIKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi0gKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKLSAqIFtvdXRdICAgIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotICogW291dF0gICAgcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgICBPTVhfSU5UICpwcmVkRGlyLAotICAgICBPTVhfSU5UICpwcmVkUVAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgotICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KLSAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX1U4IHBhdHRlcm4sCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgT01YX1U4IHN0YXJ0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSB2aWRlb0NvbXAgICAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KLSAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLCAKLSAgICAgT01YX1U4ICBzdGFydAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKLSAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4Ci0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCi0gKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKLSAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAotICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4Ci0gKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcwotICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKLSAgICBPTVhfVTMyIHN0b3JlUnVuLAotICAgIE9NWF9TMTYgKiBwRHN0LAotICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKLSAgICBPTVhfVTggIHNpZ24sCi0gICAgT01YX1U4ICBsYXN0LAotICAgIE9NWF9VOCAgKiBpbmRleCwKLSAgICBjb25zdCBPTVhfVTggKiBwWmlnemFnVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9HZXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW4vb3V0XSBwTGFzdCAgICAgICBwb2ludGVyIHRvIGxhc3Qgc3RhdHVzIGZsYWcKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAwCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMQotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwwICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBWbGNUYWJsZUwwICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMSAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSBwVmxjVGFibGVMMSAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBMTUFYVGFibGVMMCAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcExNQVhUYWJsZUwxICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSBwUk1BWFRhYmxlTDAgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUk1BWFRhYmxlTDEgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF1wRHN0CQkJICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKgkJCQkJCQlibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfR2V0VkxDQml0cyAoCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLQkJCSAgT01YX1MxNiAqIHBEc3QsCi0JCQkgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLQkJCSAgT01YX1U4ICAgIHN0YXJ0LAkJCSAgCi0JCQkgIE9NWF9VOCAgKiBwTGFzdCwKLQkJCSAgT01YX1U4ICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0JCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAotICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pOwotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIHRoZSBWTEMgYml0cyBkZXBlbmRpbmcgb24gdGhlIGVzY2FwZSB0eXBlIGFuZCBpbnNlcnQgCi0gKiB0aGUgc2FtZSBpbiB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSAgcnVuICAgICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSAgbGV2ZWwgICAgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSAgcnVuUGx1cyAgICAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSAgbGV2ZWxQbHVzICAgICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSAgZk1vZGUgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgZXNjYXBlIG1vZGVzCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlICAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAotICogW2luXSAgcFZsY1RhYmxlICAgICAgICAgIFZMQyB0YWJsZSBkZWZpbmVkIGluIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAotICogW291dF0gcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgT01YX1UzMiBydW4sCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWwsIAotCQkJICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLCAKLSAgICAgICAgICAgICAgT01YX1U4ICBmTW9kZSwKLQkJCSAgT01YX1U4ICBsYXN0LAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywgCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMwotICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCi0gKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKLSAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KLSAqCi0gKi8KLQotT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCi0gICAgIE9NWF9VMzIgcnVuLAotICAgICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgIE9NWF9TMTYgbGV2ZWwsCi0gICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAotICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAotICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQotKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKLSAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKLSAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKLSAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCi0gKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKLSAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCi0gKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAotICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00Ci0gKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCi0gKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKLSAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgotICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCi0gKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKLSAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KLSAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XQlwRHN0TVYJCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0JcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yLgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIGVzdGltYXRlZCAKLSAqIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCAKLSAqIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCAKLSAqIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCAKLSAqIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIAotICogc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gIAotICogVGhlIGZ1bmN0aW9uIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICAgICAgICAgIHRoZQljdXJyZW50IHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlCi0gKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgCi0gKiAgICAgICAgICAgICAgICAgICAgKGxpbmVhciBhcnJheSwgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqIFtpbl0JcFNlYXJjaFBvaW50UmVmUG9zCXBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCBzZWFyY2ggKHNwZWNpZmllZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXQlybmRWYWwJCQkgIHJvdW5kaW5nIGNvbnRyb2wgYml0IGZvciBoYWxmIHBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAwPXJvdW5kaW5nIGNvbnRyb2wgZGlzYWJsZWQ7IDE9cm91bmRpbmcgY29udHJvbCBlbmFibGVkCi0gKiBbaW5dCXBTcmNEc3RNVgkJcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgYSBwcmlvciAKLSAqICAgICAgICAgICAgICAgICAgMTZYMTYgaW50ZWdlciBzZWFyY2ggYW5kIGl0cyB1bml0IGlzIGhhbGYgcGl4ZWwuCi0gKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgotICogW291dF1wU3JjRHN0TVYJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKTsKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9QYWRNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwYWRkaW5nIGZvciBhIG1hY3JvYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrCi0gKiBbaW5dIHBUcmFuc3AgICAgICAgICBwb2ludGVyIHRvIHRyYW5zcGFyZW50IHN0YXR1cyBidWZmZXIgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jawotICogW291dF0gICAgcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgaW4gd2hpY2ggdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIGhhdmUgYmVlbiBwYWRkZWQKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1BhZE1WKAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNEc3RNViwKLSAgICAgT01YX1U4ICogcFRyYW5zcAotKTsKLQotLyogCi0gKiBILjI2NCBTcGVjaWZpYyBEZWNsYXJhdGlvbnMgCi0gKi8KLS8qIERlZmluZXMgKi8KLSNkZWZpbmUgQVJNX000UDEwX1FfT0ZGU0VUICAgICAgICAoMTUpCi0KLQotLyogRGVxdWFudCB0YWJsZXMgKi8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sMngyWzRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM107Ci1leHRlcm4gY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdOwotCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAotICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KLSAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCi0gKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAotICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQotICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KLSAqCQkJCQkJCQl0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLQotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBuVGFibGUsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jawotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKLSAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKLSAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKLSAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKLSAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKLSAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKLSAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKLSAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcwotICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCi0gKiAKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAotICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLwotICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLwotICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLwotICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLwotICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCi0gICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KLSAgICBpbnQgQ2hyb21hRmxhZwotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotIAkJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbb3V0XQlwRHN0CSAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAotICAgICAgICBjb25zdCBPTVhfVTgqCQlwU3JjLCAKLQkJT01YX1UzMiAJaVNyY1N0ZXAsIAotCQlPTVhfVTgqIAlwRHN0LCAKLQkJT01YX1UzMiAJaURzdFN0ZXAsIAotCQlPTVhfVTMyIAlpV2lkdGgsIAotCQlPTVhfVTMyIAlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW291dF0JcERzdCAgICAJUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKAkKLQkgY29uc3QgT01YX1U4KiAJcFNyYywgCi0JIE9NWF9VMzIgCWlTcmNTdGVwLCAKLSAJIE9NWF9VOCogCXBEc3QsCi0gCSBPTVhfVTMyIAlpRHN0U3RlcCwgCi0gCSBPTVhfVTMyIAlpV2lkdGgsIAotIAkgT01YX1UzMiAJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKLSAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAotICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAotICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEZvcndhcmQgVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKLQotT01YX0lOVCBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCi0gICAgT01YX1MxNiAgbXZYLAotICAgIE9NWF9TMTYgIG12WSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIAotICAgIE9NWF9JTlQgY2FuZFNBRCwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKmJlc3RNViwgCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0KTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKLSAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jawotICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKLSAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKLQljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAotCU9NWF9VMzIgCWlTdGVwT3JnLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JT01YX1UzMiAJaVN0ZXBSZWYsCi0JT01YX1MzMioJcERzdFNBRCwKLQlPTVhfVTMyCQlpSGVpZ2h0LAotCU9NWF9VMzIJCWlXaWR0aCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9BdmVyYWdlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBQcmVkMAkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMAotICoJW2luXQlwUHJlZDEJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaVByZWRTdGVwMAkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMAotICoJW2luXQlpUHJlZFN0ZXAxCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlEc3RTdGVwIAkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKglbaW5dCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9ja3MKLSAqCVtpbl0JaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2tzCi0gKglbb3V0XQlwRHN0UHJlZAkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ0NPTU1fQXZlcmFnZSAoCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQotCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAotCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAotCSBPTVhfVTgqCQlwRHN0UHJlZCwKLQkgT01YX1UzMgkJaURzdFN0ZXAsIAotCSBPTVhfVTMyCQlpV2lkdGgsCi0JIE9NWF9VMzIJCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfU0FEUXVhcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgCi0gKiBhdmVyYWdlIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFtpbl0JCXBTcmMJCQkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCXBTcmNSZWYwCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwCi0gKiBbaW5dCQlwU3JjUmVmMQkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMQotICogW2luXQkJaVNyY1N0ZXAgCQlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlSZWZTdGVwMAkJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqIFtpbl0JCWlSZWZTdGVwMSAJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqIFtpbl0JCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2sKLSAqIFtvdXRdCXBEc3RTQUQJCQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9TQURRdWFyKAotCWNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQotICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCi0gICAgT01YX1UzMioJcERzdFNBRCwKLSAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgIE9NWF9VMzIgICAgIGlXaWR0aAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCi0gICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKLSAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgICAgIE9NWF9VMzIgICAgIGR4LAotICAgICAgICBPTVhfVTMyICAgICBkeQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0gICAgIGNvbnN0IE9NWF9VOCAgICAgKnBTcmMsCi0gICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsCi0gICAgIE9NWF9VOCAgICAgKnBEc3QsCi0gICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsCi0gICAgIE9NWF9VMzIgICAgaVdpZHRoLAotICAgICBPTVhfVTMyICAgIGlIZWlnaHQsCi0gICAgIE9NWF9VMzIgICAgZHgsCi0gICAgIE9NWF9VMzIgICAgZHkKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IG9teFZDSDI2NF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsCi0gKiBwZXJmb3JtIGRlcXVhbnRpc2F0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZgotICogcmVzaWR1YWxzIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwkJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24KLSAqCQkJCQkJCXBhaXIgYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW2luXQlwREMJCQlQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMCi0gKgkJCQkJCQlpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gKiBbaW5dCVFQCQkJUXVhbnRpemF0aW9uIHBhcmFtZXRlcgotICogW2luXSBBQyAgICAgICAgICBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIGNvZWZmaWNpZW50IGV4aXN0cwotICogW291dF0JcERzdAkJcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgoCi0gICAgIE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2ICpwRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfUzE2KiBwREMsCi0gICAgIGludCBBQwotKTsKLQotI2VuZGlmICAvKl9hcm1WaWRlb19IXyovCi0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDQ09NTV9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzJhM2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDQ09NTV9zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCi07Ly8gCi07Ly8gRm9ybXVsYSB1c2VkOgotOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KLQotCi0KLSAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAotICAgICAKLSAgICAgOy8vLyoKLSAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMwotICAgICA7Ly8gKgotICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gICAgIDsvLyAqIAotICAgICA7Ly8gKiBSZW1hcmtzOgotICAgICA7Ly8gKgotICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgotICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgotICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKLSAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCi0gICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCi0gICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCi0gICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgotICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCi0gICAgIDsvLyAqLwotICAgICAKLSAgICAgTUFDUk8KLQotICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCi0gICAgIAotICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCi0gICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKLSAgICAgU1VCTFQgJHksICR5LCAkdDsKLQotICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQotICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KLQotICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKLSAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKLSAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCi0KLSAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQotICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAotCi0gICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKLSAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKLSAgICAgCi0gICAgIE1FTkQKLSAgICBFTkRJRiAgICAgIAotICAgIAotICAgIAotICAgICAgICAKLSAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAotCi0gRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2NjNzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM4MSArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teFZDLmgKLSAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5Ci0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfT01YVkNfSF8KLSNkZWZpbmUgX09NWFZDX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KLS8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzE2IGR4OwotICAgIE9NWF9TMTYgZHk7Ci19IE9NWFZDTW90aW9uVmVjdG9yOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKLSAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCi0gKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCi0gKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKLSAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAotICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAotICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAotICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCi0gKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKLSAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCi0gKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCi0gKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCi0gKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAotICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKLSAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKLSAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAotICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAotICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCi0gICAgT01YX1UzMiBpUGxhbmVTdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKLSAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAotICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAotICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAotICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAotICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKLSAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKLSAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAotICogICAgICAgICAgICAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCi0gKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKLSAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAotICAgIE9NWF9JTlQgWGNvb3JkLAotICAgIE9NWF9JTlQgWWNvb3JkLAotICAgIE9NWF9JTlQgc2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCi0vKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAotICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKLSAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCi19OwotCi0KLQotLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLwotLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKLX07Ci0KLQotCi0vKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLwotLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19DRU5URVIgPSA0LAotICAgIE9NWF9WQ19SSUdIVCA9IDgsCi0gICAgT01YX1ZDX0xPV0VSID0gMTYsCi0gICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAotICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKLX07Ci0KLQotCi0vKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCi0gICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKLX0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7Ci0KLQotCi0vKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLX0gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLwotLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0lOVCB4OwotICAgIE9NWF9JTlQgeTsKLX0gT01YVkNNNFAyQ29vcmRpbmF0ZTsKLQotCi0KLS8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KLSAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAotfSBPTVhWQ000UDJNRU1vZGU7Ci0KLQotCi0vKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCi0vKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKLSAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCi0gICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCi0gICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCi0gICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KLX0gT01YVkNNNFAyTUVQYXJhbXM7Ci0KLQotCi0vKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLwotLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLwotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCi0gICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCi0gICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KLSAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAotICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKLSAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAotICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCi0gKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKLSAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCi0gKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAotICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCi0gKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCi0gKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAotICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCi0gKiAgICAgICAgICAgIHJldHVybiBNVnMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAotICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAotICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKLSAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAotICAgIE9NWF9JTlQgaUJsawotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKLSAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCi0gKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCi0gKiAgICAgICAgICAgIC00LiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAotICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgT01YX0lOVCBybmRWYWwsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgIE9NWF9JTlQgcm5kVmFsLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAotICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCi0gKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKLSAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCi0gKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKLSAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAotICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAotICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAotICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAotICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKLSAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAotICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKLSAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAotICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCi0gKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAotICogICAgICAgICAgICBpZ25vcmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCi0gKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAotICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAotICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAotICogICAgICAgICAgICBmb3IgSU5URVI0ViAKLSAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAotICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAotICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX1MzMiBzcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKLSAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0gICAgT01YX1UxNiAqcERzdFNBRCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCi0gKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA2LjEuMy44LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKLSAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKLSAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCi0gKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCi0gKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAotICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCi0gKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKLSAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAotICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAotICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAotICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAotICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAotICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAotICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCi0gKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKLSAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAotICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAotICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKLSAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAotICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKLSAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAotICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKLSAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAotICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKLSAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAotICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCi0gKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKLSAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb24gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKLSAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCi0gKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCi0gKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCi0gKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAotICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgcFNyYywgcFJlYy4gIAotICoKLSAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4ICpwUmVjLAotICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCi0gICAgT01YX0lOVCAqcFN1bUVyciwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX1U4IGN1clFwLAotICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCi0gKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAotICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCi0gKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICAgICAtIHBTcmMgCi0gKiAgICAgICAgICAgIC0gcERzdAotICogICAgICAgICAgICAtIHBSZWMKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1MxNiAqcFJlYywKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKLSAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCi0gKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCi0gKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCi0gKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAotICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAotICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAotICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAotICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAotICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAotICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAotICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKLSAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKLSAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAotICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCi0gKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAotICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCi0gKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCi0gKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCi0gKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAotICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIHN5bnRheCAKLSAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKLSAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKLSAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQotICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KLSAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAotICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAotICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKLSAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmOgotICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAotICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCi0gKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCi0gKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCi0gKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAotICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCi0gKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCi0gKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKLSAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAotICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCi0gKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKLSAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCi0gKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCi0gKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAotICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCi0gKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCi0gKgotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBiZWxvbmdzIHRvIAotICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKLSAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAotICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCi0gKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAotICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCi0gKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCi0gKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQotICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KLSAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKLSAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcCwKLSAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICBPTVhfVTggY3VyUVAsCi0gICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKLSAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCi0gKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKLSAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAotICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAotICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCi0gKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIFFQIDw9IDAuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKLSAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAotICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCi0gKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKLSAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKLSAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAotICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAotICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKLSAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCi0gKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgT01YX0lOVCBwcmVkUVAsCi0gICAgT01YX0lOVCBwcmVkRGlyLAotICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKLSAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKLSAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKLSAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKLSAqICAgICAgICAgICAgNi4yLjEuMi4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAotICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKLSAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKLSAgICBPTVhfSU5UIHJuZFZhbAotKTsKLQotCi0KLS8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLwotICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKLX0gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCi0gICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCi0gICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCi0gICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLwotICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCi0gICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCi0gICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLwotICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCi19IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCi0gICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCi0gICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCi19IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KLSAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAotfSBPTVhWQ000UDEwTUVNb2RlOwotCi0KLQotLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KLSAgICBPTVhfVkNfUF8xNng4ICA9IDEsCi0gICAgT01YX1ZDX1BfOHgxNiAgPSAyLAotICAgIE9NWF9WQ19QXzh4OCAgPSAzLAotICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKLSAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAotICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKLSAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKLSAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCi19IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCi0gICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCi0gICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCi0gICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCi19IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KLSAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KLSAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLwotICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLwotICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLwotICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLwotfSBPTVhWQ000UDEwVkxDSW5mbzsKLQotCi0KLS8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLwotICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KLSAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLwotICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCi0gICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLwotICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCi0gICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLwotICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KLSAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCi19IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOwotCi0KLQotLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLwotICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLwotICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKLSAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7Ci0gICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCi0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCi0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OwotfSBPTVhWQ000UDEwTUVQYXJhbXM7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAotICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAotICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKLSAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKLSAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAotICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCi0gKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAotICogICAgICAgICAgICAwLi4xNSkgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKLSAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICogTm90ZTogCi0gKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKLSAqICAgICAgICAgICAgMC4uNykuIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCi0gKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAotICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAotICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCi0gKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKLSAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aCAKLSAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICBPTVhfUzMyIGR4LAotICAgIE9NWF9TMzIgZHksCi0gICAgT01YU2l6ZSByb2kKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCi0gKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoLiAKLSAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MzMiBzcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgT01YX1MzMiBkeCwKLSAgICBPTVhfUzMyIGR5LAotICAgIE9NWFNpemUgcm9pCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKLSAqICAgICAgICAgICAgICBpcyBOVUxMLiAKLSAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAotICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAotICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCi0gKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAotICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKLSAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAotICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKLSAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCi0gKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAotICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAotICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAotICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKLSAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCi0gKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCi0gKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCi0gKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKLSAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKLSAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCi0gKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKLSAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKLSAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAotICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAotICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfUzMyKnBPZmZzZXQsCi0gICAgT01YX1U4ICpwTnVtQ29lZmYsCi0gICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKLSAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKLSAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCi0gKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKLSAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKLSAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAotICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKLSAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKLSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAotICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAotICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKLSAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKLSAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAotICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKLSAqCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfUzMyICpwT2Zmc2V0LAotICAgIE9NWF9VOCAqcE51bUNvZWZmLAotICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKLSAgICBPTVhfSU5UIHNWTENTZWxlY3QsCi0gICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCi0gKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAotICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCi0gKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKLSAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCi0gKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKLSAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAotICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAotICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCi0gKiAxLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCi0gKiAgICAgICAgICAgIGV4aXN0IAotICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCi0gKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCi0gKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKLSAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCi0gICAgY29uc3QgT01YX1MxNiAqcERDLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHByZWRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWF9JTlQgQUMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCi0gKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKLSAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKLSAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKLSAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAotICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKLSAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAotICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKLSAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCi0gKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKLSAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKLSAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6Ci0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCi0gKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKLSAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCi0gKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKLSAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCi0gKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAotICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAotICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCi0gKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCi0gKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCi0gKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAotICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAotICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAotICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAotICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCi0gKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCi0gKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKLSAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gCi0gKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVEVSLiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5UUkEuIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAotICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCi0gKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCi0gKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKLSAqICAgICAgICAgICAgLSAgTWJUeXBlIAotICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCi0gKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCi0gKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCi0gKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKLSAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAotICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCi0gKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKLSAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAotICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCi0gICAgT01YX1MzMiBTcmNSZWNTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgT01YX1UzMiBMYW1iZGEsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLSAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCi0gICAgT01YX0lOVCAqcERzdENvc3QsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAotICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKLSAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKLSAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1UzMiAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKLSAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKC0xLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3RMZWZ0LAotICAgIE9NWF9VOCAqcERzdFJpZ2h0LAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpV2lkdGgsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKLSAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0VXAsCi0gICAgT01YX1U4ICpwRHN0RG93biwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaVdpZHRoLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAotICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCi0gKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1UzMiBpUVAsCi0gICAgT01YX1U4IGJJbnRyYQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAotICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAotICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKLSAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgbWF0cml4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAotICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCi0gICAgT01YX1U4ICpwRHN0UmVjb24sCi0gICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCi0gICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAotICAgIE9NWF9VOCBiQUMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAotICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAotICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAotICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKLSAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAotICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICA0LiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCi0gKiAgICAgICAgICAgIG9mIDQuIAotICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCi0gKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAotICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCi0gKiAgICAgICAgICAgIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCi0gKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCi0gKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAotICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCi0gICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCi0gICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCi0gICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKLSAgICBPTVhfUzE2ICpwRENDb2VmZiwKLSAgICBPTVhfUzggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCi0gICAgT01YX1UzMiBpUVAsCi0gICAgT01YX1U4IGJJbnRyYQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAotICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAotICogc3RydWN0dXJlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAotICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAotICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAotICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAotICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAotICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAotICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKLSAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAotICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKLSAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAotICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAotICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCi0gICAgT01YX1U4IGJBQywKLSAgICBPTVhfVTMyIE1heE51bUNvZWYsCi0gICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KLSk7Ci0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLwotCi0vKiogRU9GICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZjMwNDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi07LyoqID09PT09PT09PT09PT09PSBTdHJ1Y3R1cmUgRGVmaW5pdGlvbiBmb3IgU2FtcGxlIEdlbmVyYXRpb24gPT09PT09PT09PT09PT0gKi8KLTsvKiogdHJhbnNwYXJlbnQgc3RhdHVzICovCi0KLTtlbnVtIHsKLU9NWF9WSURFT19UUkFOU1BBUkVOVAlFUVUgMDsJLyoqIFdob2xseSB0cmFuc3BhcmVudCAqLwotT01YX1ZJREVPX1BBUlRJQUwJCUVRVSAxOwkvKiogUGFydGlhbGx5IHRyYW5zcGFyZW50ICovCi1PTVhfVklERU9fT1BBUVVFCQlFUVUgMjsJLyoqIE9wYXF1ZSAqLwotO30KLQotOy8qKiBkaXJlY3Rpb24gKi8KLTtlbnVtIHsKLU9NWF9WSURFT19OT05FCQkJRVFVIDA7Ci1PTVhfVklERU9fSE9SSVpPTlRBTAlFUVUgMTsKLU9NWF9WSURFT19WRVJUSUNBTAkJRVFVIDI7Ci07fQotCi07LyoqIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSAqLwotO2VudW0gewotT01YX1ZJREVPX0lOVEVHRVJfUElYRUwgRVFVIDA7CS8qKiBjYXNlIGEgKi8KLU9NWF9WSURFT19IQUxGX1BJWEVMX1ggIEVRVSAxOwkvKiogY2FzZSBiICovCi1PTVhfVklERU9fSEFMRl9QSVhFTF9ZICBFUVUgMjsJLyoqIGNhc2UgYyAqLwotT01YX1ZJREVPX0hBTEZfUElYRUxfWFkgRVFVIDM7CS8qKiBjYXNlIGQgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF9VUFBFUiAgCQkJCUVRVSAxOwkJLyoqIHNldCBpZiB0aGUgYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9MRUZUICAgCQkJCUVRVSAyOwkJLyoqIHNldCBpZiB0aGUgbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0NFTlRFUiAJCQkJRVFVIDQ7Ci1PTVhfUklHSFQJCQkJRVFVIDg7Ci1PTVhfTE9XRVIgIAkJCQlFUVUJMTY7Ci1PTVhfVVBQRVJfTEVGVCAgCQlFUVUgMzI7CQkvKiogc2V0IGlmIHRoZSBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfVVBQRVJfUklHSFQgCQlFUVUgNjQ7CQkvKiogc2V0IGlmIHRoZSBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0xPV0VSX0xFRlQgIAkJRVFVIDEyODsKLU9NWF9MT1dFUl9SSUdIVCAJCUVRVSAyNTYKLTt9Ci0KLTtlbnVtIHsKLU9NWF9WSURFT19MVU1JTkFOQ0UgIAlFUVUgMDsJLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KLU9NWF9WSURFT19DSFJPTUlOQU5DRSAgCUVRVSAxOwkvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovCi1PTVhfVklERU9fQUxQSEEgIAkJRVFVIDI7CS8qKiBBbHBoYSBjb21wb25lbnQgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF9WSURFT19JTlRFUgkJCUVRVSAwOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVklERU9fSU5URVJfUQkJRVFVIDE7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRFUjRWCQlFUVUgMjsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZJREVPX0lOVFJBCQkJRVFVIDM7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLwotT01YX1ZJREVPX0lOVFJBX1EJCUVRVSA0OwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRFUjRWX1EJCUVRVSA1OwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotT01YX1ZJREVPX0RJUkVDVAkJRVFVIDY7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKE1QRUctNCBvbmx5KSAqLwotT01YX1ZJREVPX0lOVEVSUE9MQVRFCUVRVSA3OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi1PTVhfVklERU9fQkFDS1dBUkQJCUVRVSA4OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi1PTVhfVklERU9fRk9SV0FSRAkJRVFVIDk7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLU9NWF9WSURFT19OT1RDT0RFRAkJRVFVIDEwOwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi07fQotCi07ZW51bSB7Ci1PTVhfMTZYMTZfVkVSVCAJCQlFUVUgMDsJCS8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzE2WDE2X0hPUiAJCQlFUVUgMTsJCS8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfMTZYMTZfREMgCQkJRVFVIDI7CQkvKiogSW50cmFfMTZ4MTZfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF8xNlgxNl9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfMTZ4MTZfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF80eDRfVkVSVCAJCQlFUVUgMDsJCS8qKiBJbnRyYV80eDRfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfSE9SICAJCQlFUVUgMTsJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9EQyAgIAkJCUVRVSAyOwkJLyoqIEludHJhXzR4NF9EQyAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9ESUFHX0RMIAkJRVFVIDM7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0IChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0RJQUdfRFIgCQlFUVUgNDsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0IChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X1ZSIAkJCQlFUVUgNTsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0IChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0hEIAkJCQlFUVUgNjsJCQkvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9WTCAJCQkJRVFVIDc7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0IChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0hVIAkJCQlFUVUgODsJCQkvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKHByZWRpY3Rpb24gbW9kZSkgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF9DSFJPTUFfREMgCQkJRVFVIDA7CQkvKiogSW50cmFfQ2hyb21hX0RDIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfQ0hST01BX0hPUiAJCQlFUVUgMTsJCS8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YX0NIUk9NQV9WRVJUIAkJRVFVIDI7CS8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF9DSFJPTUFfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhX0Nocm9tYV9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLwotO30KLQotO3R5cGVkZWYJc3RydWN0IHsJCi14CUVRVQkwOwoteQlFUVUJNDsKLTt9T01YQ29vcmRpbmF0ZTsKLQotO3R5cGVkZWYgc3RydWN0IHsKLWR4CUVRVQkwOwotZHkJRVFVCTI7Ci07fU9NWE1vdGlvblZlY3RvcjsKLQotO3R5cGVkZWYgc3RydWN0IHsKLXh4CQlFUVUJMDsKLXl5CQlFUVUJNDsKLXdpZHRoCUVRVQk4OwotaGVpZ2h0CUVRVQkxMjsKLTt9T01YaVJlY3Q7Ci0KLTt0eXBlZGVmIGVudW0gewotT01YX1ZDX0lOVEVSICAgICAgICAgRVFVIDA7ICAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVkNfSU5URVJfUSAgICAgICBFUVUgMTsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZDX0lOVEVSNFYgICAgICAgRVFVIDI7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WQ19JTlRSQSAgICAgICAgIEVRVSAzOyAgICAgICAgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi1PTVhfVkNfSU5UUkFfUSAgICAgICBFUVUgNDsgICAgICAgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi1PTVhfVkNfSU5URVI0Vl9RICAgICBFUVUgNTsgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLTt9IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOwotCi07ZW51bSB7Ci1PTVhfVkNfTk9ORSAgICAgICAgICBFUVUgMAotT01YX1ZDX0hPUklaT05UQUwgICAgRVFVIDEKLU9NWF9WQ19WRVJUSUNBTCAgICAgIEVRVSAyIAotO307Ci0KLQotCUVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NmQ1OWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotIDsvKioKLSA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5MTZ4MTYKLSA7ICoKLSA7ICogRGVzY3JpcHRpb246Ci0gOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgotIDsgKiBQYXJhbWV0ZXJzOgotIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeS4KLSA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7Ci0gOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDE2LgotIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBSZXR1cm4gVmFsdWU6Ci0gOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKLSA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gIAotIDsgKi8KLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIAotICAgICAKLSAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAKLSAgICAgSUYgQ29ydGV4QTgKLSAgICAgCi0gICAgIAotIDsvL0lucHV0IEFyZ3VtZW50cwotcFNyYyAgICBSTiAwICAgICAgICAKLXBEc3QgICAgUk4gMSAgICAgICAgCi1zdGVwICAgIFJOIDIKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1SZXR1cm4gIFJOIDAKLTsvLyBOZW9uIFJlZ2lzdGVycwotCi1YMCAgICAgIEROIEQwLlM4IAotWDEgICAgICBETiBEMS5TOCAKLVgyICAgICAgRE4gRDIuUzgKLVgzICAgICAgRE4gRDMuUzgKLVg0ICAgICAgRE4gRDQuUzgKLVg1ICAgICAgRE4gRDUuUzgKLVg2ICAgICAgRE4gRDYuUzgKLVg3ICAgICAgRE4gRDcuUzggCi0gCi0gICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHkxNngxNgotICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcCAgICAgICA7Ly8gTG9hZCAxNiBieXRlcyBmcm9tIDE2IGJ5dGUgYWxpZ25lZCBwU3JjIGFuZCBwU3JjPXBTcmMgKyBzdGVwIGFmdGVyIGxvYWRpbmcKLSAgICAgICAgVkxEMSAge1gyLFgzfSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1g0LFg1fSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1g2LFg3fSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYMCxYMSxYMixYM30sW3BEc3RAMTI4XSEgICAgIDsvLyBTdG9yZSAzMiBieXRlcyB0byAxNiBieXRlIGFsaWduZWQgcERzdCAgIAotICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hCi0gICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEKLSAgICAgICAgIAotICAgICAgCi0gICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hICAgICAgICAgICAgICAKLSAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdISAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gyLFgzfSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1g0LFg1fSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1g2LFg3fSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYMCxYMSxYMixYM30sW3BEc3RAMTI4XSEKLSAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdIQotCi0gICAgICAgIAotICAgICAgICBNT1YgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLQotICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0KLQotCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI5ZTVlZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIDsvKioKLSA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4Ci0gOyAqCi0gOyAqIERlc2NyaXB0aW9uOgotIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCi0gOyAqIFBhcmFtZXRlcnM6Ci0gOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOwotIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCi0gOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFJldHVybiBWYWx1ZToKLSA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgotIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCi0gOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgCi0gICAgIAotICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgIAotICAgICBJRiBDb3J0ZXhBOAotICAgICAKLSAgICAgCi0gOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjICAgIFJOIDAgICAgICAgIAotcERzdCAgICBSTiAxICAgICAgICAKLXN0ZXAgICAgUk4gMgotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLUNvdW50ICAgUk4gMwotUmV0dXJuICBSTiAwCi07Ly8gTmVvbiBSZWdpc3RlcnMKLQotWDAgICAgICBETiBEMC5TOCAKLVgxICAgICAgRE4gRDEuUzgKLVgyICAgICAgRE4gRDIuUzgKLVgzICAgICAgRE4gRDMuUzgKLSAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTh4OAotICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkxEMSAge1gwfSxbcFNyY10sc3RlcCAgICAgICAgICAgIDsvLyBMb2FkIDggYnl0ZXMgZnJvbSA4IGJ5dGUgYWxpZ25lZCBwU3JjLCBwU3JjPXBTcmMrc3RlcCBhZnRlciBsb2FkCi0gICAgICAgIFZMRDEgIHtYMX0sW3BTcmNdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gyfSxbcFNyY10sc3RlcAotICAgICAgICBWTEQxICB7WDN9LFtwU3JjXSxzdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICB7WDAsWDF9LFtwRHN0XSEgICAgICAgICAgICA7Ly8gU3RvcmUgMTYgYnl0ZXMgdG8gOCBieXRlIGFsaWduZWQgcERzdCAgCi0gICAgICAgIFZTVDEgIHtYMixYM30sW3BEc3RdISAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTEQxICB7WDB9LFtwU3JjXSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMX0sW3BTcmNdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gyfSxbcFNyY10sc3RlcAotICAgICAgICBWTEQxICB7WDN9LFtwU3JjXSxzdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICB7WDAsWDF9LFtwRHN0XSEgICAgICAgICAgICAgIAotICAgICAgICBWU1QxICB7WDIsWDN9LFtwRHN0XSEgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotCi0KLQotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDZiNjY5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgRXhwYW5kIEZyYW1lIGJvdW5kYXJ5IHBpeGVscyBpbnRvIFBsYW5lCi07Ly8gCi07Ly8gCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAKLSAgCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotCi0gICAgCi0gICAgSUYgQ29ydGV4QTgKLSAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSxyMTEKLQotOy8vSW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3RQbGFuZSAgICBSTiAgMAotaUZyYW1lV2lkdGggICAgIFJOICAxCi1pRnJhbWVIZWlnaHQgICAgUk4gIDIgICAgCi1pRXhwYW5kUGVscyAgICAgUk4gIDMKLWlQbGFuZVN0ZXAgICAgICBSTiAgNAotcFRvcCAgICAgICAgICAgIFJOICA1Ci1wQm90ICAgICAgICAgICAgUk4gIDYKLXBEc3RUb3AgICAgICAgICBSTiAgNwotcERzdEJvdCAgICAgICAgIFJOICA4Ci1wTGVmdCAgICAgICAgICAgUk4gIDUKLXBSaWdodCAgICAgICAgICBSTiAgNgotcERzdExlZnQgICAgICAgIFJOICA5Ci1wRHN0UmlnaHQgICAgICAgUk4gIDEwCi1PZmZzZXQgICAgICAgICAgUk4gIDExCi1UZW1wICAgICAgICAgICAgUk4gIDE0Ci1Db3VudGVyICAgICAgICAgUk4gIDEyCi1UbXAgICAgICAgICAgICAgUk4gIDcKLTsvL091dHB1dCByZWdpc3RlcnMKLQotcmVzdWx0ICAgICAgICAgIFJOICAwCi07Ly8gTmVvbiByZWdpc3RlcnMKLXFEYXRhMCAgICAgICAgICBRTiAgMC5VOAotcURhdGExICAgICAgICAgIFFOICAxLlU4Ci1kRGF0YTAgICAgICAgICAgRE4gIDAuVTgKLWREYXRhMSAgICAgICAgICBETiAgMS5VOAotZERhdGEyICAgICAgICAgIEROICAyLlU4Ci1kRGF0YTMgICAgICAgICAgRE4gIDMuVTgKLQotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgICAgICBwUGxhbmVTdGVwLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICAgICBpUGxhbmVTdGVwLCBwUGxhbmVTdGVwCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBwVG9wLCBwU3JjRHN0UGxhbmUsICMwICAgICAgICAgICAgICA7Ly8gVG9wIHJvdyBwb2ludGVyIG9mIHRoZSBmcmFtZQotICAgICAgICBNVUwgICAgICAgICBPZmZzZXQsIGlFeHBhbmRQZWxzLCBpUGxhbmVTdGVwICAgICA7Ly8gRSpTdGVwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgVGVtcCwgaUZyYW1lSGVpZ2h0LCAjMSAgICAgICAgICAgICAgOy8vIEgtMQotICAgICAgICBNVUwgICAgICAgICBUZW1wLCBpUGxhbmVTdGVwLCBUZW1wICAgICAgICAgICAgICA7Ly8gKEgtMSkqU3RlcAotICAgICAgICBBREQgICAgICAgICBwQm90LCBUZW1wLCBwU3JjRHN0UGxhbmUgICAgICAgICAgICA7Ly8gQlB0ciA9IFRQdHIgKyAoSC0xKSpTdGVwCi0gICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlGcmFtZVdpZHRoICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBsb29wIGNvdW50ZXIKLSAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayBpZiBwU3JjRHN0UGxhbmUgYW5kIGlQbGFuZVN0ZXAgYXJlIDE2IGJ5dGUgYWxpZ25lZAotICAgICAgICBUU1QgICAgICAgICBwU3JjRHN0UGxhbmUsICMweGYKLSAgICAgICAgVFNURVEgICAgICAgaVBsYW5lU3RlcCwgIzB4ZiAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgIEhvcjhMb29wMDAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQ29weSB0b3AgYW5kIGJvdHRvbSByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKLSAgICAgICAgOy8vIHRvcCByZWdpb24gPSB0b3Agcm93IGVsZW1lbnRzIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLyBib3R0b20gcmVnaW9uID0gbGFzdCByb3cgZWxlbWVudHMgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vCi0KLSAgICAgICAgOy8vIENhc2UgZm9yIDE2IGJ5dGUgYWxpZ25tZW50Ci1Ib3IxNkxvb3AwMAotICAgICAgICBTVUIgICAgICAgICBwRHN0VG9wLCBwVG9wLCBPZmZzZXQKLSAgICAgICAgVkxEMSAgICAgICAgcURhdGEwLCBbcFRvcCBAMTI4XSEKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMgICAgICAgICAgICAgICAgOy8vIElubmVyIGxvb3AgY291bnRlcgotICAgICAgICBBREQgICAgICAgICBwRHN0Qm90LCBwQm90LCBpUGxhbmVTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIHFEYXRhMSwgW3BCb3QgQDEyOF0hCi1WZXIxNkxvb3AwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAgICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBWZXIxNkxvb3AwCi0KLSAgICAgICAgU1VCUyAgICAgICAgVGVtcCwgVGVtcCwgIzE2Ci0gICAgICAgIEJHVCAgICAgICAgIEhvcjE2TG9vcDAwCi0gICAgICAgIEIgICAgICAgICAgIEVuZEFsaWduZWRMb29wCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2FzZSBmb3IgOCBieXRlIGFsaWdubWVudAotSG9yOExvb3AwMAotICAgICAgICBTVUIgICAgICAgICBwRHN0VG9wLCBwVG9wLCBPZmZzZXQKLSAgICAgICAgVkxEMSAgICAgICAgcURhdGEwLCBbcFRvcCBANjRdIQotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscyAgICAgICAgICAgICAgICA7Ly8gSW5uZXIgbG9vcCBjb3VudGVyCi0gICAgICAgIEFERCAgICAgICAgIHBEc3RCb3QsIHBCb3QsIGlQbGFuZVN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgcURhdGExLCBbcEJvdCBANjRdIQotVmVyOExvb3AwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcCAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgIFZlcjhMb29wMAotCi0gICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxNgotICAgICAgICBCR1QgICAgICAgICBIb3I4TG9vcDAwCi0KLUVuZEFsaWduZWRMb29wCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmNEc3RQbGFuZSwgaUZyYW1lV2lkdGgKLSAgICAgICAgU1VCICAgICAgICAgcERzdFJpZ2h0LCBUZW1wLCBPZmZzZXQKLSAgICAgICAgU1VCICAgICAgICAgcFJpZ2h0LCBUZW1wLCAjMQotICAgICAgICBTVUIgICAgICAgICBwRHN0TGVmdCwgcFNyY0RzdFBsYW5lLCBPZmZzZXQgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgaUV4cGFuZFBlbHMgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBMZWZ0LCBwU3JjRHN0UGxhbmUsICMwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7ZERhdGEwIFtdfSwgW3BMZWZ0XSwgaVBsYW5lU3RlcCAgICAgICAgOy8vIFRvcC1MZWZ0IGNvcm5lciBwaXhlbCBmcm9tIGZyYW1lIGR1cGxpY2F0ZWQgaW4gZERhdGEwCi0gICAgICAgIFNVQiAgICAgICAgIE9mZnNldCwgaVBsYW5lU3RlcCwgaUV4cGFuZFBlbHMKLSAgICAgICAgVkxEMSAgICAgICAge2REYXRhMSBbXX0sIFtwUmlnaHRdLCBpUGxhbmVTdGVwICAgICAgIDsvLyBUb3AtUmlnaHQgY29ybmVyIHBpeGVsIGZyb20gZnJhbWUgZHVwbGljYXRlZCBpbiBkRGF0YTEKLSAgICAgICAgTU9WICAgICAgICAgVGVtcCwgaUV4cGFuZFBlbHMKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvcHkgdG9wLWxlZnQgYW5kIHRvcC1yaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKLSAgICAgICAgOy8vIHRvcC1sZWZ0IHJlZ2lvbiA9IHRvcC1sZWZ0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8gdG9wLXJpZ2h0IHJlZ2lvbiA9IHRvcC1yaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vCi1Ib3JMb29wMTEKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKLVZlckxvb3AxCi0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKLSAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMQotCi0gICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxCi0gICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0Ci0gICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKLSAgICAgICAgQlBMICAgICAgICAgSG9yTG9vcDExCi0KLSAgICAgICAgU1VCICAgICAgICAgaUZyYW1lSGVpZ2h0LCBpRnJhbWVIZWlnaHQsICMxCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQ29weSBsZWZ0IGFuZCByaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKLSAgICAgICAgOy8vIExlZnQgcmVnaW9uID0gY29weSB0aGUgcm93IHdpdGggbGVmdCBzdGFydCBwaXhlbCBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8gUmlnaHQgcmVnaW9uID0gY29weSB0aGUgcm93IHdpdGggcmlnaHQgZW5kIHBpeGVsIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLwotSG9yTG9vcDIyCi0gICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTAgW119LCBbcExlZnRdLCBpUGxhbmVTdGVwCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCi0gICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTEgW119LCBbcFJpZ2h0XSwgaVBsYW5lU3RlcAotVmVyTG9vcDIKLSAgICAgICAgVlNUMSAgICAgICAgZERhdGEwLCBbcERzdExlZnRdLCAjOAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAotICAgICAgICBWU1QxICAgICAgICBkRGF0YTEsIFtwRHN0UmlnaHRdLCAjOCAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgIFZlckxvb3AyCi0KLSAgICAgICAgU1VCUyAgICAgICAgaUZyYW1lSGVpZ2h0LCBpRnJhbWVIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0Ci0gICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKLSAgICAgICAgQkdUICAgICAgICAgSG9yTG9vcDIyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlFeHBhbmRQZWxzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQ29weSBib3R0b20tbGVmdCBhbmQgYm90dG9tLXJpZ2h0IHJlZ2lvbiBvZiB0aGUgcGxhbmUgYXMgZm9sbG93cwotICAgICAgICA7Ly8gYm90dG9tLWxlZnQgcmVnaW9uID0gYm90dG9tLWxlZnQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLyBib3R0b20tcmlnaHQgcmVnaW9uID0gYm90dG9tLXJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8KLUhvckxvb3AzMwotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscwotVmVyTG9vcDMKLSAgICAgICAgVlNUMSAgICAgICAgZERhdGEwLCBbcERzdExlZnRdLCAjOAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAotICAgICAgICBWU1QxICAgICAgICBkRGF0YTEsIFtwRHN0UmlnaHRdLCAjOCAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgIFZlckxvb3AzCi0KLSAgICAgICAgU1VCUyAgICAgICAgVGVtcCwgVGVtcCwgIzEKLSAgICAgICAgQUREICAgICAgICAgcERzdExlZnQsIHBEc3RMZWZ0LCBPZmZzZXQKLSAgICAgICAgQUREICAgICAgICAgcERzdFJpZ2h0LCBwRHN0UmlnaHQsIE9mZnNldAotICAgICAgICBCR1QgICAgICAgICBIb3JMb29wMzMKLUVuZAotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIE1fRU5EICAgIAotICAgIAotICAgIEVORElGCi0KLQotCi0gICAgICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGRlOWE3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIEhlYWRlciBmaWxlIGZvciBvcHRpbWl6ZWQgSC4yNjQgQ0FMVkMgdGFibGVzCi0gKiAKLSAqLwotIAotI2lmbmRlZiBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKLSNkZWZpbmUgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0gIAotLyogQ0FWTEMgdGFibGVzICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF07Ci1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV07Ci1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107Ci1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XTsKLWV4dGVybiBjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjNlYjliLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLTsvLyBGdW5jdGlvbnM6Ci07Ly8gICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ248QUxJR05NRU5UPl91bnNhZmUgIAotOy8vCi07Ly8gSW1wbGVtZW50cyBBdmVyYWdlIG9mIDR4NCB3aXRoIGVxdWF0aW9uIGMgPSAoYStiKzEpPj4xLgotOy8vIEZpcnN0IG9wZXJhbmQgd2lsbCBiZSBhdCBvZmZzZXQgQUxJR05NRU5UIGZyb20gYWxpZ25lZCBhZGRyZXNzCi07Ly8gU2Vjb25kIG9wZXJhbmQgd2lsbCBiZSBhdCBhbGlnbmVkIGxvY2F0aW9uIGFuZCB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0LgotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgotOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyMixyMyB3aGVyZSByMiBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByMyBzdGVwIHNpemUKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjIgLSBwb2ludGVyIHRvIHRoZSBhbGlnbmVkIGxvY2F0aW9uCi07Ly8gcjMgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wUHJlZDAgICAgICAgICAgUk4gMAotaVByZWRTdGVwMCAgICAgIFJOIDEKLXBQcmVkMSAgICAgICAgICBSTiAyCi1pUHJlZFN0ZXAxICAgICAgUk4gMwotcERzdFByZWQgICAgICAgIFJOIDIKLWlEc3RTdGVwICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLWlQcmVkQTAgICAgICAgICBSTiAxMAotaVByZWRBMSAgICAgICAgIFJOIDExCi1pUHJlZEIwICAgICAgICAgUk4gMTIKLWlQcmVkQjEgICAgICAgICBSTiAxNAotVGVtcDEgICAgICAgICAgIFJOIDQKLVRlbXAyICAgICAgICAgICBSTiA1Ci1SZXN1bHRBICAgICAgICAgUk4gNQotUmVzdWx0QiAgICAgICAgIFJOIDQKLXIweDgwODA4MDgwICAgICBSTiA3Ci0KLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCi0gICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAwIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCi0KLSAgICAgICAgOy8vIDFzdCBsb2FkCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLQotICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4Ci0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gMm5kIGxvYWQKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAotRW5kMAotICAgICAgICBNX0VORAotCi0gICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCi0gICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAyIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCi0KLSAgICAgICAgOy8vIDFzdCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2Ci0KLSAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gMm5kIGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgotCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCi1FbmQyCi0gICAgICAgIE1fRU5ECi0KLQotICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAotICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMyBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAotCi0gICAgICAgIDsvLyAxc3QgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gMm5kIGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLQotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4Ci0KLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKLUVuZDMKLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjRiZDllLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0Ci0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCi0KLS8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Ci17Ci0gICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQotfTsKLQotLyogMngyIERlWmlnWmFnIHRhYmxlICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQotewotICAgIDAsIDEsIDIsIDMKLX07Ci0KLQotLyoKLSAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQotICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAotICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgotICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgotICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgotICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgotICovCi1jb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KLXsKLSAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KLSAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KLSAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KLSAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KLSAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KLSAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KLSAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKLSAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKLSAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKLSAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKLSAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKLSAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKLSAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKLSAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKLSAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKLSAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKLSAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKLSAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKLSAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKLSAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKLSAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKLSAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKLSAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKLSAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKLSAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKLSAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKLSAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKLSAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKLSAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKLSAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKLSAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKLSAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKLSAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKLSAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKLSAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0gewotICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAotICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAotICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAotICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAotICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAotICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAotICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAotICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAotICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAotICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAotICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAotICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAotICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAotICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKLSAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKLSAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKLSAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKLSAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKLSAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKLSAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKLSAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKLSAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCi0gICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCi0gICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCi0gICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCi0gICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCi0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCi0gICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCi0gICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAotICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAotICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCi0gICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCi0gICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAotICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKLSAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0gewotICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAotICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKLSAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKLSAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7Ci0gICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCi0gICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0gewotICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKLSAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMwotfTsKLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0gewotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKLSAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7Ci0gICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0gewotICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7Ci0gICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0gewotICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7Ci0gICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKLSAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKLSAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKLSAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKLSAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgotfTsKLQotLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4MTNkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLQotICAgIElGICBDb3J0ZXhBOAotICAgICAgICAKLXBBbHBoYSAgICAgIFJOIDIKLXBCZXRhICAgICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNQotcEJTICAgICAgICAgUk4gNAotYlMzMjEwICAgICAgUk4gNgotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFBfMyAgICAgICAgRE4gRDcuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotZFFfMyAgICAgICAgRE4gRDExLlU4IAotCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci1kQmV0YSAgICAgICBETiBEMi5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLQotOy8vIGJTTFQ0Ci1kVEMzMjEwICAgICBETiBEMTguVTggICAKLWRUQ3MgICAgICAgIEROIEQzMS5TOAotZFRDICAgICAgICAgRE4gRDMxLlU4Ci0KLWRNYXNrXzAgICAgIEROIEQxNC5VOAotZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAotZE1hc2tfNCAgICAgRE4gRDI2LlUxNgotCi1kVGVtcCAgICAgICBETiBEMjguVTgKLWREdW1teSAgICAgIEROIEQxNy5VOAotCi07Ly8gQ29tcHV0aW5nIFAwLFEwCi1xRHEwcDAgICAgICBRTiBRMTAuUzE2Ci1xRHAxcTEgICAgICBRTiBRMTEuUzE2Ci1xRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAotZERlbHRhICAgICAgRE4gRDIwLlM4Ci0KLQotOy8vIENvbXB1dGluZyBQMSxRMQotcVBfMG4gICAgICAgUU4gUTE0LlMxNgotcVFfMG4gICAgICAgUU4gUTEyLlMxNgotCi1kUV8wbiAgICAgICBETiBEMjQuVTgKLWRQXzBuICAgICAgIEROIEQyOS5VOAotCi07Ly8gYlNHRTQKLQotZEhTcDBxMSAgICAgRE4gRDEzLlU4Ci1kSFNxMHAxICAgICBETiBEMzEuVTggICAKLQotZEJTMzIxMCAgICAgRE4gRDI4LlUxNgotCi1kUF8wdCAgICAgICBETiBEMTMuVTggICA7ZEhTcDBxMSAgICAgICAgCi1kUV8wdCAgICAgICBETiBEMzEuVTggICA7VGVtcDEgICAgICAgIAotCi1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRRXzBuICAgICAgIEROIEQyNC5VOCAgIDtUZW1wMiAgICAgICAgCi0KLTsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi07Ly8KLTsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKLTsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKLTsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBwVGhyZXNob2xkczogcjUKLTsvLyAgICAgICAgIAotOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAxOiBEMjktRDMwLCBRMC1RMTogRDI0LUQyNQotOy8vICAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAtIHBUaHJlc2hvbGRzOiByNQotCi07Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQotCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLQotICAgICAgICAKLSAgICAgICAgO2RUQzMyMTAgLTE4Ci0gICAgICAgIDtkVGVtcC0yOAotCi0gICAgICAgIFZMRDEgICAgICAgIGQxOC5VMzJbMF0sIFtwVGhyZXNob2xkc10hIDtoZXJlCi0KLSAgICAgICAgOy8vIGRlbHRhID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KSA+PiAzOwotICAgICAgICA7Ly8gZERlbHRhID0gKHFEcDFxMSA+PiAyICsgcURxMHAwICsgMSk+PiAxCi0KLSAgICAgICAgOy8vIHFEcDFxMS0xMQotICAgICAgICA7Ly8gcURxMHAwLTEwCi0gICAgICAgIFZTVUJMICAgICAgIHFEcDFxMSwgZFBfMSwgZFFfMSAgICAgIAotICAgICAgICBWTU9WICAgICAgICBkVGVtcCwgZFRDMzIxMAotICAgICAgICBWU1VCTCAgICAgICBxRHEwcDAsIGRRXzAsIGRQXzAgICAgICAKLSAgICAgICAgVlNIUiAgICAgICAgcURwMXExLCBxRHAxcTEsICMyICAgICAgCi0gICAgICAgIFZaSVAuOCAgICAgIGRUQzMyMTAsIGRUZW1wCi0gICAgCi0gICAgICAgIDsvLyBxRGVsdGEtcURxMHAwLTEwCi0KLSAgICAgICAgOy8vIGRUQyA9IGRUQzAxICsgKGRBcGxnICYgMSkgKyAoZEFxZmxnICYgMSkKLQotICAgICAgICA7Ly8gZFRDMzIxMC0xOAotICAgICAgICA7Ly8gZFRlbXAtMjgKLSAgICAgICAgOy8vIGRUQy0zMQotICAgICAgICBWQklGICAgICAgICBkVEMzMjEwLCBkTWFza18wLCBkRmlsdAotICAgICAgICBWUkhBREQgICAgICBxRGVsdGEsIHFEcDFxMSwgcURxMHAwICAKLSAgICAgICAgVkFERCAgICAgICAgZFRDLCBkVEMzMjEwLCBkTWFza18xCi0gICAgICAgIFZRTU9WTiAgICAgIGREZWx0YSwgcURlbHRhCi0gICAgICAgIDsvLyBkRGVsdGEtZDIwCi0KLSAgICAgICAgOy8vIGREZWx0YSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHEwIC0gZGVsdGEpOwotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQotICAgICAgICBWTUlOICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcwotICAgICAgICBWTkVHICAgICAgICBkVENzLCBkVENzCi0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQotICAgICAgICA7MQotICAgICAgICBWTUFYICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcwotCi0gICAgICAgIDsvLyBkUF8wbiAtIDI5Ci0gICAgICAgIDsvLyBkUV8wbiAtIDI0Ci0KLSAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkZWx0YSk7Ci0gICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRRXzAgLSBkZWx0YSk7Ci0KLSAgICAgICAgOy8vIGRQXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7Ci0gICAgICAgIDsvLyBkUV8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOwotICAgICAgICAKLSAgICAgICAgOy8vIHFQXzBuIC0gMTQKLSAgICAgICAgOy8vIHFRXzBuIC0gMTIKLSAgICAgICAgCi0gICAgICAgIFZNT1ZMICAgICAgIHFQXzBuLCBkUF8wCi0gICAgICAgIFZNT1ZMICAgICAgIHFRXzBuLCBkUV8wCi0KLSAgICAgICAgOzEKLSAgICAgICAgVkFERFcgICAgICAgcVBfMG4sIHFQXzBuLCBkRGVsdGEKLSAgICAgICAgVlNVQlcgICAgICAgcVFfMG4sIHFRXzBuLCBkRGVsdGEKLSAgICAgICAgCi0gICAgICAgIFZRTU9WVU4gICAgIGRQXzBuLCBxUF8wbgotICAgICAgICBWUU1PVlVOICAgICBkUV8wbiwgcVFfMG4KLQotICAgICAgICBNX0VORAotCi07Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSgpCi07Ly8KLTsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKLTsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKLTsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBhbHBoYTogRDAsIGRNYXNrXzE6IEQxNQotOy8vICAgICAgICAgCi07Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDI6IEQyOS1EMzEsIFEwLVEyOiBEMjQsRDI1LEQyOAotCi07Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgCi0gICAgICAgIDtkSFNxMHAxIC0gMzEKLSAgICAgICAgO2RIU3AwcTEgLSAxMwotICAgICAgICBWSEFERCAgICAgICBkSFNwMHExLCBkUF8wLCBkUV8xICAgICAKLSAgICAgICAgVkhBREQgICAgICAgZEhTcTBwMSwgZFFfMCwgZFBfMSAgICAgICAgIAotCi0gICAgICAgIDsvLyBQcmVwYXJlIHRoZSBiUyBtYXNrCi0KLSAgICAgICAgOy8vIGRIU3AwcTEtMTMKLSAgICAgICAgOy8vIGRQXzB0LWRIU3AwcTEtMTMKLSAgICAgICAgOy8vIGRIU3EwcDEtMzEKLSAgICAgICAgOy8vIGRRXzB0LVRlbXAxLTMxCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCi0KLSAgICAgICAgVlJIQUREICAgICAgZFBfMHQsIGRIU3AwcTEsIGRQXzEgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRRXzB0LCBkSFNxMHAxLCBkUV8xCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYgIAotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMDFkZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotCi0gICAgSUYgIENvcnRleEE4Ci0gICAgICAgIAotcFRocmVzaG9sZHMgUk4gNQotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFBfMyAgICAgICAgRE4gRDcuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotZFFfMyAgICAgICAgRE4gRDExLlU4IAotCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci0KLWRGaWx0ICAgICAgIEROIEQxNi5VOAotZEFxZmxnICAgICAgRE4gRDEyLlU4Ci1kQXBmbGcgICAgICBETiBEMTcuVTggCi0KLWRBcDBxMCAgICAgIEROIEQxMy5VOAotCi07Ly8gYlNMVDQKLWRUQzAgICAgICAgIEROIEQxOC5VOCAgIAotZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCi1kVEMwMSAgICAgICBETiBEMTguVTggICAKLQotZFRDcyAgICAgICAgRE4gRDMxLlM4Ci1kVEMgICAgICAgICBETiBEMzEuVTgKLQotZE1hc2tfMCAgICAgRE4gRDE0LlU4Ci1kTWFza18xICAgICBETiBEMTUuVTggICAgCi0KLWRUZW1wICAgICAgIEROIEQxOS5VOAotCi07Ly8gQ29tcHV0aW5nIFAwLFEwCi1xRHEwcDAgICAgICBRTiBRMTAuUzE2Ci1xRHAxcTEgICAgICBRTiBRMTEuUzE2Ci1xRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAotZERlbHRhICAgICAgRE4gRDIwLlM4Ci0KLQotOy8vIENvbXB1dGluZyBQMSxRMQotZFJwMHEwICAgICAgRE4gRDI0LlU4Ci0KLWRNYXhQICAgICAgIEROIEQyMy5VOAotZE1pblAgICAgICAgRE4gRDIyLlU4Ci0KLWRNYXhRICAgICAgIEROIEQxOS5VOAotZE1pblEgICAgICAgRE4gRDIxLlU4Ci0KLWREZWx0YVAgICAgIEROIEQyNi5VOAotZERlbHRhUSAgICAgRE4gRDI3LlU4Ci0KLXFQXzBuICAgICAgIFFOIFExNC5TMTYKLXFRXzBuICAgICAgIFFOIFExMi5TMTYKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci1kUV8xbiAgICAgICBETiBEMjUuVTgKLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFBfMW4gICAgICAgRE4gRDMwLlU4Ci0KLTsvLyBiU0dFNAotCi1xU3AwcTAgICAgICBRTiBRMTAuVTE2Ci0KLXFTcDJxMSAgICAgIFFOIFExMS5VMTYKLXFTcDBxMHAxICAgIFFOIFExMi5VMTYKLXFTcDNwMiAgICAgIFFOIFExMy5VMTYKLWRIU3AwcTEgICAgIEROIEQyOC5VOAotCi1xU3EycDEgICAgICBRTiBRMTEuVTE2Ci1xU3AwcTBxMSAgICBRTiBRMTIuVTE2Ci1xU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKLWRIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQotCi1xVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAotcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKLQotZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAotZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKLQotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUF8xbiAgICAgICBETiBEMzAuVTgKLWRQXzJuICAgICAgIEROIEQzMS5VOAotCi1kUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAotZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLWRRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCi0KLTsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi07Ly8KLTsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKLTsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKLTsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBwVGhyZXNob2xkczogcjUKLTsvLyAgICAgICAgIAotOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAxOiBEMjktRDMwLCBRMC1RMTogRDI0LUQyNQotOy8vICAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAtIHBUaHJlc2hvbGRzOiByNQotCi07Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQotCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBxRHEwcDAtMTAKLSAgICAgICAgVlNVQkwgICAgICAgcURwMXExLCBkUF8xLCBkUV8xICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHtkVEMwW119LCBbcFRocmVzaG9sZHNdIQotICAgICAgICA7Ly8gcURwMXExLTExCi0gICAgICAgIFZTVUJMICAgICAgIHFEcTBwMCwgZFFfMCwgZFBfMCAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7ZFRDMVtdfSwgW3BUaHJlc2hvbGRzXSEKLQotICAgICAgICA7Ly8gZFJwMHEwLTI0Ci0gICAgICAgIFZTSFIgICAgICAgIHFEcDFxMSwgcURwMXExLCAjMiAgICAgIAotICAgIAotICAgICAgICA7Ly8gZFRDMDEgPSAoZFRDMSA8PCA0KSB8IGRUQzAKLSAgICAgICAgOy8vIGRUQzAxLTE4Ci0gICAgICAgIFZFWFQgICAgICAgIGRUQzAxLCBkVEMwLCBkVEMxLCAjNAotICAgICAgICA7Ly8gZFRlbXAtMTkKLSAgICAgICAgVkFORCAgICAgICAgZFRlbXAsIGRBcGZsZywgZE1hc2tfMQotICAgICAgICAKLSAgICAgICAgVkJJRiAgICAgICAgZFRDMDEsIGRNYXNrXzAsIGRGaWx0Ci0gICAgCi0KLSAgICAgICAgOy8vIGRlbHRhID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KSA+PiAzOwotICAgICAgICA7Ly8gZERlbHRhID0gKHFEcDFxMSA+PiAyICsgcURxMHAwICsgMSk+PiAxCi0KLSAgICAgICAgOy8vIHFEZWx0YS1xRHEwcDAtMTAKLSAgICAgICAgVlJIQUREICAgICAgcURlbHRhLCBxRHAxcTEsIHFEcTBwMCAgCi0gICAgICAgIFZSSEFERCAgICAgIGRScDBxMCwgZFBfMCwgZFFfMCAgICAgIAotICAgICAgICBWQUREICAgICAgICBkVEMsIGRUQzAxLCBkVGVtcAotCi0gICAgICAgIDsvLyBkVEMgPSBkVEMwMSArIChkQXBsZyAmIDEpICsgKGRBcWZsZyAmIDEpCi0gICAgICAgIAotICAgICAgICBWQU5EICAgICAgICBkVGVtcCwgZEFxZmxnLCBkTWFza18xCi0gICAgICAgIFZRQUREICAgICAgIGRNYXhQLCBkUF8xLCBkVEMwMSAgICAgIAotICAgICAgICBWUU1PVk4gICAgICBkRGVsdGEsIHFEZWx0YQotICAgICAgICBWQUREICAgICAgICBkVEMsIGRUQywgZFRlbXAKLQotICAgICAgICA7Ly8gZE1heFAgPSBRQUREKGRQXzEsIGRUQzAxKQotICAgICAgICA7Ly8gZE1pblAgPSBRU1VCKGRQXzEsIGRUQzAxKQotIAotICAgICAgICA7Ly8gZE1heFAtZDIzCi0gICAgICAgIDsvLyBkTWluUC1kMjIKLSAgICAgICAgVlFTVUIgICAgICAgZE1pblAsIGRQXzEsIGRUQzAxICAgICAgCi0KLSAgICAgICAgOy8vIGREZWx0YS1kMjAKLQotICAgICAgICA7Ly8gZE1heFEgPSBRQUREKGRRXzEsIGRUQzAxKQotICAgICAgICA7Ly8gZE1pblEgPSBRU1VCKGRRXzEsIGRUQzAxKQotIAotICAgICAgICA7Ly8gZE1heFEtMTkKLSAgICAgICAgOy8vIGRNaW5RLTIxCi0gICAgICAgIFZRQUREICAgICAgIGRNYXhRLCBkUV8xLCBkVEMwMQotICAgICAgICBWSEFERCAgICAgICBkRGVsdGFQLCBkUnAwcTAsIGRQXzIgICAKLSAgICAgICAgVk1JTiAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKLQotICAgICAgICA7Ly8gZERlbHRhID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcTAgLSBkZWx0YSk7Ci0gICAgICAgIFZORUcgICAgICAgIGRUQ3MsIGRUQ3MKLSAgICAgICAgCi0gICAgICAgIFZRU1VCICAgICAgIGRNaW5RLCBkUV8xLCBkVEMwMQotCi0gICAgICAgIDsvLyBkZWx0YSA9IChwMiArICgocDArcTArMSk+PjEpIC0gKHAxPDwxKSk+PjE7Ci0gICAgICAgIDsvLyBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7Ci0gICAgICAgIDsvLyBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KShwMSArIGRlbHRhKTsKLQotICAgICAgICA7Ly8gZERlbHRhUCA9IChkUF8yICsgZFJwMHEwKT4+MTsKLSAgICAgICAgOy8vIGRQXzFuID0gYXJtQ2xpcChkUF8xIC0gZFRDMDEsIGRQXzEgKyBkVEMwMSwgZERlbHRhUCk7Ci0gICAgICAgIDsvLyBkUF8xbiA9IGFybUNsaXAoTWluUCwgTWF4UCwgZERlbHRhUCk7Ci0gICAgICAgIAotICAgICAgICA7Ly8gZGVsdGEgPSAocTIgKyAoKHAwK3EwKzEpPj4xKSAtIChxMTw8MSkpPj4xOwotICAgICAgICA7Ly8gZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOwotICAgICAgICA7Ly8gcFEwWzEqU3RlcF0gPSAoT01YX1U4KShxMSArIGRlbHRhKTsKLQotICAgICAgICA7Ly8gZERlbHRhUSA9IChkUV8yICsgZFJwMHEwKT4+MTsKLSAgICAgICAgOy8vIGRRXzFuID0gYXJtQ2xpcChkUV8xIC0gZFRDMDEsIGRRXzEgKyBkVEMwMSwgZERlbHRhUSk7Ci0gICAgICAgIDsvLyBkUV8xbiA9IGFybUNsaXAoTWluUSwgTWF4USwgZERlbHRhUSk7Ci0gICAgICAgIAotICAgICAgICA7Ly8gZERlbHRhUC0yNgotICAgICAgICBWSEFERCAgICAgICBkRGVsdGFRLCBkUnAwcTAsIGRRXzIgICAKLQotICAgICAgICA7Ly8gZERlbHRhUS0yNwotICAgICAgICAKLSAgICAgICAgOy8vIGRQXzBuIC0gMjkKLSAgICAgICAgOy8vIGRQXzFuIC0gMzAKLSAgICAgICAgOy8vIGRRXzBuIC0gMjQKLSAgICAgICAgOy8vIGRRXzFuIC0gMjUKLSAgICAgICAgCi0gICAgICAgIDsvLyBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7Ci0gICAgICAgIDsvLyBkRGVsdGFRID0gKGRRXzIgKyBkUnAwcTApPj4xOwotCi0gICAgICAgIFZNQVggICAgICAgIGRQXzFuLCBkRGVsdGFQLCBkTWluUCAgIAotICAgICAgICBWTUFYICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcwotCi0gICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZGVsdGEpOwotICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUV8wIC0gZGVsdGEpOwotCi0gICAgICAgIDsvLyBkUF8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOwotICAgICAgICA7Ly8gZFFfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBxUF8wbiAtIDE0Ci0gICAgICAgIDsvLyBxUV8wbiAtIDEyCi0gICAgICAgIAotICAgICAgICBWTU9WTCAgICAgICBxUF8wbiwgZFBfMAotICAgICAgICBWTU9WTCAgICAgICBxUV8wbiwgZFFfMAotCi0gICAgICAgIFZBRERXICAgICAgIHFQXzBuLCBxUF8wbiwgZERlbHRhCi0gICAgICAgIFZTVUJXICAgICAgIHFRXzBuLCBxUV8wbiwgZERlbHRhCi0gICAgICAgIAotICAgICAgICBWUU1PVlVOICAgICBkUF8wbiwgcVBfMG4KLSAgICAgICAgVlFNT1ZVTiAgICAgZFFfMG4sIHFRXzBuCi0gICAgICAgIAotICAgICAgICBWTUFYICAgICAgICBkUV8xbiwgZERlbHRhUSwgZE1pblEKLQotICAgICAgICBWTUlOICAgICAgICBkUF8xbiwgZFBfMW4sIGRNYXhQCi0gICAgICAgIFZNSU4gICAgICAgIGRRXzFuLCBkUV8xbiwgZE1heFEKLSAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0ICAgICAgCi0KLSAgICAgICAgVkJJRiAgICAgICAgZFBfMW4sIGRQXzEsIGRBcGZsZwotICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQgIAotICAgICAgICBWQklGICAgICAgICBkUV8xbiwgZFFfMSwgZEFxZmxnCi0KLSAgICAgICAgTV9FTkQKLQotOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQotOy8vCi07Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCi07Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Ci07Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gYWxwaGE6IEQwLCBkTWFza18xOiBEMTUKLTsvLyAgICAgICAgIAotOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAyOiBEMjktRDMxLCBRMC1RMjogRDI0LEQyNSxEMjgKLQotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICAKLQotICAgICAgICA7Ly8gYXA8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpICAgICAgICAKLSAgICAgICAgOy8vIGFxPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSAgICAgICAgCi0KLSAgICAgICAgOy8vICggZEFwZmxnICYgZEFwMHEwIDwgKGRBbHBoYSA+PiAyICsgMikgKQotICAgICAgICA7Ly8gKCBkQXFmbGcgJiBkQXAwcTAgPCAoZEFscGhhID4+IDIgKyAyKSApCi0KLSAgICAgICAgOy8vICggZEFwZmxnID0gZEFwZmxnICYgZEFwMHEwIDwgKGRUZW1wICsgZE1hc2tfMSArIGRNYXNrXzEpICkKLSAgICAgICAgOy8vICggZEFxZmxnID0gZEFxZmxnICYgZEFwMHEwIDwgKGRUZW1wICsgZE1hc2tfMSArIGRNYXNrXzEpICkKLQotICAgICAgICA7Ly8gUCBGaWx0ZXIKLQotICAgICAgICBWU0hSICAgICAgICBkVGVtcCwgZEFscGhhLCAjMgotICAgICAgICBWQUREICAgICAgICBkVGVtcCwgZFRlbXAsIGRNYXNrXzEKLQotICAgICAgICA7Ly8gcVNwMHEwLTEwCi0gICAgICAgIFZBRERMICAgICAgIHFTcDBxMCwgZFFfMCwgZFBfMCAgICAgIAotICAgICAgICBWQUREICAgICAgICBkVGVtcCwgZFRlbXAsIGRNYXNrXzEKLQotICAgICAgICA7Ly8gcVNwMnExLTExCi0gICAgICAgIDsvLyBxU3AwcTBwMS0xMgotICAgICAgICBWQURETCAgICAgICBxU3AycTEsIGRQXzIsIGRRXzEgICAgICAKLSAgICAgICAgVkFERFcgICAgICAgcVNwMHEwcDEsIHFTcDBxMCwgZFBfMSAgCi0KLSAgICAgICAgVkNHVCAgICAgICAgZFRlbXAsIGRUZW1wLCBkQXAwcTAKLSAgICAgICAgVlNIUiAgICAgICAgcVNwMnExLCAjMSAgICAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpKChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMpOwotICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKCAoIChwMCArIHEwICsgcDEpICsgKHAyICsgcTEpPj4xICkgPj4gMSArIDEgKSA+PiAxCi0KLSAgICAgICAgOy8vIGRQXzBuID0gKCAoIChxU3AwcTAgKyBkUF8xKSArIHFTcDJxMT4+MSApID4+IDEgKyAxICkgPj4gMQotICAgICAgICA7Ly8gZFBfMG4gPSAoICggcVNwMHEwcDEgKyBxU3AycTE+PjEgKSA+PiAxICsgMSApID4+IDEKLSAgICAgICAgOy8vIGRQXzBuID0gKCBxVGVtcDEgKyAxICkgPj4gMQotICAgICAgICAKLSAgICAgICAgOy8vIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKChwMiArIHAxICsgcDAgKyBxMCArIDIpPj4yKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBkUF8xbiA9IChPTVhfVTgpKChkUF8yICsgcVNwMHEwcDEgKyAyKT4+Mik7Ci0gICAgICAgIDsvLyBkUF8xbiA9IChPTVhfVTgpKChxVGVtcDIgKyAyKT4+Mik7Ci0gICAgICAgIAotICAgICAgICA7Ly8gcFEwWy0zKlN0ZXBdID0gKE9NWF9VOCkoKDIqcDMgKyAzKnAyICsgcDEgKyBwMCArIHEwICsgNCk+PjMpOwotICAgICAgICA7Ly8gcFEwWy0zKlN0ZXBdID0gKE9NWF9VOCkoKCAocDMgKyBwMikgKyAocDEgKyBwMCArIHEwICsgcDIpID4+IDEgKyAyKT4+Mik7Ci0KLSAgICAgICAgOy8vIGRQXzJuID0gKE9NWF9VOCkoKCBxU3AzcDIgKyAoZFBfMiArIHFTcDBxMHAxKSA+PiAxICsgMikgPj4gMik7Ci0gICAgICAgIDsvLyBkUF8ybiA9IChPTVhfVTgpKCggcVNwM3AyICsgcVRlbXAyID4+IDEgKyAyKSA+PiAyKTsKLQotICAgICAgICA7Ly8gcVRlbXAxLXFTcDJxMS0xMQotICAgICAgICA7Ly8gcVRlbXAyLXFTcDBxMHAxLTEyCi0gICAgICAgIFZIQUREICAgICAgIHFUZW1wMSwgcVNwMHEwcDEsIHFTcDJxMQotICAgICAgICBWQUREVyAgICAgICBxVGVtcDIsIHFTcDBxMHAxLCBkUF8yICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBxU3AzcDItMTMKLSAgICAgICAgVkFEREwgICAgICAgcVNwM3AyLCBkUF8zLCBkUF8yICAgICAgCi0KLSAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkQXBmbGcsIGRUZW1wCi0gICAgICAgIFZIQUREICAgICAgIGRIU3AwcTEsIGRQXzAsIGRRXzEgICAgIAotICAgICAgICBWU1JBICAgICAgICBxU3AzcDIsIHFUZW1wMiwgIzEgICAgICAKLSAgICAgICAgOy8vIGRIU3AwcTEtMjgKLSAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkQXFmbGcsIGRUZW1wCi0KLSAgICAgICAgOy8vIGRQXzBuLTI5Ci0gICAgICAgIDsvLyBkUF8wdC1kSFNwMHExLTI4Ci0gICAgICAgIFZRUlNIUk4gICAgIGRQXzBuLCBxVGVtcDEsICMxCi0gICAgICAgIFZSSEFERCAgICAgIGRQXzB0LCBkSFNwMHExLCBkUF8xICAgIAotCi0gICAgICAgIDsvLyBkUF8xbi0zMAotICAgICAgICBWUVJTSFJOICAgICBkUF8xbiwgcVRlbXAyLCAjMgotICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNxMnAxLCBkUV8yLCBkUF8xICAgICAgICAgIAotICAgICAgICBWQUREVyAgICAgICBxU3AwcTBxMSwgcVNwMHEwLCBkUV8xICAgICAgCi0gICAgICAgIAotICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMHQsIGRBcGZsZyAgICAKLQotICAgICAgICA7Ly8gUSBGaWx0ZXIKLQotICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KSgocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zKTsKLSAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKCAoIChwMCArIHEwICsgcTEpICsgKHEyICsgcDEpPj4xICkgPj4gMSArIDEgKSA+PiAxCi0KLSAgICAgICAgOy8vIGRRXzBuID0gKCAoIChxU3AwcTAgKyBkUV8xKSArIHFTcTJwMT4+MSApID4+IDEgKyAxICkgPj4gMQotICAgICAgICA7Ly8gZFFfMG4gPSAoICggcVNwMHEwcTEgKyBxU3EycDE+PjEgKSA+PiAxICsgMSApID4+IDEKLSAgICAgICAgOy8vIGRRXzBuID0gKCBxVGVtcDEgKyAxICkgPj4gMQotICAgICAgICAKLSAgICAgICAgOy8vIHBRMFsxKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgcTEgKyBxMCArIHEwICsgMik+PjIpOwotICAgICAgICAKLSAgICAgICAgOy8vIGRRXzFuID0gKE9NWF9VOCkoKGRRXzIgKyBxU3AwcTBxMSArIDIpPj4yKTsKLSAgICAgICAgOy8vIGRRXzFuID0gKE9NWF9VOCkoKHFUZW1wMiArIDIpPj4yKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBwUTBbMipTdGVwXSA9IChPTVhfVTgpKCgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zKTsKLSAgICAgICAgOy8vIHBRMFsyKlN0ZXBdID0gKE9NWF9VOCkoKCAocTMgKyBxMikgKyAocTEgKyBwMCArIHEwICsgcTIpID4+IDEgKyAyKT4+Mik7Ci0KLSAgICAgICAgOy8vIGRRXzJuID0gKE9NWF9VOCkoKCBxU3EzcTIgKyAoZFFfMiArIHFTcDBxMHExKSA+PiAxICsgMikgPj4gMik7Ci0gICAgICAgIDsvLyBkUV8ybiA9IChPTVhfVTgpKCggcVNxM3EyICsgcVRlbXAyID4+IDEgKyAyKSA+PiAyKTsKLQotICAgICAgICA7Ly8gcVRlbXAxLXFTcDJxMS0xMQotICAgICAgICA7Ly8gcVRlbXAyLXFTcDBxMHAxLTEyCi0gICAgICAgIDsvLyBxU3EycDEtMTEKLSAgICAgICAgOy8vIHFTcDBxMHExLTEyCi0KLQotICAgICAgICA7Ly8gcVRlbXAyLXFTcDBxMHAxLTEyCi0gICAgICAgIDsvLyBxVGVtcDEtcVNxMnAxLTExCi0gICAgICAgIDsvLyBxU3EzcTItMTMKLSAgICAgICAgOy8vIGRQXzJuLTMxCi0gICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICBkUF8ybiwgcVNwM3AyLCAjMgotICAgICAgICBWQURETCAgICAgICBxU3EzcTIsIGRRXzMsIGRRXzIgICAgICAgICAgCi0KLSAgICAgICAgVlNIUiAgICAgICAgcVNxMnAxLCAjMSAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIFZIQUREICAgICAgIHFUZW1wMSwgcVNwMHEwcTEsIHFTcTJwMQotICAgICAgICBWQUREVyAgICAgICBxVGVtcDIsIHFTcDBxMHExLCBkUV8yICAgICAgCi0KLSAgICAgICAgOy8vIGRIU3EwcDEtMjgKLSAgICAgICAgVkhBREQgICAgICAgZEhTcTBwMSwgZFFfMCwgZFBfMSAgICAgICAgIAotCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdAotICAgICAgICBWQklGICAgICAgICBkUF8xbiwgZFBfMSwgZEFwZmxnCi0KLSAgICAgICAgVlNSQSAgICAgICAgcVNxM3EyLCBxVGVtcDIsICMxICAgICAgICAgIAotCi0gICAgICAgIDsvLyBkUV8xLVRlbXAyLTI1Ci0gICAgICAgIDsvLyBkUV8wLVRlbXAyLTI0Ci0gICAgICAgIFZRUlNIUk4gICAgIGRRXzFuLCBxVGVtcDIsICMyCi0gICAgICAgIFZRUlNIUk4gICAgIGRRXzBuLCBxVGVtcDEsICMxCi0KLSAgICAgICAgOy8vIGRRXzB0LVRlbXAxLTIyCi0gICAgICAgIFZSSEFERCAgICAgIGRRXzB0LCBkSFNxMHAxLCBkUV8xCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzFuLCBkUV8xLCBkQXFmbGcgICAgICAgICAKLQotICAgICAgICBWQklGICAgICAgICBkUF8ybiwgZFBfMiwgZEFwZmxnICAgICAgICAKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzB0LCBkQXFmbGcgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICBkUV8ybiwgcVNxM3EyLCAjMgotICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMm4sIGRRXzIsIGRBcWZsZyAgICAgICAKLQotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgCi0KLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlM2EwZDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzR4NAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0gICAgICAgIAotTEFTVF9DT0VGRiAgICAgICAgICAgICAgIEVRVSAweDIwICAgICAgICA7Ly8gRW5kIG9mIGJsb2NrIGZsYWcKLVRXT19CWVRFX0NPRUZGICAgICAgICAgICBFUVUgMHgxMAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcHBCaXRTdHJlYW0gICAgIFJOIDAKLXBPZmZzZXQgICAgICAgICBSTiAxCi1wTnVtQ29lZmYgICAgICAgUk4gMgotcHBQb3NDb2VmYnVmICAgIFJOIDMKLW5DICAgICAgICAgICAgICBSTiA0IDsvLyBudW1iZXIgb2YgY29lZmZzIG9yIDE3IGZvciBjaHJvbWEKLXNNYXhOdW1Db2VmZiAgICBSTiA1Ci0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi0KLTsvLyBMZXZlbCBsb29wCi1Db3VudCAgICAgICAgICAgUk4gMAotVHJhaWxpbmdPbmVzICAgIFJOIDEKLXBMZXZlbCAgICAgICAgICBSTiAyCi1MZXZlbFN1ZmZpeCAgICAgUk4gMwotU3VmZml4TGVuZ3RoICAgIFJOIDQKLVRvdGFsQ29lZmYgICAgICBSTiA1Ci0KLXBWTERUYWJsZSAgICAgICBSTiA2Ci1TeW1ib2wgICAgICAgICAgUk4gNwotVDEgICAgICAgICAgICAgIFJOIDgKLVQyICAgICAgICAgICAgICBSTiA5Ci1SQml0U3RyZWFtICAgICAgUk4gMTAKLVJCaXRCdWZmZXIgICAgICBSTiAxMQotUkJpdENvdW50ICAgICAgIFJOIDEyCi1sciAgICAgICAgICAgICAgUk4gMTQKLQotOy8vIFJ1biBsb29wCi1Db3VudCAgICAgICAgICAgUk4gMAotWmVyb3NMZWZ0ICAgICAgIFJOIDEKLXBMZXZlbCAgICAgICAgICBSTiAyCi1wcFJ1blRhYmxlICAgICAgUk4gMwotcFJ1biAgICAgICAgICAgIFJOIDQKLVRvdGFsQ29lZmYgICAgICBSTiA1Ci0KLXBWTERUYWJsZSAgICAgICBSTiA2Ci1TeW1ib2wgICAgICAgICAgUk4gNwotVDEgICAgICAgICAgICAgIFJOIDgKLVQyICAgICAgICAgICAgICBSTiA5Ci1SQml0U3RyZWFtICAgICAgUk4gMTAKLVJCaXRCdWZmZXIgICAgICBSTiAxMQotUkJpdENvdW50ICAgICAgIFJOIDEyCi1sciAgICAgICAgICAgICAgUk4gMTQKLQotOy8vIEZpbGwgaW4gY29lZmZpY2llbnRzIGxvb3AKLXBQb3NDb2VmYnVmICAgICBSTiAwCi10ZW1wICAgICAgICAgICAgUk4gMQotcExldmVsICAgICAgICAgIFJOIDIKLXBwUG9zQ29lZmJ1ZiAgICBSTiAzCi1wUnVuICAgICAgICAgICAgUk4gNAotVG90YWxDb2VmZiAgICAgIFJOIDUKLXBaaWdaYWcgICAgICAgICBSTiA2Ci0KLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotQ29lZmZOdW0gICAgICAgIFJOIDE0Ci0KLQotCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICBNX0FMTE9DNCBwcHBCaXRTdHJlYW0sIDQKLSAgICAgICAgTV9BTExPQzQgcHBPZmZzZXQsIDQKLSAgICAgICAgTV9BTExPQzQgcHBwUG9zQ29lZmJ1ZiwgNAotICAgICAgICBNX0FMTE9DNCBwcExldmVsLCAxNioyCi0gICAgICAgIE1fQUxMT0M0IHBwUnVuLCAxNgotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcE5DLCA0Ci0gICAgICAgIE1fQVJHICAgcFNNYXhOdW1Db2VmZiw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDAgcHBCaXRTdHJlYW0sIHBPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAotICAgICAgICBMRFIgICAgICAgIHBWTERUYWJsZSwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi0gICAgICAgIE1fTERSICAgICAgbkMsIHBOQwotICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMSBUMSwgVDIsIGxyCi0gICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBuQywgTFNMICMyXSAgOy8vIEZpbmQgVkxEIHRhYmxlICAgIAotICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMiBUMSwgVDIsIGxyCi0KLSAgICAgICAgOy8vIERlY29kZSBTeW1ib2wgPSBUb3RhbENvZWZmKjQgKyBUcmFpbGluZ09uZXMKLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIKLSAgICAKLSAgICAgICAgTU9WUyAgICBUb3RhbENvZWZmLCBTeW1ib2wsIExTUiAjMiAgICAKLSAgICAgICAgU1RSQiAgICBUb3RhbENvZWZmLCBbcE51bUNvZWZmXSAgICAKLSAgICAgICAgTV9QUklOVEYgIlRvdGFsQ29lZmY9JWRcbiIsIFRvdGFsQ29lZmYKLSAgICAgICAgQkVRLlcgICBFbmROb0Vycm9yICAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGVkIGlmIG5vIGNvZWZmaWNpZW50cwotCi0gICAgICAgIENNUCAgICAgU3ltYm9sLCAjMTcqNAotICAgICAgICBCR0UuVyAgIEVuZEJhZFN5bWJvbCAgICAgICAgICAgICAgICA7Ly8gRXJyb3IgaWYgYmFkIHN5bWJvbAotICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgYml0c3RyZWFtIHBvaW50ZXJzCi0gICAgICAgIE1fU1RSICAgcHBCaXRTdHJlYW0sICBwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9TVFIgICBwT2Zmc2V0LCAgICAgIHBwT2Zmc2V0Ci0gICAgICAgIE1fU1RSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBUcmFpbGluZyBPbmVzCi0gICAgICAgIEFORFMgICAgVHJhaWxpbmdPbmVzLCBTeW1ib2wsICMzCi0gICAgICAgIE1fQURSICAgcExldmVsLCBwcExldmVsICAgICAgICAgICAgCi0gICAgICAgIE1fUFJJTlRGICJUcmFpbGluZ09uZXM9JWRcbiIsIFRyYWlsaW5nT25lcwotICAgICAgICBCRVEgICAgIFRyYWlsaW5nT25lc0RvbmUgICAgCi0gICAgICAgIE1PViAgICAgQ291bnQsIFRyYWlsaW5nT25lcwotVHJhaWxpbmdPbmVzTG9vcCAgICAKLSAgICAgICAgTV9CRF9SRUFEOCBTeW1ib2wsIDEsIFQxCi0gICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQotICAgICAgICBNT1YgICAgIFQxLCAjMQotICAgICAgICBTVUIgICAgIFQxLCBUMSwgU3ltYm9sLCBMU0wgIzEKLSAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQotICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIKLSAgICAgICAgQkdUICAgICBUcmFpbGluZ09uZXNMb29wCi1UcmFpbGluZ09uZXNEb25lICAgIAotICAgIAotICAgICAgICA7Ly8gRGVjb2RlIGxldmVsIHZhbHVlcyAgICAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzICAgICA7Ly8gTnVtYmVyIG9mIGxldmVscyB0byByZWFkCi0gICAgICAgIEJFUSAgICAgRGVjb2RlUnVucyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5vbmUgbGVmdAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBTdWZmaXhMZW5ndGgsICMxCi0gICAgICAgIENNUCAgICAgVG90YWxDb2VmZiwgIzEwCi0gICAgICAgIE1PVkxFICAgU3VmZml4TGVuZ3RoLCAjMAotICAgICAgICBDTVAgICAgIFRyYWlsaW5nT25lcywgIzMgICAgOy8vIGlmIChUcmFpbGluZ09uZXM8MykKLSAgICAgICAgTU9WTFQgICBUcmFpbGluZ09uZXMsICM0ICAgIDsvLyB0aGVuIFRyYWlsaW5nT25lcyA9ICs0Ci0gICAgICAgIE1PVkdFICAgVHJhaWxpbmdPbmVzLCAjMiAgICA7Ly8gZWxzZSBUcmFpbGluZ09uZXMgPSArMgotICAgICAgICBNT1ZHRSAgIFN1ZmZpeExlbmd0aCwgIzAgICAgOy8vICAgICAgU3VmZml4TGVuZ3RoID0gMAotICAgICAgICAKLUxldmVsTG9vcAotICAgICAgICBNX0JEX0NMWjE2IFN5bWJvbCwgVDEsIFQyICAgOy8vIFN5bWJvbD1MZXZlbFByZWZpeAotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKLSAgICAgICAgCi0gICAgICAgIE1PVlMgICAgbHIsIFN1ZmZpeExlbmd0aCAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCi0gICAgICAgIFRFUUVRICAgU3ltYm9sLCAjMTQgICAgICAgICA7Ly8gICBhbmQgIExldmVsUHJlZml4PT0xNAotICAgICAgICBNT1ZFUSAgIGxyLCAjNCAgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9NAotICAgICAgICBURVEgICAgIFN5bWJvbCwgIzE1ICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MTUKLSAgICAgICAgTU9WRVEgICBsciwgIzEyICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTEyCi0gICAgICAgIAotICAgICAgICBURVFFUSAgIFN1ZmZpeExlbmd0aCwjMAotICAgICAgICBBRERFUSAgIFN5bWJvbCxTeW1ib2wsIzE1Ci0gICAgICAgIAotICAgICAgICBURVEgICAgIGxyLCAjMCAgICAgICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAotICAgICAgICBCRVEgICAgIExldmVsQ29kZVJlYWQgICAgICAgOy8vIExldmVsQ29kZSA9IExldmVsUHJlZml4Ci0gICAgICAgIAotICAgICAgICBNX0JEX1ZSRUFEMTYgTGV2ZWxTdWZmaXgsIGxyLCBUMSwgVDIgIDsvLyBSZWFkIExldmVsIFN1ZmZpeAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBTeW1ib2wsIFN5bWJvbCwgTFNMIFN1ZmZpeExlbmd0aAotICAgICAgICBBREQgICAgIFN5bWJvbCwgTGV2ZWxTdWZmaXgsIFN5bWJvbAotICAgICAgICAgICAgIAotTGV2ZWxDb2RlUmVhZCAgICAgICAgCi0gICAgICAgIDsvLyBTeW1ib2wgPSBMZXZlbENvZGUKLSAgICAgICAgQUREICAgICBTeW1ib2wsIFN5bWJvbCwgVHJhaWxpbmdPbmVzIDsvLyArNCBpZiBsZXZlbCBjYW5ub3QgYmUgKy8tMSwgKzIgby93Ci0gICAgICAgIE1PViAgICAgVHJhaWxpbmdPbmVzLCAjMgotICAgICAgICBNT1ZTICAgIFQxLCBTeW1ib2wsIExTUiAjMQotICAgICAgICBSU0JDUyAgIFQxLCBUMSwgIzAgICAgICAgICAgICAgICAgICA7Ly8gSWYgU3ltYm9sIG9kZCB0aGVuIG5lZ2F0ZQotICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCi0gICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMiAgICAgICAgICAgIDsvLyBTdG9yZSBsZXZlbC4KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgVDIsID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKLSAgICAgICAgTERSU0IgICBUMSwgW1QyLCBTdWZmaXhMZW5ndGhdICAgICAgOy8vIEZpbmQgaW5jcmVtZW50IGxldmVsICAgICAgICAKLSAgICAgICAgVEVRICAgICBTdWZmaXhMZW5ndGgsICMwCi0gICAgICAgIE1PVkVRICAgU3VmZml4TGVuZ3RoLCAjMQotICAgICAgICBDTVAgICAgIFN5bWJvbCwgVDEKLSAgICAgICAgQUREQ1MgICBTdWZmaXhMZW5ndGgsIFN1ZmZpeExlbmd0aCwgIzEgICAgICAgIAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgIAotICAgICAgICBCR1QgICAgIExldmVsTG9vcAotICAgICAgICAKLURlY29kZVJ1bnMgICAgICAgIAotICAgICAgICA7Ly8gRmluZCBudW1iZXIgb2YgemVyb3MKLSAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgotICAgICAgICBTVUIgICAgIENvdW50LCBUb3RhbENvZWZmLCAjMSAgICAgICA7Ly8gTnVtYmVyIG9mIHJ1bnMgZXhjbHVkaW5nIGxhc3QKLSAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFQxLCBUb3RhbENvZWZmICAgOy8vIE1heGltdW0gbnVtYmVyIG9mIHplcm9zIHRoZXJlIGNvdWxkIGJlCi0gICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KLSAgICAgICAgTU9WICAgICBDb2VmZk51bSxUb3RhbENvZWZmCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKLSAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAotICAgICAgICAKLSAgICAgICAgOy8vIFVucGFjayBudW1iZXIgb2YgemVyb3MgZnJvbSBiaXRzdHJlYW0KLSAgICAgICAgVEVRICAgICBUMSwgIzQgICAgICAgIAotICAgICAgICBMRFJFUSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcy00KQotICAgICAgICBMRFJORSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzLTQpCi0gICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBUb3RhbENvZWZmLCBMU0wgIzJdCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMiA7Ly8gU3ltYm9sID0gWmVyb3NMZWZ0Ci0gICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgotICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAotCi0gICAgICAgIExEUiAgICAgcHBSdW5UYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzLTQpCi0gICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KLSAgICAgICAgTU9WUyAgICBaZXJvc0xlZnQsIFN5bWJvbAotCi0gICAgICAgIEFERCAgICAgQ29lZmZOdW0sQ29lZmZOdW0sWmVyb3NMZWZ0ICAgICAgICAKLQotICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgemVyb3MgYXJlIGxlZnQgYW5kIG1vcmUgdGhhbiBvbmUgY29lZmZpY2llbnQKLVJ1bkxvb3AgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BwUnVuVGFibGUsIFplcm9zTGVmdCwgTFNMIzJdCi0gICAgICAgIEJMVCAgICAgTGFzdFJ1bgotICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgMywgMiA7Ly8gU3ltYm9sID0gUnVuCi0gICAgICAgIENNUCAgICAgU3ltYm9sLCMxNSAgICAgICAgIAotICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbCAgICAgICAgCi0KLSAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFplcm9zTGVmdCwgU3ltYm9sCi0gICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFN5bWJvbAotICAgICAgICBTVFJCICAgIFN5bWJvbCwgW3BSdW5dLCAjMQotICAgICAgICBCR1QgICAgIFJ1bkxvb3AKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSBubyB6ZXJvcyBhcmUgbGVmdAotTm9aZXJvc0xlZnQgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQotICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBaZXJvc0xlZnQKLSAgICAgICAgU1RSR0VCICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEKLSAgICAgICAgQkdUICAgICBOb1plcm9zTGVmdAotCi1MYXN0UnVuICAgICAgICAKLSAgICAgICAgOy8vIEZpbmFsIHJ1biBsZW5ndGggaXMgcmVtYWluaW5nIHplcm9zCi0gICAgICAgIE1fUFJJTlRGICJMYXN0UnVuPSVkXG4iLCBaZXJvc0xlZnQKLSAgICAgICAgU1RSQiAgICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGNvZWZmaWNpZW50cyB0byBvdXRwdXQgYXJyYXkKLSAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgotICAgICAgICBURVEgICAgIFQxLCAjMTUKLSAgICAgICAgQURERVEgICBDb2VmZk51bSxDb2VmZk51bSwjMQotICAgICAgICAKLQotICAgICAgICBTVUIgICAgIHBSdW4scFJ1bixUb3RhbENvZWZmCi0gICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAKLSAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgICAKLQotICAgICAgICBNX0xEUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZgotICAgICAgICBMRFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQotICAgICAgICBURVEgICAgIFQxLCAjNAotICAgICAgICBMRFJFUSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICAgICAgTERSTkUgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci0KLSAgICAgICAgCi0gICAgICAgIAotT3V0cHV0TG9vcAotICAgICAgICAKLSAgICAgICAgTERSQiAgICBUMiwgW3BSdW5dLCMxCi0gICAgICAgIExEUkIgICAgVDEsIFtwWmlnWmFnLCBDb2VmZk51bV0KLSAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sICMxICAgICAgOy8vIFNraXAgTm9uIHplcm8KLSAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sIFQyICAgICAgOy8vIFNraXAgWmVybyBydW4KLSAgICAgICAgCi0gICAgICAgIExEUlNIICAgVDIsIFtwTGV2ZWxdLCMyCi0gICAgICAgIAotICAgICAgICBTVUJTICAgIFRvdGFsQ29lZmYsIFRvdGFsQ29lZmYsICMxICAgICAgIAotICAgICAgICBPUlJFUSAgIFQxLCBUMSwgI0xBU1RfQ09FRkYKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgdGVtcCwgVDIsICMxMjgKLSAgICAgICAgQ01QICAgICB0ZW1wLCAjMjU2Ci0gICAgICAgIE9SUkNTICAgVDEsIFQxLCAjVFdPX0JZVEVfQ09FRkYKLQotICAgICAgICAKLSAgICAgICAgVEVRICAgICBUb3RhbENvZWZmLCAjMCAgICAgICAgICAgICAgOy8vIFByZXNlcnZlcyBjYXJyeSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1BSSU5URiAiT3V0cHV0PSUwMnggJTA0eFxuIiwgVDEsIFQyCi0gICAgICAgIFNUUkIgICAgVDEsIFtwUG9zQ29lZmJ1Zl0sICMxCi0gICAgICAgIFNUUkIgICAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxCi0gICAgICAgIE1PViAgICAgVDIsIFQyLCBMU1IgIzgKLSAgICAgICAgU1RSQ1NCICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEgICAgICAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgT3V0cHV0TG9vcAotICAgICAgICAKLSAgICAgICAgOy8vIEZpbmlzaGVkCi0gICAgICAgIFNUUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCi0gICAgICAgIE1fTERSICAgcHBCaXRTdHJlYW0sIHBwcEJpdFN0cmVhbQotICAgICAgICBNX0xEUiAgIHBPZmZzZXQsIHBwT2Zmc2V0Ci0gICAgICAgIEIgICAgICAgRW5kTm9FcnJvcgotICAgICAgICAgICAgCi1FbmRCYWRTeW1ib2wKLSAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfRXJyCi0gICAgICAgIEIgICAgICAgRW5kICAgIAotICAgICAgICAKLUVuZE5vRXJyb3IKLSAgICAgICAgOy8vIEZpbmlzaGVkIHJlYWRpbmcgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBPZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyICAgIAotRW5kCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlOGM4OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0KLSAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgIAotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4IAotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotICAgICAgICAgCi0gICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgICAgIAotICAgICAgICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0KLSAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICAgICAKLSAKLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKLSAgICAgICAgIERDQiAgMCwgMiwgMCwgMgotICAgICAgICAgRENCICAyLCAxLCAyLCAxCi0gICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMSwgMiwgMQotCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAgICAgIERDQiAgMCwgMgotICAgICAgICAgRENCICAyLCAxCi0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXgKLSAgICAgICAgIERDQiAgMTAsIDE2LCAxMwotICAgICAgICAgRENCICAxMSwgMTgsIDE0Ci0gICAgICAgICBEQ0IgIDEzLCAyMCwgMTYKLSAgICAgICAgIERDQiAgMTQsIDIzLCAxOAotICAgICAgICAgRENCICAxNiwgMjUsIDIwCi0gICAgICAgICBEQ0IgIDE4LCAyOSwgMjMKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIFsoSU5UKShRUC82KV0sCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICAgRENCICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLSAgICAgICAgIERDQiAgMSwgIDEsICAxLCAgMSwgIDEsICAxCi0gICAgICAgICBEQ0IgIDIsICAyLCAgMiwgIDIsICAyLCAgMgotICAgICAgICAgRENCICAzLCAgMywgIDMsICAzLCAgMywgIDMKLSAgICAgICAgIERDQiAgNCwgIDQsICA0LCAgNCwgIDQsICA0Ci0gICAgICAgICBEQ0IgIDUsICA1LCAgNSwgIDUsICA1LCAgNQotICAgICAgICAgRENCICA2LCAgNiwgIDYsICA2LCAgNiwgIDYKLSAgICAgICAgIERDQiAgNywgIDcsICA3LCAgNywgIDcsICA3Ci0gICAgICAgICBEQ0IgIDgsICA4LCAgOCwgIDgsICA4LCAgOAotICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdIGVudGlyZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgbW9kdWx1cyBleHByZXNzaW9uIFtRUCU2XSo2LAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW52aWR1YWwgYnl0ZSB2YWx1ZXMgc3RvcmVkIGFzCi07Ly8gaGFsZndvcmRzLiBUaGlzIGF2b2lkcyB1bnBhY2tpbmcgaW5zaWRlIHRoZSBmdW5jdGlvbgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgICBEQ1cgMTAsIDE2LCAxMyAKLSAgICAgICAgIERDVyAxMSwgMTgsIDE0Ci0gICAgICAgICBEQ1cgMTMsIDIwLCAxNgotICAgICAgICAgRENXIDE0LCAyMywgMTgKLSAgICAgICAgIERDVyAxNiwgMjUsIDIwCi0gICAgICAgICBEQ1cgMTgsIDI5LCAyMyAKLSAgICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAKLSAgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGIzZTIyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLSAgICBJRiBBUk0xMTM2SlMgCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gOAotaUhlaWdodCAgICAgICAgIFJOIDkKLQotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLXggICAgICAgICAgICAgICBSTiA3Ci14MCAgICAgICAgICAgICAgUk4gNwoteDEgICAgICAgICAgICAgIFJOIDEwCi14MiAgICAgICAgICAgICAgUk4gMTEKLVNjcmF0Y2ggICAgICAgICBSTiAxMgotCi07Ly8gRnVuY3Rpb246IAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotOy8vCi07Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYSA0IGJ5dGUgYWxpZ25lZAotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciBob3Jpem9udGFsIGludGVycG9sYXRpb24uCi07Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDkgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24uIAotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyByb3dzIHRvIGNvcHkKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIyLHIzLHI0LHI1LHI2Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCi07Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb3B5IHBEc3QgdG8gc2NyYXRjaAotICAgICAgICBNT1YgICAgIFNjcmF0Y2gsIHBEc3QKLQotU3RhcnRBbGlnbmVkU3RhY2tDb3B5Ci0gICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKLSAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMwotICAgICAgICAKLSAgICAgICAgTV9TV0lUQ0ggeAotICAgICAgICBNX0NBU0UgICBDb3B5MHRvQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MXRvQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MnRvQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5M3RvQWxpZ25lZAotICAgICAgICBNX0VORFNXSVRDSAotCi1Db3B5MHRvQWxpZ25lZCAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkwdG9BbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weUVuZCAgCi0gICAgICAKLUNvcHkxdG9BbGlnbmVkICAgICAgICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMyNAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4Ci0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MXRvQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlFbmQgIAotCi1Db3B5MnRvQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMxNgotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTJ0b0FsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5RW5kICAKLQotQ29weTN0b0FsaWduZWQgICAgICAgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4Ci0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICM4Ci0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0Ci0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5M3RvQWxpZ25lZAotCi1Db3B5RW5kICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcFNyYywgU2NyYXRjaAotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICMxMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLTsvLwotOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KLTsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gb2Ygcm93cyB0byBjb3B5Ci07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMixyMyxyNCxyNSxyNgotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYwotOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZSAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29weSBwU3JjIHRvIHN0YWNrCi1TdGFydFZBbGlnbmVkU3RhY2tDb3B5Ci0gICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKLSAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1dJVENIIHgKLSAgICAgICAgTV9DQVNFICAgQ29weTB0b1ZBbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkxdG9WQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MnRvVkFsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTN0b1ZBbGlnbmVkCi0gICAgICAgIE1fRU5EU1dJVENICi0gICAgICAgIAotQ29weTB0b1ZBbGlnbmVkICAKLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkwdG9WQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlWRW5kICAKLSAgICAgIAotQ29weTF0b1ZBbGlnbmVkICAgICAgICAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzgKLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MXRvVkFsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCi0KLUNvcHkydG9WQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMxNgotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkydG9WQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlWRW5kICAKLQotQ29weTN0b1ZBbGlnbmVkICAgICAgICAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMjQKLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5M3RvVkFsaWduZWQKLQotQ29weVZFbmQgIAotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcERzdCwgIzI4Ci0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKLQotICAgICAgICBNX0VORAotCi0KLSAgICBFTkRJRgotCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE1YmViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUgCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIxLHIzLHI0LHI1LHI2LHI3LHIxMCxyMTEscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjAscjIscjgscjkscjEyCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKLSAgICAgICAgCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLXgwICAgICAgICAgICAgICBSTiA0Ci14MSAgICAgICAgICAgICAgUk4gNQoteDIgICAgICAgICAgICAgIFJOIDgKLXgzICAgICAgICAgICAgICBSTiA5Ci1UZW1wICAgICAgICAgICAgUk4gMTIKLQotICAgIElGIEFSTTExMzZKUwotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUsIHI2Ci0KLUNvcHk0eDRTdGFydAotICAgICAgICA7Ly8gRG8gQ29weSBhbmQgYnJhbmNoIHRvIEVuZE9mSW50ZXJwb2xhdGlvbgotICAgICAgICBBTkQgICAgIFRlbXAsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICBNX1NXSVRDSCBUZW1wCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMAotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjEKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24yCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMwotICAgICAgICBNX0VORFNXSVRDSAotCi1Db3B5NHg0QWxpZ24wCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX0xEUiAgIHgxLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgxLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTV9MRFIgICB4MywgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNX1NUUiAgIHgzLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLQotQ29weTR4NEFsaWduMQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLSAgICAgIAotQ29weTR4NEFsaWduMgotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAotCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRBbGlnbjMgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRFbmQKLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGCi0KLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhNzMyNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKLQotOy8vIEZ1bmN0aW9uczogCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSBhbmQKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlIAotOy8vCi07Ly8gSW1wbGVtZW50cyByZS1hcnJhbmdlbWVudCBvZiBkYXRhIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciB0byBhIGJ1ZmZlciBwb2ludGVkIGJ5IHBCdWYuCi07Ly8gVGhpcyB3aWxsIGRvIHRoZSBjb252ZXJ0aW9uIG9mIGRhdGEgZnJvbSAxNiBiaXQgdG8gOCBiaXQgYW5kIGl0IGFsc28KLTsvLyByZW1vdmUgb2Zmc2V0IGFuZCBjaGVjayBmb3Igc2F0dXJhdGlvbi4KLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjcgd2hlcmUgcjAgaXMgaW5wdXQgcG9pbnRlciBhbmQgcjIgaXRzIHN0ZXAgc2l6ZSwgcjcgaXMgb3V0cHV0IHBvaW50ZXIKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgotOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgZGVzdGluYXRpb24gbG9jYXRpb24KLQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLSAgICAgICAgCi1NQVNLICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAgIDsvLyBNYXNrIGlzIHVzZWQgdG8gaW1wbGVtZW50IChhK2IrMSkvMgotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLQotcFNyYzAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAwICAgICAgICBSTiAxCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLVRlbXAxICAgICAgICAgICBSTiA0Ci1UZW1wMiAgICAgICAgICAgUk4gNQotVGVtcDMgICAgICAgICAgIFJOIDEwCi1UZW1wNCAgICAgICAgICAgUk4gMTEKLXBCdWYgICAgICAgICAgICBSTiA3Ci1yMHgwZmUwMGZlMCAgICAgUk4gNgotcjB4MDBmZjAwZmYgICAgIFJOIDEyCi1Db3VudCAgICAgICAgICAgUk4gMTQKLVZhbHVlQTAgICAgICAgICBSTiAxMAotVmFsdWVBMSAgICAgICAgIFJOIDExCi0KLSAgICBJRiBBUk0xMTM2SlMKLQotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgIAotICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzQgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgCi1Mb29wU3RhcnQxCi0gICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMCAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICAgICAgIAotICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVFJEICAgICAgICBWYWx1ZUEwLCBbcEJ1Zl0sICM4IAotICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQxCi1FbmQxCi0gICAgICAgIFNVQiAgICAgICAgcFNyYzAsIHBCdWYsICMzMgotICAgICAgICBNT1YgICAgICAgIHNyY1N0ZXAwLCAjOAotCi0gICAgICAgIE1fRU5ECi0KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlLCByNgotICAgICAgICAKLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmCi0gICAgICAgIE1PViAgICAgICAgIENvdW50LCAjMgotCi1Mb29wU3RhcnQgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAotICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCi0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCi0gICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQotICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjLTQgIAotCi0gICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAotICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCi0gICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQotICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjNCAgCi0gICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQKLUVuZDIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYzAsIHBCdWYsICMzMi04Ci0gICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAwLCAjNAotCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg2NzgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgSUYgQ29ydGV4QTgKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZSwgcjExCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKLWRDb2VmZjUgICAgICAgICBETiAzMC5TMTYKLWRDb2VmZjIwICAgICAgICBETiAzMS5TMTYKLXFDb2VmZjUgICAgICAgICBRTiAxNC5TMzIKLXFDb2VmZjIwICAgICAgICBRTiAxNS5TMzIKLSAgICAgICAgCi1xU3JjMDEgICAgICAgICAgUU4gMC5VOAotZFNyYzAgICAgICAgICAgIEROIDAuVTgKLWRTcmMxICAgICAgICAgICBETiAxLlU4ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotZFNyY2IgICAgICAgICAgIEROIDQuVTgKLWRTcmNjICAgICAgICAgICBETiAyLlU4Ci1kU3JjZCAgICAgICAgICAgRE4gMy5VOAotZFNyY2UgICAgICAgICAgIEROIDUuVTgKLWRTcmNmICAgICAgICAgICBETiAxLlU4Ci0KLXFTcmNiICAgICAgICAgICBRTiAyLlMxNgotcVNyY2MgICAgICAgICAgIFFOIDEuUzE2Ci1kU3JjQiAgICAgICAgICAgRE4gNC5TMTYKLWRTcmNDICAgICAgICAgICBETiAyLlMxNgotCi1xUmVzMCAgICAgICAgICAgUU4gNS5TMTYKLXFSZXMxICAgICAgICAgICBRTiA2LlMxNgotcVJlczIgICAgICAgICAgIFFOIDcuUzE2Ci1xUmVzMyAgICAgICAgICAgUU4gOC5TMTYKLXFSZXM0ICAgICAgICAgICBRTiA5LlMxNgotcVJlczUgICAgICAgICAgIFFOIDEwLlMxNgotcVJlczYgICAgICAgICAgIFFOIDExLlMxNgotcVJlczcgICAgICAgICAgIFFOIDEyLlMxNgotcVJlczggICAgICAgICAgIFFOIDEzLlMxNgotICAgIAotZFJlczAgICAgICAgICAgIEROIDEwLlMxNgotZFJlczEgICAgICAgICAgIEROIDEyLlMxNgotZFJlczIgICAgICAgICAgIEROIDE0LlMxNgotZFJlczMgICAgICAgICAgIEROIDE2LlMxNgotZFJlczQgICAgICAgICAgIEROIDE4LlMxNgotZFJlczUgICAgICAgICAgIEROIDIwLlMxNgotZFJlczYgICAgICAgICAgIEROIDIyLlMxNgotZFJlczcgICAgICAgICAgIEROIDI0LlMxNgotZFJlczggICAgICAgICAgIEROIDI2LlMxNgotICAgIAotcUFjYzAxICAgICAgICAgIFFOIDUuUzMyCi1xQWNjMjMgICAgICAgICAgUU4gNi5TMzIKLXFBY2M0NSAgICAgICAgICBRTiAyLlMzMgotcUFjYzY3ICAgICAgICAgIFFOIDMuUzMyCi1xU3VtQkUgICAgICAgICAgUU4gMC5TMzIKLXFTdW1DRCAgICAgICAgICBRTiAxLlMzMgotCi1kVGVtcEFjYzAgICAgICAgRE4gMC5VMTYKLWRUZW1wQWNjMSAgICAgICBETiAyLlUxNgotZFRlbXBBY2MyICAgICAgIEROIDQuVTE2Ci1kVGVtcEFjYzMgICAgICAgRE4gNi5VMTYKLQotcVRBY2MwICAgICAgICAgIFFOIDAuVTE2Ci1xVEFjYzEgICAgICAgICAgUU4gMS5VMTYKLXFUQWNjMiAgICAgICAgICBRTiAyLlUxNgotcVRBY2MzICAgICAgICAgIFFOIDMuVTE2Ci0KLWRBY2MwICAgICAgICAgICBETiAwLlU4Ci1kQWNjMSAgICAgICAgICAgRE4gMi5VOAotZEFjYzIgICAgICAgICAgIEROIDQuVTgKLWRBY2MzICAgICAgICAgICBETiA2LlU4Ci0KLWRUbXAwICAgICAgICAgICBETiA4LlMxNgotZFRtcDEgICAgICAgICAgIEROIDkuUzE2Ci1xVG1wMCAgICAgICAgICAgUU4gNC5TMzIKLQotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAotICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQotCi0gICAgICAgIDsvLyBSb3cwCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczAsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIAotICAgICAgICA7Ly8gUm93MQotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXMxLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLSAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRtcDAgOy8vIFRlUmkKLSAgICAgICAgCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXMxLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzMSwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93MgotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXMyLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLSAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXMxLCBkUmVzMSwgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzMywgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczIsIGRSZXMyLCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXMzLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzMywgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93NAotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXM0LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLQotICAgICAgICBWU1VCICAgICAgICBkUmVzMywgZFJlczMsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczQsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXM0LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3c1Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczUsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM0LCBkUmVzNCwgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzNSwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczUsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzYKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzNiwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczUsIGRSZXM1LCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM2LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzNiwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93NwotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXM3LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLQotICAgICAgICBWU1VCICAgICAgICBkUmVzNiwgZFJlczYsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczcsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXM3LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3c4Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczgsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczcsIGRSZXM3LCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM4LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzOCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICBWTU9WICAgICAgICBxQ29lZmYyMCwgIzIwCi0gICAgICAgIFZNT1YgICAgICAgIHFDb2VmZjUsICM1Ci0KLSAgICAgICAgOy8vIENvbDAKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzAxLCBkUmVzMCwgZFJlczUgICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzMiwgZFJlczMgICAgICAgIDsvLyBjK2QKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzMSwgZFJlczQgICAgICAgIDsvLyBiK2UKLQotICAgICAgICBWU1VCICAgICAgICBkUmVzOCwgZFJlczgsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgcUFjYzAxLCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIHFBY2MwMSwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLSAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0KLSAgICAgICAgOy8vIENvbDEKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzIzLCBkUmVzMSwgZFJlczYgICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzMywgZFJlczQgICAgICAgIDsvLyBjK2QKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzMiwgZFJlczUgICAgICAgIDsvLyBiK2UKLSAgICAgICAgVk1MQSAgICAgICAgcUFjYzIzLCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLQotICAgICAgICBWU1VCICAgICAgICBxQWNjMDEsIHFBY2MwMSwgcVRtcDAKLQotOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzIzLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLQotICAgICAgICA7Ly8gQ29sMgotICAgICAgICBWQURETCAgICAgICBxQWNjNDUsIGRSZXMyLCBkUmVzNyAgICAgICAgOy8vIEFjYyA9IGErZgotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXM0LCBkUmVzNSAgICAgICAgOy8vIGMrZAotICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXMzLCBkUmVzNiAgICAgICAgOy8vIGIrZQotICAgICAgICBWTUxBICAgICAgICBxQWNjNDUsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQotCi0gICAgICAgIFZTVUIgICAgICAgIHFBY2MyMywgcUFjYzIzLCBxVG1wMAotCi07ICAgICAgICBWTUxTICAgICAgICBxQWNjNDUsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0gICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENvbDMKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzY3LCBkUmVzMywgZFJlczggICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzNSwgZFJlczYgICAgICAgIDsvLyBjK2QKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzNCwgZFJlczcgICAgICAgIDsvLyBiK2UKLSAgICAgICAgVk1MQSAgICAgICAgcUFjYzY3LCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLQotICAgICAgICBWU1VCICAgICAgICBxQWNjNDUsIHFBY2M0NSwgcVRtcDAKLQotICAgICAgICBWTUxTICAgICAgICBxQWNjNjcsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0KLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MwLCBxQWNjMDEsICMxMAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzEsIHFBY2MyMywgIzEwCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMiwgcUFjYzQ1LCAjMTAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MzLCBxQWNjNjcsICMxMAotICAgICAgICAKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzAsIHFUQWNjMAotICAgICAgICBWUU1PVk4gICAgICBkQWNjMSwgcVRBY2MxCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MyLCBxVEFjYzIKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzMsIHFUQWNjMwotICAgICAgICAgICAgICAgIAotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0KLQotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmM5NTM0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgIElGIENvcnRleEE4Ci0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlLCByMTEKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycwotZFRDb2VmZjUgICAgICAgIEROIDMwLlU4Ci1kVENvZWZmMjAgICAgICAgRE4gMzEuVTgKLWRDb2VmZjUgICAgICAgICBETiAzMC5TMTYKLWRDb2VmZjIwICAgICAgICBETiAzMS5TMTYKLQotcVNyY0EwMSAgICAgICAgIFFOIDAuVTgKLXFTcmNCMjMgICAgICAgICBRTiAxLlU4Ci1xU3JjQzQ1ICAgICAgICAgUU4gMi5VOAotcVNyY0Q2NyAgICAgICAgIFFOIDMuVTgKLXFTcmNFODkgICAgICAgICBRTiA0LlU4Ci1xU3JjRjEwMTEgICAgICAgUU4gNS5VOAotcVNyY0cxMjEzICAgICAgIFFOIDYuVTgKLXFTcmNIMTQxNSAgICAgICBRTiA3LlU4Ci1xU3JjSTE2MTcgICAgICAgUU4gOC5VOAotCi1kU3JjQTAgICAgICAgICAgRE4gMC5VOAotZFNyY0IyICAgICAgICAgIEROIDIuVTgKLWRTcmNDNCAgICAgICAgICBETiA0LlU4Ci1kU3JjRDYgICAgICAgICAgRE4gNi5VOAotZFNyY0U4ICAgICAgICAgIEROIDguVTgKLWRTcmNGMTAgICAgICAgICBETiAxMC5VOAotZFNyY0cxMiAgICAgICAgIEROIDEyLlU4Ci1kU3JjSDE0ICAgICAgICAgRE4gMTQuVTgKLWRTcmNJMTYgICAgICAgICBETiAxNi5VOAotCi1kU3JjQTEgICAgICAgICAgRE4gMS5VOAotZFNyY0IzICAgICAgICAgIEROIDMuVTgKLWRTcmNDNSAgICAgICAgICBETiA1LlU4Ci1kU3JjRDcgICAgICAgICAgRE4gNy5VOAotZFNyY0U5ICAgICAgICAgIEROIDkuVTgKLWRTcmNGMTEgICAgICAgICBETiAxMS5VOAotZFNyY0cxMyAgICAgICAgIEROIDEzLlU4Ci1kU3JjSDE1ICAgICAgICAgRE4gMTUuVTgKLWRTcmNJMTcgICAgICAgICBETiAxNy5VOAotCi1xVGVtcFAwMSAgICAgICAgUU4gOS5TMTYKLXFUZW1wUTAxICAgICAgICBRTiAxMC5TMTYKLXFUZW1wUjAxICAgICAgICBRTiAxMS5TMTYKLXFUZW1wUzAxICAgICAgICBRTiAxMi5TMTYKLQotcVRlbXBQMjMgICAgICAgIFFOIDAuUzE2Ci1xVGVtcFEyMyAgICAgICAgUU4gMS5TMTYKLXFUZW1wUjIzICAgICAgICBRTiAyLlMxNgotcVRlbXBTMjMgICAgICAgIFFOIDMuUzE2Ci0KLWRUZW1wUDAgICAgICAgICBETiAxOC5TMTYKLWRUZW1wUDEgICAgICAgICBETiAxOS5TMTYKLWRUZW1wUDIgICAgICAgICBETiAwLlMxNgotCi1kVGVtcFEwICAgICAgICAgRE4gMjAuUzE2Ci1kVGVtcFExICAgICAgICAgRE4gMjEuUzE2Ci1kVGVtcFEyICAgICAgICAgRE4gMi5TMTYKLQotZFRlbXBSMCAgICAgICAgIEROIDIyLlMxNgotZFRlbXBSMSAgICAgICAgIEROIDIzLlMxNgotZFRlbXBSMiAgICAgICAgIEROIDQuUzE2Ci0KLWRUZW1wUzAgICAgICAgICBETiAyNC5TMTYKLWRUZW1wUzEgICAgICAgICBETiAyNS5TMTYKLWRUZW1wUzIgICAgICAgICBETiA2LlMxNgotIAotZFRlbXBCMCAgICAgICAgIEROIDI2LlMxNgotZFRlbXBDMCAgICAgICAgIEROIDI3LlMxNgotZFRlbXBEMCAgICAgICAgIEROIDI4LlMxNgotZFRlbXBGMCAgICAgICAgIEROIDI5LlMxNgotCi1kVGVtcEFjYzAgICAgICAgRE4gMC5VMTYKLWRUZW1wQWNjMSAgICAgICBETiAyLlUxNgotZFRlbXBBY2MyICAgICAgIEROIDQuVTE2Ci1kVGVtcEFjYzMgICAgICAgRE4gNi5VMTYKLQotZEFjYzAgICAgICAgICAgIEROIDAuVTgKLWRBY2MxICAgICAgICAgICBETiAyLlU4Ci1kQWNjMiAgICAgICAgICAgRE4gNC5VOAotZEFjYzMgICAgICAgICAgIEROIDYuVTgKLQotcUFjYzAgICAgICAgICAgIFFOIDAuUzMyCi1xQWNjMSAgICAgICAgICAgUU4gMS5TMzIKLXFBY2MyICAgICAgICAgICBRTiAyLlMzMgotcUFjYzMgICAgICAgICAgIFFOIDMuUzMyCi0KLXFUQWNjMCAgICAgICAgICBRTiAwLlUxNgotcVRBY2MxICAgICAgICAgIFFOIDEuVTE2Ci1xVEFjYzIgICAgICAgICAgUU4gMi5VMTYKLXFUQWNjMyAgICAgICAgICBRTiAzLlUxNiAgICAgICAgICAgICAgICAKLQotcVRtcCAgICAgICAgICAgIFFOIDQuUzE2Ci1kVG1wICAgICAgICAgICAgRE4gOC5TMTYKLQotICAgICAgICBWTEQxICAgICAgICBxU3JjQTAxLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi4gYTE1XSAgIAotICAgICAgICBBREQgICAgICAgICByMTIsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotICAgICAgICBWTU9WICAgICAgICBkVENvZWZmNSwgIzUKLSAgICAgICAgVk1PViAgICAgICAgZFRDb2VmZjIwLCAjMjAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0YxMDExLCBbcjEyXSwgc3JjU3RlcAotICAgICAgICBWTEQxICAgICAgICBxU3JjQjIzLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi4gYjE1XQotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0cxMjEzLCBbcjEyXSwgc3JjU3RlcAotICAgICAgICBWQURETCAgICAgICBxVGVtcFAwMSwgZFNyY0EwLCBkU3JjRjEwICAgICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0M0NSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2MwIGMxIGMyIGMzIC4uIGMxNV0KLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBQMjMsIGRTcmNBMSwgZFNyY0YxMSAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjRDY3LCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBRMDEsIGRTcmNCMiwgZFNyY0cxMiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0U4OSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly90MAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAwMSwgZFNyY0M0LCBkVENvZWZmMjAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNIMTQxNSwgW3IxMl0sIHNyY1N0ZXAKLQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAyMywgZFNyY0M1LCBkVENvZWZmMjAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNJMTYxNywgW3IxMl0sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbaTAgaTEgaTIgaTMgLi4gXQotICAgICAgICAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMDEsIGRTcmNENiwgZFRDb2VmZjIwCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTAxLCBkU3JjRDYsIGRUQ29lZmYyMAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAyMywgZFNyY0IzLCBkVENvZWZmNQotICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBSMDEsIGRTcmNDNCwgZFNyY0gxNCAgIAotICAgICAgICAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMDEsIGRTcmNCMiwgZFRDb2VmZjUKLQotICAgICAgICBWQURETCAgICAgICBxVGVtcFEyMywgZFNyY0IzLCBkU3JjRzEzICAgCi0KLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMjMsIGRTcmNENywgZFRDb2VmZjIwCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTAxLCBkU3JjRTgsIGRUQ29lZmYyMAotCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDAxLCBkU3JjRTgsIGRUQ29lZmY1Ci0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTIzLCBkU3JjRDcsIGRUQ29lZmYyMAotCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDIzLCBkU3JjRTksIGRUQ29lZmY1Ci0KLSAgICAgICAgOy8vdDEKLQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIwMSwgZFNyY0U4LCBkVENvZWZmMjAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMDEsIGRTcmNDNCwgZFRDb2VmZjUKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMjMsIGRTcmNDNSwgZFRDb2VmZjUKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBSMjMsIGRTcmNDNSwgZFNyY0gxNSAgIAotCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjAxLCBkU3JjRjEwLCBkVENvZWZmMjAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMDEsIGRTcmNGMTAsIGRUQ29lZmY1Ci0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTIzLCBkU3JjRTksIGRUQ29lZmYyMAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIyMywgZFNyY0U5LCBkVENvZWZmMjAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBTMDEsIGRTcmNENiwgZFNyY0kxNiAgIAotCi0KLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMDEsIGRTcmNENiwgZFRDb2VmZjUKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMjMsIGRTcmNGMTEsIGRUQ29lZmY1Ci0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjIzLCBkU3JjRDcsIGRUQ29lZmY1Ci0KLSAgICAgICAgOy8vdDIKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBTMjMsIGRTcmNENywgZFNyY0kxNyAgIAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMwMSwgZFNyY0YxMCwgZFRDb2VmZjIwCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjAxLCBkU3JjRzEyLCBkVENvZWZmNQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIyMywgZFNyY0cxMywgZFRDb2VmZjUKLQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMyMywgZFNyY0YxMSwgZFRDb2VmZjIwCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzAxLCBkU3JjRzEyLCBkVENvZWZmMjAKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzEKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMjMsIGRTcmNGMTEsIGRUQ29lZmYyMAotCi0KLSAgICAgICAgOy8vdDMKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMjMsIGRTcmNHMTMsIGRUQ29lZmYyMAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMwMSwgZFNyY0U4LCBkVENvZWZmNQotICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMgotICAgICAgICBWTU9WICAgICAgICBkQ29lZmYyMCwgIzIwCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzIzLCBkU3JjRTksIGRUQ29lZmY1Ci0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzAxLCBkU3JjSDE0LCBkVENvZWZmNQotICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFAxLCBkVGVtcFAyLCAjMQotICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMwotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMyMywgZFNyY0gxNSwgZFRDb2VmZjUKLSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MwLCBkVGVtcFAwLCBkVGVtcEYwCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKLSAgICAgICAgOy8vaCAKLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKLSAgICAgICAgCi0gICAgICAgIDsvLyByZXMwCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUDEKLSAgICAgICAgVk1MQUwgICAgICAgcUFjYzAsIGRUZW1wQzAsIGRDb2VmZjIwCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUTAsIGRUZW1wUTEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUTAsIGRUZW1wUTEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUTEsIGRUZW1wUTIsICMxCi0gICAgICAgIFZNTFNMICAgICAgIHFBY2MwLCBkVGVtcEIwLCBkQ29lZmY1Ci0KLSAgICAgICAgOy8vIHJlczEKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzEKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzEsIGRUZW1wUTAsIGRUZW1wRjAKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAotICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFExCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUjAsIGRUZW1wUjEsICMzCi0gICAgICAgIFZNTEFMICAgICAgIHFBY2MxLCBkVGVtcEMwLCBkQ29lZmYyMAotICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFIxLCBkVGVtcFIyLCAjMQotICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkVG1wLCBkVGVtcFIwLCBkVGVtcFIxLCAjMQotICAgICAgICBWQURETCAgICAgICBxQWNjMiwgZFRlbXBSMCwgZFRlbXBGMAotICAgICAgICBWTUxTTCAgICAgICBxQWNjMSwgZFRlbXBCMCwgZENvZWZmNQotOyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzEKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAotICAgICAgICAKLSAgICAgICAgOy8vIHJlczIKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRtcCwgZFRlbXBSMQotICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMwotICAgICAgICBWTUxBTCAgICAgICBxQWNjMiwgZFRlbXBDMCwgZENvZWZmMjAKLTsgICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUjEKLSAgICAgICAgCi0gICAgICAgIDsvLyByZXMzCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUzAsIGRUZW1wUzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUzEsIGRUZW1wUzIsICMxCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKLSAgICAgICAgVkVYVCAgICAgICAgZFRtcCwgZFRlbXBTMCwgZFRlbXBTMSwgIzEKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzMsIGRUZW1wUzAsIGRUZW1wRjAKLSAgICAgICAgVk1MU0wgICAgICAgcUFjYzIsIGRUZW1wQjAsIGRDb2VmZjUKLSAgICAgICAgVk1MQUwgICAgICAgcUFjYzMsIGRUZW1wQzAsIGRDb2VmZjIwCi0gICAgICAgIFZBREQgICAgICAgIGRUbXAsIGRUbXAsIGRUZW1wUzEKLSAgICAgICAgVk1MU0wgICAgICAgcUFjYzMsIGRUbXAsIGRDb2VmZjUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MwLCBxQWNjMCwgIzEwCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMSwgcUFjYzEsICMxMAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzIsIHFBY2MyLCAjMTAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MzLCBxQWNjMywgIzEwCi0KLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzAsIHFUQWNjMAotICAgICAgICBWUU1PVk4gICAgICBkQWNjMSwgcVRBY2MxCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MyLCBxVEFjYzIKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzMsIHFUQWNjMwotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIAotICAgIAotCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTFjMzQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlLCByMTEKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycwotZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgotZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgotCi1xU3JjQTAxICAgICAgICAgUU4gMTEuVTgKLXFTcmNCMDEgICAgICAgICBRTiAxMi5VOAotcVNyY0MwMSAgICAgICAgIFFOIDEzLlU4Ci1xU3JjRDAxICAgICAgICAgUU4gMTQuVTgKLQotZFNyY0EwICAgICAgICAgIEROIDIyLlU4Ci1kU3JjQTEgICAgICAgICAgRE4gMjMuVTgKLWRTcmNCMCAgICAgICAgICBETiAyNC5VOAotZFNyY0IxICAgICAgICAgIEROIDI1LlU4Ci1kU3JjQzAgICAgICAgICAgRE4gMjYuVTgKLWRTcmNDMSAgICAgICAgICBETiAyNy5VOAotZFNyY0QwICAgICAgICAgIEROIDI4LlU4Ci1kU3JjRDEgICAgICAgICAgRE4gMjkuVTgKLQotZFNyY2IgICAgICAgICAgIEROIDEyLlU4Ci1kU3JjZSAgICAgICAgICAgRE4gMTMuVTgKLWRTcmNmICAgICAgICAgICBETiAxMC5VOAotCi1kU3JjMGMgICAgICAgICAgRE4gMTQuVTgKLWRTcmMxYyAgICAgICAgICBETiAxNi5VOAotZFNyYzJjICAgICAgICAgIEROIDE4LlU4Ci1kU3JjM2MgICAgICAgICAgRE4gMjAuVTgKLSAgICAgICAgICAgICAgICAgICAKLWRTcmMwZCAgICAgICAgICBETiAxNS5VOAotZFNyYzFkICAgICAgICAgIEROIDE3LlU4Ci1kU3JjMmQgICAgICAgICAgRE4gMTkuVTgKLWRTcmMzZCAgICAgICAgICBETiAyMS5VOAotCi1xVGVtcDAxICAgICAgICAgUU4gNC5TMTYKLXFUZW1wMjMgICAgICAgICBRTiA2LlMxNgotZFRlbXAwICAgICAgICAgIEROIDguUzE2Ci1kVGVtcDIgICAgICAgICAgRE4gMTIuUzE2Ci0KLXFSZXMwMSAgICAgICAgICBRTiAxMS5TMTYKLXFSZXMyMyAgICAgICAgICBRTiAxMi5TMTYKLXFSZXM0NSAgICAgICAgICBRTiAxMy5TMTYKLXFSZXM2NyAgICAgICAgICBRTiAxNC5TMTYKLQotZFJlczAgICAgICAgICAgIEROIDIyLlMxNgotZFJlczIgICAgICAgICAgIEROIDI0LlMxNgotZFJlczQgICAgICAgICAgIEROIDI2LlMxNgotZFJlczYgICAgICAgICAgIEROIDI4LlMxNgotCi1kQWNjMCAgICAgICAgICAgRE4gMjIuVTgKLWRBY2MyICAgICAgICAgICBETiAyNC5VOAotZEFjYzQgICAgICAgICAgIEROIDI2LlU4Ci1kQWNjNiAgICAgICAgICAgRE4gMjguVTgKLQotZFJlc3VsdDAgICAgICAgIEROIDIyLlUzMgotZFJlc3VsdDIgICAgICAgIEROIDI0LlUzMgotZFJlc3VsdDQgICAgICAgIEROIDI2LlUzMgotZFJlc3VsdDYgICAgICAgIEROIDI4LlUzMgotCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNBMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBBIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0EwLCBkU3JjQTEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNBMCwgZFNyY0ExLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi07ICAgICAgICBWTEQxICAgICAgICBxU3JjQjAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQiByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMwYywgZFNyY0EwLCBkU3JjQTEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMwZCwgZFNyY0EwLCBkU3JjQTEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQTAsIGRTcmNBMSwgIzQKLSAgICAgICAgVkFEREwgICAgICAgcVJlczAxLCBkU3JjQTAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMwYywgZFNyYzBkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0IwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEIgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQotOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0MwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEMgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgICAgICAgICAgCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1IDsvLyBUZVJpCi0gICAgICAgIAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0IwLCBkU3JjQjEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNCMCwgZFNyY0IxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMxYywgZFNyY0IwLCBkU3JjQjEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMxZCwgZFNyY0IwLCBkU3JjQjEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQjAsIGRTcmNCMSwgIzQKLSAgICAgICAgVkFEREwgICAgICAgcVJlczIzLCBkU3JjQjAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczAsIGRSZXMwLCBkVGVtcDAgICAgOy8vIFRlUmkKLQotICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMWMsIGRTcmMxZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNDMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBDIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gICAgICAgICAgIAotOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0QwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEQgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgCi0gICAgICAgIAotICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSA7Ly8gVGVSaQotCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjQzAsIGRTcmNDMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0MwLCBkU3JjQzEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyYzJjLCBkU3JjQzAsIGRTcmNDMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyYzJkLCBkU3JjQzAsIGRTcmNDMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNDMCwgZFNyY0MxLCAjNAotICAgICAgICBWQURETCAgICAgICBxUmVzNDUsIGRTcmNDMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRlbXAwICA7Ly8gVGVSaQotICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzJjLCBkU3JjMmQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCi0KLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0QwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEQgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczQsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXM0LCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkgVGVSaQotICAgICAgICAKLQotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0QwLCBkU3JjRDEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNEMCwgZFNyY0QxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMzYywgZFNyY0QwLCBkU3JjRDEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMzZCwgZFNyY0QwLCBkU3JjRDEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjRDAsIGRTcmNEMSwgIzQKLSAgICAgICAgVkFEREwgICAgICAgcVJlczY3LCBkU3JjRDAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczQsIGRSZXM0LCBkVGVtcDAgOy8vIFRlUmkKLQotICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjM2MsIGRTcmMzZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKLSAgICAgICAgVk1MQSAgICAgICAgZFJlczYsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLSAgICAgICAgVk1MUyAgICAgICAgZFJlczYsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2MwLCBxUmVzMDEsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2MyLCBxUmVzMjMsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2M0LCBxUmVzNDUsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2M2LCBxUmVzNjcsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0KLQotICAgIEVORAotICAgIAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE0ZDQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUsIHIxMQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLVRlbXAgICAgICAgICAgICBSTiAxMgotCi07Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycwotZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgotZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgotCi1kU3JjMCAgICAgICAgICAgRE4gNy5VOAotZFNyYzEgICAgICAgICAgIEROIDguVTgKLWRTcmMyICAgICAgICAgICBETiA5LlU4Ci1kU3JjMyAgICAgICAgICAgRE4gMTAuVTgKLWRTcmM0ICAgICAgICAgICBETiAxMS5VOAotZFNyYzUgICAgICAgICAgIEROIDEyLlU4Ci1kU3JjNiAgICAgICAgICAgRE4gMTMuVTgKLWRTcmM3ICAgICAgICAgICBETiAxNC5VOAotZFNyYzggICAgICAgICAgIEROIDE1LlU4Ci0KLXFTdW1CRTAxICAgICAgICBRTiA4LlMxNgotcVN1bUNEMDEgICAgICAgIFFOIDkuUzE2Ci1kU3VtQkUwICAgICAgICAgRE4gMTYuUzE2Ci1kU3VtQ0QwICAgICAgICAgRE4gMTguUzE2Ci0KLXFBY2MwMSAgICAgICAgICBRTiAwLlMxNgotcUFjYzIzICAgICAgICAgIFFOIDEuUzE2Ci1xQWNjNDUgICAgICAgICAgUU4gMi5TMTYKLXFBY2M2NyAgICAgICAgICBRTiAzLlMxNgotCi1kUmVzMCAgICAgICAgICAgRE4gMC5TMTYKLWRSZXMxICAgICAgICAgICBETiAyLlMxNgotZFJlczIgICAgICAgICAgIEROIDQuUzE2Ci1kUmVzMyAgICAgICAgICAgRE4gNi5TMTYKLQotZEFjYzAgICAgICAgICAgIEROIDAuVTgKLWRBY2MxICAgICAgICAgICBETiAyLlU4Ci1kQWNjMiAgICAgICAgICAgRE4gNC5VOAotZEFjYzMgICAgICAgICAgIEROIDYuVTggICAgICAgIAotICAgICAgICAKLQotZFRtcDAgICAgICAgICAgIEROIDIwLlMxNgotZFRtcDEgICAgICAgICAgIEROIDIxLlMxNgotZFRtcDIgICAgICAgICAgIEROIDIyLlMxNgotZFRtcDMgICAgICAgICAgIEROIDIzLlMxNgotCi0KLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzAsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLiBdIAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLiBdCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzUsIFtUZW1wXSwgc3JjU3RlcCAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzIsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFtjMCBjMSBjMiBjMyAuLiBdCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MwMSwgZFNyYzAsIGRTcmM1ICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzMsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmM2LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmM0LCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzcsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQotICAgICAgICBWQURETCAgICAgICBxU3VtQkUwMSwgZFNyYzEsIGRTcmM0ICAgICA7Ly8gYitlCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjMiwgZFNyYzMgICAgIDsvLyBjK2QgICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBkU3JjOCwgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCi0gICAgICAgIFZNTFMgICAgICAgIGRSZXMwLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotOyAgICAgICAgVk1MQSAgICAgICAgZFJlczAsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0gICAgICAgIAotOyAgICAgICAgVkxEMSAgICAgICAgZFNyYzYsIFtUZW1wXSwgc3JjU3RlcAotICAgICAgICBWQURETCAgICAgICBxU3VtQkUwMSwgZFNyYzIsIGRTcmM1ICAgICA7Ly8gYitlCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjMywgZFNyYzQgICAgIDsvLyBjK2QKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzIzLCBkU3JjMSwgZFNyYzYgICAgICAgOy8vIEFjYyA9IGErZgotICAgICAgICBWTUxTICAgICAgICBkUmVzMSwgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpCi07ICAgICAgICBWTUxBICAgICAgICBkUmVzMSwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAxLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLQotOyAgICAgICAgVkxEMSAgICAgICAgZFNyYzcsIFtUZW1wXSwgc3JjU3RlcAotICAgICAgICBWQURETCAgICAgICBxU3VtQkUwMSwgZFNyYzMsIGRTcmM2ICAgICA7Ly8gYitlCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjNCwgZFNyYzUgICAgIDsvLyBjK2QKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzQ1LCBkU3JjMiwgZFNyYzcgICAgICAgOy8vIEFjYyA9IGErZgotICAgICAgICBWTUxTICAgICAgICBkUmVzMiwgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLTsgICAgICAgIFZNTEEgICAgICAgIGRSZXMyLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDIsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotCi07ICAgICAgICBWTEQxICAgICAgICBkU3JjOCwgW1RlbXBdLCBzcmNTdGVwICAgICA7Ly8gW2kwIGkxIGkyIGkzIC4uIF0gICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3VtQkUwMSwgZFNyYzQsIGRTcmM3ICAgICA7Ly8gYitlCi0gICAgICAgIFZBRERMICAgICAgIHFBY2M2NywgZFNyYzMsIGRTcmM4ICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmM1LCBkU3JjNiAgICAgOy8vIGMrZAotICAgICAgICBWTUxTICAgICAgICBkUmVzMywgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZFJlczAsIGRSZXMwLCBkVG1wMAotICAgICAgICBWQUREICAgICAgICBkUmVzMSwgZFJlczEsIGRUbXAxCi0gICAgICAgIFZBREQgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRtcDIKLSAgICAgICAgVk1MQSAgICAgICAgZFJlczMsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1VTCAgICAgICAgZFRtcDMsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVkFERCAgICAgICAgZFJlczMsIGRSZXMzLCBkVG1wMwotCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2MwLCBxQWNjMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzEsIHFBY2MyMywgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMiwgcUFjYzQ1LCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2MzLCBxQWNjNjcsICM1ICAgICAgICAKLQotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0KLSAgICAKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjk1NjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotCi0gICAgSUYgQ29ydGV4QTgKLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8gICAgICAKLSAgICAKLSAgICBEQ0QgICBXaWR0aElzMk1WSXNOb3RaZXJvLCBXaWR0aElzMk1WSXNOb3RaZXJvCi0gICAgRENEICAgV2lkdGhJczRNVklzTm90WmVybywgV2lkdGhJczRNVklzTm90WmVybwotICAgIERDRCAgIFdpZHRoSXM4TVZJc05vdFplcm8KLSAgICAKLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvICAgICAgCi0gICAgCi0gICAgRENEICAgV2lkdGhJczJNVklzWmVybywgV2lkdGhJczJNVklzWmVybwotICAgIERDRCAgIFdpZHRoSXM0TVZJc1plcm8sIFdpZHRoSXM0TVZJc1plcm8KLSAgICBEQ0QgICBXaWR0aElzOE1WSXNaZXJvCi0gICAgCi0gICAgCi07Ly8gaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmMgICAgICAgICAgICAgICAgIFJOIDAKLWlTcmNTdGVwICAgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLWlEc3RTdGVwICAgICAgICAgICAgIFJOIDMKLWlXaWR0aCAgICAgICAgICAgICAgIFJOIDQKLWlIZWlnaHQgICAgICAgICAgICAgIFJOIDUKLWR4ICAgICAgICAgICAgICAgICAgIFJOIDYKLWR5ICAgICAgICAgICAgICAgICAgIFJOIDcKLQotOy8vIGxvY2FsIHZhcmlhYmxlIHJlZ2lzdGVycwotcGMgICAgICAgICAgICAgICAgICAgUk4gMTUKLXJldHVybiAgICAgICAgICAgICAgIFJOIDAKLUVpZ2h0TWludXNkeCAgICAgICAgIFJOIDggCi1FaWdodE1pbnVzZHkgICAgICAgICBSTiA5Ci0KLUFDb2VmZiAgICAgICAgICAgICAgIFJOIDEyCi1CQ29lZmYgICAgICAgICAgICAgICBSTiA5Ci1DQ29lZmYgICAgICAgICAgICAgICBSTiA4Ci1EQ29lZmYgICAgICAgICAgICAgICBSTiA2Ci0KLXBUYWJsZSAgICAgICAgICAgICAgIFJOIDExCi0KLVN0ZXAxICAgICAgICAgICAgICAgIFJOIDEwCi1TcmNTdGVwTWludXMxICAgICAgICBSTiAxNAotCi1kQUNvZWZmICAgICAgICAgICAgICBETiBEMTIuVTgKLWRCQ29lZmYgICAgICAgICAgICAgIEROIEQxMy5VOAotZENDb2VmZiAgICAgICAgICAgICAgRE4gRDE0LlU4Ci1kRENvZWZmICAgICAgICAgICAgICBETiBEMTUuVTgKLQotZFJvdzBhICAgICAgICAgICAgICAgRE4gRDAuVTgKLWRSb3cwYiAgICAgICAgICAgICAgIEROIEQxLlU4Ci1kUm93MWEgICAgICAgICAgICAgICBETiBEMi5VOAotZFJvdzFiICAgICAgICAgICAgICAgRE4gRDMuVTgKLQotcVJvdzBhICAgICAgICAgICAgICAgUU4gUTIuUzE2Ci1xUm93MGIgICAgICAgICAgICAgICBRTiBRMy5TMTYKLQotOy8vZEluZGV4ICAgICAgICAgICAgICAgRE4gICAgRDE2LlU4ICAgICAgICAgICAgICAgICAKLXFSb3cxYSAgICAgICAgICAgICAgIFFOIFExMS5TMTYKLXFSb3cxYiAgICAgICAgICAgICAgIFFOIFExMi5TMTYKLQotZFJvdzJhICAgICAgICAgICAgICAgRE4gRDE2LlU4Ci1kUm93MmIgICAgICAgICAgICAgICBETiBEMTcuVTgKLWRSb3czYSAgICAgICAgICAgICAgIEROIEQxOC5VOAotZFJvdzNiICAgICAgICAgICAgICAgRE4gRDE5LlU4Ci0KLXFPdXRSb3cyICAgICAgICAgICAgIFFOIFExMS5VMTYKLXFPdXRSb3czICAgICAgICAgICAgIFFOIFExMi5VMTYKLWRPdXRSb3cyICAgICAgICAgICAgIEROIEQyMC5VOAotZE91dFJvdzMgICAgICAgICAgICAgRE4gRDIxLlU4Ci1kT3V0Um93MlU2NCAgICAgICAgICBETiBEMjAuVTY0Ci1kT3V0Um93M1U2NCAgICAgICAgICBETiBEMjEuVTY0Ci0KLXFPdXRSb3cwICAgICAgICAgICAgIFFOIFEyLlUxNgotcU91dFJvdzEgICAgICAgICAgICAgUU4gUTMuVTE2Ci1kT3V0Um93MCAgICAgICAgICAgICBETiBEOC5VOAotZE91dFJvdzEgICAgICAgICAgICAgRE4gRDkuVTgKLQotZE91dFJvdzBVNjQgICAgICAgICAgRE4gRDguVTY0Ci1kT3V0Um93MVU2NCAgICAgICAgICBETiBEOS5VNjQKLQotZE91dFJvdzBVMzIgICAgICAgICAgRE4gRDguVTMyCi1kT3V0Um93MVUzMiAgICAgICAgICBETiBEOS5VMzIKLQotZE91dFJvdzBVMTYgICAgICAgICAgRE4gRDguVTE2Ci1kT3V0Um93MVUxNiAgICAgICAgICBETiBEOS5VMTYKLQotCi1kT3V0MFU2NCAgICAgICAgICAgICBETiBEMC5VNjQKLWRPdXQxVTY0ICAgICAgICAgICAgIEROIEQxLlU2NAotCi1kT3V0MDBVMzIgICAgICAgICAgICBETiBEMC5VMzIKLWRPdXQwMVUzMiAgICAgICAgICAgIEROIEQxLlUzMgotZE91dDEwVTMyICAgICAgICAgICAgRE4gRDIuVTMyCi1kT3V0MTFVMzIgICAgICAgICAgICBETiBEMy5VMzIKLQotZE91dDBVMTYgICAgICAgICAgICAgRE4gRDAuVTE2Ci1kT3V0MVUxNiAgICAgICAgICAgICBETiBEMS5VMTYKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9hc20gc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLCByMTEsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBXaWR0aCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgSGVpZ2h0LCAgICAgNAotICAgICAgICBNX0FSRyAgIER4LCAgICAgICAgIDQKLSAgICAgICAgTV9BUkcgICBEeSwgICAgICAgICA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTV9MRFJEICAgZHgsIGR5LCBEeAotICAgICAgICBNX0xEUkQgICBpV2lkdGgsIGlIZWlnaHQsIFdpZHRoCi0gICAgICAgIAotICAgICAgICA7Ly8gRWlnaHRNaW51c2R4ID0gOCAtIGR4Ci0gICAgICAgIDsvLyBFaWdodE1pbnVzZHkgPSA4IC0gZHkKLSAgICAgICAgCi0gICAgICAgIDsvLyBBQ29lZmYgPSBFaWdodE1pbnVzZHggKiBFaWdodE1pbnVzZHkKLSAgICAgICAgOy8vIEJDb2VmZiA9IGR4ICogRWlnaHRNaW51c2R5Ci0gICAgICAgIDsvLyBDQ29lZmYgPSBFaWdodE1pbnVzZHggKiBkeQotICAgICAgICA7Ly8gRENvZWZmID0gZHggKiBkeQotICAgICAgICAKLSAgICAgICAgUlNCICAgICBFaWdodE1pbnVzZHgsIGR4LCAjOCAKLSAgICAgICAgUlNCICAgICBFaWdodE1pbnVzZHksIGR5LCAjOAotICAgICAgICBDTU4gICAgIGR4LGR5Ci0gICAgICAgIE1PViAgICAgU3RlcDEsICMxCi0gICAgICAgIExEUkVRICAgcFRhYmxlLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8KLSAgICAgICAgU1VCICAgICBTcmNTdGVwTWludXMxLCBpU3JjU3RlcCwgU3RlcDEKLSAgICAgICAgTERSTkUgICBwVGFibGUsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybwotICAgICAgICAKLSAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICAgICAgICAgOy8vIDBhCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgIEFDb2VmZiwgRWlnaHRNaW51c2R4LCBFaWdodE1pbnVzZHkKLSAgICAgICAgU01VTEJCICBCQ29lZmYsIGR4LCBFaWdodE1pbnVzZHkKLSAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICAgICAgICAgOy8vIDBiCi0gICAgICAgIFNNVUxCQiAgQ0NvZWZmLCBFaWdodE1pbnVzZHgsIGR5Ci0gICAgICAgIFNNVUxCQiAgRENvZWZmLCBkeCwgZHkKLSAgICAgICAgCi0gICAgICAgIFZEVVAgICAgZEFDb2VmZiwgQUNvZWZmCi0gICAgICAgIFZEVVAgICAgZEJDb2VmZiwgQkNvZWZmCi0gICAgICAgIFZEVVAgICAgZENDb2VmZiwgQ0NvZWZmCi0gICAgICAgIFZEVVAgICAgZERDb2VmZiwgRENvZWZmCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIHBjLCBbcFRhYmxlLCBpV2lkdGgsIExTTCAjMV0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGlXaWR0aAotICAgICAgICAKLTsvLyBQaXhlbCBsYXlvdXQ6Ci07Ly8KLTsvLyAgIHgwMCB4MDEgeDAyCi07Ly8gICB4MTAgeDExIHgxMgotOy8vICAgeDIwIHgyMSB4MjIKLQotOy8vIElmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApCi1XaWR0aElzOE1WSXNOb3RaZXJvCi0KLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDFhCi0gICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAxYgotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MmEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMmEKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzJiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDJiCi0gICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cxYSwgZFJvdzJhLCBkQUNvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3czYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAzYQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3cyYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MWIsIGRSb3czYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93M2IsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gM2IKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MmEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDBhCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzNiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzNhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAwYgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3cwYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cyYiwgZERDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3czYiwgZERDb2VmZgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3cwYiwgZERDb2VmZgotCi0gICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2Ci0gICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2Ci0gICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MiwgcU91dFJvdzIsICM2Ci0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTY0LCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MywgcU91dFJvdzMsICM2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTY0LCBbcERzdF0sIGlEc3RTdGVwICAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzJVNjQsIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzNVNjQsIFtwRHN0XSwgaURzdFN0ZXAgIAotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzOE1WSXNOb3RaZXJvCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgICAgIE1fRVhJVAotCi1XaWR0aElzNE1WSXNOb3RaZXJvCi0KLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxCi0gICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCi0gICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQotICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYiwgZERDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcCAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzNE1WSXNOb3RaZXJvCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgICAgIE1fRVhJVAotCi1XaWR0aElzMk1WSXNOb3RaZXJvCi0KLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxCi0gICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCi0gICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQotICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYiwgZERDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcCAgCi0KLSAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXMyTVZJc05vdFplcm8gCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLTsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgKDAsIDApCi1XaWR0aElzOE1WSXNaZXJvCi0gICAgICAgICAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBpU3JjU3RlcAotCi1XaWR0aElzOExvb3BNVklzWmVybwotICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCi0gICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MFU2NCwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDFVNjQsIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM4TG9vcE1WSXNaZXJvCi0KLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FWElUCi0KLVdpZHRoSXM0TVZJc1plcm8gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MDBVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDAxVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzNE1WSXNaZXJvIAotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQKLSAgICAgICAgICAgICAgICAKLVdpZHRoSXMyTVZJc1plcm8gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MFUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCi0gICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MVUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczJNVklzWmVybyAKLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBNX0VORAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBFTkQKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9hc20gZW5kcwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZDMzYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIHF1YW50aXphdGlvbiB0YWJsZXMKLTsvLyAKLTsvLyAKLQotICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZSAgCi0gICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KSB2YWx1ZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKLSAgICAgICAgIERDQiAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2Ci0gICAgICAgICBEQ0IgMTcsIDE3LCAxNywgMTcsIDE3LCAxNwotICAgICAgICAgRENCIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKLSAgICAgICAgIERDQiAxOSwgMTksIDE5LCAxOSwgMTksIDE5Ci0gICAgICAgICBEQ0IgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAotICAgICAgICAgRENCIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKLSAgICAgICAgIERDQiAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCi0gICAgICAgICBEQ0IgMjMsIDIzLCAyMywgMjMsIDIzLCAyMwotICAgICAgICAgRENCIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlLCAyCi0gICAgICAgICBEQ0QgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQotICAgICAgICAgRENEIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKLSAgICAgICAgIERDRCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCi0gICAgICAgICBEQ0QgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgotICAgICAgICAgRENEIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKLSAgICAgICAgIERDRCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCi0gICAgICAgICBEQ0QgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQotICAgICAgICAgRENEIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKLSAgICAgICAgIERDRCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1ICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEVORAotICAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxNmU0OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotOy8vIAotOy8vIAotCi0gICAgICAgIAotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAgCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotCi0KLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIAotICAgIAotCi0KLQotCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQ29ydGV4QTgKLQotOy8vIEFSTSBSZWdpc3RlcnMKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcERzdCAgICAgICAgICAgICAgICBSTiAgMAotcFNyYyAgICAgICAgICAgICAgICBSTiAgMQotCi0KLTsvLyBOZW9uIFJlZ2lzdGVycwotICAgICAgCi07Ly8gUGFja2VkIElucHV0IHBpeGVscwotZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2ICAgICAgIAotZEluMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2ICAgICAgIAotZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2ICAgICAgIAotZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zICAgICAgIAotZFplcm8gICAgICAgICAgICAgICBETiAgRDQuUzE2Ci1kZTAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKLWRlMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgotZGUyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kZTMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKLWRJbjFSUyAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZEluM1JTICAgICAgICAgICAgICBETiAgRDguUzE2Ci1kZjAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKLWRmMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZGYyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kZjMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLXFmMDEgICAgICAgICAgICAgICAgUU4gIFEwLjMyCi1xZjIzICAgICAgICAgICAgICAgIFFOICBRMS4zMgotZGcwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2Ci1kZzEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKLWRnMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZGczICAgICAgICAgICAgICAgICBETiAgRDguUzE2Ci1kZjFSUyAgICAgICAgICAgICAgIEROICBENy5TMTYKLWRmM1JTICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotCi07Ly8gT3V0cHV0IHBpeGVscwotZGgwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kaDEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRoMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZGgzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci0KLSAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LCAsZDgKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgotICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscyBpbiB0cmFuc3Bvc2VkIGZvcm0KLSAgICAgICAgCi0gICAgICAgIFZMRDQgICAge2RJbjAsZEluMSxkSW4yLGRJbjN9LFtwU3JjXQotICAgICAgICAKLSAgICAgICAgVk1PViAgICBkWmVybywjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRlMCxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAotICAgICAgICBWU1VCICAgICAgICBkZTEsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCi0gICAgICAgIFZIQUREICAgICAgIGRJbjFSUyxkSW4xLGRaZXJvICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBWSEFERCAgICAgICBkSW4zUlMsZEluMyxkWmVybwotICAgICAgICBWU1VCICAgICAgICBkZTIsZEluMVJTLGRJbjMgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAotICAgICAgICBWQUREICAgICAgICBkZTMsZEluMSxkSW4zUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAotICAgICAgICBWQUREICAgICAgICBkZjAsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMwotICAgICAgICBWQUREICAgICAgICBkZjEsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgotICAgICAgICBWU1VCICAgICAgICBkZjIsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgotICAgICAgICBWU1VCICAgICAgICBkZjMsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZUUk4gICAgZGYwLGRmMQotICAgICAgICBWVFJOICAgIGRmMixkZjMKLSAgICAgICAgVlRSTiAgICBxZjAxLHFmMjMgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRnMCxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAotICAgICAgICBWU1VCICAgICAgICBkZzEsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKLSAgICAgICAgVkhBREQgICAgICAgZGYxUlMsZGYxLGRaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFZIQUREICAgICAgIGRmM1JTLGRmMyxkWmVybwotICAgICAgICBWU1VCICAgICAgICBkZzIsZGYxUlMsZGYzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAotICAgICAgICBWQUREICAgICAgICBkZzMsZGYxLGRmM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKLSAgICAgICAgVkFERCAgICAgICAgZGgwLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKLSAgICAgICAgVkFERCAgICAgICAgZGgxLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGgyLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGgzLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKLSAgICAgICAgCi0gICAgICAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBmaW5hbCB2YWx1ZSAoY29sT3BbaV1bal0gKyAzMik+PjYKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlJTSFIgICAgICAgZGgwLCM2Ci0gICAgICAgIFZSU0hSICAgICAgIGRoMSwjNgotICAgICAgICBWUlNIUiAgICAgICBkaDIsIzYKLSAgICAgICAgVlJTSFIgICAgICAgZGgzLCM2Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlNUMSAgIHtkaDAsZGgxLGRoMixkaDN9LFtwRHN0XQotICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAKLUVuZCAgICAgICAgICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NvcnRleEE4ICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjRjN2Q1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gSW5wdXQgQXJndW1lbnRzIGFuZCB0aGVpciBzY29wZS91c2FnZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBwU3JjICAgICAgICAgICBSTiAwICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCi1wRHN0ICAgICAgICAgICAgUk4gMSAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFZhcmlhYmxlcyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjICAgICAgICAgICAgUk4gMiAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZXMKLUZsYWcgICAgICAgICAgICBSTiAzICAgIAotVmFsdWUgICAgICAgICAgIFJOIDQgICAgCi1WYWx1ZTIgICAgICAgICAgUk4gNSAgICAKLXN0ck9mZnNldCAgICAgICBSTiA2ICAgIAotY3N0T2Zmc2V0ICAgICAgIFJOIDcgICAgCi0KLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCwgcjcKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYwotICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIFZhbHVlLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKLSAgICAgICAgTU9WICAgICAgVmFsdWUyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+Ci0gICAgICAgIAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjOF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0XSAgPSBwRHN0WzVdICA9IHBEc3RbNl0gID0gcERzdFs3XSAgPSAwCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzE2XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbOF0gID0gcERzdFs5XSAgPSBwRHN0WzEwXSA9IHBEc3RbMTFdID0gMAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMyNF0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyXSA9IHBEc3RbMTNdID0gcERzdFsxNF0gPSBwRHN0WzE1XSA9IDAKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIFRoZSBsb29wIGJlbG93IHBhcnNlcyBhbmQgdW5wYWNrcyB0aGUgaW5wdXQgc3RyZWFtLiBUaGUgQy1tb2RlbCBoYXMgCi0gICAgICAgIDsvLyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIGxvZ2ljIGZvciBzaWduIGV4dGVuc2lvbi4gIEJ1dCBpbiB0aGUgdjYgdmVyc2lvbiwKLSAgICAgICAgOy8vIHRoYXQgY2FuIGJlIGVhc2lseSB0YWtlbiBjYXJlIGJ5IGxvYWRpbmcgdGhlIGRhdGEgZnJvbSA8cFNyYz4gc3RyZWFtIGFzIAotICAgICAgICA7Ly8gU0lHTkVEIGJ5dGUvaGFsZndvcmQuIFNvLCBiYXNlZCBvbiB0aGUgZmlyc3QgVFNUIGluc3RydWN0aW9uLCA4LWJpdHMgb3IgCi0gICAgICAgIDsvLyAxNi1iaXRzIGFyZSByZWFkLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE5leHQsIHRvIGNvbXB1dGUgdGhlIG9mZnNldCwgd2hlcmUgdGhlIHVucGFja2VkIHZhbHVlIG5lZWRzIHRvIGJlIHN0b3JlZCwKLSAgICAgICAgOy8vIHdlIG1vZGlmeSB0aGUgY29tcHV0YXRpb24gdG8gcGVyZm9ybSBbKEZsYWcgJiAxNSkgPCAxXSBhcyBbKEZsYWcgPCAxKSAmIDMxXQotICAgICAgICA7Ly8gVGhpcyByZXN1bHRzIGluIGEgc2F2aW5nIG9mIG9uZSBjeWNsZS4KLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLXVucGFja0xvb3AKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCi0gICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzICAgCi0gICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOwotICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKwotICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKwotICAgICAgICAKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCi0gICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgotICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KLSAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKLSAgICAgICAgCi0gICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICAKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2NDQ4ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW50cmEgY2hyb21hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSBtYWNyb2Jsb2NrICgxNngxNikuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KLSAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIFN0ZXAgb2YgdGhlIGFycmF5cwotICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsICB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcFRocmVzaG9sZHMJCUFBcnJheSBvZiBzaXplICA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCi0gKiBbaW5dCXBCUwkJCQlhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KLSAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2sKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcywgb3IgcEJTIGlzIE5VTEwuCi0gKiAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCi0gKiAgIC0gZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuCi0gKiAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCi0gKiAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JKAotCU9NWF9VOCogcFNyY0RzdCwgCi0JT01YX1MzMiBzcmNkc3RTdGVwLCAKLQljb25zdCBPTVhfVTgqIHBBbHBoYSwgCi0JY29uc3QgT01YX1U4KiBwQmV0YSwgCi0JY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKQotewotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKLQotICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCi0gICAgCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzgsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODliZTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgbHVtYSBkZWJsb2NrCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotIAotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrCi0gKigxNngxNikuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KLSAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIGltYWdlIHdpZHRoCi0gKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwVGhyZXNob2xkcwkJcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyB2YWx1ZXMgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcikKLSAqIFtpbl0JcEJTCQkJCSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KLSAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzIG9yIHBCUyBpcyBOVUxMLgotICogICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KLSAqICAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4Ci0gKiAgICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgotLgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JKAotCU9NWF9VOCogcFNyY0RzdCwgCi0JT01YX1MzMiBzcmNkc3RTdGVwLCAKLQljb25zdCBPTVhfVTgqIHBBbHBoYSwgCi0JY29uc3QgT01YX1U4KiBwQmV0YSwgCi0JY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywgCi0JY29uc3QgT01YX1U4ICpwQlMKLSkKLXsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKLQotICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCi0gICAgCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKLQotICAgIHJldHVybiBlcnJvckNvZGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwZjM0OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciAyeDIgYmxvY2sgb2YgCi0gKiBDaHJvbWFEQ0xldmVsLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAotICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyByYXN0ZXIgc2NhbiBvcmRlciwgbmFtZWx5IHBvc2l0aW9uIG9yZGVyLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtCi0gKgkJCQkJCQkJYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICoJCQkJCQkJCXBvaW50ZWQgdG8gYnkgKnBwQml0U3RyZWFtCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzCi0gKgkJCQkJCQkJaW4gdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKiBwcFBvc0NvZWZidWYgICAgICAgIAotICkKLQotewotICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIDE3LCA0KTsKLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3OGI0Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gCi0gKiBJbnZlcnNlIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCAKLSAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgemlnemFnIG9yZGVyIGluc3RlYWQgCi0gKiBvZiBwb3NpdGlvbiBvcmRlci4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jawotICogW2luXQlzVkxDU2VsZWN0CQlWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gbnVtYmVyIG9mIG5vbi16ZXJvCi0gKgkJCQkJCQkJQUMgY29lZmZpY2llbnRzIG9mIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuIEl0IGlzIAotICoJCQkJCQkJCWVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCAKLSAqCQkJCQkJCQl0YWJsZSA5LTUsIGV4Y2VwdCBpdHMgdmFsdWUgY2Fuoa90IGJlIGxlc3MgdGhhbiB6ZXJvLgotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKQotewotICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIHNWTENTZWxlY3QsIHNNYXhOdW1Db2VmZik7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4Nzk4Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi07Ly8gCi07Ly8gCi0KLSAgICAgICAgCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZSAKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAgCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotCi0KLTsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLQotCi0KLQotCi07Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKLSAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICAKLSAgICAKLTsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAotICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBDb3J0ZXhBOAotICAgIAotCi07Ly8gQVJNIFJlZ2lzdGVycwotCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBwU3JjICAgICAgIFJOICAwCi1wUHJlZCAgICAgICBSTiAgMQotcERDICAgICAgICAgUk4gIDIKLXBEc3QgICAgICAgIFJOICAzCi0gICAKLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotcmVzdWx0ICAgICAgUk4gIDAKLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLQotOy8vUmVnaXN0ZXJzIHVzZWQgaW4gYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0Ci1wUVBkaXYgICAgICBSTiAgMTAKLXBRUG1vZCAgICAgIFJOICAxMQotcFZSb3cgICAgICAgUk4gIDIKLVFQbW9kICAgICAgIFJOICAxMgotc2hpZnQgICAgICAgUk4gIDE0Ci1pbmRleDAgICAgICBSTiAgMSAKLWluZGV4MSAgICAgIFJOICAxMCAKLQotOy8vUmVnaXN0ZXJzIHVzZWQgaW4gRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKLXBEZWx0YSAgICAgIFJOICA0Ci1wRGVsdGFUbXAgICBSTiAgNgotQUMgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCi1wUHJlZFRlbXAgICBSTiAgNwotcERDVGVtcCAgICAgUk4gIDgKLXBEc3RUZW1wICAgIFJOICA5Ci1wRGVsdGFBcmcxICBSTiAgMQotcERlbHRhQXJnMCAgUk4gIDAKLVFQICAgICAgICAgIFJOICAxICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjawotREN2YWwgICAgICAgUk4gIDEwICAKLXByZWRzdGVwICAgIFJOICAxCi1kc3RTdGVwICAgICBSTiAgMTAKLVByZWRWYWwxICAgIFJOICAzCi1QcmVkVmFsMiAgICBSTiAgNQotCi0KLQotCi07Ly8gTmVvbiBSZWdpc3RlcnMKLQotOy8vIFJlZ2lzdGVycyB1c2VkIGluIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotCi1kVm1hdHJpeCAgICAgICAgICAgIEROICBENi44ICAKLWRpbmRleFJvdzAgICAgICAgICAgRE4gIEQ3LjMyIAotZGluZGV4Um93MSAgICAgICAgICBETiAgRDkuMzIgCi1kQnl0ZUluZGV4Um93MCAgICAgIEROICBENy44Ci1kQnl0ZUluZGV4Um93MSAgICAgIEROICBEOS44Ci1kVlJvdzAgICAgICAgICAgICAgIEROICBEOC44ICAKLWRWUm93MSAgICAgICAgICAgICAgRE4gIEQ0LjgKLWRWUm93MFUxNiAgICAgICAgICAgRE4gIEQ4LlUxNgotZFZSb3cxVTE2ICAgICAgICAgICBETiAgRDQuVTE2Ci1kVlJvdzJVMTYgICAgICAgICAgIEROICBEOC5VMTYKLWRWUm93M1UxNiAgICAgICAgICAgRE4gIEQ0LlUxNgotCi1kU2hpZnQgICAgICAgICAgICAgIEROICBENS5VMTYKLWRTcmNSb3cwICAgICAgICAgICAgRE4gIEQwLkkxNgotZFNyY1JvdzEgICAgICAgICAgICBETiAgRDEuSTE2Ci1kU3JjUm93MiAgICAgICAgICAgIEROICBEMi5JMTYgICAgCi1kU3JjUm93MyAgICAgICAgICAgIEROICBEMy5JMTYKLWREcW50Um93MCAgICAgICAgICAgRE4gIEQwLkkxNiAgCi1kRHFudFJvdzEgICAgICAgICAgIEROICBEMS5JMTYgCi1kRHFudFJvdzIgICAgICAgICAgIEROICBEMi5JMTYgCi1kRHFudFJvdzMgICAgICAgICAgIEROICBEMy5JMTYgIAotCi07Ly8gUmVnaXN0ZXJzIHVzZWQgaW4gVHJhbnNmb3JtUmVzaWR1YWw0eDQKLQotOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKLWRJbjAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNiAgICAgICAKLWRJbjEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNiAgICAgICAKLWRJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNiAgICAgICAKLWRJbjMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotcUluMDEgICAgICAgICAgICAgICBRTiAgUTAuMzIKLXFJbjIzICAgICAgICAgICAgICAgUU4gIFExLjMyCi0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zICAgICAgIAotZFplcm8gICAgICAgICAgICAgICBETiAgRDQuUzE2Ci1kZTAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKLWRlMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgotZGUyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kZTMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKLWRJbjFSUyAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZEluM1JTICAgICAgICAgICAgICBETiAgRDguUzE2Ci1kZjAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKLWRmMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZGYyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kZjMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLXFmMDEgICAgICAgICAgICAgICAgUU4gIFEwLjMyCi1xZjIzICAgICAgICAgICAgICAgIFFOICBRMS4zMgotZGcwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2Ci1kZzEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKLWRnMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZGczICAgICAgICAgICAgICAgICBETiAgRDguUzE2Ci1kZjFSUyAgICAgICAgICAgICAgIEROICBENy5TMTYKLWRmM1JTICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotCi07Ly8gT3V0cHV0IHBpeGVscwotZGgwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kaDEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRoMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZGgzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2IAotCi07Ly8gUmVnaXN0ZXJzIHVzZWQgaW4gRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKLQotZERlbHRhUm93MCAgICAgICAgICBETiAgRDAuUzE2Ci1kRGVsdGFSb3cxICAgICAgICAgIEROICBEMS5TMTYKLWREZWx0YVJvdzIgICAgICAgICAgRE4gIEQyLlMxNgotZERlbHRhUm93MyAgICAgICAgICBETiAgRDMuUzE2Ci1xRGVsdGFSb3cwMSAgICAgICAgIFFOICBRMC5TMTYKLXFEZWx0YVJvdzIzICAgICAgICAgUU4gIFExLlMxNgotCi1kUHJlZFZhbFJvdzAxICAgICAgIEROICBENC5VOAotZFByZWRWYWxSb3cyMyAgICAgICBETiAgRDUuVTgKLQotcVN1bVJvdzAxICAgICAgICAgICBRTiAgUTMuUzE2Ci1xU3VtUm93MjMgICAgICAgICAgIFFOICBRNC5TMTYKLWREc3RSb3cwMSAgICAgICAgICAgRE4gIEQwLlU4Ci1kRHN0Um93MjMgICAgICAgICAgIEROICBEMS5VOAotZERzdFJvdzAgICAgICAgICAgICBETiAgRDAuMzJbMF0KLWREc3RSb3cxICAgICAgICAgICAgRE4gIEQwLjMyWzFdCi1kRHN0Um93MiAgICAgICAgICAgIEROICBEMS4zMlswXQotZERzdFJvdzMgICAgICAgICAgICBETiAgRDEuMzJbMV0KLSAgICAKLSAgICAgICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgTV9BTExPQzggcEJ1ZmZlciwgMzIKLSAgICAgICAgICAgICAgIAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQscjExLGQ5Ci0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHByZWRTdGVwT25TdGFjaywgNAotICAgICAgICBNX0FSRyAgIGRzdFN0ZXBPblN0YWNrLDQKLSAgICAgICAgTV9BUkcgICBRUE9uU3RhY2ssIDQKLSAgICAgICAgTV9BUkcgICBBQ09uU3RhY2ssNAotICAKLSAgICAgICAgCi0gICAgICAgIE1fQURSICAgcERlbHRhLHBCdWZmZXIgCi0gICAgICAgIE1fTERSICAgQUMsQUNPblN0YWNrIAotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgcjEscjIscjMgYmVmb3JlIGZ1bmN0aW9uIGNhbGwgICAgCi0gICAgICAgIE1PViAgICAgcFByZWRUZW1wLHBQcmVkCi0gICAgICAgIE1PViAgICAgcERDVGVtcCxwREMKLSAgICAgICAgTU9WICAgICBwRHN0VGVtcCxwRHN0Ci0gICAgICAgIAotICAgICAgICBDTVAgICAgIEFDLCMwCi0gICAgICAgIEJFUSAgICAgRENjYXNlCi0gICAgICAgIE1PViAgICAgcERlbHRhQXJnMSxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0IDogc3RhdGljIGZ1bmN0aW9uIGlubGluZWQKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvL0JMICAgICAgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0Ci0gICAgICAgIE1fTERSICAgUVAsUVBPblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgIHBRUG1vZCw9YXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgIExEUiAgICBwUVBkaXYsPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICAgICAgCi0gICAgICAgIExEUiAgICBwVlJvdyw9YXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSU0IgIFFQbW9kLFtwUVBtb2QsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gKFFQJTYpICogNgotICAgICAgICBMRFJTQiAgc2hpZnQsW3BRUGRpdixRUF0gICAgICAgICAgICAgICAgICAgIDsvLyBTaGlmdCA9IFFQIC8gNgotICAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgaW5kZXgxLD0weDAzMDIwNTA0IAotICAgICAgICBMRFIgICAgaW5kZXgwLD0weDA1MDQwMTAwICAgICAgICAgICAgICAgICAgIDsvLyBJbmRleGVzIGludG8gZFZtYXRyaXgKLSAgICAgICAgQUREICAgIHBWUm93LHBWUm93LFFQbW9kCi0gICAgICAgIFZEVVAgICBkaW5kZXhSb3cwLGluZGV4MCAKLSAgICAgICAgVkRVUCAgIGRpbmRleFJvdzEsaW5kZXgxCi0gICAgICAgIFZEVVAgICBkU2hpZnQsc2hpZnQgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhbGwgNHg0IHBWUm93W10gdmFsdWVzCi0gICAgICAgIFZMRDEgICBkVm1hdHJpeCxbcFZSb3ddICAgICAgICAgICAgICAgICAgICAgOy8vIGRWbWF0cml4ID0gWzBkfDBjfDBifDBhXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZUQkwgICBkVlJvdzAsZFZtYXRyaXgsZEJ5dGVJbmRleFJvdzAgICAgICAgOy8vIHJvdzAgPSByb3cyID0gW3BWUm93WzJdIHwgcFZSb3dbMF0gfCBwVlJvd1syXSB8IHBWUm93WzBdXQotICAgICAgICBWVEJMICAgZFZSb3cxLGRWbWF0cml4LGRCeXRlSW5kZXhSb3cxICAgICAgIDsvLyByb3cxID0gcm93MyA9IFtwVlJvd1sxXSB8IHBWUm93WzJdIHwgcFZSb3dbMV0gfCBwVlJvd1syXV0KLSAgICAgICAgQ01QICAgICBwRENUZW1wLCMwCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0ICdzcmMnIHZhbHVlcyAgCi0gICAgICAgIFZMRDEgICB7IGRTcmNSb3cwLGRTcmNSb3cxLGRTcmNSb3cyLGRTcmNSb3czIH0sW3BEZWx0YV0gCi0gICAgICAgIAotICAgICAgICBWU0hMICAgZFZSb3cwVTE2LGRWUm93MFUxNixkU2hpZnQgCi0gICAgICAgIFZTSEwgICBkVlJvdzFVMTYsZFZSb3cxVTE2LGRTaGlmdCAKLSAgICAgICAgTERSU0hORSBEQ3ZhbCxbcERDVGVtcF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTXVsdGlwbHkgc3JjW10gd2l0aCBwVlJvd1tdCi0gICAgICAgIFZNVUwgICAgZERxbnRSb3cwLGRTcmNSb3cwLGRWUm93MFUxNgotICAgICAgICBWTVVMICAgIGREcW50Um93MSxkU3JjUm93MSxkVlJvdzFVMTYKLSAgICAgICAgVk1VTCAgICBkRHFudFJvdzIsZFNyY1JvdzIsZFZSb3cyVTE2Ci0gICAgICAgIFZNVUwgICAgZERxbnRSb3czLGRTcmNSb3czLGRWUm93M1UxNgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBUcmFuc2Zvcm1SZXNpZHVhbDR4NCA6IElubGluZWQgdG8gYXZvaWQgTG9hZC9TdG9yZXMKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvL0JMICAgICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAotICAgICAgICA7Ly9TVFJITkUgIERDdmFsLFtwRGVsdGFdCi0gICAgICAgIFZNT1ZORSAgICBkSW4wWzBdLERDdmFsCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIGlucHV0IHBpeGVscyA6IHBlcmZvcm0gUm93IG9wcyBhcyBDb2wgb3BzCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWVFJOICAgIGRJbjAsZEluMQotICAgICAgICBWVFJOICAgIGRJbjIsZEluMwotICAgICAgICBWVFJOICAgIHFJbjAxLHFJbjIzIAotICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTU9WICAgIGRaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gcmlnaHQgc2hpZnQgYnkgMSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRlMCxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAotICAgICAgICBWU1VCICAgICAgICBkZTEsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCi0gICAgICAgIFZIQUREICAgICAgIGRJbjFSUyxkSW4xLGRaZXJvICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBWSEFERCAgICAgICBkSW4zUlMsZEluMyxkWmVybwotICAgICAgICBWU1VCICAgICAgICBkZTIsZEluMVJTLGRJbjMgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAotICAgICAgICBWQUREICAgICAgICBkZTMsZEluMSxkSW4zUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAotICAgICAgICBWQUREICAgICAgICBkZjAsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMwotICAgICAgICBWQUREICAgICAgICBkZjEsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgotICAgICAgICBWU1VCICAgICAgICBkZjIsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgotICAgICAgICBWU1VCICAgICAgICBkZjMsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4Ci0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWVFJOICAgIGRmMCxkZjEKLSAgICAgICAgVlRSTiAgICBkZjIsZGYzCi0gICAgICAgIFZUUk4gICAgcWYwMSxxZjIzIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZGcwLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCi0gICAgICAgIFZTVUIgICAgICAgIGRnMSxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAotICAgICAgICBWSEFERCAgICAgICBkZjFSUyxkZjEsZFplcm8gICAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgVkhBREQgICAgICAgZGYzUlMsZGYzLGRaZXJvCi0gICAgICAgIFZTVUIgICAgICAgIGRnMixkZjFSUyxkZjMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCi0gICAgICAgIFZBREQgICAgICAgIGRnMyxkZjEsZGYzUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAotICAgICAgICBWQUREICAgICAgICBkaDAsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMwotICAgICAgICBWQUREICAgICAgICBkaDEsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgotICAgICAgICBWU1VCICAgICAgICBkaDIsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgotICAgICAgICBWU1VCICAgICAgICBkaDMsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMwotICAgICAgICAKLSAgICAgICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42Ci0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlJTSFIgICAgICAgZGgwLCM2Ci0gICAgICAgIFZSU0hSICAgICAgIGRoMSwjNgotICAgICAgICBWUlNIUiAgICAgICBkaDIsIzYKLSAgICAgICAgVlJTSFIgICAgICAgZGgzLCM2Ci0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIEIgICAgICAgT3V0RENjYXNlIAotICAgICAgICAKLQotRENjYXNlCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgdGhlIFRyYW5zZm9ybWVkIERDdmFsdWUgOiAoREN2YWwrMzIpPj42Ci0gICAgICAgIExEUlNIICAgREN2YWwsW3BEQ1RlbXBdIAotICAgICAgICBBREQgICAgIERDdmFsLERDdmFsLCMzMiAKLSAgICAgICAgQVNSICAgICBEQ3ZhbCxEQ3ZhbCwjNgotICAgICAgICAKLSAgICAgICAgVkRVUCAgICBkRGVsdGFSb3cwLCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVswXSAgPSBwRGVsdGFbMV0gID0gcERlbHRhWzJdICA9IHBEZWx0YVszXSA9IERDdmFsCi0gICAgICAgIFZEVVAgICAgZERlbHRhUm93MSwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzRdICA9IHBEZWx0YVs1XSAgPSBwRGVsdGFbNl0gID0gcERlbHRhWzddID0gREN2YWwKLSAgICAgICAgVkRVUCAgICBkRGVsdGFSb3cyLCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbOF0gID0gcERlbHRhWzldICA9IHBEZWx0YVsxMF0gPSBwRGVsdGFbMTFdID0gREN2YWwKLSAgICAgICAgVkRVUCAgICBkRGVsdGFSb3czLCBEQ3ZhbAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi1PdXREQ2Nhc2UgICAgICAKLSAgICAgICAgTV9MRFIgICBwcmVkc3RlcCxwcmVkU3RlcE9uU3RhY2sKLSAgICAgICAgTV9MRFIgICBkc3RTdGVwLGRzdFN0ZXBPblN0YWNrCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIFByZWRWYWwxLFtwUHJlZFRlbXBdLHByZWRzdGVwCi0gICAgICAgIExEUiAgICAgUHJlZFZhbDIsW3BQcmVkVGVtcF0scHJlZHN0ZXAKLSAgICAgICAgVk1PViAgICBkUHJlZFZhbFJvdzAxLFByZWRWYWwxLFByZWRWYWwyCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIFByZWRWYWwxLFtwUHJlZFRlbXBdLHByZWRzdGVwCi0gICAgICAgIExEUiAgICAgUHJlZFZhbDIsW3BQcmVkVGVtcF0KLSAgICAgICAgVk1PViAgICBkUHJlZFZhbFJvdzIzLFByZWRWYWwxLFByZWRWYWwyCi0gCi0gICAgICAgIAotICAgICAgICBWQUREVyAgIHFTdW1Sb3cwMSxxRGVsdGFSb3cwMSxkUHJlZFZhbFJvdzAxCi0gICAgICAgIFZBRERXICAgcVN1bVJvdzIzLHFEZWx0YVJvdzIzLGRQcmVkVmFsUm93MjMKLSAgICAgICAgVlFNT1ZVTiBkRHN0Um93MDEscVN1bVJvdzAxCi0gICAgICAgIFZRTU9WVU4gZERzdFJvdzIzLHFTdW1Sb3cyMwotICAgICAgICAKLSAKLSAgICAgICAgVlNUMSAgICBkRHN0Um93MCxbcERzdFRlbXBdLGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICBkRHN0Um93MSxbcERzdFRlbXBdLGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICBkRHN0Um93MixbcERzdFRlbXBdLGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICBkRHN0Um93MyxbcERzdFRlbXBdCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VycgotICAgICAgICAKLUVuZCAgICAgICAgICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NPUlRFWEE4ICAgCi0gICAgCi0gICAgICAgICAKLSAgICAgICAgICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTlkY2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICAgIElGIENvcnRleEE4Ci0KLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLSAgICAgICAgCi1MT09QX0NPVU5UICBFUVUgMHg0MDAwMDAwMAotTUFTS18zICAgICAgRVFVIDB4MDMwMzAzMDMKLU1BU0tfNCAgICAgIEVRVSAweDA0MDQwNDA0Ci0KLTsvLyBGdW5jdGlvbiBhcmd1bWVudHMKLQotcFNyY0RzdCAgICAgUk4gMAotc3JjZHN0U3RlcCAgUk4gMQotcEFscGhhICAgICAgUk4gMgotcEJldGEgICAgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiA1Ci1wQlMgICAgICAgICBSTiA0Ci1iUzMyMTAgICAgICBSTiA2Ci0KLTsvLyBMb29wIAotCi1YWSAgICAgICAgICBSTiA3Ci0KLTsvLyBQaXhlbHMKLWRQXzAgICAgICAgIEROIEQ0LlU4Ci1kUF8xICAgICAgICBETiBENS5VOCAgCi1kUF8yICAgICAgICBETiBENi5VOCAgCi1kUV8wICAgICAgICBETiBEOC5VOCAgCi1kUV8xICAgICAgICBETiBEOS5VOCAgCi1kUV8yICAgICAgICBETiBEMTAuVTggCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci1kQmV0YSAgICAgICBETiBEMi5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLWRBcDFwMCAgICAgIEROIEQxMi5VOAotZEFxMXEwICAgICAgRE4gRDE4LlU4Ci1kQXAycDAgICAgICBETiBEMTkuVTgKLWRBcTJxMCAgICAgIEROIEQxNy5VOAotCi1xQlMzMjEwICAgICBRTiBRMTMuVTE2Ci1kQlMzMjEwICAgICBETiBEMjYKLWRNYXNrX2JzICAgIEROIEQyNwotZEZpbHRfYnMgICAgRE4gRDI2LlUxNgotCi07Ly8gYlNMVDQKLWRNYXNrXzAgICAgIEROIEQxNC5VOAotZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAotZE1hc2tfNCAgICAgRE4gRDEuVTE2Ci0KLU1hc2tfNCAgICAgIFJOIDgKLU1hc2tfMyAgICAgIFJOIDkKLQotZFRlbXAgICAgICAgRE4gRDE5LlU4Ci0KLTsvLyBSZXN1bHQKLWRQXzB0ICAgICAgIEROIEQxMy5VOCAgIAotZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgCi0KLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci0KLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCByOSwgZDE1Ci0gICAgICAgIAotICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCUywgNAotICAgICAgICAKLSAgICAgICAgOy8vIGQwLWRBbHBoYV8wCi0gICAgICAgIDsvLyBkMi1kQmV0YV8wCi0KLSAgICAgICAgO2xvYWQgYWxwaGExLGJldGExIHNvbWV3aGVyZSB0byBhdm9pZCBtb3JlIGxvYWRzCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdIQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzEgOz8KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0hIAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCi0KLSAgICAgICAgTERSICAgICAgICAgTWFza18zLCA9TUFTS18zCi0gICAgICAgIExEUiAgICAgICAgIE1hc2tfNCwgPU1BU0tfNAotCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAotICAgICAgICBWTU9WICAgICAgICBkTWFza180LCAjNCAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBYWSwgPUxPT1BfQ09VTlQKLQotICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNwotICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKLUxvb3BZICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgYlMzMjEwLCBbcEJTXSwgIzgKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIGRQXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICA7MQotICAgICAgICBWTEQxICAgICAgICBkUF8xLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQ01QICAgICAgICAgYlMzMjEwLCAjMAotICAgICAgICBWTEQxICAgICAgICBkUF8wLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgOzEKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMCwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAotICAgICAgICBWTEQxICAgICAgICBkUV8xLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAotCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAotICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKLQotICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKLSAgICAgICAgVk1PVi5VMzIgICAgZEJTMzIxMFswXSwgYlMzMjEwCi0gICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKLSAgICAgICAgVk1PVkwgICAgICAgcUJTMzIxMCwgZEJTMzIxMC5VOAotICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKLSAgICAgICAgVkNHVCAgICAgICAgZE1hc2tfYnMuUzE2LCBkQlMzMjEwLlMxNiwgIzAKLQotICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAgCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAotICAgICAgICAKLSAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRNYXNrX2JzLlU4Ci0KLSAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzMKLQotICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKLSAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKLQotICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKLSAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCi0gICAgICAgIAotICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZwotICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLQotICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfNCAgICAgICAgCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFZUU1QgICAgICAgIGRGaWx0X2JzLCBkRmlsdF9icywgZE1hc2tfNAotCi0gICAgICAgIDsvLyBiUyA9PSA0IEZpbHRlcmluZwotICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZCSVQgICAgICAgIGRQXzBuLCBkUF8wdCwgZEZpbHRfYnMKLSAgICAgICAgVkJJVCAgICAgICAgZFFfMG4sIGRRXzB0LCBkRmlsdF9icwotICAgICAgICAKLSAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0ICAgICAgCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCi0KLSAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCi0gICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0KLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotTm9GaWx0ZXJCUzAKLQotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCi0KLSAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICBFTkRJRgotICAgICAgICAKLQotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjE1MmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgICBJRiBDb3J0ZXhBOAotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0gICAgICAgIAotTE9PUF9DT1VOVCAgRVFVIDB4NDAwMDAwMDAKLU1BU0tfMyAgICAgIEVRVSAweDAzMDMwMzAzCi1NQVNLXzQgICAgICBFUVUgMHgwNDA0MDQwNAotCi07Ly8gRnVuY3Rpb24gYXJndW1lbnRzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYSAgICAgIFJOIDIKLXBCZXRhICAgICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNQotcEJTICAgICAgICAgUk4gNAotYlMzMjEwICAgICAgUk4gNgotcFNyY0RzdF9QICAgUk4gMTAKLXBTcmNEc3RfUSAgIFJOIDEyCi0KLXBUbXAgICAgICAgIFJOIDEwCi1wVG1wMiAgICAgICBSTiAxMgotc3RlcCAgICAgICAgUk4gMTQKLQotOy8vIExvb3AgCi0KLVhZICAgICAgICAgIFJOIDcKLQotOy8vIFJvd3MgaW5wdXQKLWRSb3cwICAgICAgIEROIEQ3LlU4Ci1kUm93MSAgICAgICBETiBEOC5VOCAgCi1kUm93MiAgICAgICBETiBENS5VOCAgCi1kUm93MyAgICAgICBETiBEMTAuVTggIAotZFJvdzQgICAgICAgRE4gRDYuVTggIAotZFJvdzUgICAgICAgRE4gRDkuVTggIAotZFJvdzYgICAgICAgRE4gRDQuVTggCi1kUm93NyAgICAgICBETiBEMTEuVTggCi0KLQotOy8vIFBpeGVscwotZFBfMCAgICAgICAgRE4gRDQuVTgKLWRQXzEgICAgICAgIEROIEQ1LlU4ICAKLWRQXzIgICAgICAgIEROIEQ2LlU4ICAKLWRRXzAgICAgICAgIEROIEQ4LlU4ICAKLWRRXzEgICAgICAgIEROIEQ5LlU4ICAKLWRRXzIgICAgICAgIEROIEQxMC5VOCAKLQotOy8vIEZpbHRlcmluZyBEZWNpc2lvbgotZEFscGhhICAgICAgRE4gRDAuVTgKLWRCZXRhICAgICAgIEROIEQyLlU4Ci0KLWRGaWx0ICAgICAgIEROIEQxNi5VOAotZEFxZmxnICAgICAgRE4gRDEyLlU4Ci1kQXBmbGcgICAgICBETiBEMTcuVTggCi0KLWRBcDBxMCAgICAgIEROIEQxMy5VOAotZEFwMXAwICAgICAgRE4gRDEyLlU4Ci1kQXExcTAgICAgICBETiBEMTguVTgKLWRBcDJwMCAgICAgIEROIEQxOS5VOAotZEFxMnEwICAgICAgRE4gRDE3LlU4Ci0KLXFCUzMyMTAgICAgIFFOIFExMy5VMTYKLWRCUzMyMTAgICAgIEROIEQyNgotZE1hc2tfYnMgICAgRE4gRDI3Ci1kRmlsdF9icyAgICBETiBEMjYuVTE2Ci0KLTsvLyBiU0xUNAotZE1hc2tfMCAgICAgRE4gRDE0LlU4Ci1kTWFza18xICAgICBETiBEMTUuVTggICAgCi1kTWFza180ICAgICBETiBEMS5VMTYKLQotTWFza180ICAgICAgUk4gOAotTWFza18zICAgICAgUk4gOQotCi1kVGVtcCAgICAgICBETiBEMTkuVTgKLQotOy8vIFJlc3VsdAotZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgCi1kUV8wdCAgICAgICBETiBEMzEuVTggICAKLQotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUV8wbiAgICAgICBETiBEMjQuVTgKLQotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIHIxMiwgZDE1Ci0gICAgICAgIAotICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCUywgNAotICAgICAgICAKLSAgICAgICAgOy8vIGQwLWRBbHBoYV8wCi0gICAgICAgIDsvLyBkMi1kQmV0YV8wCi0KLSAgICAgICAgO2xvYWQgYWxwaGExLGJldGExIHNvbWV3aGVyZSB0byBhdm9pZCBtb3JlIGxvYWRzCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdIQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0hIAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCi0KLSAgICAgICAgTERSICAgICAgICAgTWFza180LCA9TUFTS180Ci0gICAgICAgIExEUiAgICAgICAgIE1hc2tfMywgPU1BU0tfMwotCi0gICAgICAgIDtkTWFza18wLTE0Ci0gICAgICAgIDtkTWFza18xLTE1Ci0gICAgICAgIDtkTWFza180LTE5Ci0KLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAotICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzQsICM0ICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFhZLCA9TE9PUF9DT1VOVAotCi0gICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3Ci0gICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQotCi0KLUxvb3BZICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgYlMzMjEwLCBbcEJTXSwgIzgKLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCi0gICAgICAgIAotICAgICAgICA7MQotICAgICAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIDsxCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3cxLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93MywgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c0LCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c3LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gZFJvdzAgPSBbcTNyMCBxMnIwIHExcjAgcTByMCBwMHIwIHAxcjAgcDJyMCBwM3IwXQotICAgICAgICA7Ly8gZFJvdzEgPSBbcTNyMSBxMnIxIHExcjEgcTByMSBwMHIxIHAxcjEgcDJyMSBwM3IxXQotICAgICAgICA7Ly8gZFJvdzIgPSBbcTNyMiBxMnIyIHExcjIgcTByMiBwMHIyIHAxcjIgcDJyMiBwM3IyXQotICAgICAgICA7Ly8gZFJvdzMgPSBbcTNyMyBxMnIzIHExcjMgcTByMyBwMHIzIHAxcjMgcDJyMyBwM3IzXQotICAgICAgICA7Ly8gZFJvdzQgPSBbcTNyNCBxMnI0IHExcjQgcTByNCBwMHI0IHAxcjQgcDJyNCBwM3I0XQotICAgICAgICA7Ly8gZFJvdzUgPSBbcTNyNSBxMnI1IHExcjUgcTByNSBwMHI1IHAxcjUgcDJyNSBwM3I1XQotICAgICAgICA7Ly8gZFJvdzYgPSBbcTNyNiBxMnI2IHExcjYgcTByNiBwMHI2IHAxcjYgcDJyNiBwM3I2XQotICAgICAgICA7Ly8gZFJvdzcgPSBbcTNyNyBxMnI3IHExcjcgcTByNyBwMHI3IHAxcjcgcDJyNyBwM3I3XQotCi0gICAgICAgIDsvLyA4eDggVHJhbnNwb3NlCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3cwLCBkUm93MQotICAgICAgICBWWklQLjggICAgICBkUm93MiwgZFJvdzMKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzQsIGRSb3c1Ci0gICAgICAgIFZaSVAuOCAgICAgIGRSb3c2LCBkUm93NwotCi0gICAgICAgIFZaSVAuMTYgICAgIGRSb3cwLCBkUm93MgotICAgICAgICBWWklQLjE2ICAgICBkUm93MSwgZFJvdzMKLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzQsIGRSb3c2Ci0gICAgICAgIFZaSVAuMTYgICAgIGRSb3c1LCBkUm93NwotCi0gICAgICAgIFZaSVAuMzIgICAgIGRSb3cwLCBkUm93NAotICAgICAgICBWWklQLjMyICAgICBkUm93MiwgZFJvdzYKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzMsIGRSb3c3Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3cxLCBkUm93NQotCi0KLSAgICAgICAgO1JlYWxpZ24gdGhlIHBvaW50ZXJzCi0KLSAgICAgICAgQ01QICAgICAgICAgYlMzMjEwLCAjMAotICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCi0gICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCi0KLSAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCi0gICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAotCi0gICAgICAgIFZNT1YuVTMyICAgIGRCUzMyMTBbMF0sIGJTMzIxMAotICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKLSAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAotICAgICAgICBWTU9WTCAgICAgICBxQlMzMjEwLCBkQlMzMjEwLlU4Ci0gICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAotICAgICAgICBWQ0dUICAgICAgICBkTWFza19icy5TMTYsIGRCUzMyMTAuUzE2LCAjMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMAotICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKLSAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRNYXNrX2JzLlU4Ci0KLSAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzMKLQotICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKLSAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKLQotICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKLSAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCi0KLSAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKLSAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzQgICAgICAgIAotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMwotICAgICAgICBWVFNUICAgICAgICBkRmlsdF9icywgZEZpbHRfYnMsIGRNYXNrXzQKLQotICAgICAgICA7Ly8gYlMgPT0gNCBGaWx0ZXJpbmcKLSAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0KLSAgICAgICAgVkJJVCAgICAgICAgZFBfMG4sIGRQXzB0LCBkRmlsdF9icwotICAgICAgICBWQklUICAgICAgICBkUV8wbiwgZFFfMHQsIGRGaWx0X2JzCi0KLSAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3RfUCwgcFNyY0RzdCwgIzMKLSAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0ICAgICAgCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwVG1wMiwgcFNyY0RzdF9QLCBzcmNkc3RTdGVwCi0gICAgICAgIEFERCAgICAgICAgIHN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKLQotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMF19LCBbcFNyY0RzdF9QXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMV19LCBbcFRtcDJdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wblsyXX0sIFtwU3JjRHN0X1BdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wblszXX0sIFtwVG1wMl0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzRdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzVdfSwgW3BUbXAyXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bNl19LCBbcFNyY0RzdF9QXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bN119LCBbcFRtcDJdLCBzdGVwCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0X1EsIHBTcmNEc3QsICM0Ci0gICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3RfUSwgc3JjZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzBdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzFdfSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wblsyXX0sIFtwU3JjRHN0X1FdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wblszXX0sIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bNF19LCBbcFNyY0RzdF9RXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bNV19LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzZdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzddfSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotCi0gICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotTm9GaWx0ZXJCUzAKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCi0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAotCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICBFTkRJRgotCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Nzg2NzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLQotICAgICAgICBJRiBDb3J0ZXhBOAotCi1MT09QX0NPVU5UICBFUVUgMHg1NTAwMDAwMAotCi0KLTsvLyBGdW5jdGlvbiBhcmd1bWVudHMKLQotcFNyY0RzdCAgICAgUk4gMAotc3JjZHN0U3RlcCAgUk4gMQotcEFscGhhICAgICAgUk4gMgotcEJldGEgICAgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiA1Ci1wQlMgICAgICAgICBSTiA0Ci1iUzEwICAgICAgICBSTiAxMgotCi1wQWxwaGFfMCAgICBSTiAyCi1wQmV0YV8wICAgICBSTiAzCi0KLXBBbHBoYV8xICAgIFJOIDcKLXBCZXRhXzEgICAgIFJOIDgKLQotCi0KLTsvLyBMb29wIAotCi1YWSAgICAgICAgICBSTiA5Ci0KLXBUbXAgICAgICAgIFJOIDYKLXN0ZXAgICAgICAgIFJOIDEwCi0KLTsvLyBQaXhlbHMKLWRQXzAgICAgICAgIEROIEQ0LlU4Ci1kUF8xICAgICAgICBETiBENS5VOCAgCi1kUF8yICAgICAgICBETiBENi5VOCAgCi1kUF8zICAgICAgICBETiBENy5VOCAgCi1kUV8wICAgICAgICBETiBEOC5VOCAgCi1kUV8xICAgICAgICBETiBEOS5VOCAgCi1kUV8yICAgICAgICBETiBEMTAuVTggCi1kUV8zICAgICAgICBETiBEMTEuVTggCi0KLQotOy8vIEZpbHRlcmluZyBEZWNpc2lvbgotZEFscGhhICAgICAgRE4gRDAuVTgKLWRCZXRhICAgICAgIEROIEQyLlU4Ci0KLWRGaWx0ICAgICAgIEROIEQxNi5VOAotZEFxZmxnICAgICAgRE4gRDEyLlU4Ci1kQXBmbGcgICAgICBETiBEMTcuVTggCi0KLWRBcDBxMCAgICAgIEROIEQxMy5VOAotZEFwMXAwICAgICAgRE4gRDEyLlU4Ci1kQXExcTAgICAgICBETiBEMTguVTgKLWRBcDJwMCAgICAgIEROIEQxOS5VOAotZEFxMnEwICAgICAgRE4gRDE3LlU4Ci0KLTsvLyBiU0xUNAotZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCi1kVEMxICAgICAgICBETiBEMTkuVTggICAKLWRUQzAxICAgICAgIEROIEQxOC5VOCAgIAotCi1kVENzICAgICAgICBETiBEMzEuUzgKLWRUQyAgICAgICAgIEROIEQzMS5VOAotCi1kTWFza18wICAgICBETiBEMTQuVTgKLWRNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKLQotTWFza18wICAgICAgUk4gMTEKLQotZFRlbXAgICAgICAgRE4gRDE5LlU4Ci0KLTsvLyBDb21wdXRpbmcgUDAsUTAKLXFEcTBwMCAgICAgIFFOIFExMC5TMTYKLXFEcDFxMSAgICAgIFFOIFExMS5TMTYKLXFEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCi1kRGVsdGEgICAgICBETiBEMjAuUzgKLQotCi07Ly8gQ29tcHV0aW5nIFAxLFExCi1kUnAwcTAgICAgICBETiBEMjQuVTgKLQotZE1heFAgICAgICAgRE4gRDIzLlU4Ci1kTWluUCAgICAgICBETiBEMjIuVTgKLQotZE1heFEgICAgICAgRE4gRDE5LlU4Ci1kTWluUSAgICAgICBETiBEMjEuVTgKLQotZERlbHRhUCAgICAgRE4gRDI2LlU4Ci1kRGVsdGFRICAgICBETiBEMjcuVTgKLQotcVBfMG4gICAgICAgUU4gUTE0LlMxNgotcVFfMG4gICAgICAgUU4gUTEyLlMxNgotCi1kUV8wbiAgICAgICBETiBEMjQuVTgKLWRRXzFuICAgICAgIEROIEQyNS5VOAotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUF8xbiAgICAgICBETiBEMzAuVTgKLQotOy8vIGJTR0U0Ci0KLXFTcDBxMCAgICAgIFFOIFExMC5VMTYKLQotcVNwMnExICAgICAgUU4gUTExLlUxNgotcVNwMHEwcDEgICAgUU4gUTEyLlUxNgotcVNwM3AyICAgICAgUU4gUTEzLlUxNgotZEhTcDBxMSAgICAgRE4gRDI4LlU4Ci0KLXFTcTJwMSAgICAgIFFOIFExMS5VMTYKLXFTcDBxMHExICAgIFFOIFExMi5VMTYKLXFTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQotZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCi0KLXFUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCi1xVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAotCi1kUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCi1kUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAotCi1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRQXzFuICAgICAgIEROIEQzMC5VOAotZFBfMm4gICAgICAgRE4gRDMxLlU4Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCi1kUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAotZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCByMTEsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAotICAgICAgICBNX0FSRyAgIHBwQlMsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBkMC1kQWxwaGFfMAotICAgICAgICA7Ly8gZDItZEJldGFfMAotCi0gICAgICAgIEFERCAgICAgICAgIHBBbHBoYV8xLCBwQWxwaGFfMCwgIzEKLSAgICAgICAgQUREICAgICAgICAgcEJldGFfMSwgcEJldGFfMCwgIzEKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMF0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzBdIAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCi0KLSAgICAgICAgTU9WICAgICAgICAgTWFza18wLCMwCi0KLSAgICAgICAgO2RNYXNrXzAtMTQKLSAgICAgICAgO2RNYXNrXzEtMTUKLQotICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKLQotICAgICAgICBMRFIgICAgICAgICBYWSw9TE9PUF9DT1VOVAotCi0gICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3Ci0gICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQotTG9vcFkgICAgICAgIAotTG9vcFggICAgICAgIAotICAgICAgICBMRFJIICAgICAgICBiUzEwLCBbcEJTXSwgIzIKLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBDTVAgICAgICAgICBiUzEwLCAjMAotICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAotCi0gICAgICAgIFZMRDEgICAgICAgIGRQXzMsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUF8yLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMSwgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRQXzAsIFtwVG1wXSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUV8wLCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8wLCBkUF8xCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzEsIFtwVG1wXQotICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRRXzAsIGRQXzAKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCi0gICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAotCi0gICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmCi0gICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCi0KLSAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMF0sIE1hc2tfMAotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZjAwCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMAotCi0gICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzFdLCBNYXNrXzAKLQotICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMywgW3BTcmNEc3RdCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCi0gICAgICAgIFRTVCAgICAgICAgIGJTMTAsICM0IAotCi0gICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAotICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKLSAgICAKLSAgICAgICAgQk5FICAgICAgICAgYlNHRTQgICAgICAgIAotYlNMVDQKLSAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCi0gICAgICAgIFZTVDEgICAgICAgIGRQXzFuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFBfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBTVUIgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgVlNUMSAgICAgICAgZFFfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzFuLCBbcFNyY0RzdF0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFRtcCwgIzgKLQotICAgICAgICBCQ0MgICAgICAgICBMb29wWAotICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAotCi1Ob0ZpbHRlckJTMAotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjOAotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKLSAgICAgICAgQkNDICAgICAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKLWJTR0U0ICAgICAgICAKLSAgICAgICAgOy8vIGJTID49IDQgRmlsdGVyaW5nCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotCi0gICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQotICAgICAgICBWU1QxICAgICAgICBkUF8ybiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRQXzFuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFBfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBTVUIgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgVlNUMSAgICAgICAgZFFfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBBRERTICAgICAgICBYWSxYWSxYWQotICAgICAgICBWU1QxICAgICAgICBkUV8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKLSAgICAgICAgVlNUMSAgICAgICAgZFFfMm4sIFtwU3JjRHN0XQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFRtcCwgIzgKLSAgICAgICAgQkNDICAgICAgICAgTG9vcFgKLQotRXhpdExvb3BZICAgICAgICAKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjMTYKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIgCi0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCi0gICAgICAgIEJORSAgICAgICAgIExvb3BZCi0KLSAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYKLSAgICAKLQotICAgICAgICAKLQotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhMTM0ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgICAgICAKLSAgICAgICAgSUYgQ29ydGV4QTgKLQotTE9PUF9DT1VOVCAgRVFVIDB4MTEwMDAwMDAKLQotCi07Ly8gRnVuY3Rpb24gYXJndW1lbnRzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYSAgICAgIFJOIDIKLXBCZXRhICAgICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNQotcEJTICAgICAgICAgUk4gNAotYlMxMCAgICAgICAgUk4gMTIKLQotcEFscGhhXzAgICAgUk4gMgotcEJldGFfMCAgICAgUk4gMwotCi1wQWxwaGFfMSAgICBSTiA3Ci1wQmV0YV8xICAgICBSTiA4Ci0KLXBUbXAgICAgICAgIFJOIDEwCi1wVG1wU3RlcCAgICBSTiAxMQotCi07Ly8gTG9vcCAKLQotWFkgICAgICAgICAgUk4gOQotCi07Ly8gUm93cyBpbnB1dAotZFJvdzAgICAgICAgRE4gRDcuVTgKLWRSb3cxICAgICAgIEROIEQ4LlU4ICAKLWRSb3cyICAgICAgIEROIEQ1LlU4ICAKLWRSb3czICAgICAgIEROIEQxMC5VOCAgCi1kUm93NCAgICAgICBETiBENi5VOCAgCi1kUm93NSAgICAgICBETiBEOS5VOCAgCi1kUm93NiAgICAgICBETiBENC5VOCAKLWRSb3c3ICAgICAgIEROIEQxMS5VOCAKLQotOy8vIGRSb3cwIC0gZFBfMywgZFJvdzEgLSBkUV8wLCBkUm93MiAtIGRQXzEsIGRSb3czIC0gZFFfMgotOy8vIGRSb3c0IC0gZFBfMiwgZFJvdzUgLSBkUV8xLCBkUm93NiAtIGRQXzAsIGRSb3c3IC0gZFFfMwotCi07Ly8gUm93cyBvdXRwdXQKLWRSb3duMCAgICAgIEROIEQ3LlU4Ci1kUm93bjEgICAgICBETiBEMjQuVTgKLWRSb3duMiAgICAgIEROIEQzMC5VOAotZFJvd24zICAgICAgRE4gRDEwLlU4Ci1kUm93bjQgICAgICBETiBENi5VOAotZFJvd241ICAgICAgRE4gRDI1LlU4Ci1kUm93bjYgICAgICBETiBEMjkuVTgKLWRSb3duNyAgICAgIEROIEQxMS5VOAotCi07Ly8gZFBfMG4gICAgICAgRE4gRDI5LlU4Ci07Ly8gZFBfMW4gICAgICAgRE4gRDMwLlU4Ci07Ly8gZFBfMm4gICAgICAgRE4gRDMxLlU4Ci07Ly8gCi07Ly8gZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLTsvLyBkUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAotOy8vIGRRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCi07Ly8gCi07Ly8gZFJvd24wIC0gZFBfMywgIGRSb3duMSAtIGRRXzBuCi07Ly8gZFJvd24yIC0gZFBfMW4sIGRSb3duMyAtIGRRXzIKLTsvLyBkUm93bjQgLSBkUF8yLCAgZFJvd241IC0gZFFfMW4KLTsvLyBkUm93bjYgLSBkUF8wbiwgZFJvd243IC0gZFFfMwotCi1kUm93MG4gICAgICBETiBENy5VOAotZFJvdzFuICAgICAgRE4gRDI0LlU4Ci1kUm93Mm4gICAgICBETiBEMzAuVTgKLWRSb3czbiAgICAgIEROIEQyOC5VOAotZFJvdzRuICAgICAgRE4gRDMxLlU4Ci1kUm93NW4gICAgICBETiBEMjUuVTgKLWRSb3c2biAgICAgIEROIEQyOS5VOAotZFJvdzduICAgICAgRE4gRDExLlU4Ci0KLTsvLyBkUm93MG4gLSBkUF8zLCBkUm93MW4gLSBkUV8wbiwgZFJvdzJuIC0gZFBfMW4sIGRSb3czbiAtIGRRXzJuCi07Ly8gZFJvdzRuIC0gZFBfMiwgZFJvdzVuIC0gZFFfMW4sIGRSb3c2biAtIGRQXzBuLCBkUm93N24gLSBkUV8zCi0KLTsvLyBQaXhlbHMKLWRQXzAgICAgICAgIEROIEQ0LlU4Ci1kUF8xICAgICAgICBETiBENS5VOCAgCi1kUF8yICAgICAgICBETiBENi5VOCAgCi1kUF8zICAgICAgICBETiBENy5VOCAgCi1kUV8wICAgICAgICBETiBEOC5VOCAgCi1kUV8xICAgICAgICBETiBEOS5VOCAgCi1kUV8yICAgICAgICBETiBEMTAuVTggCi1kUV8zICAgICAgICBETiBEMTEuVTggCi0KLQotOy8vIEZpbHRlcmluZyBEZWNpc2lvbgotZEFscGhhICAgICAgRE4gRDAuVTgKLWRCZXRhICAgICAgIEROIEQyLlU4Ci0KLWRGaWx0ICAgICAgIEROIEQxNi5VOAotZEFxZmxnICAgICAgRE4gRDEyLlU4Ci1kQXBmbGcgICAgICBETiBEMTcuVTggCi0KLWRBcDBxMCAgICAgIEROIEQxMy5VOAotZEFwMXAwICAgICAgRE4gRDEyLlU4Ci1kQXExcTAgICAgICBETiBEMTguVTgKLWRBcDJwMCAgICAgIEROIEQxOS5VOAotZEFxMnEwICAgICAgRE4gRDE3LlU4Ci0KLTsvLyBiU0xUNAotZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCi1kVEMxICAgICAgICBETiBEMTkuVTggICAKLWRUQzAxICAgICAgIEROIEQxOC5VOCAgIAotCi1kVENzICAgICAgICBETiBEMzEuUzgKLWRUQyAgICAgICAgIEROIEQzMS5VOAotCi1kTWFza18wICAgICBETiBEMTQuVTgKLWRNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKLQotTWFza18wICAgICAgUk4gNgotCi1kVGVtcCAgICAgICBETiBEMTkuVTgKLQotOy8vIENvbXB1dGluZyBQMCxRMAotcURxMHAwICAgICAgUU4gUTEwLlMxNgotcURwMXExICAgICAgUU4gUTExLlMxNgotcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKLWREZWx0YSAgICAgIEROIEQyMC5TOAotCi0KLTsvLyBDb21wdXRpbmcgUDEsUTEKLWRScDBxMCAgICAgIEROIEQyNC5VOAotCi1kTWF4UCAgICAgICBETiBEMjMuVTgKLWRNaW5QICAgICAgIEROIEQyMi5VOAotCi1kTWF4USAgICAgICBETiBEMTkuVTgKLWRNaW5RICAgICAgIEROIEQyMS5VOAotCi1kRGVsdGFQICAgICBETiBEMjYuVTgKLWREZWx0YVEgICAgIEROIEQyNy5VOAotCi1xUF8wbiAgICAgICBRTiBRMTQuUzE2Ci1xUV8wbiAgICAgICBRTiBRMTIuUzE2Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOAotZFFfMW4gICAgICAgRE4gRDI1LlU4Ci1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRQXzFuICAgICAgIEROIEQzMC5VOAotCi07Ly8gYlNHRTQKLQotcVNwMHEwICAgICAgUU4gUTEwLlUxNgotCi1xU3AycTEgICAgICBRTiBRMTEuVTE2Ci1xU3AwcTBwMSAgICBRTiBRMTIuVTE2Ci1xU3AzcDIgICAgICBRTiBRMTMuVTE2Ci1kSFNwMHExICAgICBETiBEMjguVTgKLQotcVNxMnAxICAgICAgUU4gUTExLlUxNgotcVNwMHEwcTEgICAgUU4gUTEyLlUxNgotcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCi1kSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKLQotcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKLXFUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCi0KLWRQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKLWRRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCi0KLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFBfMW4gICAgICAgRE4gRDMwLlU4Ci1kUF8ybiAgICAgICBETiBEMzEuVTgKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLWRRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCi1kUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIHIxMSwgZDE1Ci0gICAgICAgIAotICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCUywgNAotICAgICAgICAKLSAgICAgICAgOy8vIGQwLWRBbHBoYV8wCi0gICAgICAgIDsvLyBkMi1kQmV0YV8wCi0KLSAgICAgICAgQUREICAgICAgICAgcEFscGhhXzEsIHBBbHBoYV8wLCAjMQotICAgICAgICBBREQgICAgICAgICBwQmV0YV8xLCBwQmV0YV8wLCAjMQotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXSAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAotCi0gICAgICAgIE1PViAgICAgICAgIE1hc2tfMCwjMAotCi0gICAgICAgIDtkTWFza18wLTE0Ci0gICAgICAgIDtkTWFza18xLTE1Ci0KLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAotICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCi0KLSAgICAgICAgTERSICAgICAgICAgWFksPUxPT1BfQ09VTlQKLSAgICAKLSAgICAgICAgQUREICAgICAgICAgcFRtcFN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKLQotICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNwotICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKLUxvb3BZICAgICAgICAKLUxvb3BYICAgICAgICAKLSAgICAgICAgTERSSCAgICAgICAgYlMxMCwgW3BCU10sICM0Ci0KLSAgICAgICAgQ01QICAgICAgICAgYlMxMCwgIzAKLSAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKLQotICAgICAgICA7Ly8gTG9hZCA4IHJvd3Mgb2YgZGF0YQotICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3cxLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3cwLCBkUm93MQotICAgICAgICBWTEQxICAgICAgICBkUm93MywgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWWklQLjggICAgICBkUm93MiwgZFJvdzMKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzQsIGRSb3c1Ci0gICAgICAgIFZaSVAuMTYgICAgIGRSb3cxLCBkUm93MwotICAgIAotCi0gICAgICAgIDsvLyBkUm93MCA9IFtxM3IwIHEycjAgcTFyMCBxMHIwIHAwcjAgcDFyMCBwMnIwIHAzcjBdCi0gICAgICAgIDsvLyBkUm93MSA9IFtxM3IxIHEycjEgcTFyMSBxMHIxIHAwcjEgcDFyMSBwMnIxIHAzcjFdCi0gICAgICAgIDsvLyBkUm93MiA9IFtxM3IyIHEycjIgcTFyMiBxMHIyIHAwcjIgcDFyMiBwMnIyIHAzcjJdCi0gICAgICAgIDsvLyBkUm93MyA9IFtxM3IzIHEycjMgcTFyMyBxMHIzIHAwcjMgcDFyMyBwMnIzIHAzcjNdCi0gICAgICAgIDsvLyBkUm93NCA9IFtxM3I0IHEycjQgcTFyNCBxMHI0IHAwcjQgcDFyNCBwMnI0IHAzcjRdCi0gICAgICAgIDsvLyBkUm93NSA9IFtxM3I1IHEycjUgcTFyNSBxMHI1IHAwcjUgcDFyNSBwMnI1IHAzcjVdCi0gICAgICAgIDsvLyBkUm93NiA9IFtxM3I2IHEycjYgcTFyNiBxMHI2IHAwcjYgcDFyNiBwMnI2IHAzcjZdCi0gICAgICAgIDsvLyBkUm93NyA9IFtxM3I3IHEycjcgcTFyNyBxMHI3IHAwcjcgcDFyNyBwMnI3IHAzcjddCi0KLSAgICAgICAgOy8vIDh4OCBUcmFuc3Bvc2UKLQotICAgICAgICBWWklQLjggICAgICBkUm93NiwgZFJvdzcKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzAsIGRSb3cyCi0gICAgICAgIFZaSVAuMTYgICAgIGRSb3c1LCBkUm93NwotICAgICAgICAKLQotICAgICAgICBWWklQLjE2ICAgICBkUm93NCwgZFJvdzYKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzEsIGRSb3c1Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3cyLCBkUm93NgotICAgICAgICBWWklQLjMyICAgICBkUm93MywgZFJvdzcKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzAsIGRSb3c0Ci0gICAgICAgIAotCi0gICAgICAgIDsvLyBkUm93MCAtIGRQXzMsIGRSb3cxIC0gZFFfMCwgZFJvdzIgLSBkUF8xLCBkUm93MyAtIGRRXzIKLSAgICAgICAgOy8vIGRSb3c0IC0gZFBfMiwgZFJvdzUgLSBkUV8xLCBkUm93NiAtIGRQXzAsIGRSb3c3IC0gZFFfMwotCi0gICAgICAgIDsvLyBkUV8wID0gW3EwcjcgcTByNiBxMHI1IHEwcjQgcTByMyBxMHIyIHEwcjEgcTByMF0KLSAgICAgICAgOy8vIGRRXzEgPSBbcTFyNyBxMXI2IHExcjUgcTFyNCBxMXIzIHExcjIgcTFyMSBxMXIwXQotICAgICAgICA7Ly8gZFFfMiA9IFtxMnI3IHEycjYgcTJyNSBxMnI0IHEycjMgcTJyMiBxMnIxIHEycjBdCi0gICAgICAgIDsvLyBkUV8zID0gW3EzcjcgcTNyNiBxM3I1IHEzcjQgcTNyMyBxM3IyIHEzcjEgcTNyMF0KLQotICAgICAgICA7Ly8gZFBfMCA9IFtwMHI3IHAwcjYgcDByNSBwMHI0IHAwcjMgcDByMiBwMHIxIHAwcjBdCi0gICAgICAgIDsvLyBkUF8xID0gW3AxcjcgcDFyNiBwMXI1IHAxcjQgcDFyMyBwMXIyIHAxcjEgcDFyMF0KLSAgICAgICAgOy8vIGRQXzIgPSBbcDJyNyBwMnI2IHAycjUgcDJyNCBwMnIzIHAycjIgcDJyMSBwMnIwXQotICAgICAgICA7Ly8gZFBfMyA9IFtwM3I3IHAzcjYgcDNyNSBwM3I0IHAzcjMgcDNyMiBwM3IxIHAzcjBdCi0KLSAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAotCi0gICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAotICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmCi0gICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAotCi0gICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCi0KLSAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMF0sIE1hc2tfMAotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZjAwCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMAotCi0gICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzFdLCBNYXNrXzAKLQotICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKLSAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKLSAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzQgCi0KLSAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAotICAgIAotICAgICAgICBCTkUgICAgICAgICBiU0dFNCAgICAgICAgCi1iU0xUNAotICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZwotCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLQotICAgICAgICA7Ly8gVHJhbnNwb3NlCi0KLSAgICAgICAgVlpJUC44ICAgICAgZFBfMywgIGRQXzIgIAotICAgICAgICBWWklQLjggICAgICBkUF8xbiwgZFBfMG4KLSAgICAgICAgVlpJUC44ICAgICAgZFFfMG4sIGRRXzFuCi0gICAgICAgIFZaSVAuOCAgICAgIGRRXzIsICBkUV8zCi0KLSAgICAgICAgCi0gICAgICAgIFZaSVAuMTYgICAgIGRQXzMsICBkUF8xbgotICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCi0gICAgICAgIFZaSVAuMTYgICAgIGRRXzBuLCBkUV8yCi0gICAgICAgIFZaSVAuMTYgICAgIGRRXzFuLCBkUV8zCi0gICAgICAgIFZaSVAuMTYgICAgIGRQXzIsICBkUF8wbgotCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzMsICBkUV8wbgotICAgICAgICBWWklQLjMyICAgICBkUF8xbiwgZFFfMgotICAgICAgICBWWklQLjMyICAgICBkUF8yLCAgZFFfMW4KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMG4sIGRRXzMKLQotICAgICAgICA7Ly8gZFJvd24wIC0gZFBfMywgIGRSb3duMSAtIGRRXzBuCi0gICAgICAgIDsvLyBkUm93bjIgLSBkUF8xbiwgZFJvd24zIC0gZFFfMgotICAgICAgICA7Ly8gZFJvd240IC0gZFBfMiwgIGRSb3duNSAtIGRRXzFuCi0gICAgICAgIDsvLyBkUm93bjYgLSBkUF8wbiwgZFJvd243IC0gZFFfMwotCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duMCwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93bjEsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd24yLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duMywgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICA7MQotICAgICAgICBWU1QxICAgICAgICBkUm93bjQsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd241LCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd242LCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd243LCBbcFRtcF0sIHNyY2RzdFN0ZXAKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQotCi0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCi0KLU5vRmlsdGVyQlMwCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0Ci0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCi0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCi1iU0dFNCAgICAgICAgCi0gICAgICAgIDsvLyBiUyA+PSA0IEZpbHRlcmluZwotICAgICAgICAKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UKLQotICAgICAgICBWWklQLjggICAgICBkUF8zLCAgZFBfMm4gICAKLSAgICAgICAgVlpJUC44ICAgICAgZFBfMW4sIGRQXzBuCi0gICAgICAgIFZaSVAuOCAgICAgIGRRXzBuLCBkUV8xbgotICAgICAgICBWWklQLjggICAgICBkUV8ybiwgZFFfMwotCi0gICAgICAgIFZaSVAuMTYgICAgIGRQXzMsICBkUF8xbgotICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCi0gICAgICAgIFZaSVAuMTYgICAgIGRRXzBuLCBkUV8ybgotICAgICAgICBWWklQLjE2ICAgICBkUV8xbiwgZFFfMwotICAgICAgICBWWklQLjE2ICAgICBkUF8ybiwgZFBfMG4KLQotICAgICAgICBWWklQLjMyICAgICBkUF8zLCAgZFFfMG4KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMW4sIGRRXzJuCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzJuLCBkUV8xbgotICAgICAgICBWWklQLjMyICAgICBkUF8wbiwgZFFfMwotCi0gICAgICAgIDsvLyBkUm93MG4gLSBkUF8zLCBkUm93MW4gLSBkUV8wbiwgZFJvdzJuIC0gZFBfMW4sIGRSb3czbiAtIGRRXzJuCi0gICAgICAgIDsvLyBkUm93NG4gLSBkUF8yLCBkUm93NW4gLSBkUV8xbiwgZFJvdzZuIC0gZFBfMG4sIGRSb3c3biAtIGRRXzMKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3cwbiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93MW4sIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzJuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3czbiwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93NG4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzVuLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIEFERFMgICAgICAgIFhZLFhZLFhZCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3c2biwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIFZTVDEgICAgICAgIGRSb3c3biwgW3BUbXBdLCBwVG1wU3RlcAotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMwotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCi0KLSAgICAgICAgQkNDICAgICAgICAgTG9vcFgKLQotRXhpdExvb3BZICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcEJTLCBwQlMsICMxNAotICAgICAgICBTVUIgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMxNAotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjMTYKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMgCi0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzBdCi0gICAgICAgIEJORSAgICAgICAgIExvb3BZCi0KLSAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmIzZjQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgMS84IFBpeGVsIGludGVycG9sYXRpb24gZm9yIENocm9tYSBCbG9jawotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyYwlQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlcgotICogW2luXQlzcmNTdGVwIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKLSAqIFtpbl0JZHN0U3RlcCBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoLgotICogW2luXQlkeAkJRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQKLSAqCQkJCQkJaW4gMS84IHBpeGVsIHVuaXQ7dmFsaWQgaW4gdGhlIHJhbmdlIFswLDddCi0gKiBbaW5dCWR5CQlGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQKLSAqCQkJCQkJaW4gMS84IHBpeGVsIHVuaXQ7dmFsaWQgaW4gdGhlIHJhbmdlIFswLDddCi0gKiBbaW5dCXJvaQkJRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAotICogICAgICAgICAgICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuCi0gKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE9NWF9TdHNfQmFkQXJnRXJyOgotICoJcFNyYyBvciBwRHN0IGlzIE5VTEwuCi0gKglzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LgotICoJZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLgotICoJcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uCi0gKglyb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLgotICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KLSAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuCi0gKglzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAotICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCi0gICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgZHgsCi0gICAgIE9NWF9TMzIgZHksCi0gICAgIE9NWFNpemUgcm9pCi0gKQotewotICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSAKLSAgICAgICAgKChPTVhfVTgqKXBTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXAsIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgZHgsIGR5KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4ZjY5ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworKysgL2Rldi9udWxsCkBAIC0xLDU2NyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCi07Ly8KLTsvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgaW4gdjYgYXNzZW1ibHkuCi07Ly8gUGVyZm9ybXMgcXVhcnRlciBwZWwgaW50ZXJwb2xhdGlvbiBvZiBpbnRlciBsdW1hIE1CLgotOy8vIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLTsvLyBQYXJhbWV0ZXJzOgotOy8vIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKLTsvLyBbaW5dICAgIHNyY1N0ZXAgICAgIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKLTsvLyBbaW5dICAgIGRzdFN0ZXAgICAgIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGgKLTsvLyBbaW5dICAgIGR4ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQotOy8vIFtpbl0gICAgZHkgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQotOy8vIFtpbl0gICAgcm9pICAgICAgICAgRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAotOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4KLTsvLyBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KLTsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi07Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi07Ly8KLTsvLyBSZXR1cm4gVmFsdWU6Ci07Ly8gSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgotOy8vIEl0IGlzIGFzc3VlZCB0aGF0IGZvbGxvd2luZyBjYXNlcyBhcmUgc2F0aXNmaWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb246Ci07Ly8gIHBTcmMgb3IgcERzdCBpcyBub3QgTlVMTC4KLTsvLyAgc3JjU3RlcCBvciBkc3RTdGVwID49IHJvaS53aWR0aC4KLTsvLyAgICAgZHggb3IgZHkgaXMgaW4gdGhlIHJhbmdlIFswLTNdLgotOy8vICAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBub3Qgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uCi07Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBEc3QgaXMgNCBieXRlIGFsaWduZWQuCi07Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBwRHN0IGlzIDggYnl0ZSBhbGlnbmVkLgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gMTYsIHBEc3QgaXMgMTYgYnl0ZSBhbGlnbmVkLgotOy8vICAgICBzcmNTdGVwIGFuZCBkc3RTdGVwIGlzIG11bHRpcGxlIG9mIDguCi07Ly8KLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgICBFWFBPUlQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKLSAgICAgICAgCi0KLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgIEVORElGCi0gICAgCi0gICAgCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLWlIZWlnaHQgICAgICAgICBSTiA0Ci1pV2lkdGggICAgICAgICAgUk4gNQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1pZHggICAgICAgICAgICAgUk4gNgotaWR5ICAgICAgICAgICAgIFJOIDcKLWluZGV4ICAgICAgICAgICBSTiA2Ci1UZW1wICAgICAgICAgICAgUk4gMTIKLXBBcmdzICAgICAgICAgICBSTiAxMQotCi0KLSAgICBJRiBDb3J0ZXhBOAotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW50ZXJwb2xhdGlvbiBvZiBsdW1hIGlzIGltcGxlbWVudGVkIGJ5IHByb2Nlc3NpbmcgYmxvY2sgb2YgcGl4ZWxzLCBzaXplIDR4NCBhdCBhIHRpbWUuCi0gICAgICAgIDsvLwotICAgICAgICBNX0FMTE9DNCAgICBwcEFyZ3MsIDE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIHIxMSwgZDE1Ci0KLXBTcmNCSyAgICAgICAgICBSTiA4Ci0KLTsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCi1kQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2Ci1kQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2Ci0KLTsvLyBSZWdpc3RlcnMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbgotZFNyYzBjICAgICAgICAgIEROIDE0LlU4Ci1kU3JjMWMgICAgICAgICAgRE4gMTYuVTgKLWRTcmMyYyAgICAgICAgICBETiAxOC5VOAotZFNyYzNjICAgICAgICAgIEROIDIwLlU4ICAgICAgICAgICAgICAgICAgIAotZFNyYzBkICAgICAgICAgIEROIDE1LlU4Ci1kU3JjMWQgICAgICAgICAgRE4gMTcuVTgKLWRTcmMyZCAgICAgICAgICBETiAxOS5VOAotZFNyYzNkICAgICAgICAgIEROIDIxLlU4Ci1kQWNjSDAgICAgICAgICAgRE4gMjIuVTgKLWRBY2NIMSAgICAgICAgICBETiAyNC5VOAotZEFjY0gyICAgICAgICAgIEROIDI2LlU4Ci1kQWNjSDMgICAgICAgICAgRE4gMjguVTgKLWRSZXN1bHRIMCAgICAgICBETiAyMi5VMzIKLWRSZXN1bHRIMSAgICAgICBETiAyNC5VMzIKLWRSZXN1bHRIMiAgICAgICBETiAyNi5VMzIKLWRSZXN1bHRIMyAgICAgICBETiAyOC5VMzIKLQotOy8vIFJlZ2lzdGVycyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgVmVydGljYWwgaW50ZXJwb2xhdGlvbgotZFNyYzAgICAgICAgICAgIEROIDkuVTgKLWRTcmMxICAgICAgICAgICBETiAxMC5VOAotZFNyYzIgICAgICAgICAgIEROIDExLlU4Ci1kU3JjMyAgICAgICAgICAgRE4gMTIuVTgKLWRTcmM0ICAgICAgICAgICBETiAxMy5VOAotZEFjY1YwICAgICAgICAgIEROIDAuVTgKLWRBY2NWMSAgICAgICAgICBETiAyLlU4Ci1kQWNjVjIgICAgICAgICAgRE4gNC5VOAotZEFjY1YzICAgICAgICAgIEROIDYuVTgKLWRSZXN1bHRWMCAgICAgICBETiAwLlUzMgotZFJlc3VsdFYxICAgICAgIEROIDIuVTMyCi1kUmVzdWx0VjIgICAgICAgRE4gNC5VMzIKLWRSZXN1bHRWMyAgICAgICBETiA2LlUzMgotICAgICAgICAKLTsvLyBSZWdpc3RlcnMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIERpYWdvbmFsIGludGVycG9sYXRpb24KLWRUQWNjMCAgICAgICAgICBETiAwLlU4Ci1kVEFjYzEgICAgICAgICAgRE4gMi5VOAotZFRBY2MyICAgICAgICAgIEROIDQuVTgKLWRUQWNjMyAgICAgICAgICBETiA2LlU4Ci1kVFJlczAgICAgICAgICAgRE4gMC4zMgotZFRSZXMxICAgICAgICAgIEROIDIuMzIKLWRUUmVzMiAgICAgICAgICBETiA0LjMyCi1kVFJlczMgICAgICAgICAgRE4gNi4zMgotZFRSZXN1bHQwICAgICAgIEROIDE0LlU4Ci1kVFJlc3VsdDEgICAgICAgRE4gMTYuVTgKLWRUUmVzdWx0MiAgICAgICBETiAxOC5VOAotZFRSZXN1bHQzICAgICAgIEROIDIwLlU4Ci1kVGVtcFAwICAgICAgICAgRE4gMTguUzE2Ci1kVGVtcFAxICAgICAgICAgRE4gMTkuUzE2Ci1kVGVtcFEwICAgICAgICAgRE4gMjAuUzE2Ci1kVGVtcFExICAgICAgICAgRE4gMjEuUzE2Ci1kVGVtcFIwICAgICAgICAgRE4gMjIuUzE2Ci1kVGVtcFIxICAgICAgICAgRE4gMjMuUzE2Ci1kVGVtcFMwICAgICAgICAgRE4gMjQuUzE2Ci1kVGVtcFMxICAgICAgICAgRE4gMjUuUzE2Ci1xVGVtcFAwMSAgICAgICAgUU4gOS5TMTYKLXFUZW1wUTAxICAgICAgICBRTiAxMC5TMTYKLXFUZW1wUjAxICAgICAgICBRTiAxMS5TMTYKLXFUZW1wUzAxICAgICAgICBRTiAxMi5TMTYKLQotOy8vIEludGVybWVkaWF0ZSB2YWx1ZXMgZm9yIGF2ZXJhZ2luZwotcVJlczIgICAgICAgICAgIFFOIDcuUzE2Ci1xUmVzMyAgICAgICAgICAgUU4gOC5TMTYKLXFSZXM0ICAgICAgICAgICBRTiA5LlMxNgotcVJlczUgICAgICAgICAgIFFOIDEwLlMxNgotcVJlczYgICAgICAgICAgIFFOIDExLlMxNgotICAgICAgIAotOy8vIEZvciBpbXBsZW1lbnRpbmcgY29weQotZERzdDAgICAgICAgICAgICBETiA5LjMyCi1kRHN0MSAgICAgICAgICAgIEROIDEwLjMyCi1kRHN0MiAgICAgICAgICAgIEROIDExLjMyCi1kRHN0MyAgICAgICAgICAgIEROIDEyLjMyCi0KLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgICAgcHRyaWR4LCA0Ci0gICAgICAgIE1fQVJHICAgICAgIHB0cmlkeSwgNCAgICAgICAgCi0gICAgICAgIE1fQVJHICAgICAgIHB0cldpZHRoLCA0Ci0gICAgICAgIE1fQVJHICAgICAgIHB0ckhlaWdodCwgNCAgICAgICAgCi0KLSAgICAgICAgOy8vIExvYWQgc3RydWN0dXJlIGVsZW1lbnRzIG9mIHJvaSAKLSAgICAgICAgTV9MRFIgICAgICAgaWR4LCBwdHJpZHgKLSAgICAgICAgTV9MRFIgICAgICAgaWR5LCBwdHJpZHkKLSAgICAgICAgTV9MRFIgICAgICAgaVdpZHRoLCBwdHJXaWR0aAotICAgICAgICBNX0xEUiAgICAgICBpSGVpZ2h0LCBwdHJIZWlnaHQKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIGluZGV4LCBpZHgsIGlkeSwgTFNMICMyICAgICAgICAgICAgICAgICA7Ly8gIFtpbmRleF0gPSBbaWR5XVtpZHhdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBNb3ZlIGNvZWZmaWNpZW50cyBOZW9uIHJlZ2lzdGVycwotICAgICAgICBWTU9WICAgICAgICBkQ29lZmYyMCwgIzIwCi0gICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjUsICM1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1CbG9jazR4NFdpZHRoTG9vcAotQmxvY2s0eDRIZWlnaHRMb29wCi0KLSAgICAgICAgU1RNICAgICAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gc3dpdGNoIHRhYmxlIHVzaW5nIG1vdGlvbiB2ZWN0b3IgYXMgaW5kZXgKLSAgICAgICAgQUREICAgICAgICAgcGMsIHBjLCBpbmRleCwgTFNMICMyCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfZgotICAgICAgICBCICAgICAgICAgICBDYXNlXzAgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzEgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzIgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzMgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzQgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzUgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzYgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzcgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzggICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlXzkgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlX2EgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlX2IgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlX2MgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlX2QKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9lICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9mCi0gICAgICAgICAgICAgICAgICAgIAotQ2FzZV8wICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gQ2FzZSBHCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDAgXG4iCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZHMgYSA0eDQgYmxvY2sgb2YgLjggYW5kIHN0b3JlcyBhcyAuMzIKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcFNyYywgc3JjU3RlcCwgTFNMICMxIAotICAgICAgICBWTEQxICAgICAgICBkU3JjMCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMyLCBbVGVtcF0sIHNyY1N0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzEsIFtwU3JjXQotICAgICAgICBWTEQxICAgICAgICBkU3JjMywgW1RlbXBdCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGREc3QwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZERzdDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkRHN0MVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGREc3QzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfMQotICAgICAgICA7Ly8gQ2FzZSBhCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDEgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZFNyYzBjCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkU3JjMmMKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRTcmMxYwotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZFNyYzNjCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAotQ2FzZV8yCi0gICAgICAgIDsvLyBDYXNlIGIKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMiBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMiAgICAgICAgCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAotQ2FzZV8zCi0gICAgICAgIDsvLyBDYXNlIGMKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMyBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkU3JjMGQKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRTcmMyZAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZFNyYzFkCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkU3JjM2QKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCi1DYXNlXzQKLSAgICAgICAgOy8vIENhc2UgZAotICAgICAgICBNX1BSSU5URiAiQ2FzZSA0IFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMCwgZEFjY1YwLCBkU3JjMAotICAgICAgICBWUkhBREQgICAgICBkQWNjVjIsIGRBY2NWMiwgZFNyYzIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YxLCBkQWNjVjEsIGRTcmMxCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMywgZEFjY1YzLCBkU3JjMwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKLUNhc2VfNQotICAgICAgICA7Ly8gQ2FzZSBlCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDUgXG4iCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyY0JLLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkQWNjVjAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRBY2NWMgotICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZEFjY1YxCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkQWNjVjMgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIAotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKLUNhc2VfNgotICAgICAgICA7Ly8gQ2FzZSBmCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDYgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFSZXMyLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVJlczMsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxUmVzNCwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFSZXM1LCAjNSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgotICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQotICAgICAgICAKLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCi1DYXNlXzcKLSAgICAgICAgOy8vIENhc2UgZwotICAgICAgICBNX1BSSU5URiAiQ2FzZSA3IFxuIgotICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzEKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyY0JLLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkQWNjVjAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRBY2NWMgotICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZEFjY1YxCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkQWNjVjMgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIAotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzgKLSAgICAgICAgOy8vIENhc2UgaAotICAgICAgICBNX1BSSU5URiAiQ2FzZSA4IFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfOQotICAgICAgICA7Ly8gQ2FzZSBpCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDkgXG4iCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBQMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBRMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBSMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBTMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzIKLSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVRlbXBQMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxVGVtcFEwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFUZW1wUjAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVRlbXBTMDEsICM1ICAgICAgICAKLQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9hCi0gICAgICAgIDsvLyBDYXNlIGoKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgYSBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9iCi0gICAgICAgIDsvLyBDYXNlIGsKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgYiBcbiIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBWRVhUICAgICAgICBkVGVtcFAwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkVGVtcFEwLCBkVGVtcFEwLCBkVGVtcFExLCAjMwotICAgICAgICBWRVhUICAgICAgICBkVGVtcFIwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkVGVtcFMwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMwotICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxVGVtcFAwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFUZW1wUTAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVRlbXBSMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxVGVtcFMwMSwgIzUgICAgICAgIAotCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgotICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2MKLSAgICAgICAgOy8vIENhc2UgbgotICAgICAgICBNX1BSSU5URiAiQ2FzZSBjIFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMCwgZEFjY1YwLCBkU3JjMQotICAgICAgICBWUkhBREQgICAgICBkQWNjVjIsIGRBY2NWMiwgZFNyYzMKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YxLCBkQWNjVjEsIGRTcmMyCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMywgZEFjY1YzLCBkU3JjNAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2QKLSAgICAgICAgOy8vIENhc2UgcAotICAgICAgICBNX1BSSU5URiAiQ2FzZSBkIFxuIgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmNCSywgc3JjU3RlcAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkQWNjVjAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRBY2NWMgotICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZEFjY1YxCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkQWNjVjMgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfZQotICAgICAgICA7Ly8gQ2FzZSBxCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGUgXG4iCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVJlczMsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxUmVzNCwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFSZXM1LCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVJlczYsICM1ICAgICAgICAKLQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9mCi0gICAgICAgIDsvLyBDYXNlIHIKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgZiBcbiIKLSAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmNCSywgc3JjU3RlcAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkQWNjVjAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRBY2NWMgotICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZEFjY1YxCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkQWNjVjMgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLQotCi1CbG9jazR4NExvb3BFbmQKLQotICAgICAgICA7Ly8gV2lkdGggTG9vcAotICAgICAgICA7Ly9NX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIExETSAgICAgICAgIHBBcmdzLCB7cFNyYyxzcmNTdGVwLHBEc3QsZHN0U3RlcH0gIDsvLyBMb2FkIGFyZ3VtZW50cwotICAgICAgICBTVUJTICAgICAgICBpV2lkdGgsIGlXaWR0aCwgIzQKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzQgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzQKLSAgICAgICAgQkdUICAgICAgICAgQmxvY2s0eDRXaWR0aExvb3AKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBIZWlnaHQgTG9vcAotICAgICAgICBTVUJTICAgICAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAotICAgICAgICBNX0xEUiAgICAgICBpV2lkdGgsIHB0cldpZHRoCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBpV2lkdGgKLSAgICAgICAgU1VCICAgICAgICAgcERzdCwgcERzdCwgaVdpZHRoCi0gICAgICAgIEJHVCAgICAgICAgIEJsb2NrNHg0SGVpZ2h0TG9vcAotCi1FbmRPZkludGVycG9sYXRpb24KLSAgICAgICAgTU9WICAgICAgICAgcjAsICMwCi0gICAgICAgIE1fRU5EICAgICAgIAotCi0gICAgRU5ESUYgIAotICAgICAgICA7Ly8gRW5kIG9mIENvcnRleEE4Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY0MThmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotICAgICAgICAgCi0gICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgIAotICAgICBBUkVBIHRhYmxlLCBEQVRBICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAotICAgIERDRCAgT01YX1ZDX0NIUk9NQV9EQywgICAgIE9NWF9WQ19DSFJPTUFfSE9SIAotICAgIERDRCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUgIAotICAgIAotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgsMQotICAgIERDVyAgIDMsIDIsIDEsNCAKLSAgICBEQ1cgIC0zLC0yLC0xLDAKLSAgICBEQ1cgICAxLCAyLCAzLDQKLSAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgIElGIENvcnRleEE4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAKLXBjICAgICAgICAgICAgICBSTiAxNSAgIAotcmV0dXJuICAgICAgICAgIFJOIDAgIAotcFRhYmxlICAgICAgICAgIFJOIDggCi0gIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBJbnB1dCBBcmd1bWVudHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKLWxlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWF2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcE11bHRpcGxpZXJUYWJsZSAgICBSTiAgMiAgICAgCi0KLXBUbXAgICAgICAgICAgICBSTiA5Ci1zdGVwICAgICAgICAgICAgUk4gMTAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gTmVvbiBSZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ly8gT01YX1ZDX0NIUk9NQV9IT1IKLQotZExlZnRWYWwwICAgICAgIEROICBEMC44Ci1kTGVmdFZhbDEgICAgICAgRE4gIEQxLjgKLWRMZWZ0VmFsMiAgICAgICBETiAgRDIuOAotZExlZnRWYWwzICAgICAgIEROICBEMy44Ci1kTGVmdFZhbDQgICAgICAgRE4gIEQ0LjgKLWRMZWZ0VmFsNSAgICAgICBETiAgRDUuOAotZExlZnRWYWw2ICAgICAgIEROICBENi44Ci1kTGVmdFZhbDcgICAgICAgRE4gIEQ3LjgKLQotOy8vIE9NWF9WQ19DSFJPTUFfVkVSVAotCi1kQWJvdmVWYWwgICAgICAgRE4gIEQwLlU4Ci0KLTsvLyBPTVhfVkNfQ0hST01BX0RDCi0KLWRMZWZ0VmFsICAgICAgICBETiAgRDEuVTgKLWRTdW1BYm92ZVZhbFUxNiBETiAgRDIuVTE2Ci1kU3VtQWJvdmVWYWxVMzIgRE4gIEQzLlUzMgotZFN1bUFib3ZlVmFsVTggIEROICBEMy5VOAotZFN1bUxlZnRWYWxVMTYgIEROICBEMi5VMTYKLWRTdW1MZWZ0VmFsVTMyICBETiAgRDEuVTMyCi1kU3VtTGVmdFZhbFU4ICAgRE4gIEQxLlU4Ci1kU3VtQWJvdmVMZWZ0ICAgRE4gIEQyLlUzMgotZFN1bUFib3ZlTGVmdFU4IEROICBEMi5VOAotZEluZGV4Um93MFU4ICAgIEROICBENS5VOAotZEluZGV4Um93MCAgICAgIEROICBENS5VNjQKLWRJbmRleFJvdzRVOCAgICBETiAgRDYuVTgKLWRJbmRleFJvdzQgICAgICBETiAgRDYuVTY0Ci1kRHN0Um93MCAgICAgICAgRE4gIEQwLlU4Ci1kRHN0Um93NCAgICAgICAgRE4gIEQ0LlU4Ci1kQ29uc3QxMjhVOCAgICAgRE4gIEQwLlU4Ci0KLTsvLyBPTVhfVkNfQ0hST01BX1BMQU5FCi0KLWRSZXZBYm92ZVZhbCAgICBETiAgRDMuVTggIAotZFJldkFib3ZlVmFsVTY0IEROICBEMy5VNjQgIAotZEFib3ZlTGVmdFZhbCAgIEROICBEMi5VOAotcUFib3ZlN21pbnVzMCAgIFFOICBRMy5TMTYgCi1xQWJvdmVEaWZmICAgICAgUU4gIFEyLlMxNiAKLWRJbmRleCAgICAgICAgICBETiAgRDguVTggIAotZERpZmZBYm92ZVU4ICAgIEROICBEOS5VOCAgCi1kRGlmZkFib3ZlUzE2ICAgRE4gIEQ5LlMxNiAKLWRBYm92ZURpZmYwVTggICBETiAgRDQuVTggIAotZEFib3ZlRGlmZjBVNjQgIEROICBENC5VNjQKLWRBYm92ZTdtaW51czBVOCBETiAgRDYuVTggIAotZE11bHRpcGxpZXIgICAgIEROICBEMTAuUzE2IAotZEhvclByZWQgICAgICAgIEROICBEMTEuUzE2IAotZFJldkxlZnRWYWwgICAgIEROICBEMy5VOAotZFJldkxlZnRWYWxVNjQgIEROICBEMy5VNjQKLXFMZWZ0N21pbnVzMCAgICBRTiAgUTcuUzE2Ci1xTGVmdERpZmYgICAgICAgUU4gIFE2LlMxNgotZERpZmZMZWZ0VTggICAgIEROICBEMTYuVTgKLWREaWZmTGVmdFMxNiAgICBETiAgRDE2LlMxNgotZExlZnREaWZmMFU4ICAgIEROICBEMTIuVTgKLWRMZWZ0RGlmZjBVNjQgICBETiAgRDEyLlU2NAotZExlZnQ3bWludXMwVTggIEROICBEMTQuVTgKLWRWZXJQcmVkICAgICAgICBETiAgRDMuUzE2IAotZEhWVmFsUzE2ICAgICAgIEROICBEMy5TMTYKLWRIVlZhbFMzMiAgICAgICBETiAgRDMuUzMyCi1kSFZUZW1wUzMyICAgICAgRE4gIEQyLlMzMgotcUEgICAgICAgICAgICAgIFFOICBRMC5TMTYKLXFCICAgICAgICAgICAgICBRTiAgUTIuUzE2Ci1xQyAgICAgICAgICAgICAgUU4gIFEzLlMxNgotcU11bHRpcGxpZXIgICAgIFFOICBRNS5TMTYKLWRNdWx0aXBsaWVyMCAgICBETiAgRDEwLlMxNgotZE11bHRpcGxpZXIxICAgIEROICBEMTEuUzE2Ci1xQzAgICAgICAgICAgICAgUU4gIFEwLlMxNgotcUMxICAgICAgICAgICAgIFFOICBRMS5TMTYKLXFDMiAgICAgICAgICAgICBRTiAgUTQuUzE2Ci1xQzMgICAgICAgICAgICAgUU4gIFE1LlMxNgotcUM0ICAgICAgICAgICAgIFFOICBRNi5TMTYKLXFDNSAgICAgICAgICAgICBRTiAgUTcuUzE2Ci1xQzYgICAgICAgICAgICAgUU4gIFE4LlMxNgotcUM3ICAgICAgICAgICAgIFFOICBROS5TMTYKLXFTdW0wICAgICAgICAgICBRTiAgUTAuUzE2Ci1xU3VtMSAgICAgICAgICAgUU4gIFExLlMxNgotcVN1bTIgICAgICAgICAgIFFOICBRNC5TMTYKLXFTdW0zICAgICAgICAgICBRTiAgUTUuUzE2Ci1xU3VtNCAgICAgICAgICAgUU4gIFE2LlMxNgotcVN1bTUgICAgICAgICAgIFFOICBRNy5TMTYKLXFTdW02ICAgICAgICAgICBRTiAgUTguUzE2Ci1xU3VtNyAgICAgICAgICAgUU4gIFE5LlMxNgotZFN1bTAgICAgICAgICAgIEROICBEMC5VOAotZFN1bTEgICAgICAgICAgIEROICBEMS5VOAotZFN1bTIgICAgICAgICAgIEROICBEMi5VOAotZFN1bTMgICAgICAgICAgIEROICBEMy5VOAotZFN1bTQgICAgICAgICAgIEROICBENC5VOAotZFN1bTUgICAgICAgICAgIEROICBENS5VOAotZFN1bTYgICAgICAgICAgIEROICBENi5VOAotZFN1bTcgICAgICAgICAgIEROICBENy5VOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCByMTAsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDggICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAotICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCi0KLU9NWF9WQ19DSFJPTUFfREMKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKLSAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OExlZnROb3RBdmFpbGFibGUKLQotICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotCi0gICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFswXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzFdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFszXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs2XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzddfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0gICAgICAKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCi0gICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhMZWZ0T25seUF2YWlsYWJsZQotCi0gICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgYWxzbwotICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDddICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCs1KzYrNyB8ICAwKzErMiszIF0gCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA0KzUrNis3IHwgIDArMSsyKzMgXSAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgIGRTdW1BYm92ZUxlZnQsZFN1bUFib3ZlVmFsVTMyLGRTdW1MZWZ0VmFsVTMyCi0gICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZUxlZnQsZFN1bUFib3ZlTGVmdCwjMyAgICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDQpID4+IDMKLSAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlVmFsVTMyLGRTdW1BYm92ZVZhbFUzMiwjMiAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICBWUlNIUiAgICBkU3VtTGVmdFZhbFUzMixkU3VtTGVmdFZhbFUzMiwjMiAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCi0gICAgICAgIAotICAgICAgICBWTU9WICAgICBkSW5kZXhSb3cwVTgsIzB4MGMgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzRVOCwjMHgwNAotICAgICAgICBWU0hMICAgICBkSW5kZXhSb3cwLGRJbmRleFJvdzAsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4MCA9IDB4MGMwYzBjMGMwMDAwMDAwMCAKLSAgICAgICAgVlNIUiAgICAgZEluZGV4Um93NCxkSW5kZXhSb3c0LCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleDQgPSAweDAwMDAwMDAwMDQwNDA0MDQKLSAgICAgICAgVkFERCAgICAgZEluZGV4Um93NFU4LGRJbmRleFJvdzRVOCxkSW5kZXhSb3cwVTggICAgIDsvLyBpbmRleDQgPSAweDBjMGMwYzBjMDQwNDA0MDQKLSAgICAgICAgVlRCTCAgICAgZERzdFJvdzAse2RTdW1BYm92ZUxlZnRVOCxkU3VtQWJvdmVWYWxVOH0sZEluZGV4Um93MFU4Ci0gICAgICAgIFZUQkwgICAgIGREc3RSb3c0LHtkU3VtTGVmdFZhbFU4LGRTdW1BYm92ZUxlZnRVOH0sZEluZGV4Um93NFU4Ci0gCi1EQ0Nocm9tYTh4OExlZnRTdG9yZSAgICAgICAKLSAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0KLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotCi1EQ0Nocm9tYTh4OExlZnRPbmx5QXZhaWxhYmxlCi0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDQrNSs2KzcgfCAgMCsxKzIrMyBdICAgCi0gICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKLSAgICAgICAgCi0gICAgICAgIFZEVVAgICAgIGREc3RSb3cwLGRTdW1MZWZ0VmFsVThbMF0KLSAgICAgICAgVkRVUCAgICAgZERzdFJvdzQsZFN1bUxlZnRWYWxVOFs0XQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhMZWZ0U3RvcmUgIAotICAgICAgICAKLQotRENDaHJvbWE4eDhMZWZ0Tm90QXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgotICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4Tm9uZUF2YWlsYWJsZQotCi0gICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgCi0gICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gN10gIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUxNiwgZEFib3ZlVmFsICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTMyLCBkU3VtQWJvdmVWYWxVMTYgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQrNSs2KzcgfCAgMCsxKzIrMyBdIAotICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCi0gICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzBVOCwjMHgwNAotICAgICAgICBWU0hMICAgICBkSW5kZXhSb3cwLGRJbmRleFJvdzAsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4ID0gMHgwNDA0MDQwNDAwMDAwMDAwCi0gICAgICAgIFZUQkwgICAgIGREc3RSb3cwLHtkU3VtQWJvdmVWYWxVOH0sZEluZGV4Um93MFU4IAotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhVcHBlclN0b3JlCi0gICAgICAgIAotCi1EQ0Nocm9tYTh4OE5vbmVBdmFpbGFibGUgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVk1PViAgICAgZENvbnN0MTI4VTgsIzB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAweDgwODA4MDgwODA4MDgwODAgaWYoY291bnQgPT0gMCkKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCi0KLURDQ2hyb21hOHg4VXBwZXJTdG9yZSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgCi0gICAgICAgIE1fRVhJVAotCi0KLU9NWF9WQ19DSFJPTUFfVkVSVAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFVwcGVyU3RvcmUKLSAgICAgICAgCi0KLU9NWF9WQ19DSFJPTUFfSE9SCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwwW119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMVtdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDJbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwzW119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNFtdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDVbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw2W119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsN1tdfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhQbGFuZVN0b3JlCi0gICAgICAgIAotICAgICAgICAKLU9NWF9WQ19DSFJPTUFfUExBTkUKLSAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW3hdICAgICAgOjA8PSB4IDw9IDcgICAKLSAgICAgICAgVkxEMSAgICBkQWJvdmVMZWZ0VmFsWzBdLFtwU3JjQWJvdmVMZWZ0XQotICAgICAgICAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs0XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzVdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs3XX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZSRVY2NCAgZFJldkFib3ZlVmFsLGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmV2ZXJzZSBvcmRlciBvZiBieXRlcyA9IHBTcmNBYm92ZVswOjE6MjozOjQ6NTo2OjddCi0gICAgICAgIFZTVUJMICAgcUFib3ZlN21pbnVzMCxkUmV2QWJvdmVWYWwsZEFib3ZlTGVmdFZhbCAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNBYm92ZVs3XSAtIHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgVlNIUiAgICBkUmV2QWJvdmVWYWxVNjQsZFJldkFib3ZlVmFsVTY0LCM4ICAgICAgICAgIDsvLyBwU3JjQWJvdmVbWDowOjE6MjozOjQ6NTo2XQotICAgICAgICBWU1VCTCAgIHFBYm92ZURpZmYsZFJldkFib3ZlVmFsLGRBYm92ZVZhbCAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XSAtIHBTcmNBYm92ZVsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XSAtIHBTcmNBYm92ZVsyXQotICAgICAgICAKLSAgICAgICAgVlJFVjY0ICBkUmV2TGVmdFZhbCxkTGVmdFZhbCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXZlcnNlIG9yZGVyIG9mIGJ5dGVzID0gcFNyY0xlZnRbMDoxOjI6Mzo0OjU6Njo3XQotICAgICAgICBWU1VCTCAgIHFMZWZ0N21pbnVzMCxkUmV2TGVmdFZhbCxkQWJvdmVMZWZ0VmFsICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjTGVmdFs3XSAtIHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgVlNIUiAgICBkUmV2TGVmdFZhbFU2NCxkUmV2TGVmdFZhbFU2NCwjOCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFtYOjA6MToyOjM6NDo1OjZdCi0gICAgICAgIFZTVUJMICAgcUxlZnREaWZmLGRSZXZMZWZ0VmFsLGRMZWZ0VmFsICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNl0gLSBwU3JjTGVmdFswXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzVdIC0gcFNyY0xlZnRbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0XSAtIHBTcmNMZWZ0WzJdCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIHBNdWx0aXBsaWVyVGFibGUsPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4ICAgOy8vIFVzZWQgdG8gY2FsY3VsYXRlIEh2YWwgJiBWdmFsICAKLSAgICAgICAgVlNITCAgICBkQWJvdmVEaWZmMFU2NCxkQWJvdmVEaWZmMFU2NCwjMTYgIAotICAgICAgICBWRVhUICAgIGREaWZmQWJvdmVVOCxkQWJvdmVEaWZmMFU4LGRBYm92ZTdtaW51czBVOCwjMiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNy0wIHwgNC0yIHwgNS0xIHwgNi0wIF0KLSAgICAgICAgVkxEMSAgICBkTXVsdGlwbGllcixbcE11bHRpcGxpZXJUYWJsZV0hIAotICAgICAgICBWU0hMICAgIGRMZWZ0RGlmZjBVNjQsZExlZnREaWZmMFU2NCwjMTYgIAotICAgICAgICBWRVhUICAgIGREaWZmTGVmdFU4LGRMZWZ0RGlmZjBVOCxkTGVmdDdtaW51czBVOCwjMiAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA3LTAgfCA0LTIgfCA1LTEgfCA2LTAgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZNVUwgICAgZEhvclByZWQsZERpZmZBYm92ZVMxNixkTXVsdGlwbGllciAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0Kig3LTApIHwgMSooNC0yKSB8IDIqKDUtMSkgfCAzKig2LTApIF0KLSAgICAgICAgVk1VTCAgICBkVmVyUHJlZCxkRGlmZkxlZnRTMTYsZE11bHRpcGxpZXIKLSAgICAgICAgVlBBREQgICBkSFZWYWxTMTYsZEhvclByZWQsZFZlclByZWQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWUEFEREwgIGRIVlZhbFMzMixkSFZWYWxTMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtWfEhdIGluIDMyIGJpdHMgZWFjaAotICAgICAgICBWU0hMICAgIGRIVlRlbXBTMzIsZEhWVmFsUzMyLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE3KkggPSAxNipIICsgSCA9IChIPDw0KStICi0gICAgICAgIFZBREQgICAgZEhWVmFsUzMyLGRIVlZhbFMzMixkSFZUZW1wUzMyICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWyAxNypWICB8IDE3KkggXWluIDMyIGJpdHMgZWFjaAotICAgICAgICBWTEQxICAgIHtkTXVsdGlwbGllcjAsZE11bHRpcGxpZXIxfSxbcE11bHRpcGxpZXJUYWJsZV0gICAgICAgICAgOy8vIHFNdWx0aXBsaWVyID0gWyA0fDN8MnwxfDB8LTF8LTJ8LTMgXSAgCi0gICAgICAgIFZSU0hSICAgZEhWVmFsUzMyLGRIVlZhbFMzMiwjNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2N8Yl0gaW4gMTZiaXRzIGVhY2gKLSAgICAgICAgVkFEREwgICBxQSxkQWJvdmVWYWwsZExlZnRWYWwKLSAgICAgICAgVkRVUCAgICBxQSxxQVs3XQotICAgICAgICBWU0hMICAgIHFBLHFBLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFthfGF8YXxhfGF8YXxhfGFdCi0gICAgICAgIFZEVVAgICAgcUIsZEhWVmFsUzE2WzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2J8YnxifGJ8YnxifGJ8Yl0KLSAgICAgICAgVkRVUCAgICBxQyxkSFZWYWxTMTZbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbY3xjfGN8Y3xjfGN8Y3xjXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZNVUwgICAgcUIscUIscU11bHRpcGxpZXIKLSAgICAgICAgVk1VTCAgICBxQyxxQyxxTXVsdGlwbGllcgotICAgICAgICBWQUREICAgIHFCLHFCLHFBIAotICAgICAgICAKLSAgICAgICAgVkRVUCAgICBxQzAscUNbMF0KLSAgICAgICAgVkRVUCAgICBxQzEscUNbMV0KLSAgICAgICAgVkRVUCAgICBxQzIscUNbMl0KLSAgICAgICAgVkRVUCAgICBxQzMscUNbM10KLSAgICAgICAgVkRVUCAgICBxQzQscUNbNF0KLSAgICAgICAgVkRVUCAgICBxQzUscUNbNV0KLSAgICAgICAgVkRVUCAgICBxQzYscUNbNl0KLSAgICAgICAgVkRVUCAgICBxQzcscUNbN10KLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgcVN1bTAscUIscUMwCi0gICAgICAgIFZBREQgICAgcVN1bTEscUIscUMxCi0gICAgICAgIFZBREQgICAgcVN1bTIscUIscUMyCi0gICAgICAgIFZBREQgICAgcVN1bTMscUIscUMzCi0gICAgICAgIFZBREQgICAgcVN1bTQscUIscUM0Ci0gICAgICAgIFZBREQgICAgcVN1bTUscUIscUM1Ci0gICAgICAgIFZBREQgICAgcVN1bTYscUIscUM2Ci0gICAgICAgIFZBREQgICAgcVN1bTcscUIscUM3Ci0gICAgICAgIAotICAgICAgICBWUVJTSFJVTiBkU3VtMCxxU3VtMCwjNSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gKE9NWF9VOClhcm1DbGlwKDAsMjU1LChTdW0rMTYpPj41KQotICAgICAgICBWUVJTSFJVTiBkU3VtMSxxU3VtMSwjNQotICAgICAgICBWUVJTSFJVTiBkU3VtMixxU3VtMiwjNQotICAgICAgICBWUVJTSFJVTiBkU3VtMyxxU3VtMywjNQotICAgICAgICBWUVJTSFJVTiBkU3VtNCxxU3VtNCwjNQotICAgICAgICBWUVJTSFJVTiBkU3VtNSxxU3VtNSwjNQotICAgICAgICBWUVJTSFJVTiBkU3VtNixxU3VtNiwjNQotICAgICAgICBWUVJTSFJVTiBkU3VtNyxxU3VtNywjNSAgICAgIAotCi1EQ0Nocm9tYTh4OFBsYW5lU3RvcmUgICAgICAgIAotICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRTdW0wLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtMSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTIsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW0zLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtNCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTUsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW02LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtNyxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3ICAgICAgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIEVORAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggZW5kcwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMzMxZjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgIAotICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNgotICAgIERDRCAgT01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IgCi0gICAgRENEICBPTVhfVkNfMTZYMTZfREMsICAgT01YX1ZDXzE2WDE2X1BMQU5FCi0gICAgCi0KLSAgICBJRiBDb3J0ZXhBOAotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2LDEKLSAgICBEQ1cgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgOCAKLSAgICBEQ1cgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNwotICAgIERDVyAgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Ci0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBDb25zdGFudHMgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCi1CTEtfU0laRSAgICAgICAgRVFVIDB4MTAKLU1VTF9DT05TVDAgICAgICBFUVUgMHgwMTAxMDEwMQotTVVMX0NPTlNUMSAgICAgIEVRVSAweDAwMDYwMDA0Ci1NVUxfQ09OU1QyICAgICAgRVFVIDB4MDAwNzAwMDUKLU1VTF9DT05TVDMgICAgICBFUVUgMHgwMDAzMDAwMQotTUFTS19DT05TVCAgICAgIEVRVSAweDAwRkYwMEZGCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXkgICAgICAgICAgICAgICBSTiAxMiAgIAotcGMgICAgICAgICAgICAgIFJOIDE1ICAgCi0KLXJldHVybiAgICAgICAgICBSTiAwICAgIAotcFRhYmxlICAgICAgICAgIFJOIDkgICAgCi1jb3VudCAgICAgICAgICAgUk4gMTEgICAKLXBNdWx0VGFibGUgICAgICBSTiA5Ci07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTmVvbiByZWdpc3RlcnMKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcUFib3ZlICAgICAgICAgIFFOIFEwLlU4Ci1xTGVmdCAgICAgICAgICAgUU4gUTEuVTgKLXFTdW04ICAgICAgICAgICBRTiBRMC5VMTYKLWRTdW04MCAgICAgICAgICBETiBEMC5VMTYKLWRTdW04MSAgICAgICAgICBETiBEMS5VMTYKLWRTdW00ICAgICAgICAgICBETiBEMC5VMTYKLWRTdW0yICAgICAgICAgICBETiBEMC5VMzIKLWRTdW0xICAgICAgICAgICBETiBEMC5VNjQKLXFPdXQgICAgICAgICAgICBRTiBRMy5VOAotZFN1bUxlZnQgICAgICAgIEROIEQ2LlU2NAotZFN1bUFib3ZlICAgICAgIEROIEQ3LlU2NAotZFN1bSAgICAgICAgICAgIEROIEQ4LlU2NAotZFN1bTAgICAgICAgICAgIEROIEQ4LlU4WzBdCi0KLXFIICAgICAgICAgICAgICBRTiBRMTEuUzMyCi1xViAgICAgICAgICAgICAgUU4gUTEyLlMzMgotcUEgICAgICAgICAgICAgIFFOIFExMS5TMTYKLXFCICAgICAgICAgICAgICBRTiBRNi5TMTYKLXFDICAgICAgICAgICAgICBRTiBRNy5TMTYKLQotcUIwICAgICAgICAgICAgIFFOIFE1LlMxNgotcUIxICAgICAgICAgICAgIFFOIFE2LlMxNgotZEExICAgICAgICAgICAgIEROIEQyMy5TMTYKLQotZEgwICAgICAgICAgICAgIEROIEQyMi5TMzIKLWRIMSAgICAgICAgICAgICBETiBEMjMuUzMyCi1kVjAgICAgICAgICAgICAgRE4gRDI0LlMzMgotZFYxICAgICAgICAgICAgIEROIEQyNS5TMzIKLQotcUhWICAgICAgICAgICAgIFFOIFExMS5TNjQKLXFIVjAgICAgICAgICAgICBRTiBRMTEuUzMyCi1xSFYxICAgICAgICAgICAgUU4gUTEyLlM2NAotCi1kSFYwMCAgICAgICAgICAgRE4gRDIyLlMzMgotZEhWMDEgICAgICAgICAgIEROIEQyMy5TMzIKLQotZEhWMCAgICAgICAgICAgIEROIEQyMi5TMTZbMF0KLWRIVjEgICAgICAgICAgICBETiBEMjMuUzE2WzBdCi1kSFYxMCAgICAgICAgICAgRE4gRDI0LlM2NAotZEhWMTEgICAgICAgICAgIEROIEQyNS5TNjQKLQotcVN1bTAgICAgICAgICAgIFFOIFEwLlMxNgotcVN1bTEgICAgICAgICAgIFFOIFExLlMxNgotCi1kT3V0MCAgICAgICAgICAgRE4gRDYuVTgKLWRPdXQxICAgICAgICAgICBETiBENy5VOAotCi1kTGVmdDAgICAgICAgICAgRE4gRDIuVTgKLWRMZWZ0MSAgICAgICAgICBETiBEMy5VOAotcUNvbnN0ICAgICAgICAgIFFOIFExMy5TMTYKLQotZEFib3ZlMCAgICAgICAgIEROIEQwLlU4Ci1kQWJvdmUxICAgICAgICAgRE4gRDEuVTgKLQotZFJldkxlZnQ2NCAgICAgIEROIEQxMi5VNjQKLWRSZXZMZWZ0ICAgICAgICBETiBEMTIuVTgKLWRSZXZBYm92ZTY0ICAgICBETiBENS5VNjQKLWRSZXZBYm92ZSAgICAgICBETiBENS5VOAotcUxlZnREaWZmICAgICAgIFFOIFE4LlMxNgotZExlZnREaWZmMSAgICAgIEROIEQxNy5TMTYKLWRMZWZ0RGlmZjY0ICAgICBETiBEMTcuUzY0Ci1xRGlmZkxlZnQgICAgICAgUU4gUTguUzE2Ci1xRGlmZkFib3ZlICAgICAgUU4gUTQuUzE2Ci1kQWJvdmVEaWZmMSAgICAgRE4gRDkuUzE2Ci1kQWJvdmVEaWZmNjQgICAgRE4gRDkuUzY0Ci1xQWJvdmVEaWZmICAgICAgUU4gUTQuUzE2Ci0KLWRBYm92ZUxlZnQgICAgICBETiBENC5VOAotCi1kRGlmZkxlZnQwICAgICAgRE4gRDE2LlMxNgotZERpZmZMZWZ0MSAgICAgIEROIEQxNy5TMTYKLWREaWZmQWJvdmUwICAgICBETiBEOC5TMTYKLWREaWZmQWJvdmUxICAgICBETiBEOS5TMTYKLQotcUxlZnQxNW1pbnVzMCAgIFFOIFE3LlMxNgotZExlZnQxNW1pbnVzMCAgIEROIEQxNC5TMTYKLXFBYm92ZTE1bWludXMwICBRTiBRMy5TMTYKLWRBYm92ZTE1bWludXMwICBETiBENi5TMTYKLQotcU11bHRpcGxpZXIgICAgIFFOIFExMC5TMTYKLXFNdWx0aXBsaWVyMCAgICBRTiBRMTAuUzE2Ci1xTXVsdGlwbGllcjEgICAgUU4gUTEyLlMxNgotZE11bHRpcGxpZXIwICAgIEROIEQyMC5TMTYKLWRNdWx0aXBsaWVyMSAgICBETiBEMjEuUzE2Ci0KLWRCUGx1c0NNdWx0NyAgICBETiBEMS5TNjQKLWRCUGx1c0NNdWx0N1MxNiBETiBEMS5TMTYKLQotcVRtcCAgICAgICAgICAgIFFOIFEwLlU4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKLWxlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWF2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotCi1wVG1wICAgICAgICAgICAgUk4gOAotc3RlcCAgICAgICAgICAgIFJOIDEwCi1wVG1wMiAgICAgICAgICAgUk4gMTEKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIHIxMSwgZDE1Ci0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAotICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNiA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAotICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50Ci0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotICAgICAgICAKLU9NWF9WQ18xNlgxNl9WRVJUCi0gICAgICAgIFZMRDEgICAgcUFib3ZlLCAgW3BTcmNBYm92ZV0KLSAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XQotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdCi0gICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU9NWF9WQ18xNlgxNl9IT1IKLSAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBsZWZ0U3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgcFRtcDIsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RTdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi1Mb29wSG9yIAotICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzgKLSAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCi0gICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKLSAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAotICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBCTkUgICAgICBMb29wSG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciAxNiB0aW1lcwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU9NWF9WQ18xNlgxNl9EQwotICAgICAgICBNT1YgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY291bnQgPSAwCi0gICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCi0gICAgICAgIEJFUSAgICAgIFVwcGVyT3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBsZWZ0Ci0KLSAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLQotICAgICAgICBWTEQxICAgIHtxTGVmdFswXX0sIFtwU3JjTGVmdF0sc3RlcCAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMV19LCBbcFRtcF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsyXX0sIFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFszXX0sIFtwVG1wXSxzdGVwCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzRdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzVdfSwgW3BUbXBdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNl19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzddfSwgW3BUbXBdLHN0ZXAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbOF19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzldfSwgW3BUbXBdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTBdfSxbcFNyY0xlZnRdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTFdfSxbcFRtcF0sc3RlcCAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTJdfSxbcFNyY0xlZnRdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTNdfSxbcFRtcF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxNF19LFtwU3JjTGVmdF0sc3RlcCAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTVdfSxbcFRtcF0gCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBxU3VtOCwgcUxlZnQKLSAgICAgICAgQUREICAgICBjb3VudCwgY291bnQsICMxICAgIAotICAgICAgICBWUEFERCAgICBkU3VtNCwgZFN1bTgwLCBkU3VtODEKLSAgICAgICAgVlBBRERMICAgZFN1bTIsIGRTdW00Ci0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0LCBkU3VtMgotICAgICAgICBWUlNIUiAgICBkU3VtLCBkU3VtTGVmdCwgIzQKLSAgICAgICAgCi1VcHBlck9yTm9uZUF2YWlsYWJsZQotICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICAjT01YX1ZDX1VQUEVSICAgICAgICAgICAgICA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgI09NWF9WQ19VUFBFUikKLSAgICAgICAgQkVRICAgICAgQm90aE9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKLSAgICAgICAgVkxEMSAgICAgcUFib3ZlLCBbcFNyY0Fib3ZlXQotICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgdXBwZXIgaW5jIGNvdW50IGJ5IDEKLSAgICAgICAgVlBBRERMICAgcVN1bTgsIHFBYm92ZQotICAgICAgICBWUEFERCAgICBkU3VtNCwgZFN1bTgwLCBkU3VtODEKLSAgICAgICAgVlBBRERMICAgZFN1bTIsIGRTdW00Ci0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZSwgZFN1bTIKLSAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bUFib3ZlLCAjNAotICAgICAgICAKLUJvdGhPck5vbmVBdmFpbGFibGUKLSAgICAgICAgQ01QICAgICAgY291bnQsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBib3RoIGF2YWlsYWJsZQotICAgICAgICBCTkUgICAgICBOb25lQXZhaWxhYmxlCi0gICAgICAgIFZBREQgICAgIGRTdW0sIGRTdW1BYm92ZSwgZFN1bUxlZnQKLSAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bSwgIzUKLSAgICAgICAgCi0KLU5vbmVBdmFpbGFibGUKLSAgICAgICAgVkRVUCAgICAgcU91dCwgZFN1bTAgICAgICAgIAotICAgICAgICBDTVAgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIG5vbmUgYXZhaWxhYmxlCi0gICAgICAgIEFERCAgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBCTkUgICAgICBMb29wREMKLSAgICAgICAgVk1PViAgICAgcU91dCwgIzEyOAotTG9vcERDICAgICAgICAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgTU9WICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotCi1PTVhfVkNfMTZYMTZfUExBTkUKLSAgICAgICAgTERSICAgICBwTXVsdFRhYmxlLCA9YXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNgotICAgICAgICBWTEQxICAgIHFBYm92ZSwgW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgIAotICAgICAgICBWTEQxICAgIGRBYm92ZUxlZnRbMF0sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMF19LCAgW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzFdfSwgIFtwVG1wXSxzdGVwICAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzJdfSwgIFtwU3JjTGVmdF0sc3RlcCAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzNdfSwgIFtwVG1wXSxzdGVwICAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs0XX0sICBbcFNyY0xlZnRdLHN0ZXAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs1XX0sICBbcFRtcF0sc3RlcCAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs2XX0sICBbcFNyY0xlZnRdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbN119LCAgW3BUbXBdLHN0ZXAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbOF19LCAgW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzldfSwgIFtwVG1wXSxzdGVwICAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEwXX0sIFtwU3JjTGVmdF0sc3RlcCAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzExXX0sIFtwVG1wXSxzdGVwICAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxMl19LCBbcFNyY0xlZnRdLHN0ZXAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxM119LCBbcFRtcF0sc3RlcCAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxNF19LCBbcFNyY0xlZnRdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTVdfSwgW3BUbXBdICAgCi0KLSAgICAgICAgVlJFVjY0ICBkUmV2QWJvdmUsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTU6MTQ6MTM6MTI6MTE6MTA6OTo4XSAKLSAgICAgICAgVlNVQkwgICBxQWJvdmUxNW1pbnVzMCwgZFJldkFib3ZlLCBkQWJvdmVMZWZ0ICAgICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0Fib3ZlWzE1XSAtIHBTcmNBYm92ZUxlZnRbMF0gCi0gICAgICAgIFZTSFIgICAgZFJldkFib3ZlNjQsIGRSZXZBYm92ZTY0LCAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzE0OjEzOjEyOjExOjEwOjk6ODpYXSAKLSAgICAgICAgVlNVQkwgICBxQWJvdmVEaWZmLCBkUmV2QWJvdmUsIGRBYm92ZTAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNITCAgICBkQWJvdmVEaWZmNjQsIGRBYm92ZURpZmY2NCwgIzE2IAotICAgICAgICBWRVhUICAgIGREaWZmQWJvdmUxLCBkQWJvdmVEaWZmMSwgZEFib3ZlMTVtaW51czAsICMxICAKLQotICAgICAgICBWUkVWNjQgIGRSZXZMZWZ0LGRMZWZ0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzE1OjE0OjEzOjEyOjExOjEwOjk6OF0gCi0gICAgICAgIFZTVUJMICAgcUxlZnQxNW1pbnVzMCxkUmV2TGVmdCwgZEFib3ZlTGVmdCAgICAgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNMZWZ0WzddIC0gcFNyY0Fib3ZlTGVmdFswXSAKLSAgICAgICAgVlNIUiAgICBkUmV2TGVmdDY0LCBkUmV2TGVmdDY0LCAjOCAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxNDoxMzoxMjoxMToxMDo5Ojg6WF0gCi0gICAgICAgIFZTVUJMICAgcUxlZnREaWZmLGRSZXZMZWZ0LCBkTGVmdDAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNdWx0aXBsaWVyID0gWzh8MXwyfC4uLnw2fDddCi0gICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIsIFtwTXVsdFRhYmxlXSEgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTSEwgICAgZExlZnREaWZmNjQsIGRMZWZ0RGlmZjY0LCAjMTYKLSAgICAgICAgVkVYVCAgICBkRGlmZkxlZnQxLCBkTGVmdERpZmYxLCBkTGVmdDE1bWludXMwLCAjMSAgICAgCi0gICAgICAgIAotICAgICAgICBWTVVMTCAgIHFILGREaWZmQWJvdmUwLCBkTXVsdGlwbGllcjAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZNVUxMICAgcVYsZERpZmZMZWZ0MCwgIGRNdWx0aXBsaWVyMCAgICAgICAgICAgICAgICAKLSAgICAgICAgVk1MQUwgICBxSCxkRGlmZkFib3ZlMSwgZE11bHRpcGxpZXIxIAotICAgICAgICBWTUxBTCAgIHFWLGREaWZmTGVmdDEsICBkTXVsdGlwbGllcjEKLSAgICAgICAgCi0gICAgICAgIFZQQUREICAgZEhWMDAsZEgxLGRIMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWUEFERCAgIGRIVjAxLGRWMSxkVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICBxSFYsIHFIVjAKLSAgICAgICAgVlNITCAgICBxSFYxLHFIViwjMgotICAgICAgICBWQUREICAgIHFIVixxSFYscUhWMSAKLSAgICAgICAgCi0gICAgICAgIDsvLyBIViA9IFtjID0gKCg1KlYrMzIpPj42KSB8IGIgPSAoKDUqSCszMik+PjYpXQotICAgICAgICBWUlNIUiAgIHFIVixxSFYsIzYKLSAgICAgICAgCi0gICAgICAgIDsvLyBIVjEgPSBbYyo3fGIqN10KLSAgICAgICAgVlNITCAgICBxSFYxLHFIViwjMwotICAgICAgICBWU1VCICAgIHFIVjEscUhWMSxxSFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE11bHRpcGxpZXIxID0gWzB8MXwyfC4uLnw3XQotICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyMCwgW3BNdWx0VGFibGVdISAgICAKLSAgICAgICAgVkRVUCAgICBxQiwgZEhWMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVkRVUCAgICBxQywgZEhWMSAKLSAgICAgICAgCi0gICAgICAgIFZBRERMICAgcUEsZEFib3ZlMSxkTGVmdDEKLSAgICAgICAgVlNITCAgICBxQSxxQSwgIzQKLSAgICAgICAgVkRVUCAgICBxQSxkQTFbM10gIAotICAgICAgICBWQUREICAgIGRCUGx1c0NNdWx0NywgZEhWMTAsIGRIVjExCi0gICAgICAgIAotICAgICAgICA7Ly8gTXVsdGlwbGllcjEgPSBbOHw5fDEwfC4uLnwxNV0KLSAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllcjEsIFtwTXVsdFRhYmxlXQotICAgICAgICA7Ly8gQ29uc3QgPSBhIC0gNyooYitjKQotICAgICAgICBWRFVQICAgIHFDb25zdCwgZEJQbHVzQ011bHQ3UzE2WzBdCi0gICAgICAgIFZTVUIgICAgcUNvbnN0LCBxQSwgcUNvbnN0Ci0gICAgICAgIAotICAgICAgICA7Ly8gQjAgPSBbMCpifDEqYnwyKmJ8MypifC4uLi4uLnw3KmJdCi0gICAgICAgIFZNVUwgICAgcUIwLHFCLHFNdWx0aXBsaWVyMAotICAgICAgICAKLSAgICAgICAgOy8vIEIwID0gWzgqYnw5KmJ8MTAqYnwxMSpifC4uLi58MTUqYl0KLSAgICAgICAgVk1VTCAgICBxQjEscUIscU11bHRpcGxpZXIxCi0gICAgICAgIAotICAgICAgICBWQUREICAgIHFTdW0wLCBxQjAsIHFDb25zdAotICAgICAgICBWQUREICAgIHFTdW0xLCBxQjEsIHFDb25zdCAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9vcHMgZm9yIDE2IHRpbWVzCi1Mb29wUGxhbmUgICAgICAgCi0gICAgICAgIDsvLyAoYip4ICsgYyp5ICsgQyk+PjUKLSAgICAgICAgVlFSU0hSVU4gZE91dDAsIHFTdW0wLCM1Ci0gICAgICAgIFZRUlNIUlVOIGRPdXQxLCBxU3VtMSwjNSAgICAgIAotICAgICAgICBTVUJTICAgICB5LCB5LCAjMQotICAgICAgICBWU1QxICAgICBxT3V0LFtwRHN0XSxkc3RTdGVwCi0gICAgICAgIFZBREQgICAgIHFTdW0wLHFTdW0wLHFDIAotICAgICAgICBWQUREICAgICBxU3VtMSxxU3VtMSxxQyAKLSAgICAgICAgQk5FICAgICAgTG9vcFBsYW5lCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAotICAgICAgICAgICAgCi0gICAgICAgIEVORAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IGVuZHMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTc4MGVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworKysgL2Rldi9udWxsCkBAIC0xLDU0NSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0gICAgICAgICAKLSAgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NAotICAgIERDRCAgT01YX1ZDXzR4NF9WRVJULCAgICAgT01YX1ZDXzR4NF9IT1IgCi0gICAgRENEICBPTVhfVkNfNHg0X0RDLCAgICAgICBPTVhfVkNfNHg0X0RJQUdfREwKLSAgICBEQ0QgIE9NWF9WQ180eDRfRElBR19EUiwgIE9NWF9WQ180eDRfVlIKLSAgICBEQ0QgIE9NWF9WQ180eDRfSEQsICAgICAgIE9NWF9WQ180eDRfVkwKLSAgICBEQ0QgIE9NWF9WQ180eDRfSFUgICAKLSAgICAKLSAgICAgICAgCi0gICAgICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmV0dXJuICAgICAgICAgIFJOIDAKLXBUYWJsZSAgICAgICAgICBSTiA4Ci1wYyAgICAgICAgICAgICAgUk4gMTUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgotbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1kc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wRHN0MSAgICAgICAgICAgUk4gMSAKLXBEc3QyICAgICAgICAgICBSTiA0IAotcERzdDMgICAgICAgICAgIFJOIDYgCi0KLXBTcmNUbXAgICAgICAgICBSTiA5Ci1zcmNTdGVwICAgICAgICAgUk4gMTAKLXBEc3RUbXAgICAgICAgICBSTiAxMQotZHN0ZXAgICAgICAgICAgIFJOIDEyCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBOZW9uIHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ly8gT01YX1ZDX0NIUk9NQV9WRVJUCi1kQWJvdmVVMzIgICAgICAgRE4gIEQwLlUzMgotCi07Ly8gT01YX1ZDX0NIUk9NQV9IT1IKLWRMZWZ0VmFsMCAgICAgICBETiAgRDAuOAotZExlZnRWYWwxICAgICAgIEROICBEMS44Ci1kTGVmdFZhbDIgICAgICAgRE4gIEQyLjgKLWRMZWZ0VmFsMyAgICAgICBETiAgRDMuOAotZExlZnRWYWwwVTMyICAgIEROICBEMC5VMzIKLWRMZWZ0VmFsMVUzMiAgICBETiAgRDEuVTMyCi1kTGVmdFZhbDJVMzIgICAgRE4gIEQyLlUzMgotZExlZnRWYWwzVTMyICAgIEROICBEMy5VMzIKLQotOy8vIE9NWF9WQ180eDRfREMKLWRMZWZ0VmFsICAgICAgICBETiAgRDAuVTgKLWRMZWZ0VmFsVTMyICAgICBETiAgRDAuVTMyCi1kU3VtQWJvdmVMZWZ0VTE2ICBETiAgRDEuVTE2Ci1kU3VtQWJvdmVMZWZ0VTMyICBETiAgRDEuVTMyCi1kU3VtQWJvdmVMZWZ0VTY0ICBETiAgRDEuVTY0Ci1kU3VtQWJvdmVMZWZ0VTggRE4gIEQxLlU4Ci1kU3VtICAgICAgICAgICAgRE4gIEQwLlU4Ci0KLWRTdW1MZWZ0VmFsVTE2ICBETiAgRDEuVTE2Ci1kU3VtTGVmdFZhbFUzMiAgRE4gIEQxLlUzMgotZFN1bUxlZnRWYWxVNjQgIEROICBEMS5VNjQKLWRTdW1MZWZ0VmFsVTggICBETiAgRDEuVTgKLQotZEFib3ZlVmFsICAgICAgIEROICBEMC5VOAotZFN1bUFib3ZlVmFsVTE2ICBETiAgRDEuVTE2Ci1kU3VtQWJvdmVWYWxVMzIgIEROICBEMS5VMzIKLWRTdW1BYm92ZVZhbFU2NCAgRE4gIEQxLlU2NAotZFN1bUFib3ZlVmFsVTggICBETiAgRDEuVTgKLWRDb25zdDEyOFU4ICAgICBETiAgRDAuVTgKLQotCi07Ly9PTVhfVkNfNHg0X0RJQUdfREwKLQotZEFib3ZlICAgICAgICAgIEROICBEMC5VOAotZFU3ICAgICAgICAgICAgIEROICBEMi5VOAotZFUzICAgICAgICAgICAgIEROICBEMi5VOAotZEFib3ZlMCAgICAgICAgIEROICBEMy5VOAotZEFib3ZlMSAgICAgICAgIEROICBENC5VOAotZEFib3ZlMiAgICAgICAgIEROICBENS5VOAotZFRtcCAgICAgICAgICAgIEROICBENi5VOAotZFRtcDAgICAgICAgICAgIEROICBENy5VOAotZFRtcDEgICAgICAgICAgIEROICBEOC5VOAotZFRtcDIgICAgICAgICAgICBETiAgRDkuVTgKLWRUbXAzICAgICAgICAgICAgRE4gIEQxMC5VOAotZFRtcFUzMiAgICAgICAgIEROICBENi5VMzIKLQotCi07Ly9PTVhfVkNfNHg0X0RJQUdfRFIKLWRMZWZ0ICAgICAgICAgICBETiAgRDEuVTgKLWRVTCAgICAgICAgICAgICBETiAgRDIuVTgKLQotOy8vT01YX1ZDXzR4NF9WUgotZExlZnQwICAgICAgICAgIEROICBEMS5VOAotZExlZnQxICAgICAgICAgIEROICBEMi5VOAotZEV2ZW4wICAgICAgICAgIEROICBEMy5VOAotZEV2ZW4xICAgICAgICAgIEROICBENC5VOAotZEV2ZW4yICAgICAgICAgIEROICBENS5VOAotZE9kZDAgICAgICAgICAgIEROICBENi5VOAotZE9kZDEgICAgICAgICAgIEROICBEMTEuVTgKLWRPZGQyICAgICAgICAgICBETiAgRDEyLlU4Ci1kVG1wM1UzMiAgICAgICAgRE4gIEQxMC5VMzIgICAgCi1kVG1wMlUzMiAgICAgICAgRE4gIEQ5LlUzMgotCi0KLTsvL09NWF9WQ180eDRfSEQKLWRUbXAxVTY0ICAgICAgICBETiAgRDguVTY0Ci1kVG1wMFU2NCAgICAgICAgRE4gIEQ3LlU2NAotZFRtcFU2NCAgICAgICAgIEROICBENi5VNjQKLWRUbXBVMzIgICAgICAgICBETiAgRDYuVTMyCi1kVG1wMVUzMiAgICAgICAgRE4gIEQ4LlUzMgotCi07Ly9PTVhfVkNfNHg0X0hVCi1kTDMgICAgICAgICAgICAgRE4gIEQyLlU4Ci1kTGVmdEhVMCAgICAgICAgRE4gIEQzLlU4Ci1kTGVmdEhVMSAgICAgICAgRE4gIEQ0LlU4Ci1kTGVmdEhVMiAgICAgICAgRE4gIEQ1LlU4Ci1kVG1wMFUzMiAgICAgICAgRE4gIEQ3LlUzMgotCi0KLQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCByMTIsZDEyCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAotICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQgIDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFJEICAgcHJlZE1vZGUsYXZhaWxhYmlsaXR5LFByZWRNb2RlICAgICA7Ly8gQXJnIHByZWRNb2RlICYgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFJEICAgbGVmdFN0ZXAsZHN0U3RlcCxMZWZ0U3RlcCAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwICYgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCi0KLQotT01YX1ZDXzR4NF9IT1IKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDBbXX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwxW119LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMltdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDNbXX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMFUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZExlZnRWYWwxVTMyWzBdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkTGVmdFZhbDJVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRMZWZ0VmFsM1UzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLSAgICAgICAgCi1PTVhfVkNfNHg0X1ZFUlQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UKLSAgICAgICAgVkxEMSAgICAgZEFib3ZlVTMyWzBdLFtwU3JjQWJvdmVdCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIAotRENQcmVkaWN0NHg0VmVydFN0b3JlICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RdLGRzdGVwCi0gICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdFRtcF0sZHN0ZXAKLSAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0XQotICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RUbXBdCi0KLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCi0KLU9NWF9WQ180eDRfREMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCi0gICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0TGVmdE5vdEF2YWlsYWJsZQotCi0gICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFswXX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzFdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMl19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFszXX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgotICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NExlZnRPbmx5QXZhaWxhYmxlCi0KLSAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSBhbHNvCi0gICAgICAgIFZMRDEgICAgIGRMZWZ0VmFsVTMyWzFdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gM10KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlTGVmdFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgIDsvLyBbcFNyY0Fib3ZlWzIrMyB8IDArMV0gfCBwU3JjTGVmdFsyKzMgfCAwKzFdXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlTGVmdFUzMiwgZFN1bUFib3ZlTGVmdFUxNiAgICAgICAgIDsvLyBbcFNyY0Fib3ZlWzIrMyswKzFdIHwgcFNyY0xlZnRbMiszKzArMV1dIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVMZWZ0VTY0LCBkU3VtQWJvdmVMZWZ0VTMyICAgICAgICAgOy8vIFtwU3JjQWJvdmVbMiszKzArMV0gKyBwU3JjTGVmdFsyKzMrMCsxXV0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVMZWZ0VTY0LGRTdW1BYm92ZUxlZnRVNjQsIzMgICAgICAgOy8vIFN1bSA9IChTdW0gKyA0KSA+PiAzCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIFZEVVAgICAgIGRTdW0sZFN1bUFib3ZlTGVmdFU4WzBdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgIAotICAgICAgICAKLURDUHJlZGljdDR4NExlZnRPbmx5QXZhaWxhYmxlCi0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgICAgOy8vIFsgWFggfCBwU3JjTGVmdFsyKzMgfCAwKzFdXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMzIsIGRTdW1MZWZ0VmFsVTE2ICAgICAgICAgICAgIDsvLyBbIFhYWFggfCBwU3JjTGVmdFsyKzMrMCsxXV0gCi0gICAgICAgIAotICAgICAgICBWUlNIUiAgICBkU3VtTGVmdFZhbFUzMixkU3VtTGVmdFZhbFUzMiwjMiAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIFZEVVAgICAgIGRTdW0sZFN1bUxlZnRWYWxVOFswXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCi0gICAgICAgIAotRENQcmVkaWN0NHg0TGVmdE5vdEF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKLSAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDROb25lQXZhaWxhYmxlCi0KLSAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSAKLSAgICAgICAgVkxEMSAgICAgZEFib3ZlVTMyWzBdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byAzXSAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUxNiwgZEFib3ZlVmFsICAgICAgICAgICAgICAgICA7Ly8gWyBYWCB8IHBTcmNBYm92ZVsyKzMgfCAwKzFdXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTMyLCBkU3VtQWJvdmVWYWxVMTYgICAgICAgICAgIDsvLyBbIFhYWFggfCBwU3JjQWJvdmVbMiszKzArMV1dIAotICAgICAgICAKLSAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlVmFsVTMyLGRTdW1BYm92ZVZhbFUzMiwjMiAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1BYm92ZVZhbFU4WzBdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKLSAgICAgICAgCi1EQ1ByZWRpY3Q0eDROb25lQXZhaWxhYmxlICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZNT1YgICAgIGRDb25zdDEyOFU4LCMweDgwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MDgwODA4MDgwIGlmKGNvdW50ID09IDApCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotT01YX1ZDXzR4NF9ESUFHX0RMCi0gICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVAotICAgICAgICBCRVEgICAgIERpYWdETFVwcGVyUmlnaHROb3RBdmFpbGFibGUKLSAgICAgICAKLSAgICAgICAgVkxEMSAgICBkQWJvdmUwLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgOy8vIFtVN3xVNnxVNXxVNHxVM3xVMnxVMXxVMF0gCi0gICAgICAgIFZEVVAgICAgZFU3LCBkQWJvdmUwWzddICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTd8VTd8VTd8VTd8VTd8VTd8VTd8VTddCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMSwgZEFib3ZlMCwgZFU3LCAjMSAgICAgICAgICAgICAgIDsvLyBbVTd8VTd8VTZ8VTV8VTR8VTN8VTJ8VTFdCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMiwgZEFib3ZlMCwgZFU3LCAjMiAgICAgICAgICAgICAgIDsvLyBbVTd8VTd8VTd8VTZ8VTV8VTR8VTN8VTJdIAotICAgICAgICBCICAgICAgIERpYWdETFByZWRpY3Q0eDRTdG9yZSAgICAgICAgIAotICAgICAgIAotRGlhZ0RMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQotICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlsxXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICA7Ly8gW1UzfFUyfFUxfFUwfC18LXwtfC1dIAotICAgICAgICBWRFVQICAgIGRVMywgZEFib3ZlWzddICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUzXQotCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMCwgZEFib3ZlLCBkVTMsICM0ICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTIgVTEgVTBdCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMSwgZEFib3ZlLCBkVTMsICM1ICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTIgVTFdCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMiwgZEFib3ZlLCBkVTMsICM2ICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTJdCi0gICAgICAgCi1EaWFnRExQcmVkaWN0NHg0U3RvcmUgIAotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wLCBkQWJvdmUwLCBkQWJvdmUyCi0gICAgICAgIFZSSEFERCAgZFRtcCwgZFRtcCwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgotICAgICAgICAKLQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdLGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdLGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdLGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotICAgICAgICAKLQotT01YX1ZDXzR4NF9ESUFHX0RSCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgVTAsVTEsVTIsVTMKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzBdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgIDsvLyBbWHxYfFh8WHxVM3xVMnxVMXxVMF0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgVUwsTDAsTDEsTDIsTDMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0ID0gW1VMfEwwfEwxfEwyfEwzfFh8WHxYXSAgICAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRbN119LFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgcERzdDEscERzdCxkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIHtkTGVmdFs2XX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzRdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFszXX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWRVhUICAgIGRBYm92ZTAsZExlZnQsZEFib3ZlLCMzICAgICAgICAgICAgICAgICA7Ly8gW1UyfFUxfFUwfFVMfEwwfEwxfEwyfEwzXSAgIAotICAgICAgICBBREQgICAgIHBEc3QyLHBEc3QxLGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRMZWZ0LGRBYm92ZSwjNCAgICAgICAgICAgICAgICAgOy8vIFtVM3xVMnxVMXxVMHxVTHxMMHxMMXxMMl0gICAKLSAgICAgICAgQUREICAgICBwRHN0MyxwRHN0Mixkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMixkTGVmdCxkQWJvdmUsIzUgICAgICAgICAgICAgICAgIDsvLyBbIFh8VTN8VTJ8VTF8VTB8VUx8TDB8TDFdICAgCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAsIGRBYm92ZTAsIGRBYm92ZTIKLSAgICAgICAgVlJIQUREICBkVG1wLCBkVG1wLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgOy8vIChhKzIqYitjKzIpPj4yCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0M10gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMF0sWzFdLFsyXSxbM10gQCBwRHN0MwotICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDJdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzFdLFsyXSxbM10sWzRdIEAgcERzdDIKLSAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QxXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsyXSxbM10sWzRdLFs1XSBAIHBEc3QxCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbM10sWzRdLFs1XSxbNl0gQCBwRHN0Ci0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotCi1PTVhfVkNfNHg0X1ZSCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFVMLFUwLFUxLFUyLFUzCi0gICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzBdLFtwU3JjQWJvdmVdCi0gICAgICAgIFZMRDEgICAgZEFib3ZlWzddLFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgIDsvLyBbVUx8WHxYfFh8VTN8VTJ8VTF8VTBdCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBMMCxMMSxMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQwID0gW0wwfEwyfFh8WHxYfFh8WHxYXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQxID0gW0wxfCBYfFh8WHxYfFh8WHxYXSAgICAKLSAgICAgICAgVkxEMSAgICB7ZExlZnQwWzddfSxbcFNyY0xlZnRdLGxlZnRTdGVwICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0MVs3XX0sW3BTcmNMZWZ0XSxsZWZ0U3RlcCAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdDBbNl19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWRVhUICAgIGRPZGQyLGRBYm92ZSxkQWJvdmUsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMyBVMiBVMSBVMCBVTCBdCi0gICAgICAgIFZFWFQgICAgZEV2ZW4wLGRMZWZ0MCxkT2RkMiwjNiAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUxIFUwIFVMIEwwIEwyIF0KLSAgICAgICAgVkVYVCAgICBkRXZlbjEsZExlZnQxLGRPZGQyLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTIgVTEgVTAgVUwgTDEgXQotICAgICAgICBWRVhUICAgIGRFdmVuMixkTGVmdDAsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMyBVMiBVMSBVMCBMMCBdCi0gICAgICAgIFZFWFQgICAgZE9kZDAsZExlZnQxLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUzIFUyIFUxIFUwIEwxIF0KLSAgICAgICAgVkVYVCAgICBkT2RkMSxkTGVmdDAsZE9kZDIsIzcgICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTIgVTEgVTAgVUwgTDAgXQotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wMSwgZE9kZDAsIGRPZGQyCi0gICAgICAgIFZSSEFERCAgZFRtcDEsIGRUbXAxLCBkT2RkMSAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IDkgNyA1IDMgMSBdCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAwLCBkRXZlbjAsIGRFdmVuMgotICAgICAgICBWUkhBREQgIGRUbXAwLCBkVG1wMCwgZEV2ZW4xICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCA4IDYgNCAyIDAgXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZFWFQgICAgZFRtcDMsZFRtcDEsZFRtcDEsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IHggOSA3IDUgMyBdIAotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBWRVhUICAgIGRUbXAyLGRUbXAwLGRUbXAwLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCB4IDggNiA0IDIgXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFRtcDNVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBUbXBbOV0sWzddLFs1XSxbM10KLSAgICAgICAgVlNUMSAgICBkVG1wMlUzMlswXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgOy8vIFRtcFs4XSxbNl0sWzRdLFsyXQotICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzddLFs1XSxbM10sWzFdCi0gICAgICAgIFZTVDEgICAgZFRtcDBVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbNl0sWzRdLFsyXSxbMF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCi0gICAgICAgIAotT01YX1ZDXzR4NF9IRAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFUwLFUxLFUyLFUzCi0gICAgICAgIFZMRDEgICAgZEFib3ZlLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvL2RBYm92ZUxlZnRWYWwgPSBbVTd8VTZ8VTV8VTR8VTN8VTJ8VTF8VTBdCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVTCxMMCxMMSxMMixMMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQgPSBbVUx8TDB8TDF8TDJ8TDN8WHxYfFhdIAotICAgICAgICBWTEQxICAgIHtkTGVmdFs3XX0sW3BTcmNBYm92ZUxlZnRdICAgCi0gICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIHtkTGVmdFs2XX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzRdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFszXX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMCxkTGVmdCxkQWJvdmUsIzMgICAgICAgICAgICAgICAgIDsvLyBbIFUyfFUxfFUwfFVMfEwwfEwxfEwyfEwzIF0gIAotICAgICAgICBWRVhUICAgIGRBYm92ZTEsZExlZnQsZEFib3ZlLCMyICAgICAgICAgICAgICAgICA7Ly8gWyBVMXxVMHxVTHxMMHxMMXxMMnxMM3xYIF0gICAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUyLGRMZWZ0LGRBYm92ZSwjMSAgICAgICAgICAgICAgICAgOy8vIFsgVTB8VUx8TDB8TDF8TDJ8TDN8WHxYIF0gICAgIAotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wMCwgZEFib3ZlMCwgZEFib3ZlMgotICAgICAgICBWUkhBREQgIGRUbXAwLCBkVG1wMCwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAwIHwgMSB8IDIgfCA0IHwgNiB8IDggfCBYIHwgWCBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlJIQUREICBkVG1wMSwgZEFib3ZlMSwgZEFib3ZlMCAgICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEKLSAgICAgICAgVlNITCAgICBkVG1wMVU2NCxkVG1wMVU2NCwjMjQgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgM3w1fCA3IHw5IHwgWCB8IFggfCBYIHwgWCBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNITCAgICBkVG1wVTY0LGRUbXAwVTY0LCMxNiAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMnw0fDZ8OHwgWCB8IFggfCBYIHwgWCBdCi0gICAgICAgIFZaSVAgICAgZFRtcDEsZFRtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wID0gWyAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCA4IHwgOSBdCi0gICAgICAgIFZFWFQgICAgZFRtcDAsZFRtcDAsZFRtcDAsIzYgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbICBYfCBYfCBYfCBYfCBYfCBYfCAwIHwgMSBdCi0gICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcCxkVG1wMCwjMiAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfDcgXQotICAgICAgIAotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlsxXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMHwxfDJ8M10KLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzFdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMnwzfDR8NV0KLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbNHw1fDZ8N10KLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbNnw3fDh8OV0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCi0gICAgICAgIAotT01YX1ZDXzR4NF9WTAotCi0gICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVAotICAgICAgICBCRVEgICAgIERpYWdWTFVwcGVyUmlnaHROb3RBdmFpbGFibGUKLSAgICAgICAKLSAgICAgICAgVkxEMSAgICBkQWJvdmUwLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTd8VTZ8VTV8VTR8VTN8VTJ8VTF8VTBdIAotICAgICAgICBWRVhUICAgIGRBYm92ZTEsZEFib3ZlMCxkQWJvdmUwLCMxICAgICAgICAgICAgICAgOy8vIFsgWHxVN3xVNnxVNXxVNHxVM3xVMnxVMV0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUyLGRBYm92ZTEsZEFib3ZlMSwjMSAgICAgICAgICAgICAgIDsvLyBbIFh8IFh8VTd8VTZ8VTV8VTR8VTN8VTJdCi0gICAgICAgIAotICAgICAgICBCICAgICAgIERpYWdWTFByZWRpY3Q0eDRTdG9yZSAgICAgICAgIAotICAgICAgIAotRGlhZ1ZMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQotICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlsxXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgOy8vIFtVM3xVMnxVMXxVMHwtfC18LXwtXSAKLSAgICAgICAgVkRVUCAgICBkVTMsIGRBYm92ZVs3XSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTNdCi0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUwLCBkQWJvdmUsIGRVMywgIzQgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTIgVTEgVTBdCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMSwgZEFib3ZlLCBkVTMsICM1ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUyIFUxXQotICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZSwgZFUzLCAjNiAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVMl0KLSAgICAgICAKLURpYWdWTFByZWRpY3Q0eDRTdG9yZSAgCi0gICAgICAgIAotICAgICAgICBWUkhBREQgIGRUbXAwLCBkQWJvdmUxLCBkQWJvdmUwICAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCA4fCA2fCA0fCAyfCAwIF0KLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcDMsIGRBYm92ZTAsIGRBYm92ZTIKLSAgICAgICAgVlJIQUREICBkVG1wMywgZFRtcDMsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgOy8vIChhKzIqYitjKzIpPj4yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IDl8IDd8IDV8IDN8IDEgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDAsZFRtcDAsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IFh8IDh8IDZ8IDR8IDIgXQotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBWRVhUICAgIGRUbXAyLGRUbXAzLGRUbXAxLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCBYfCA5fCA3fCA1fCAzIF0KLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFRtcDBVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBUbXBbNl0sWzRdLFsyXSxbMF0KLSAgICAgICAgVlNUMSAgICBkVG1wM1UzMlswXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgOy8vIFRtcFs3XSxbNV0sWzNdLFsxXQotICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzhdLFs2XSxbNF0sWzJdCi0gICAgICAgIFZTVDEgICAgZFRtcDJVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbOV0sWzddLFs1XSxbM10KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCi0gICAgICAgIAotT01YX1ZDXzR4NF9IVQotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotCi0gICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDJ8TDF8TDB8WHxYfFh8WF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNF19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs2XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbN119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICBWRFVQICAgIGRMMyxkTGVmdFs3XSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwzfEwzfEwzXQotICAgICAgICAKLSAgICAgICAgVkVYVCAgICBkTGVmdEhVMCxkTGVmdCxkTDMsIzQgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMMnxMMXxMMF0KLSAgICAgICAgVkVYVCAgICBkTGVmdEhVMSxkTGVmdCxkTDMsIzUgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMM3xMMnxMMV0KLSAgICAgICAgVkVYVCAgICBkTGVmdEhVMixkTGVmdCxkTDMsIzYgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMMl0KLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcDAsIGRMZWZ0SFUwLCBkTGVmdEhVMgotICAgICAgICBWUkhBREQgIGRUbXAwLCBkVG1wMCwgZExlZnRIVTEgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBMMyB8IEwzIHwgTDMgfCBMMyB8IEwzIHwgNSB8IDMgfCAxIF0KLSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgZFRtcDEsIGRMZWZ0SFUxLCBkTGVmdEhVMCAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIFRtcFsgTDMgfCBMMyB8IEwzIHwgTDMgfCBMMyB8IDQgfCAyIHwgMCBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVlpJUCAgICBkVG1wMSxkVG1wMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRUbXAxID0gVG1wWzd8IDZ8IDV8IDR8IDN8IDJ8IDF8IDBdICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRUbXAwID0gW0wzfEwzfEwzfEwzfEwzfEwzfEwzfEwzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFszfDJ8MXwwXSAKLSAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMSxkVG1wMSwjMgotICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzV8NHwzfDJdIAotICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAxLGRUbXAxLCMyCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbN3w2fDV8NF0gIAotICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzl8OHw3fDZdIAotICAgICAgICAKLSAgICAgICAgCi1FeGl0UHJlZGljdDR4NAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLQotICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIEVORAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgZW5kcwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTgxNzk1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgIAotCi0gICAgCi0gICAgCi0gICAgSUYgQ29ydGV4QTgKLQotOy8vIEFSTSBSZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wcFNyYyAgICAgICBSTiAwCi1wRHN0ICAgICAgICBSTiAxCi1RUCAgICAgICAgICBSTiAyCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZSBmb3IgVW5wYWNrMngyIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmMgICAgICAgIFJOIDkKLVZhbHVlICAgICAgIFJOIDQKLVZhbHVlMiAgICAgIFJOIDUKLUZsYWcgICAgICAgIFJOIDYKLXN0ck9mZnNldCAgIFJOIDcKLWNzdE9mZnNldCAgIFJOIDgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcjB3MCAgICAgICAgUk4gIDMKLXIwdzEgICAgICAgIFJOICA0Ci0KLWMwdzAgICAgICAgIFJOICA1Ci1jMXcwICAgICAgICBSTiAgNgotCi1yZXR1cm4gICAgICBSTiAgMAotcFFQRGl2VGFibGUgUk4gIDUKLXBRUE1vZFRhYmxlICAgIFJOICA2Ci1TaGlmdCAgICAgICAgUk4gIDkKLVNjYWxlICAgICAgICBSTiAgMgotCi0KLQotOy8vIE5lb24gUmVnaXN0ZXJzCi0KLWRaZXJvICAgICAgIEROICBEMC5VMTYKLWRJbnZUckNvZWZmIEROICBEMC5TMTYKLWRTY2FsZSAgICAgIEROICBEMS5TMTYKLXFEcW50Q29lZmYgIFFOICBRMS5TMzIKLWREcW50Q29lZmYgIEROICBEMi5TMTYKLQotCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCByOQotICAgICAgICAKLSAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYwotICAgICAgICBWTU9WICAgIGRaZXJvLCAjMAotICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFplcm8sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAgICAKLSAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KLQotCi11bnBhY2tMb29wCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQotICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzCi0gICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7Ci0gICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCi0gICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKLSAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCi0gICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgotICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZwotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vSW52VHJhbnNmb3JtREMyeDI6IElubGluZWQgKEltcGxlbWVudGVkIGluIEFSTSBWNikKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIExETUlBICAgIHBEc3QsIHtyMHcwLCByMHcxfSAgICAgICAgICAgICAgICAgIDsvLyByMHcwID0gfGMxfGMwfCAmIHIwdzEgPSB8YzN8YzJ8Ci0KLSAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICBMRFIgICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICAKLSAgICAgICAgU0FERFNVQlggcjB3MCwgcjB3MCwgIHIwdzAgICAgICAgICAgICAgICAgICAgOy8vIFsgYzAwK2MwMSwgYzAwLWMwMSBdCi0gICAgICAgIFNBRERTVUJYIHIwdzEsIHIwdzEsICByMHcxICAgICAgICAgICAgICAgICAgIDsvLyBbIGMxMCtjMTEsIGMxMC1jMTEgXQotICAgICAgICAKLSAgICAgICAgTERSU0IgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCi0gICAgICAgIExEUlNCICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXQotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgYzB3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwK2QxMCwgZDAxK2QxMSBdCi0gICAgICAgIFNTVUIxNiAgIGMxdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMC1kMTAsIGQwMS1kMTEgXQotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly9EZXF1YW50Q2hyb21hREMyeDI6IElubGluZWQgKE5lb24gSW1wbGVtZW50YXRpb24pCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIExTTCAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0Ci0gICAgICAgIFZNT1YgICAgIGRJbnZUckNvZWZmLCBjMHcwLCBjMXcwICAKLSAgICAgICAgVlJFVjMyICAgZEludlRyQ29lZmYsZEludlRyQ29lZmYgIAotICAgICAgICBWRFVQICAgICBkU2NhbGUsU2NhbGUgCi0gICAgICAgIAotICAgICAgICBWTVVMTCAgICBxRHFudENvZWZmLGRJbnZUckNvZWZmLGRTY2FsZQotICAgICAgICBWU0hSTiAgICBkRHFudENvZWZmLHFEcW50Q29lZmYsIzEKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU1QxICAgICBkRHFudENvZWZmLFtwRHN0XSAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmluZyBhbGwgdGhlIGNvZWZmaWNpZW50cyBhdCBvbmNlCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGIDsvLyBDb3J0ZXhBOAotICAgIAotICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjMjQzMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKLTsvLyAKLTsvLyAKLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gSW1wb3J0L0V4cG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20vdG8gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi07Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLSAgICAKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIAotCi07Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBDb3J0ZXhBOAotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wRGF0YSAgICAgICAgICAgICAgIFJOICAwCi1RUCAgICAgICAgICAgICAgICAgIFJOICAxICAgIAotCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLTsvLyBBUk0gUmVnaXN0ZXJzCi0KLXBRUERpdlRhYmxlICAgICAgICAgUk4gIDIKLXBRUE1vZFRhYmxlICAgICAgICAgUk4gIDMKLVNoaWZ0ICAgICAgICAgICAgICAgUk4gIDQKLVNjYWxlICAgICAgICAgICAgICAgUk4gIDUKLQotOy8vIE5FT04gUmVnaXN0ZXJzCi0KLTsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCi1kSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYKLWRJbjEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYgICAKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKLWRSb3dTdW0xICAgICAgICAgICAgRE4gIEQ0LlMxNgotZFJvd1N1bTIgICAgICAgICAgICBETiAgRDUuUzE2Ci1kUm93RGlmZjEgICAgICAgICAgIEROICBENi5TMTYKLWRSb3dEaWZmMiAgICAgICAgICAgRE4gIEQ3LlMxNgotCi07Ly8gUm93IG9wZXJhdGVkIHBpeGVscwotZFJvd09wMCAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kUm93T3AxICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRSb3dPcDIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZFJvd09wMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci1xUm93T3AwMSAgICAgICAgICAgIFFOICBRMC4zMgotcVJvd09wMjMgICAgICAgICAgICBRTiAgUTEuMzIKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKLWRDb2xTdW0xICAgICAgICAgICAgRE4gIEQ0LlMxNgotZENvbFN1bTIgICAgICAgICAgICBETiAgRDUuUzE2Ci1kQ29sRGlmZjEgICAgICAgICAgIEROICBENi5TMTYKLWRDb2xEaWZmMiAgICAgICAgICAgRE4gIEQ3LlMxNgotCi07Ly8gQ29sb3VtbiBvcGVyYXRlZCBwaXhlbHMKLWRDb2xPcDAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZENvbE9wMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kQ29sT3AyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRDb2xPcDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotCi07Ly8gVGVtcG9yYXJ5IHNjcmF0Y2ggdmFyYWlibGVzCi0KLWRTY2FsZSAgICAgICAgICAgICAgRE4gIEQ1LlMxNgotcVJvdW5kMCAgICAgICAgICAgICBRTiAgUTMuUzMyCi1xUm91bmQxICAgICAgICAgICAgIFFOICBRNC5TMzIKLXFSb3VuZDIgICAgICAgICAgICAgUU4gIFE1LlMzMgotcVJvdW5kMyAgICAgICAgICAgICBRTiAgUTYuUzMyCi0KLTsvLyBJbnZUcmFuc2Zvcm1lZCBhbmQgRGVxdWFudGl6ZWQgcGl4ZWxzCi1kT3V0MCAgICAgICAgICAgICAgIEROICBEMC5TMTYKLWRPdXQxICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRPdXQyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRPdXQzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLQotICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0LHI1LGQxMwotICAgIAotICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCi0gICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDQgRC1yZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCi0gICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMgaW4gVHJhbnNwb3NlZCBmb3JtCi0gICAgICAgIAotICAgICAgICBWTEQ0ICAgIHtkSW4wLGRJbjEsZEluMixkSW4zfSxbcERhdGFdCi0gICAgICAgIExEUiAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICBMRFIgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBTY2FsZSBmYWN0b3IgY2FsY3VsYXRpb24gaXMgZG9uZSB1c2luZyBBUk0gaW5zdHJ1Y3Rpb25zCi0gICAgICAgIDsvLyBJbnRlcmxlYXZlZCB3aXRoIE5FT04gaW5zdHJ1Y3Rpb25zIGlub3JkZXIgdG8gRHVhbCBpc3N1ZQotICAgICAgICAKLSAgICAgICAgVkFERCAgICBkUm93U3VtMSxkSW4wLGRJbjEKLSAgICAgICAgVkFERCAgICBkUm93U3VtMixkSW4yLGRJbjMKLSAgICAgICAgVlNVQiAgICBkUm93RGlmZjEsZEluMCxkSW4xCi0gICAgICAgIExEUlNCICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQotICAgICAgICBWU1VCICAgIGRSb3dEaWZmMixkSW4yLGRJbjMKLSAgICAgICAgTERSU0IgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gQVJNIENPREU6IFNjYWxlID0gcFFQTW9kVGFibGVbUVBdIAotICAgICAgICBWQUREICAgIGRSb3dPcDAsZFJvd1N1bTEsZFJvd1N1bTIKLSAgICAgICAgVlNVQiAgICBkUm93T3AxLGRSb3dTdW0xLGRSb3dTdW0yCi0gICAgICAgIFZTVUIgICAgZFJvd09wMixkUm93RGlmZjEsZFJvd0RpZmYyCi0gICAgICAgIExTTCAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0Ci0gICAgICAgIFZBREQgICAgZFJvd09wMyxkUm93RGlmZjEsZFJvd0RpZmYyCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4Ci0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWVFJOICAgIGRSb3dPcDAsZFJvd09wMQotICAgICAgICBWVFJOICAgIGRSb3dPcDIsZFJvd09wMwotICAgICAgICBWVFJOICAgIHFSb3dPcDAxLHFSb3dPcDIzIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgVkFERCAgICBkQ29sU3VtMSxkUm93T3AwLGRSb3dPcDEKLSAgICAgICAgVkFERCAgICBkQ29sU3VtMixkUm93T3AyLGRSb3dPcDMKLSAgICAgICAgVlNVQiAgICBkQ29sRGlmZjEsZFJvd09wMCxkUm93T3AxCi0gICAgICAgIFZTVUIgICAgZENvbERpZmYyLGRSb3dPcDIsZFJvd09wMwotICAgICAgICBWQUREICAgIGRDb2xPcDAsZENvbFN1bTEsZENvbFN1bTIKLSAgICAgICAgVlNVQiAgICBkQ29sT3AxLGRDb2xTdW0xLGRDb2xTdW0yCi0gICAgICAgIFZTVUIgICAgZENvbE9wMixkQ29sRGlmZjEsZENvbERpZmYyCi0gICAgICAgIFZBREQgICAgZENvbE9wMyxkQ29sRGlmZjEsZENvbERpZmYyCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gPERlcXVhbnRpemU+IGltcHJvdmVzIG9uIHRoZSBjLXJlZmVyZW5jZSBjb2RlCi0gICAgICAgIDsvLyBCb3RoIHRoZSAgY2FzZXMgaS5lLiwgU2hpZnQ+PTAgYW5kIFNoaWZ0PDAgY2FzZXMgYXJlIGNvdmVyZWQgdG9nZXRoZXIKLSAgICAgICAgOy8vIFdlIGRvIG5vdCBzdWJ0cmFjdCAyIGZyb20gU2hpZnQgYXMgaW4gQyByZWZlcmVuY2UsIGluc3RlYWQgcGVyZm9ybSBhCi0gICAgICAgIDsvLyBTY2FsZSA8PCBTaGlmdCBvbmNlIGluIHRoZSBiZWdpbm5pbmcgYW5kIGRvIGEgcmlnaHQgc2hpZnQgYnkgYSAKLSAgICAgICAgOy8vIGNvbnN0YW50IDIgYWZ0ZXIgdGhlIE11bHRpcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgUm91bmQgd291bGQgYmUgMiAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gQnkgZG9pbmcgdGhpcyB3ZSBhdmlvZCB0aGUgQnJhbmNoZXMgcmVxdWlyZWQgYW5kIGFsc28gCi0gICAgICAgIDsvLyByZWR1Y2UgdGhlIGNvZGUgc2l6ZSBzdWJzdGFudGlhbGx5Ci0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZEVVAgICAgZFNjYWxlLCBTY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQVJNIC0+IE5FT04gIGNvcHkgJ3NjYWxlJyB0byB2ZWN0b3IKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBWTU9WICAgIHFSb3VuZDAsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB0aGUgUm91bmQgVmFsdWUgCi0gICAgICAgIFZNT1YgICAgcVJvdW5kMSwjMgotICAgICAgICBWTU9WICAgIHFSb3VuZDIsIzIKLSAgICAgICAgVk1PViAgICBxUm91bmQzLCMyCi0gICAgICAgIAotICAgICAgICBWTUxBTCAgIHFSb3VuZDAsZENvbE9wMCxkU2NhbGUgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbaV0gKiBTY2FsZSArIFJvdW5kIAotICAgICAgICBWTUxBTCAgIHFSb3VuZDEsZENvbE9wMSxkU2NhbGUKLSAgICAgICAgVk1MQUwgICBxUm91bmQyLGRDb2xPcDIsZFNjYWxlCi0gICAgICAgIFZNTEFMICAgcVJvdW5kMyxkQ29sT3AzLGRTY2FsZQotICAgICAgICAKLSAgICAgICAgVlNIUk4gICBkT3V0MCxxUm91bmQwLCMyICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmlnaHQgc2hpZnQgYnkgMiAmIChPTVhfUzE2KVZhbHVlCi0gICAgICAgIFZTSFJOICAgZE91dDEscVJvdW5kMSwjMgotICAgICAgICBWU0hSTiAgIGRPdXQyLHFSb3VuZDIsIzIKLSAgICAgICAgVlNIUk4gICBkT3V0MyxxUm91bmQzLCMyCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlNUMSAge2RPdXQwLGRPdXQxLGRPdXQyLGRPdXQzfSwgW3BEYXRhXQotCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQgICAgICAgIAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ09SVEVYQTggICAKLSAgICAgICAgCi0KLQotOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wcFNyYyAgICAgICAgICAgICAgIFJOICAwCi1wRHN0ICAgICAgICAgICAgICAgIFJOICAxCi1RUFIyICAgICAgICAgICAgICAgIFJOICAyCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLXJlc3VsdCAgICAgICAgICAgICAgUk4gIDAKLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBEc3RSNCAgICAgICAgICAgICAgUk4gIDQKLXBEc3RSMCAgICAgICAgICAgICAgUk4gIDAKLVFQUjEgICAgICAgICAgICAgICAgUk4gIDEKLVFQUjUgICAgICAgICAgICAgICAgUk4gIDUKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGIENvcnRleEE4Ci0gICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIscjUKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcERzdFI0LHBEc3QgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMQotICAgICAgICBNT1YgICAgIFFQUjUsUVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjIKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHBEc3RSMCxwRHN0UjQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIwCi0gICAgICAgIE1PViAgICAgUVBSMSxRUFI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjEKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgICAgICAgIAotICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgIAotICAgIAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWZmYjA5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLWFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCi0gICAgTERSICAgICAgcjEyLFtyMiwjMF0KLSAgICBMRFIgICAgICByMTAsW3IwXSxyMQotICAgIExEUiAgICAgIGxyLFtyMixyM10KLSAgICBMRFIgICAgICByMTEsW3IwXSxyMQotICAgIE1WTiAgICAgIHIxMixyMTIKLSAgICBNVk4gICAgICBscixscgotICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKLSAgICBVSFNVQjggICByNCxyMTEsbHIKLSAgICBFT1IgICAgICByNSxyNSxyNwotICAgIFNUUiAgICAgIHI1LFtyMl0scjMKLSAgICBFT1IgICAgICByNCxyNCxyNwotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMRFIgICAgICByMTAsW3IwXSxyMQotICAgIExEUiAgICAgIHIxMixbcjIsIzBdCi0gICAgTERSICAgICAgcjExLFtyMF0scjEKLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTVZOICAgICAgcjEyLHIxMgotICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKLSAgICBNVk4gICAgICBscixscgotICAgIFVIU1VCOCAgIHI0LHIxMSxscgotICAgIEVPUiAgICAgIHI1LHI1LHI3Ci0gICAgU1RSICAgICAgcjUsW3IyXSxyMwotICAgIEVPUiAgICAgIHI0LHI0LHI3Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi1hcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAotICAgIExEUiAgICAgIHI0LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTAsW3IwXSxyMQotICAgIExEUiAgICAgIHIxMixbcjIsIzBdCi0gICAgTERSICAgICAgbHIsW3IyLHIzXQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTEsW3IwXSxyMQotICAgIE1WTiAgICAgIHIxMixyMTIKLSAgICBNVk4gICAgICBscixscgotICAgIExTUiAgICAgIHIxMCxyMTAsIzE2Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzE2Ci0gICAgTFNSICAgICAgcjExLHIxMSwjMTYKLSAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjMTYKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTERSICAgICAgcjQsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCi0gICAgTERSICAgICAgcjEyLFtyMiwjMF0KLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTVZOICAgICAgcjEyLHIxMgotICAgIE1WTiAgICAgIGxyLGxyCi0gICAgTFNSICAgICAgcjEwLHIxMCwjMTYKLSAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjMTYKLSAgICBMU1IgICAgICByMTEscjExLCMxNgotICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICMxNgotICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKLSAgICBVSFNVQjggICByNCxyMTEsbHIKLSAgICBFT1IgICAgICByNSxyNSxyNwotICAgIFNUUiAgICAgIHI1LFtyMl0scjMKLSAgICBFT1IgICAgICByNCxyNCxyNwotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQotYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKLSAgICBMRFIgICAgICByNCxbcjAsIzRdCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICByMTIsW3IyLCMwXQotICAgIExEUiAgICAgIGxyLFtyMixyM10KLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjExLFtyMF0scjEKLSAgICBNVk4gICAgICByMTIscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBMU1IgICAgICByMTAscjEwLCMyNAotICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICM4Ci0gICAgTFNSICAgICAgcjExLHIxMSwjMjQKLSAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjOAotICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKLSAgICBVSFNVQjggICByNCxyMTEsbHIKLSAgICBFT1IgICAgICByNSxyNSxyNwotICAgIFNUUiAgICAgIHI1LFtyMl0scjMKLSAgICBFT1IgICAgICByNCxyNCxyNwotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMRFIgICAgICByNCxbcjAsIzRdCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICByMTIsW3IyLCMwXQotICAgIExEUiAgICAgIGxyLFtyMixyM10KLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjExLFtyMF0scjEKLSAgICBNVk4gICAgICByMTIscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBMU1IgICAgICByMTAscjEwLCMyNAotICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICM4Ci0gICAgTFNSICAgICAgcjExLHIxMSwjMjQKLSAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjOAotICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKLSAgICBVSFNVQjggICByNCxyMTEsbHIKLSAgICBFT1IgICAgICByNSxyNSxyNwotICAgIFNUUiAgICAgIHI1LFtyMl0scjMKLSAgICBFT1IgICAgICByNCxyNCxyNwotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZWE0YTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi1hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmU6Ci0gICAgVkxEMS4zMiAge2QxOFswXX0sW3I1XSEKLSAgICBWU1VCTC5VOCBxMTEsZDUsZDkKLSAgICBWTU9WICAgICBkMjgsZDE4Ci0gICAgVlNVQkwuVTggcTEwLGQ4LGQ0Ci0gICAgVlNIUi5TMTYgcTExLHExMSwjMgotICAgIFZaSVAuOCAgIGQxOCxkMjgKLSAgICBWQklGICAgICBkMTgsZDE0LGQxNgotICAgIFZSSEFERC5TMTYgcTEwLHExMSxxMTAKLSAgICBWQURELkk4ICBkMzEsZDE4LGQxNQotICAgIFZRTU9WTi5TMTYgZDIwLHExMAotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgVk1JTi5TOCAgZDIwLGQyMCxkMzEKLSAgICBWTkVHLlM4ICBkMzEsZDMxCi0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBWTUFYLlM4ICBkMjAsZDIwLGQzMQotICAgIFZNT1ZMLlU4IHExNCxkNAotICAgIFZNT1ZMLlU4IHExMixkOAotICAgIFZBRERXLlM4IHExNCxxMTQsZDIwCi0gICAgVlNVQlcuUzggcTEyLHExMixkMjAKLSAgICBWUU1PVlVOLlMxNiBkMjkscTE0Ci0gICAgVlFNT1ZVTi5TMTYgZDI0LHExMgotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlOgotICAgIFZIQURELlU4IGQxMyxkNCxkOQotICAgIFZIQURELlU4IGQzMSxkOCxkNQotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgQUREICAgICAgcjUscjUsIzQKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQotICAgIFZSSEFERC5VOCBkMTMsZDEzLGQ1Ci0gICAgVlJIQURELlU4IGQzMSxkMzEsZDkKLSAgICBCWCAgICAgICBscgotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZmIyYzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi1hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlOgotICAgIFZTVUJMLlU4IHExMSxkNSxkOQotICAgIFZMRDEuOCAgIHtkMThbXX0sW3I1XSEKLSAgICBWU1VCTC5VOCBxMTAsZDgsZDQKLSAgICBWTEQxLjggICB7ZDE5W119LFtyNV0hCi0gICAgVlNIUi5TMTYgcTExLHExMSwjMgotICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM0Ci0gICAgVkFORCAgICAgZDE5LGQxNyxkMTUKLSAgICBWQklGICAgICBkMTgsZDE0LGQxNgotICAgIFZSSEFERC5TMTYgcTEwLHExMSxxMTAKLSAgICBWUkhBREQuVTggZDI0LGQ0LGQ4Ci0gICAgVkFERC5JOCAgZDMxLGQxOCxkMTkKLSAgICBWQU5EICAgICBkMTksZDEyLGQxNQotICAgIFZRQURELlU4IGQyMyxkNSxkMTgKLSAgICBWUU1PVk4uUzE2IGQyMCxxMTAKLSAgICBWQURELkk4ICBkMzEsZDMxLGQxOQotICAgIFZRU1VCLlU4IGQyMixkNSxkMTgKLSAgICBWUUFERC5VOCBkMTksZDksZDE4Ci0gICAgVkhBREQuVTggZDI2LGQyNCxkNgotICAgIFZNSU4uUzggIGQyMCxkMjAsZDMxCi0gICAgVk5FRy5TOCAgZDMxLGQzMQotICAgIFZRU1VCLlU4IGQyMSxkOSxkMTgKLSAgICBWSEFERC5VOCBkMjcsZDI0LGQxMAotICAgIFZNQVguVTggIGQzMCxkMjYsZDIyCi0gICAgVk1BWC5TOCAgZDIwLGQyMCxkMzEKLSAgICBWTU9WTC5VOCBxMTQsZDQKLSAgICBWTU9WTC5VOCBxMTIsZDgKLSAgICBWQUREVy5TOCBxMTQscTE0LGQyMAotICAgIFZTVUJXLlM4IHExMixxMTIsZDIwCi0gICAgVlFNT1ZVTi5TMTYgZDI5LHExNAotICAgIFZRTU9WVU4uUzE2IGQyNCxxMTIKLSAgICBWTUFYLlU4ICBkMjUsZDI3LGQyMQotICAgIFZNSU4uVTggIGQzMCxkMzAsZDIzCi0gICAgVk1JTi5VOCAgZDI1LGQyNSxkMTkKLSAgICBWQklGICAgICBkMjksZDQsZDE2Ci0gICAgVkJJRiAgICAgZDMwLGQ1LGQxNwotICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKLSAgICBWQklGICAgICBkMjUsZDksZDEyCi0gICAgQlggICAgICAgbHIKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZToKLSAgICBWU0hSLlU4ICBkMTksZDAsIzIKLSAgICBWQURELkk4ICBkMTksZDE5LGQxNQotICAgIFZBRERMLlU4IHExMCxkOCxkNAotICAgIFZBREQuSTggIGQxOSxkMTksZDE1Ci0gICAgVkFEREwuVTggcTExLGQ2LGQ5Ci0gICAgVkFERFcuVTggcTEyLHExMCxkNQotICAgIFZDR1QuVTggIGQxOSxkMTksZDEzCi0gICAgVlNIUi5VMTYgcTExLHExMSwjMQotICAgIFZIQURELlUxNiBxMTEscTEyLHExMQotICAgIFZBRERXLlU4IHExMixxMTIsZDYKLSAgICBWQURETC5VOCBxMTMsZDcsZDYKLSAgICBWQU5EICAgICBkMTcsZDE3LGQxOQotICAgIFZIQURELlU4IGQyOCxkNCxkOQotICAgIFZTUkEuVTE2IHExMyxxMTIsIzEKLSAgICBWQU5EICAgICBkMTIsZDEyLGQxOQotICAgIFZRUlNIUk4uVTE2IGQyOSxxMTEsIzEKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkNQotICAgIFZRUlNIUk4uVTE2IGQzMCxxMTIsIzIKLSAgICBWQURETC5VOCBxMTEsZDEwLGQ1Ci0gICAgVkFERFcuVTggcTEyLHExMCxkOQotICAgIFZCSUYgICAgIGQyOSxkMjgsZDE3Ci0gICAgVlFSU0hSTi5VMTYgZDMxLHExMywjMgotICAgIFZBRERMLlU4IHExMyxkMTEsZDEwCi0gICAgVlNIUi5VMTYgcTExLHExMSwjMQotICAgIFZIQURELlUxNiBxMTEscTEyLHExMQotICAgIFZBRERXLlU4IHExMixxMTIsZDEwCi0gICAgVkhBREQuVTggZDI4LGQ4LGQ1Ci0gICAgVkJJRiAgICAgZDI5LGQ0LGQxNgotICAgIFZCSUYgICAgIGQzMCxkNSxkMTcKLSAgICBWU1JBLlUxNiBxMTMscTEyLCMxCi0gICAgVlFSU0hSTi5VMTYgZDI1LHExMiwjMgotICAgIFZRUlNIUk4uVTE2IGQyNCxxMTEsIzEKLSAgICBWUkhBREQuVTggZDIyLGQyOCxkOQotICAgIFZCSUYgICAgIGQyNSxkOSxkMTIKLSAgICBWQklGICAgICBkMzEsZDYsZDE3Ci0gICAgVkJJRiAgICAgZDI0LGQyMixkMTIKLSAgICBWUVJTSFJOLlUxNiBkMjgscTEzLCMyCi0gICAgVkJJRiAgICAgZDI0LGQ4LGQxNgotICAgIFZCSUYgICAgIGQyOCxkMTAsZDEyCi0gICAgQlggICAgICAgbHIKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2MwNDUyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5leHRlcm4gICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcwotICAgIC5leHRlcm4gICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1ppZ1phZ180eDQKLQotICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcwotICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1ppZ1phZ180eDQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIKLWFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgU1VCICAgICAgc3Asc3AsIzB4NDAKLSAgICBMRFIgICAgICByMTAsW3IwLCMwXQotICAgIExEUiAgICAgIHIxMixbcjEsIzBdCi0gICAgTERSICAgICAgcjYsIC5MYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLVAwOiBBREQgICAgICByNiwgcGMKLSAgICBMRFIgICAgICByNCxbc3AsIzB4NjhdCi0gICAgTERSQiAgICAgcjksW3IxMCwjMl0KLSAgICBMRFJCICAgICByOCxbcjEwLCMxXQotICAgIExEUkIgICAgIHIxMSxbcjEwXSwjMwotICAgIEFERCAgICAgIHIxMixyMTIsIzgKLSAgICBMRFIgICAgICByNixbcjYscjQsTFNMICMyXQotICAgIE9SUiAgICAgIHI5LHI5LHI4LExTTCAjOAotICAgIE9SUiAgICAgIHIxMSxyOSxyMTEsTFNMICMxNgotICAgIExTTFMgICAgIHI4LHIxMSxyMTIKLSAgICBNT1ZTICAgICByNywjMHgxZQotICAgIEFORCAgICAgIHI3LHI3LHI4LExTUiAjMjcKLSAgICBTVUJTICAgICByMTIscjEyLCM4Ci1MMHg0NDoKLSAgICBCQ0MgICAgICBMMQotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi1MMToKLSAgICBMRFJIICAgICByNyxbcjYscjddCi0gICAgQUREQ0MgICAgcjEyLHIxMiwjOAotICAgIEFERCAgICAgIHIxMixyMTIsIzQKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIExTUlMgICAgIHI4LHI3LCMxCi0gICAgQkNTICAgICAgTDB4NzQKLSAgICBMU0xTICAgICByOCxyMTEscjEyCi0gICAgU1VCUyAgICAgcjEyLHIxMiwjMHhhCi0gICAgQUREICAgICAgcjcscjcscjgsTFNSICMyOQotICAgIEJJQyAgICAgIHI3LHI3LCMxCi0gICAgQiAgICAgICAgTDB4NDQKLUwweDc0OgotICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMwotICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKLSAgICBMU1JTICAgICByNSxyNywjMgotICAgIFNUUkIgICAgIHI1LFtyMiwjMF0KLSAgICBCRVEgICAgICBMMHgzNDQKLSAgICBDTVAgICAgICByNywjMHg0NAotICAgIEJHRSAgICAgIEwweDMzYwotICAgIFNUUiAgICAgIHIwLFtzcCwjMF0KLSAgICBTVFIgICAgICByMSxbc3AsIzRdCi0gICAgU1RSICAgICAgcjMsW3NwLCM4XQotICAgIEFORFMgICAgIHIxLHI3LCMzCi0gICAgQUREICAgICAgcjIsc3AsIzB4YwotICAgIEJFUSAgICAgIEwweGQ4Ci0gICAgTU9WICAgICAgcjAscjEKLUwweGFjOgotICAgIExTTFMgICAgIHI3LHIxMSxyMTIKLSAgICBTVUJTICAgICByMTIscjEyLCM3Ci0gICAgQkNDICAgICAgTDIKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotTDI6Ci0gICAgQUREQ0MgICAgcjEyLHIxMiwjOAotICAgIExTUiAgICAgIHI3LHI3LCMzMQotICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgU1VCUyAgICAgcjAscjAsIzEKLSAgICBNT1YgICAgICByOCwjMQotICAgIFNVQiAgICAgIHI4LHI4LHI3LExTTCAjMQotICAgIFNUUkggICAgIHI4LFtyMl0sIzIKLSAgICBCR1QgICAgICBMMHhhYwotTDB4ZDg6Ci0gICAgU1VCUyAgICAgcjAscjUscjEKLSAgICBCRVEgICAgICBMMHgxYjgKLSAgICBNT1YgICAgICByNCwjMQotICAgIENNUCAgICAgIHI1LCMweGEKLSAgICBNT1ZMRSAgICByNCwjMAotICAgIENNUCAgICAgIHIxLCMzCi0gICAgTU9WTFQgICAgcjEsIzQKLSAgICBNT1ZHRSAgICByMSwjMgotICAgIE1PVkdFICAgIHI0LCMwCi1MMHhmYzoKLSAgICBMU0xTICAgICByNyxyMTEscjEyCi0gICAgQ0xaICAgICAgcjcscjcKLSAgICBBREQgICAgICByMTIscjEyLHI3Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjNwotICAgIEJDQyAgICAgIEwzCi0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLSAgICBPUlIgICAgICByMTEscjgscjExLExTTCAjOAotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLSAgICBCQ0MgICAgICBMMwotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi1MMzoKLSAgICBBRERDQyAgICByMTIscjEyLCM4Ci0gICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBDTVAgICAgICByNywjMHgxMAotICAgIEJHRSAgICAgIEwweDMzYwotICAgIE1PVlMgICAgIGxyLHI0Ci0gICAgVEVRRVEgICAgcjcsIzB4ZQotICAgIE1PVkVRICAgIGxyLCM0Ci0gICAgVEVRICAgICAgcjcsIzB4ZgotICAgIE1PVkVRICAgIGxyLCMweGMKLSAgICBURVFFUSAgICByNCwjMAotICAgIEFEREVRICAgIHI3LHI3LCMweGYKLSAgICBURVEgICAgICBsciwjMAotICAgIEJFUSAgICAgIEwweDE4NAotICAgIExTTCAgICAgIHIzLHIxMSxyMTIKLSAgICBBREQgICAgICByMTIscjEyLGxyCi0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotICAgIFJTQiAgICAgIHI5LGxyLCMweDIwCi0gICAgQkNDICAgICAgTDQKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotICAgIE9SUiAgICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotICAgIEJDQyAgICAgIEw0Ci0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLUw0OgotICAgIEFERENDICAgIHIxMixyMTIsIzgKLSAgICBMU1IgICAgICByMyxyMyxyOQotICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgTFNMICAgICAgcjcscjcscjQKLSAgICBBREQgICAgICByNyxyMyxyNwotTDB4MTg0OgotICAgIEFERCAgICAgIHI3LHI3LHIxCi0gICAgTU9WICAgICAgcjEsIzIKLSAgICBMU1JTICAgICByOCxyNywjMQotICAgIFJTQkNTICAgIHI4LHI4LCMwCi0gICAgU1RSSCAgICAgcjgsW3IyXSwjMgotICAgIExEUiAgICAgIHI5LCAuTGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAotUDE6IEFERCAgICAgIHI5LCBwYwotICAgIExEUlNCICAgIHI4LFtyOSxyNF0KLSAgICBURVEgICAgICByNCwjMAotICAgIE1PVkVRICAgIHI0LCMxCi0gICAgQ01QICAgICAgcjcscjgKLSAgICBBRERDUyAgICByNCxyNCwjMQotICAgIFNVQlMgICAgIHIwLHIwLCMxCi0gICAgQkdUICAgICAgTDB4ZmMKLUwweDFiODoKLSAgICBMRFIgICAgICByOCxbc3AsIzB4NmNdCi0gICAgU1VCICAgICAgcjAscjUsIzEKLSAgICBTVUJTICAgICByMSxyOCxyNQotICAgIEFERCAgICAgIHI0LHNwLCMweDJjCi0gICAgTU9WICAgICAgbHIscjUKLSAgICBTVUIgICAgICBscixsciwjMQotICAgIEJFUSAgICAgIEwweDJiMAotICAgIFRFUSAgICAgIHI4LCM0Ci0gICAgTERSRVEgICAgcjYsIC5MYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKLSAgICBMRFJORSAgICByNiwgLkxhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCi1QMjogQUREICAgICAgcjYsIHBjCi0gICAgTERSICAgICAgcjYsW3I2LHI1LExTTCAjMl0KLSAgICBMU0xTICAgICByOCxyMTEscjEyCi0gICAgTU9WUyAgICAgcjcsIzB4MWUKLSAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI3Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotTDB4MWY0OgotICAgIEJDQyAgICAgIEw1Ci0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLUw1OgotICAgIExEUkggICAgIHI3LFtyNixyN10KLSAgICBBRERDQyAgICByMTIscjEyLCM4Ci0gICAgQUREICAgICAgcjEyLHIxMiwjNAotICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgTFNSUyAgICAgcjgscjcsIzEKLSAgICBCQ1MgICAgICBMMHgyMjQKLSAgICBMU0xTICAgICByOCxyMTEscjEyCi0gICAgU1VCUyAgICAgcjEyLHIxMiwjMHhhCi0gICAgQUREICAgICAgcjcscjcscjgsTFNSICMyOQotICAgIEJJQyAgICAgIHI3LHI3LCMxCi0gICAgQiAgICAgICAgTDB4MWY0Ci1MMHgyMjQ6Ci0gICAgU1VCICAgICAgcjEyLHIxMixyNyxMU1IgIzEzCi0gICAgQklDICAgICAgcjcscjgsIzB4ZjAwMAotICAgIENNUCAgICAgIHI3LCMweDEwCi0gICAgQkdFICAgICAgTDB4MzNjCi0gICAgTERSICAgICAgcjMsIC5MYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotUDM6IEFERCAgICAgIHIzLCBwYwotICAgIEFERCAgICAgIHI0LHNwLCMweDJjCi0gICAgTU9WUyAgICAgcjEscjcKLSAgICBBREQgICAgICBscixscixyMQotICAgIEJFUSAgICAgIEwweDJiMAotTDB4MjQ4OgotICAgIFNVQlMgICAgIHIwLHIwLCMxCi0gICAgTERSICAgICAgcjYsW3IzLHIxLExTTCAjMl0KLSAgICBCTFQgICAgICBMMHgyYmMKLSAgICBMU0xTICAgICByOCxyMTEscjEyCi0gICAgTU9WUyAgICAgcjcsIzB4ZQotICAgIEFORCAgICAgIHI3LHI3LHI4LExTUiAjMjgKLSAgICBTVUJTICAgICByMTIscjEyLCM4Ci1MMHgyNjQ6Ci0gICAgQkNDICAgICAgTDYKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotTDY6Ci0gICAgTERSSCAgICAgcjcsW3I2LHI3XQotICAgIEFERENDICAgIHIxMixyMTIsIzgKLSAgICBBREQgICAgICByMTIscjEyLCMzCi0gICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBMU1JTICAgICByOCxyNywjMQotICAgIEJDUyAgICAgIEwweDI5NAotICAgIExTTFMgICAgIHI4LHIxMSxyMTIKLSAgICBTVUJTICAgICByMTIscjEyLCM5Ci0gICAgQUREICAgICAgcjcscjcscjgsTFNSICMyOQotICAgIEJJQyAgICAgIHI3LHI3LCMxCi0gICAgQiAgICAgICAgTDB4MjY0Ci1MMHgyOTQ6Ci0gICAgU1VCICAgICAgcjEyLHIxMixyNyxMU1IgIzEzCi0gICAgQklDICAgICAgcjcscjgsIzB4ZjAwMAotICAgIENNUCAgICAgIHI3LCMweGYKLSAgICBCR0UgICAgICBMMHgzM2MKLSAgICBTVUJTICAgICByMSxyMSxyNwotICAgIFNUUkIgICAgIHI3LFtyNF0sIzEKLSAgICBCR1QgICAgICBMMHgyNDgKLUwweDJiMDoKLSAgICBTVUJTICAgICByMCxyMCwjMQotICAgIEJMVCAgICAgIEw3Ci0gICAgU1RSQiAgICAgcjEsW3I0XSwjMQotTDc6Ci0gICAgQkdUICAgICAgTDB4MmIwCi1MMHgyYmM6Ci0gICAgU1RSQiAgICAgcjEsW3I0XSwjMQotICAgIExEUiAgICAgIHI4LFtzcCwjMHg2Y10KLSAgICBURVEgICAgICByOCwjMHhmCi0gICAgQURERVEgICAgbHIsbHIsIzEKLSAgICBTVUIgICAgICByNCxyNCxyNQotICAgIFNVQiAgICAgIHIyLHIyLHI1Ci0gICAgU1VCICAgICAgcjIscjIscjUKLSAgICBMRFIgICAgICByMyxbc3AsIzhdCi0gICAgTERSICAgICAgcjAsW3IzLCMwXQotICAgIFRFUSAgICAgIHI4LCM0Ci0gICAgTERSRVEgICAgcjYsIC5MYXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgTERSTkUgICAgcjYsIC5MYXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci1QNDogQUREICAgICAgcjYsIHBjCi1MMHgyZWM6Ci0gICAgTERSQiAgICAgcjksW3I0XSwjMQotICAgIExEUkIgICAgIHI4LFtyNixscl0KLSAgICBTVUIgICAgICBscixsciwjMQotICAgIFNVQiAgICAgIGxyLGxyLHI5Ci0gICAgTERSU0ggICAgcjksW3IyXSwjMgotICAgIFNVQlMgICAgIHI1LHI1LCMxCi0gICAgT1JSRVEgICAgcjgscjgsIzB4MjAKLSAgICBBREQgICAgICByMSxyOSwjMHg4MAotICAgIENNUCAgICAgIHIxLCMweDEwMAotICAgIE9SUkNTICAgIHI4LHI4LCMweDEwCi0gICAgVEVRICAgICAgcjUsIzAKLSAgICBTVFJCICAgICByOCxbcjBdLCMxCi0gICAgU1RSQiAgICAgcjksW3IwXSwjMQotICAgIExTUiAgICAgIHI5LHI5LCM4Ci0gICAgQkNDICAgICAgTDgKLSAgICBTVFJCICAgICByOSxbcjBdLCMxCi1MODoKLSAgICBCTkUgICAgICBMMHgyZWMKLSAgICBTVFIgICAgICByMCxbcjMsIzBdCi0gICAgTERSICAgICAgcjAsW3NwLCMwXQotICAgIExEUiAgICAgIHIxLFtzcCwjNF0KLSAgICBCICAgICAgICBMMHgzNDQKLUwweDMzYzoKLSAgICBNVk4gICAgICByMCwjMQotICAgIEIgICAgICAgIEwweDM1YwotTDB4MzQ0OgotICAgIEFERCAgICAgIHIxMCxyMTAscjEyLExTUiAjMwotICAgIEFORCAgICAgIHIxMixyMTIsIzcKLSAgICBTVUIgICAgICByMTAscjEwLCM0Ci0gICAgU1RSICAgICAgcjEyLFtyMSwjMF0KLSAgICBTVFIgICAgICByMTAsW3IwLCMwXQotICAgIE1PViAgICAgIHIwLCMwCi1MMHgzNWM6Ci0gICAgQUREICAgICAgc3Asc3AsIzB4NDAKLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0uTGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzOgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMtKFAwKzgpCi0uTGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbDoKLSAgICAud29yZCAgIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbC0oUDErOCkKLS5MYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXM6Ci0gICAgLndvcmQgICAoYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMgLSA0KS0oUDIrOCkKLS5MYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlczoKLSAgICAud29yZCAgIChhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzIC0gNCktKFAyKzgpCi0uTGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXM6Ci0gICAgLndvcmQgICAoYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcyAtIDQpLShQMys4KQotLkxhcm1WQ000UDEwX1ppZ1phZ18yeDI6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1ppZ1phZ18yeDItKFA0KzgpCi0uTGFybVZDTTRQMTBfWmlnWmFnXzR4NDoKLSAgICAud29yZCAgIGFybVZDTTRQMTBfWmlnWmFnXzR4NC0oUDQrOCkKLQotICAgIC5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmViZjJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAuc2VjdGlvbiAucm9kYXRhCi0gICAgLmFsaWduIDQKLQotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4Ci0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotCi0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAuaGlkZGVuIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9WTWF0cml4Ci0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotCi1hcm1WQ000UDEwX1Bvc1RvVkNvbDR4NDoKLSAgICAuYnl0ZSAgMCwgMiwgMCwgMgotICAgIC5ieXRlICAyLCAxLCAyLCAxCi0gICAgLmJ5dGUgIDAsIDIsIDAsIDIKLSAgICAuYnl0ZSAgMiwgMSwgMiwgMQotCi1hcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MjoKLSAgICAuYnl0ZSAgMCwgMgotICAgIC5ieXRlICAyLCAxCi0KLWFybVZDTTRQMTBfVk1hdHJpeDoKLSAgICAuYnl0ZSAgMTAsIDE2LCAxMwotICAgIC5ieXRlICAxMSwgMTgsIDE0Ci0gICAgLmJ5dGUgIDEzLCAyMCwgMTYKLSAgICAuYnl0ZSAgMTQsIDIzLCAxOAotICAgIC5ieXRlICAxNiwgMjUsIDIwCi0gICAgLmJ5dGUgIDE4LCAyOSwgMjMKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIFsoSU5UKShRUC82KV0sCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFybVZDTTRQMTBfUVBEaXZUYWJsZToKLSAgICAuYnl0ZSAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi0gICAgLmJ5dGUgIDEsICAxLCAgMSwgIDEsICAxLCAgMQotICAgIC5ieXRlICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKLSAgICAuYnl0ZSAgMywgIDMsICAzLCAgMywgIDMsICAzCi0gICAgLmJ5dGUgIDQsICA0LCAgNCwgIDQsICA0LCAgNAotICAgIC5ieXRlICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKLSAgICAuYnl0ZSAgNiwgIDYsICA2LCAgNiwgIDYsICA2Ci0gICAgLmJ5dGUgIDcsICA3LCAgNywgIDcsICA3LCAgNwotICAgIC5ieXRlICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdIGVudGlyZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGU6Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgbW9kdWx1cyBleHByZXNzaW9uIFtRUCU2XSo2LAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGU6Ci0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBpbnZpZHVhbCBieXRlIHZhbHVlcyBzdG9yZWQgYXMKLTsvLyBoYWxmd29yZHMuIFRoaXMgYXZvaWRzIHVucGFja2luZyBpbnNpZGUgdGhlIGZ1bmN0aW9uCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFybVZDTTRQMTBfVk1hdHJpeFUxNjoKLSAgICAuaHdvcmQgMTAsIDE2LCAxMwotICAgIC5od29yZCAxMSwgMTgsIDE0Ci0gICAgLmh3b3JkIDEzLCAyMCwgMTYKLSAgICAuaHdvcmQgMTQsIDIzLCAxOAotICAgIC5od29yZCAxNiwgMjUsIDIwCi0gICAgLmh3b3JkIDE4LCAyOSwgMjMKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTkwMDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlOgotICAgIE1PViAgICAgIHIxMixyOAotICAgIEFORCAgICAgIHI3LHIwLCMzCi0gICAgQklDICAgICAgcjAscjAsIzMKLSAgICBBREQgICAgICBwYyxwYyxyNyxMU0wgIzIKLSAgICBOT1AKLSAgICBCICAgICAgICBDb3B5MHRvQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkxdG9BbGlnbmVkCi0gICAgQiAgICAgICAgQ29weTJ0b0FsaWduZWQKLSAgICBCICAgICAgICBDb3B5M3RvQWxpZ25lZAotQ29weTB0b0FsaWduZWQ6Ci0gICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9Ci0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBBREQgICAgICByMCxyMCxyMQotICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KLSAgICBCR1QgICAgICBDb3B5MHRvQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlFbmQKLUNvcHkxdG9BbGlnbmVkOgotICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgQUREICAgICAgcjAscjAscjEKLSAgICBMU1IgICAgICByNyxyNywjOAotICAgIE9SUiAgICAgIHI3LHI3LHIxMCxMU0wgIzI0Ci0gICAgTFNSICAgICAgcjEwLHIxMCwjOAotICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjMjQKLSAgICBMU1IgICAgICByMTEscjExLCM4Ci0gICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQotICAgIEJHVCAgICAgIENvcHkxdG9BbGlnbmVkCi0gICAgQiAgICAgICAgQ29weUVuZAotQ29weTJ0b0FsaWduZWQ6Ci0gICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9Ci0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBBREQgICAgICByMCxyMCxyMQotICAgIExTUiAgICAgIHI3LHI3LCMxNgotICAgIE9SUiAgICAgIHI3LHI3LHIxMCxMU0wgIzE2Ci0gICAgTFNSICAgICAgcjEwLHIxMCwjMTYKLSAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzE2Ci0gICAgTFNSICAgICAgcjExLHIxMSwjMTYKLSAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9Ci0gICAgQkdUICAgICAgQ29weTJ0b0FsaWduZWQKLSAgICBCICAgICAgICBDb3B5RW5kCi1Db3B5M3RvQWxpZ25lZDoKLSAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIEFERCAgICAgIHIwLHIwLHIxCi0gICAgTFNSICAgICAgcjcscjcsIzI0Ci0gICAgT1JSICAgICAgcjcscjcscjEwLExTTCAjOAotICAgIExTUiAgICAgIHIxMCxyMTAsIzI0Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICM4Ci0gICAgTFNSICAgICAgcjExLHIxMSwjMjQKLSAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9Ci0gICAgQkdUICAgICAgQ29weTN0b0FsaWduZWQKLUNvcHlFbmQ6Ci0gICAgTU9WICAgICAgcjAscjEyCi0gICAgTU9WICAgICAgcjEsIzB4YwotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZToKLSAgICBBTkQgICAgICByNyxyMCwjMwotICAgIEJJQyAgICAgIHIwLHIwLCMzCi0gICAgQUREICAgICAgcGMscGMscjcsTFNMICMyCi0gICAgTk9QCi0gICAgQiAgICAgICAgQ29weTB0b1ZBbGlnbmVkCi0gICAgQiAgICAgICAgQ29weTF0b1ZBbGlnbmVkCi0gICAgQiAgICAgICAgQ29weTJ0b1ZBbGlnbmVkCi0gICAgQiAgICAgICAgQ29weTN0b1ZBbGlnbmVkCi1Db3B5MHRvVkFsaWduZWQ6Ci0gICAgTERSICAgICAgcjcsW3IwXSxyMQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgU1RSICAgICAgcjcsW3I4XSwjNAotICAgIEJHVCAgICAgIENvcHkwdG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlWRW5kCi1Db3B5MXRvVkFsaWduZWQ6Ci0gICAgTERSICAgICAgcjEwLFtyMCwjNF0KLSAgICBMRFIgICAgICByNyxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBMU0wgICAgICByMTAscjEwLCMyNAotICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzgKLSAgICBTVFIgICAgICByNyxbcjhdLCM0Ci0gICAgQkdUICAgICAgQ29weTF0b1ZBbGlnbmVkCi0gICAgQiAgICAgICAgQ29weVZFbmQKLUNvcHkydG9WQWxpZ25lZDoKLSAgICBMRFIgICAgICByMTAsW3IwLCM0XQotICAgIExEUiAgICAgIHI3LFtyMF0scjEKLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIExTTCAgICAgIHIxMCxyMTAsIzE2Ci0gICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjMTYKLSAgICBTVFIgICAgICByNyxbcjhdLCM0Ci0gICAgQkdUICAgICAgQ29weTJ0b1ZBbGlnbmVkCi0gICAgQiAgICAgICAgQ29weVZFbmQKLUNvcHkzdG9WQWxpZ25lZDoKLSAgICBMRFIgICAgICByMTAsW3IwLCM0XQotICAgIExEUiAgICAgIHI3LFtyMF0scjEKLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIExTTCAgICAgIHIxMCxyMTAsIzgKLSAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICMyNAotICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKLSAgICBCR1QgICAgICBDb3B5M3RvVkFsaWduZWQKLUNvcHlWRW5kOgotICAgIFNVQiAgICAgIHIwLHI4LCMweDFjCi0gICAgTU9WICAgICAgcjEsIzQKLSAgICBCWCAgICAgICBscgotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTI4OTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIEFORCAgICAgIHIxMixyMCwjMwotICAgIEJJQyAgICAgIHIwLHIwLCMzCi0gICAgQUREICAgICAgcGMscGMscjEyLExTTCAjMgotICAgIE5PUAotICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjAKLSAgICBCICAgICAgICBDb3B5NHg0QWxpZ24xCi0gICAgQiAgICAgICAgQ29weTR4NEFsaWduMgotICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjMKLUNvcHk0eDRBbGlnbjA6Ci0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIExEUiAgICAgIHI1LFtyMF0scjEKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTERSICAgICAgcjgsW3IwXSxyMQotICAgIFNUUiAgICAgIHI1LFtyMl0scjMKLSAgICBMRFIgICAgICByOSxbcjBdLHIxCi0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotICAgIFNUUiAgICAgIHI5LFtyMl0scjMKLSAgICBCICAgICAgICBDb3B5NHg0RW5kCi1Db3B5NHg0QWxpZ24xOgotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjOAotICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMjQKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzgKLSAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzI0Ci0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBTVFIgICAgICByOCxbcjJdLHIzCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjOAotICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMjQKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzgKLSAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzI0Ci0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotICAgIEIgICAgICAgIENvcHk0eDRFbmQKLUNvcHk0eDRBbGlnbjI6Ci0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBMRFIgICAgICByOSxbcjAsIzRdCi0gICAgTERSICAgICAgcjgsW3IwXSxyMQotICAgIExTUiAgICAgIHI0LHI0LCMxNgotICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMTYKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzE2Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICMxNgotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIExEUiAgICAgIHI5LFtyMCwjNF0KLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgTFNSICAgICAgcjQscjQsIzE2Ci0gICAgT1JSICAgICAgcjQscjQscjUsTFNMICMxNgotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMU1IgICAgICByOCxyOCwjMTYKLSAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzE2Ci0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotICAgIEIgICAgICAgIENvcHk0eDRFbmQKLUNvcHk0eDRBbGlnbjM6Ci0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBMRFIgICAgICByOSxbcjAsIzRdCi0gICAgTERSICAgICAgcjgsW3IwXSxyMQotICAgIExTUiAgICAgIHI0LHI0LCMyNAotICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjOAotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMU1IgICAgICByOCxyOCwjMjQKLSAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzgKLSAgICBTVFIgICAgICByOCxbcjJdLHIzCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBMRFIgICAgICByOSxbcjAsIzRdCi0gICAgTERSICAgICAgcjgsW3IwXSxyMQotICAgIExTUiAgICAgIHI0LHI0LCMyNAotICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjOAotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMU1IgICAgICByOCxyOCwjMjQKLSAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzgKLSAgICBTVFIgICAgICByOCxbcjJdLHIzCi1Db3B5NHg0RW5kOgotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmM2NzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIE1PViAgICAgIGxyLCM0Ci0gICAgTERSICAgICAgcjYsID0weGZlMDBmZTAKLSAgICBMRFIgICAgICByMTIsID0weGZmMDBmZgotTG9vcFN0YXJ0MToKLSAgICBMRFIgICAgICByMTEsW3IwLCMweGNdCi0gICAgTERSICAgICAgcjEwLFtyMCwjOF0KLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIFVRU1VCMTYgIHIxMSxyMTEscjYKLSAgICBVUVNVQjE2ICByMTAscjEwLHI2Ci0gICAgVVFTVUIxNiAgcjUscjUscjYKLSAgICBVUVNVQjE2ICByNCxyNCxyNgotICAgIFVTQVQxNiAgIHIxMSwjMTMscjExCi0gICAgVVNBVDE2ICAgcjEwLCMxMyxyMTAKLSAgICBVU0FUMTYgICByNSwjMTMscjUKLSAgICBVU0FUMTYgICByNCwjMTMscjQKLSAgICBBTkQgICAgICByMTEscjEyLHIxMSxMU1IgIzUKLSAgICBBTkQgICAgICByMTAscjEyLHIxMCxMU1IgIzUKLSAgICBBTkQgICAgICByNSxyMTIscjUsTFNSICM1Ci0gICAgQU5EICAgICAgcjQscjEyLHI0LExTUiAjNQotICAgIE9SUiAgICAgIHIxMSxyMTAscjExLExTTCAjOAotICAgIE9SUiAgICAgIHIxMCxyNCxyNSxMU0wgIzgKLSAgICBTVUJTICAgICBscixsciwjMQotICAgIFNUUkQgICAgIHIxMCxyMTEsW3I3XSwjOAotICAgIEJHVCAgICAgIExvb3BTdGFydDEKLSAgICBTVUIgICAgICByMCxyNywjMHgyMAotICAgIE1PViAgICAgIHIxLCM4Ci0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgTERSICAgICAgcjYsID0weGZlMDBmZTAKLSAgICBMRFIgICAgICByMTIsID0weGZmMDBmZgotICAgIE1PViAgICAgIGxyLCMyCi1Mb29wU3RhcnQ6Ci0gICAgTERSICAgICAgcjExLFtyMCwjMHhjXQotICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBVUVNVQjE2ICByMTEscjExLHI2Ci0gICAgVVFTVUIxNiAgcjEwLHIxMCxyNgotICAgIFVRU1VCMTYgIHI1LHI1LHI2Ci0gICAgVVFTVUIxNiAgcjQscjQscjYKLSAgICBVU0FUMTYgICByMTEsIzEzLHIxMQotICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCi0gICAgVVNBVDE2ICAgcjUsIzEzLHI1Ci0gICAgVVNBVDE2ICAgcjQsIzEzLHI0Ci0gICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1Ci0gICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1Ci0gICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQotICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKLSAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKLSAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4Ci0gICAgUEtIQlQgICAgcjQscjEwLHIxMSxMU0wgIzE2Ci0gICAgU1RSICAgICAgcjQsW3I3XSwjOAotICAgIFBLSFRCICAgIHI1LHIxMSxyMTAsQVNSICMxNgotICAgIFNUUiAgICAgIHI1LFtyN10sIy00Ci0gICAgTERSICAgICAgcjExLFtyMCwjMHhjXQotICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBVUVNVQjE2ICByMTEscjExLHI2Ci0gICAgVVFTVUIxNiAgcjEwLHIxMCxyNgotICAgIFVRU1VCMTYgIHI1LHI1LHI2Ci0gICAgVVFTVUIxNiAgcjQscjQscjYKLSAgICBVU0FUMTYgICByMTEsIzEzLHIxMQotICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCi0gICAgVVNBVDE2ICAgcjUsIzEzLHI1Ci0gICAgVVNBVDE2ICAgcjQsIzEzLHI0Ci0gICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1Ci0gICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1Ci0gICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQotICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKLSAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKLSAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4Ci0gICAgUEtIQlQgICAgcjQscjEwLHIxMSxMU0wgIzE2Ci0gICAgU1VCUyAgICAgbHIsbHIsIzEKLSAgICBTVFIgICAgICByNCxbcjddLCM4Ci0gICAgUEtIVEIgICAgcjUscjExLHIxMCxBU1IgIzE2Ci0gICAgU1RSICAgICAgcjUsW3I3XSwjNAotICAgIEJHVCAgICAgIExvb3BTdGFydAotICAgIFNVQiAgICAgIHIwLHI3LCMweDE4Ci0gICAgTU9WICAgICAgcjEsIzQKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2FhOTI3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVk1PVi5JMTYgZDMxLCMweDE0Ci0gICAgVk1PVi5JMTYgZDMwLCMweDUKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE1LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVk1MQS5JMTYgZDEwLGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTYsZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWU1VCLkkxNiBkMTAsZDEwLGQ4Ci0gICAgVk1MQS5JMTYgZDEyLGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTcsZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWU1VCLkkxNiBkMTIsZDEyLGQ4Ci0gICAgVk1MQS5JMTYgZDE0LGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTgsZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWU1VCLkkxNiBkMTQsZDE0LGQ4Ci0gICAgVk1MQS5JMTYgZDE2LGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTksZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWU1VCLkkxNiBkMTYsZDE2LGQ4Ci0gICAgVk1MQS5JMTYgZDE4LGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTEwLGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDE4LGQxOCxkOAotICAgIFZNTEEuSTE2IGQyMCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHExMSxkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZTVUIuSTE2IGQyMCxkMjAsZDgKLSAgICBWTUxBLkkxNiBkMjIsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxMTIsZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWU1VCLkkxNiBkMjIsZDIyLGQ4Ci0gICAgVk1MQS5JMTYgZDI0LGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTEzLGQwLGQxCi0gICAgVlNVQi5JMTYgZDI0LGQyNCxkOAotICAgIFZNTEEuSTE2IGQyNixkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWTU9WLkkzMiBxMTUsIzB4MTQKLSAgICBWTU9WLkkzMiBxMTQsIzB4NQotICAgIFZBRERMLlMxNiBxNSxkMTAsZDIwCi0gICAgVkFEREwuUzE2IHExLGQxNCxkMTYKLSAgICBWQURETC5TMTYgcTAsZDEyLGQxOAotICAgIFZTVUIuSTE2IGQyNixkMjYsZDgKLSAgICBWTUxBLkkzMiBxNSxxMSxxMTUKLSAgICBWTVVMLkkzMiBxNCxxMCxxMTQKLSAgICBWQURETC5TMTYgcTYsZDEyLGQyMgotICAgIFZBRERMLlMxNiBxMSxkMTYsZDE4Ci0gICAgVkFEREwuUzE2IHEwLGQxNCxkMjAKLSAgICBWTUxBLkkzMiBxNixxMSxxMTUKLSAgICBWU1VCLkkzMiBxNSxxNSxxNAotICAgIFZNVUwuSTMyIHE0LHEwLHExNAotICAgIFZBRERMLlMxNiBxMixkMTQsZDI0Ci0gICAgVkFEREwuUzE2IHExLGQxOCxkMjAKLSAgICBWQURETC5TMTYgcTAsZDE2LGQyMgotICAgIFZNTEEuSTMyIHEyLHExLHExNQotICAgIFZTVUIuSTMyIHE2LHE2LHE0Ci0gICAgVk1VTC5JMzIgcTQscTAscTE0Ci0gICAgVkFEREwuUzE2IHEzLGQxNixkMjYKLSAgICBWQURETC5TMTYgcTEsZDIwLGQyMgotICAgIFZBRERMLlMxNiBxMCxkMTgsZDI0Ci0gICAgVk1MQS5JMzIgcTMscTEscTE1Ci0gICAgVlNVQi5JMzIgcTIscTIscTQKLSAgICBWTUxTLkkzMiBxMyxxMCxxMTQKLSAgICBWUVJTSFJVTi5TMzIgZDAscTUsIzEwCi0gICAgVlFSU0hSVU4uUzMyIGQyLHE2LCMxMAotICAgIFZRUlNIUlVOLlMzMiBkNCxxMiwjMTAKLSAgICBWUVJTSFJVTi5TMzIgZDYscTMsIzEwCi0gICAgVlFNT1ZOLlUxNiBkMCxxMAotICAgIFZRTU9WTi5VMTYgZDIscTEKLSAgICBWUU1PVk4uVTE2IGQ0LHEyCi0gICAgVlFNT1ZOLlUxNiBkNixxMwotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY3ZjFjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgQUREICAgICAgcjEyLHIwLHIxLExTTCAjMgotICAgIFZNT1YuSTggIGQzMCwjMHg1Ci0gICAgVk1PVi5JOCAgZDMxLCMweDE0Ci0gICAgVkxEMS44ICAge2QxMCxkMTF9LFtyMTJdLHIxCi0gICAgVkxEMS44ICAge2QyLGQzfSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2QxMixkMTN9LFtyMTJdLHIxCi0gICAgVkFEREwuVTggcTksZDAsZDEwCi0gICAgVkxEMS44ICAge2Q0LGQ1fSxbcjBdLHIxCi0gICAgVkFEREwuVTggcTAsZDEsZDExCi0gICAgVkxEMS44ICAge2Q2LGQ3fSxbcjBdLHIxCi0gICAgVkFEREwuVTggcTEwLGQyLGQxMgotICAgIFZMRDEuOCAgIHtkOCxkOX0sW3IwXSxyMQotICAgIFZNTEFMLlU4IHE5LGQ0LGQzMQotICAgIFZMRDEuOCAgIHtkMTQsZDE1fSxbcjEyXSxyMQotICAgIFZNTEFMLlU4IHEwLGQ1LGQzMQotICAgIFZMRDEuOCAgIHtkMTYsZDE3fSxbcjEyXSxyMQotICAgIFZNTEFMLlU4IHE5LGQ2LGQzMQotICAgIFZNTEFMLlU4IHExMCxkNixkMzEKLSAgICBWTUxTTC5VOCBxMCxkMyxkMzAKLSAgICBWQURETC5VOCBxMTEsZDQsZDE0Ci0gICAgVk1MU0wuVTggcTksZDIsZDMwCi0gICAgVkFEREwuVTggcTEsZDMsZDEzCi0gICAgVk1MQUwuVTggcTAsZDcsZDMxCi0gICAgVk1MQUwuVTggcTEwLGQ4LGQzMQotICAgIFZNTFNMLlU4IHE5LGQ4LGQzMAotICAgIFZNTEFMLlU4IHExLGQ3LGQzMQotICAgIFZNTFNMLlU4IHEwLGQ5LGQzMAotICAgIFZNTEFMLlU4IHExMSxkOCxkMzEKLSAgICBWTUxTTC5VOCBxMTAsZDQsZDMwCi0gICAgVk1MU0wuVTggcTEsZDUsZDMwCi0gICAgVkFEREwuVTggcTIsZDUsZDE1Ci0gICAgVk1MQUwuVTggcTExLGQxMCxkMzEKLSAgICBWTUxTTC5VOCBxMTAsZDEwLGQzMAotICAgIFZNTEFMLlU4IHExLGQ5LGQzMQotICAgIFZNTEFMLlU4IHEyLGQ5LGQzMQotICAgIFZBRERMLlU4IHExMixkNixkMTYKLSAgICBWTUxTTC5VOCBxMTEsZDYsZDMwCi0gICAgVk1MU0wuVTggcTEsZDExLGQzMAotICAgIFZNTFNMLlU4IHEyLGQ3LGQzMAotICAgIFZBRERMLlU4IHEzLGQ3LGQxNwotICAgIFZNTEFMLlU4IHExMixkMTAsZDMxCi0gICAgVk1MU0wuVTggcTExLGQxMixkMzAKLSAgICBWTUxTTC5VOCBxMixkMTMsZDMwCi0gICAgVk1MQUwuVTggcTMsZDExLGQzMQotICAgIFZNTEFMLlU4IHExMixkMTIsZDMxCi0gICAgVkVYVC44ICAgZDI2LGQxOCxkMTksIzIKLSAgICBWTUxBTC5VOCBxMixkMTEsZDMxCi0gICAgVk1MQUwuVTggcTMsZDEzLGQzMQotICAgIFZNTFNMLlU4IHExMixkOCxkMzAKLSAgICBWRVhULjggICBkMjcsZDE4LGQxOSwjNAotICAgIFZNT1YuSTE2IGQzMSwjMHgxNAotICAgIFZNTFNMLlU4IHEzLGQ5LGQzMAotICAgIFZNTFNMLlU4IHExMixkMTQsZDMwCi0gICAgVkVYVC44ICAgZDI5LGQxOSxkMCwjMgotICAgIFZFWFQuOCAgIGQyOCxkMTgsZDE5LCM2Ci0gICAgVk1MU0wuVTggcTMsZDE1LGQzMAotICAgIFZBRERMLlMxNiBxMCxkMTgsZDI5Ci0gICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKLSAgICBWTU9WLkkxNiBkMzAsIzB4NQotICAgIFZBREQuSTE2IGQyNixkMjYsZDE5Ci0gICAgVk1MQUwuUzE2IHEwLGQyNyxkMzEKLSAgICBWRVhULjggICBkMjcsZDIwLGQyMSwjNAotICAgIFZFWFQuOCAgIGQyOCxkMjAsZDIxLCM2Ci0gICAgVkVYVC44ICAgZDI5LGQyMSxkMiwjMgotICAgIFZNTFNMLlMxNiBxMCxkMjYsZDMwCi0gICAgVkVYVC44ICAgZDI2LGQyMCxkMjEsIzIKLSAgICBWQURETC5TMTYgcTEsZDIwLGQyOQotICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4Ci0gICAgVkFERC5JMTYgZDI2LGQyNixkMjEKLSAgICBWRVhULjggICBkMjgsZDIyLGQyMywjNgotICAgIFZNTEFMLlMxNiBxMSxkMjcsZDMxCi0gICAgVkVYVC44ICAgZDI5LGQyMyxkNCwjMgotICAgIFZFWFQuOCAgIGQyNyxkMjIsZDIzLCM0Ci0gICAgVkVYVC44ICAgZDgsZDIyLGQyMywjMgotICAgIFZBRERMLlMxNiBxMixkMjIsZDI5Ci0gICAgVk1MU0wuUzE2IHExLGQyNixkMzAKLSAgICBWQURELkkxNiBkMjcsZDI3LGQyOAotICAgIFZBREQuSTE2IGQyNixkOCxkMjMKLSAgICBWRVhULjggICBkMjgsZDI0LGQyNSwjNgotICAgIFZNTEFMLlMxNiBxMixkMjcsZDMxCi0gICAgVkVYVC44ICAgZDI3LGQyNCxkMjUsIzQKLSAgICBWRVhULjggICBkMjksZDI1LGQ2LCMyCi0gICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKLSAgICBWRVhULjggICBkOCxkMjQsZDI1LCMyCi0gICAgVkFEREwuUzE2IHEzLGQyNCxkMjkKLSAgICBWTUxTTC5TMTYgcTIsZDI2LGQzMAotICAgIFZNTEFMLlMxNiBxMyxkMjcsZDMxCi0gICAgVkFERC5JMTYgZDgsZDgsZDI1Ci0gICAgVk1MU0wuUzE2IHEzLGQ4LGQzMAotICAgIFZRUlNIUlVOLlMzMiBkMCxxMCwjMTAKLSAgICBWUVJTSFJVTi5TMzIgZDIscTEsIzEwCi0gICAgVlFSU0hSVU4uUzMyIGQ0LHEyLCMxMAotICAgIFZRUlNIUlVOLlMzMiBkNixxMywjMTAKLSAgICBWUU1PVk4uVTE2IGQwLHEwCi0gICAgVlFNT1ZOLlUxNiBkMixxMQotICAgIFZRTU9WTi5VMTYgZDQscTIKLSAgICBWUU1PVk4uVTE2IGQ2LHEzCi0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTNkMzg1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWTEQxLjggICB7ZDIyLGQyM30sW3IwXSxyMQotICAgIFZFWFQuOCAgIGQxMCxkMjIsZDIzLCM1Ci0gICAgVkVYVC44ICAgZDEyLGQyMixkMjMsIzEKLSAgICBWRVhULjggICBkMTQsZDIyLGQyMywjMgotICAgIFZFWFQuOCAgIGQxNSxkMjIsZDIzLCMzCi0gICAgVkVYVC44ICAgZDEzLGQyMixkMjMsIzQKLSAgICBWQURETC5VOCBxMTEsZDIyLGQxMAotICAgIFZBRERMLlU4IHE0LGQxNCxkMTUKLSAgICBWQURETC5VOCBxNixkMTIsZDEzCi0gICAgVkxEMS44ICAge2QyNCxkMjV9LFtyMF0scjEKLSAgICBWTUxBLkkxNiBkMjIsZDgsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDEyLGQzMAotICAgIFZFWFQuOCAgIGQxMCxkMjQsZDI1LCM1Ci0gICAgVkVYVC44ICAgZDEyLGQyNCxkMjUsIzEKLSAgICBWRVhULjggICBkMTYsZDI0LGQyNSwjMgotICAgIFZFWFQuOCAgIGQxNyxkMjQsZDI1LCMzCi0gICAgVkVYVC44ICAgZDEzLGQyNCxkMjUsIzQKLSAgICBWQURETC5VOCBxMTIsZDI0LGQxMAotICAgIFZTVUIuSTE2IGQyMixkMjIsZDgKLSAgICBWQURETC5VOCBxNCxkMTYsZDE3Ci0gICAgVkFEREwuVTggcTYsZDEyLGQxMwotICAgIFZMRDEuOCAgIHtkMjYsZDI3fSxbcjBdLHIxCi0gICAgVk1MQS5JMTYgZDI0LGQ4LGQzMQotICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKLSAgICBWRVhULjggICBkMTAsZDI2LGQyNywjNQotICAgIFZFWFQuOCAgIGQxMixkMjYsZDI3LCMxCi0gICAgVkVYVC44ICAgZDE4LGQyNixkMjcsIzIKLSAgICBWRVhULjggICBkMTksZDI2LGQyNywjMwotICAgIFZFWFQuOCAgIGQxMyxkMjYsZDI3LCM0Ci0gICAgVkFEREwuVTggcTEzLGQyNixkMTAKLSAgICBWU1VCLkkxNiBkMjQsZDI0LGQ4Ci0gICAgVkFEREwuVTggcTQsZDE4LGQxOQotICAgIFZBRERMLlU4IHE2LGQxMixkMTMKLSAgICBWTEQxLjggICB7ZDI4LGQyOX0sW3IwXSxyMQotICAgIFZNTEEuSTE2IGQyNixkOCxkMzEKLSAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCi0gICAgVkVYVC44ICAgZDEwLGQyOCxkMjksIzUKLSAgICBWRVhULjggICBkMTIsZDI4LGQyOSwjMQotICAgIFZFWFQuOCAgIGQyMCxkMjgsZDI5LCMyCi0gICAgVkVYVC44ICAgZDIxLGQyOCxkMjksIzMKLSAgICBWRVhULjggICBkMTMsZDI4LGQyOSwjNAotICAgIFZBRERMLlU4IHExNCxkMjgsZDEwCi0gICAgVlNVQi5JMTYgZDI2LGQyNixkOAotICAgIFZBRERMLlU4IHE0LGQyMCxkMjEKLSAgICBWQURETC5VOCBxNixkMTIsZDEzCi0gICAgVk1MQS5JMTYgZDI4LGQ4LGQzMQotICAgIFZNTFMuSTE2IGQyOCxkMTIsZDMwCi0gICAgVlFSU0hSVU4uUzE2IGQyMixxMTEsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDI0LHExMiwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjYscTEzLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyOCxxMTQsIzUKLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGU3YjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMQotICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzIKLSAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEKLSAgICBWTEQxLjggICB7ZDEyfSxbcjEyXSxyMQotICAgIFZMRDEuOCAgIHtkOX0sW3IwXSxyMQotICAgIFZBRERMLlU4IHEwLGQ3LGQxMgotICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0scjEKLSAgICBWTEQxLjggICB7ZDEzfSxbcjEyXSxyMQotICAgIFZMRDEuOCAgIHtkMTF9LFtyMF0scjEKLSAgICBWTEQxLjggICB7ZDE0fSxbcjEyXSxyMQotICAgIFZBRERMLlU4IHE4LGQ4LGQxMQotICAgIFZBRERMLlU4IHE5LGQ5LGQxMAotICAgIFZMRDEuOCAgIHtkMTV9LFtyMTJdLHIxCi0gICAgVk1MUy5JMTYgZDAsZDE2LGQzMAotICAgIFZNVUwuSTE2IGQyMCxkMTgsZDMxCi0gICAgVkFEREwuVTggcTgsZDksZDEyCi0gICAgVkFEREwuVTggcTksZDEwLGQxMQotICAgIFZBRERMLlU4IHExLGQ4LGQxMwotICAgIFZNTFMuSTE2IGQyLGQxNixkMzAKLSAgICBWTVVMLkkxNiBkMjEsZDE4LGQzMQotICAgIFZBRERMLlU4IHE4LGQxMCxkMTMKLSAgICBWQURETC5VOCBxOSxkMTEsZDEyCi0gICAgVkFEREwuVTggcTIsZDksZDE0Ci0gICAgVk1MUy5JMTYgZDQsZDE2LGQzMAotICAgIFZNVUwuSTE2IGQyMixkMTgsZDMxCi0gICAgVkFEREwuVTggcTgsZDExLGQxNAotICAgIFZBRERMLlU4IHEzLGQxMCxkMTUKLSAgICBWQURETC5VOCBxOSxkMTIsZDEzCi0gICAgVk1MUy5JMTYgZDYsZDE2LGQzMAotICAgIFZBREQuSTE2IGQwLGQwLGQyMAotICAgIFZBREQuSTE2IGQyLGQyLGQyMQotICAgIFZBREQuSTE2IGQ0LGQ0LGQyMgotICAgIFZNTEEuSTE2IGQ2LGQxOCxkMzEKLSAgICBWUVJTSFJVTi5TMTYgZDAscTAsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDIscTEsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDQscTIsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDYscTMsIzUKLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Njk1MTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLQotICAgIC50ZXh0Ci0gICAgLmFsaWduIDQKLQotYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm86Ci0gICAgLndvcmQgICBXaWR0aElzMk1WSXNOb3RaZXJvLShQMCs4KSwgV2lkdGhJczJNVklzTm90WmVyby0oUDArOCkKLSAgICAud29yZCAgIFdpZHRoSXM0TVZJc05vdFplcm8tKFAwKzgpLCBXaWR0aElzNE1WSXNOb3RaZXJvLShQMCs4KQotICAgIC53b3JkICAgV2lkdGhJczhNVklzTm90WmVyby0oUDArOCkKLQotYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm86Ci0gICAgLndvcmQgICBXaWR0aElzMk1WSXNaZXJvLShQMCs4KSwgV2lkdGhJczJNVklzWmVyby0oUDArOCkKLSAgICAud29yZCAgIFdpZHRoSXM0TVZJc1plcm8tKFAwKzgpLCBXaWR0aElzNE1WSXNaZXJvLShQMCs4KQotICAgIC53b3JkICAgV2lkdGhJczhNVklzWmVyby0oUDArOCkKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBMRFJEICAgICByNixyNyxbc3AsIzB4NzBdCi0gICAgTERSRCAgICAgcjQscjUsW3NwLCMweDY4XQotICAgIFJTQiAgICAgIHI4LHI2LCM4Ci0gICAgUlNCICAgICAgcjkscjcsIzgKLSAgICBDTU4gICAgICByNixyNwotICAgIE1PViAgICAgIHIxMCwjMQotICAgIEFEUkVRICAgIHIxMSwgYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8KLSAgICBTVUIgICAgICBscixyMSxyMTAKLSAgICBBRFJORSAgICByMTEsIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAotICAgIFNNVUxCQiAgIHIxMixyOCxyOQotICAgIFNNVUxCQiAgIHI5LHI2LHI5Ci0gICAgVkxEMS44ICAge2QxfSxbcjBdLGxyCi0gICAgU01VTEJCICAgcjgscjgscjcKLSAgICBTTVVMQkIgICByNixyNixyNwotICAgIFZEVVAuOCAgIGQxMixyMTIKLSAgICBWRFVQLjggICBkMTMscjkKLSAgICBWRFVQLjggICBkMTQscjgKLSAgICBWRFVQLjggICBkMTUscjYKLSAgICBMRFIgICAgICByMTEsW3IxMSwgcjQsIGxzbCAjMV0KLVAwOiBBREQgICAgICBwYyxyMTEKLQotV2lkdGhJczhNVklzTm90WmVybzoKLSAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCi0gICAgVk1VTEwuVTggcTIsZDAsZDEyCi0gICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCi0gICAgVk1VTEwuVTggcTMsZDIsZDEyCi0gICAgVkxEMS44ICAge2QxNn0sW3IwXSxyMTAKLSAgICBWTUxBTC5VOCBxMixkMSxkMTMKLSAgICBWTEQxLjggICB7ZDE3fSxbcjBdLGxyCi0gICAgVk1VTEwuVTggcTExLGQxNixkMTIKLSAgICBWTUxBTC5VOCBxMyxkMyxkMTMKLSAgICBWTEQxLjggICB7ZDE4fSxbcjBdLHIxMAotICAgIFZNTEFMLlU4IHEyLGQyLGQxNAotICAgIFZNTEFMLlU4IHExMSxkMTcsZDEzCi0gICAgVk1VTEwuVTggcTEyLGQxOCxkMTIKLSAgICBWTEQxLjggICB7ZDE5fSxbcjBdLGxyCi0gICAgVk1MQUwuVTggcTMsZDE2LGQxNAotICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKLSAgICBWTUxBTC5VOCBxMTIsZDE5LGQxMwotICAgIFZNTEFMLlU4IHExMSxkMTgsZDE0Ci0gICAgVk1MQUwuVTggcTIsZDMsZDE1Ci0gICAgVkxEMS44ICAge2QxfSxbcjBdLGxyCi0gICAgVk1MQUwuVTggcTEyLGQwLGQxNAotICAgIFZNTEFMLlU4IHEzLGQxNyxkMTUKLSAgICBWTUxBTC5VOCBxMTEsZDE5LGQxNQotICAgIFNVQlMgICAgIHI1LHI1LCM0Ci0gICAgVk1MQUwuVTggcTEyLGQxLGQxNQotICAgIFZRUlNIUk4uVTE2IGQ4LHEyLCM2Ci0gICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKLSAgICBWUVJTSFJOLlUxNiBkMjAscTExLCM2Ci0gICAgVlNUMS42NCAge2Q4fSxbcjJdLHIzCi0gICAgVlFSU0hSTi5VMTYgZDIxLHExMiwjNgotICAgIFZTVDEuNjQgIHtkOX0sW3IyXSxyMwotICAgIFZTVDEuNjQgIHtkMjB9LFtyMl0scjMKLSAgICBWU1QxLjY0ICB7ZDIxfSxbcjJdLHIzCi0gICAgQkdUICAgICAgV2lkdGhJczhNVklzTm90WmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi1XaWR0aElzNE1WSXNOb3RaZXJvOgotICAgIFZMRDEuOCAgIHtkMn0sW3IwXSxyMTAKLSAgICBWTVVMTC5VOCBxMixkMCxkMTIKLSAgICBWTVVMTC5VOCBxMyxkMixkMTIKLSAgICBWTEQxLjggICB7ZDN9LFtyMF0sbHIKLSAgICBWTUxBTC5VOCBxMixkMSxkMTMKLSAgICBWTUxBTC5VOCBxMyxkMyxkMTMKLSAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCi0gICAgVk1MQUwuVTggcTIsZDIsZDE0Ci0gICAgVk1MQUwuVTggcTMsZDAsZDE0Ci0gICAgVkxEMS44ICAge2QxfSxbcjBdLGxyCi0gICAgU1VCUyAgICAgcjUscjUsIzIKLSAgICBWTUxBTC5VOCBxMyxkMSxkMTUKLSAgICBWTUxBTC5VOCBxMixkMyxkMTUKLSAgICBWUVJTSFJOLlUxNiBkOSxxMywjNgotICAgIFZRUlNIUk4uVTE2IGQ4LHEyLCM2Ci0gICAgVlNUMS4zMiAge2Q4WzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q5WzBdfSxbcjJdLHIzCi0gICAgQkdUICAgICAgV2lkdGhJczRNVklzTm90WmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi1XaWR0aElzMk1WSXNOb3RaZXJvOgotICAgIFZMRDEuOCAgIHtkMn0sW3IwXSxyMTAKLSAgICBWTVVMTC5VOCBxMixkMCxkMTIKLSAgICBWTVVMTC5VOCBxMyxkMixkMTIKLSAgICBWTEQxLjggICB7ZDN9LFtyMF0sbHIKLSAgICBWTUxBTC5VOCBxMixkMSxkMTMKLSAgICBWTUxBTC5VOCBxMyxkMyxkMTMKLSAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCi0gICAgVk1MQUwuVTggcTIsZDIsZDE0Ci0gICAgVk1MQUwuVTggcTMsZDAsZDE0Ci0gICAgVkxEMS44ICAge2QxfSxbcjBdLGxyCi0gICAgU1VCUyAgICAgcjUscjUsIzIKLSAgICBWTUxBTC5VOCBxMyxkMSxkMTUKLSAgICBWTUxBTC5VOCBxMixkMyxkMTUKLSAgICBWUVJTSFJOLlUxNiBkOSxxMywjNgotICAgIFZRUlNIUk4uVTE2IGQ4LHEyLCM2Ci0gICAgVlNUMS4xNiAge2Q4WzBdfSxbcjJdLHIzCi0gICAgVlNUMS4xNiAge2Q5WzBdfSxbcjJdLHIzCi0gICAgQkdUICAgICAgV2lkdGhJczJNVklzTm90WmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi1XaWR0aElzOE1WSXNaZXJvOgotICAgIFNVQiAgICAgIHIwLHIwLHIxCi1XaWR0aElzOExvb3BNVklzWmVybzoKLSAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEKLSAgICBTVUJTICAgICByNSxyNSwjMgotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQotICAgIFZTVDEuNjQgIHtkMH0sW3IyXSxyMwotICAgIFZTVDEuNjQgIHtkMX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXM4TG9vcE1WSXNaZXJvCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLVdpZHRoSXM0TVZJc1plcm86Ci0gICAgVkxEMS44ICAge2QxfSxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjUscjUsIzIKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEKLSAgICBWU1QxLjMyICB7ZDFbMF19LFtyMl0scjMKLSAgICBCR1QgICAgICBXaWR0aElzNE1WSXNaZXJvCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLVdpZHRoSXMyTVZJc1plcm86Ci0gICAgVkxEMS44ICAge2QxfSxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjUscjUsIzIKLSAgICBWU1QxLjE2ICB7ZDBbMF19LFtyMl0scjMKLSAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEKLSAgICBWU1QxLjE2ICB7ZDFbMF19LFtyMl0scjMKLSAgICBCR1QgICAgICBXaWR0aElzMk1WSXNaZXJvCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZTYwMTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC5zZWN0aW9uIC5yb2RhdGEKLSAgICAuYWxpZ24gNAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1hcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZToKLSAgICAud29yZCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1Ci0gICAgLndvcmQgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MAotICAgIC53b3JkIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEKLSAgICAud29yZCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyCi0gICAgLndvcmQgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNQotICAgIC53b3JkIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAKLSAgICAud29yZCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxCi0gICAgLndvcmQgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMgotCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlOgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlOgotICAgIC5ieXRlIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKLSAgICAuYnl0ZSAxNywgMTcsIDE3LCAxNywgMTcsIDE3Ci0gICAgLmJ5dGUgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOAotICAgIC5ieXRlIDE5LCAxOSwgMTksIDE5LCAxOSwgMTkKLSAgICAuYnl0ZSAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwCi0gICAgLmJ5dGUgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMQotICAgIC5ieXRlIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIKLSAgICAuYnl0ZSAyMywgMjMsIDIzLCAyMywgMjMsIDIzCi0gICAgLmJ5dGUgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNAotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThiZWM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLWFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQ6Ci0gICAgVlBVU0ggICAge2Q4fQotICAgIFZMRDQuMTYgIHtkMCxkMSxkMixkM30sW3IxXQotICAgIFZNT1YuSTE2IGQ0LCMwCi0gICAgVkFERC5JMTYgZDUsZDAsZDIKLSAgICBWU1VCLkkxNiBkNixkMCxkMgotICAgIFZIQURELlMxNiBkNyxkMSxkNAotICAgIFZIQURELlMxNiBkOCxkMyxkNAotICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCi0gICAgVkFERC5JMTYgZDgsZDEsZDgKLSAgICBWQURELkkxNiBkMCxkNSxkOAotICAgIFZBREQuSTE2IGQxLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDIsZDYsZDcKLSAgICBWU1VCLkkxNiBkMyxkNSxkOAotICAgIFZUUk4uMTYgIGQwLGQxCi0gICAgVlRSTi4xNiAgZDIsZDMKLSAgICBWVFJOLjMyICBxMCxxMQotICAgIFZBREQuSTE2IGQ1LGQwLGQyCi0gICAgVlNVQi5JMTYgZDYsZDAsZDIKLSAgICBWSEFERC5TMTYgZDcsZDEsZDQKLSAgICBWSEFERC5TMTYgZDgsZDMsZDQKLSAgICBWU1VCLkkxNiBkNyxkNyxkMwotICAgIFZBREQuSTE2IGQ4LGQxLGQ4Ci0gICAgVkFERC5JMTYgZDAsZDUsZDgKLSAgICBWQURELkkxNiBkMSxkNixkNwotICAgIFZTVUIuSTE2IGQyLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDMsZDUsZDgKLSAgICBWUlNIUi5TMTYgZDAsZDAsIzYKLSAgICBWUlNIUi5TMTYgZDEsZDEsIzYKLSAgICBWUlNIUi5TMTYgZDIsZDIsIzYKLSAgICBWUlNIUi5TMTYgZDMsZDMsIzYKLSAgICBWU1QxLjE2ICB7ZDAsZDEsZDIsZDN9LFtyMF0KLSAgICBWUE9QICAgICB7ZDh9Ci0gICAgQlggICAgICAgbHIKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3ZWZjYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotICAgIC5zeW50YXggdW5pZmllZAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci1hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0OgotICAgIFBVU0ggICAgIHtyNC1yOCxscn0KLSAgICBMRFIgICAgICByMixbcjAsIzBdCi0gICAgTU9WICAgICAgcjcsIzB4MWYKLSAgICBNT1YgICAgICByNCwjMAotICAgIE1PViAgICAgIHI1LCMwCi0gICAgTERSQiAgICAgcjMsW3IyXSwjMQotICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjMF0KLSAgICBTVFJEICAgICByNCxyNSxbcjEsIzhdCi0gICAgU1RSRCAgICAgcjQscjUsW3IxLCMweDEwXQotICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjMHgxOF0KLXVucGFja0xvb3A6Ci0gICAgVFNUICAgICAgcjMsIzB4MTAKLSAgICBMRFJTQk5FICByNSxbcjIsIzFdCi0gICAgTERSQk5FICAgcjQsW3IyXSwjMgotICAgIEFORCAgICAgIHI2LHI3LHIzLExTTCAjMQotICAgIExEUlNCRVEgIHI0LFtyMl0sIzEKLSAgICBPUlJORSAgICByNCxyNCxyNSxMU0wgIzgKLSAgICBUU1QgICAgICByMywjMHgyMAotICAgIExEUkJFUSAgIHIzLFtyMl0sIzEKLSAgICBTVFJIICAgICByNCxbcjEscjZdCi0gICAgQkVRICAgICAgdW5wYWNrTG9vcAotICAgIFNUUiAgICAgIHIyLFtyMCwjMF0KLSAgICBQT1AgICAgICB7cjQtcjgscGN9Ci0gICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5OWJkZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuUworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKLW9teFZDTTRQMTBfRGVibG9ja0x1bWFfSToKLSAgICBQVVNIICAgICB7cjQtcjksbHJ9Ci0gICAgTU9WUyAgICAgcjYscjAKLSAgICBTVUIgICAgICBzcCxzcCwjMHhjCi0gICAgTU9WICAgICAgcjkscjEKLSAgICBNT1YgICAgICByNyxyMgotICAgIE1PViAgICAgIHI4LHIzCi0gICAgTERSICAgICAgcjQsW3NwLCMweDI4XQotICAgIExEUiAgICAgIHI1LFtzcCwjMHgyY10KLSAgICBCRVEgICAgICBMMHg1OAotICAgIFRTVCAgICAgIHI2LCM3Ci0gICAgVFNURVEgICAgcjksIzcKLSAgICBCTkUgICAgICBMMHg1OAotICAgIENNUCAgICAgIHI3LCMwCi0gICAgQ01QTkUgICAgcjgsIzAKLSAgICBDTVBORSAgICByNCwjMAotICAgIEJFUSAgICAgIEwweDU4Ci0gICAgVFNUICAgICAgcjQsIzMKLSAgICBCTkUgICAgICBMMHg1OAotICAgIENNUCAgICAgIHI1LCMwCi0gICAgQkVRICAgICAgTDB4NTgKLSAgICBUU1QgICAgICByNSwjMwotICAgIEJFUSAgICAgIEwweDY0Ci1MMHg1ODoKLSAgICBNVk4gICAgICByMCwjNAotTDB4NWM6Ci0gICAgQUREICAgICAgc3Asc3AsIzB4YwotICAgIFBPUCAgICAgIHtyNC1yOSxwY30KLUwweDY0OgotICAgIFNUUiAgICAgIHI0LFtzcCwjMF0KLSAgICBNT1YgICAgICByMyxyOAotICAgIFNUUiAgICAgIHI1LFtzcCwjNF0KLSAgICBNT1YgICAgICByMixyNwotICAgIE1PViAgICAgIHIxLHI5Ci0gICAgTU9WICAgICAgcjAscjYKLSAgICBCTCAgICAgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSQotICAgIENNUCAgICAgIHIwLCMwCi0gICAgQk5FICAgICAgTDB4NWMKLSAgICBBREQgICAgICByMyxyNSwjMHgxMAotICAgIEFERCAgICAgIHIyLHI0LCMweDEwCi0gICAgU1RSICAgICAgcjMsW3NwLCM0XQotICAgIFNUUiAgICAgIHIyLFtzcCwjMF0KLSAgICBBREQgICAgICByMyxyOCwjMgotICAgIEFERCAgICAgIHIyLHI3LCMyCi0gICAgTU9WICAgICAgcjEscjkKLSAgICBNT1YgICAgICByMCxyNgotICAgIEJMICAgICAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JCi0gICAgQUREICAgICAgc3Asc3AsIzB4YwotICAgIFBPUCAgICAgIHtyNC1yOSxwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNWQ4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAotb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZDoKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kOX0KLSAgICBTVUIgICAgICBzcCxzcCwjMHgyMAotICAgIEFERCAgICAgIHI0LHNwLCMwCi0gICAgTERSICAgICAgcjUsW3NwLCMweDY0XQotICAgIE1PViAgICAgIHI3LHIxCi0gICAgTU9WICAgICAgcjgscjIKLSAgICBNT1YgICAgICByOSxyMwotICAgIENNUCAgICAgIHI1LCMwCi0gICAgQkVRICAgICAgTDB4MTE0Ci0gICAgTU9WICAgICAgcjEscjQKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0ICA7Ly8KLSAgICBMRFIgICAgICByMSxbc3AsIzB4NjBdCi0gICAgTERSICAgICAgcjExLCAuTGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotUDA6IEFERCAgICAgIHIxMSwgcGMKLSAgICBMRFIgICAgICByMTAsIC5MYXJtVkNNNFAxMF9RUERpdlRhYmxlCi1QMTogQUREICAgICAgcjEwLCBwYwotICAgIExEUiAgICAgIHIyLCAuTGFybVZDTTRQMTBfVk1hdHJpeFUxNgotUDI6IEFERCAgICAgIHIyLCBwYwotICAgIExEUlNCICAgIHIxMixbcjExLHIxXQotICAgIExEUlNCICAgIGxyLFtyMTAscjFdCi0gICAgTERSICAgICAgcjEwLCA9MHgzMDIwNTA0Ci0gICAgTERSICAgICAgcjEsID0weDUwNDAxMDAKLSAgICBBREQgICAgICByMixyMixyMTIKLSAgICBWRFVQLjMyICBkNyxyMQotICAgIFZEVVAuMzIgIGQ5LHIxMAotICAgIFZEVVAuMTYgIGQ1LGxyCi0gICAgVkxEMS44ICAge2Q2fSxbcjJdCi0gICAgVlRCTC44ICAgZDgse2Q2fSxkNwotICAgIFZUQkwuOCAgIGQ0LHtkNn0sZDkKLSAgICBDTVAgICAgICByOCwjMAotICAgIFZMRDEuMTYgIHtkMCxkMSxkMixkM30sW3I0XQotICAgIFZTSEwuVTE2IGQ4LGQ4LGQ1Ci0gICAgVlNITC5VMTYgZDQsZDQsZDUKLSAgICBCRVEgICAgICBMMQotICAgIExEUlNIICAgIHIxMCxbcjgsIzBdCi1MMToKLSAgICBWTVVMLkkxNiBkMCxkMCxkOAotICAgIFZNVUwuSTE2IGQxLGQxLGQ0Ci0gICAgVk1VTC5JMTYgZDIsZDIsZDgKLSAgICBWTVVMLkkxNiBkMyxkMyxkNAotICAgIFZNT1ZORS4xNiBkMFswXSxyMTAKLSAgICBWVFJOLjE2ICBkMCxkMQotICAgIFZUUk4uMTYgIGQyLGQzCi0gICAgVlRSTi4zMiAgcTAscTEKLSAgICBWTU9WLkkxNiBkNCwjMAotICAgIFZBREQuSTE2IGQ1LGQwLGQyCi0gICAgVlNVQi5JMTYgZDYsZDAsZDIKLSAgICBWSEFERC5TMTYgZDcsZDEsZDQKLSAgICBWSEFERC5TMTYgZDgsZDMsZDQKLSAgICBWU1VCLkkxNiBkNyxkNyxkMwotICAgIFZBREQuSTE2IGQ4LGQxLGQ4Ci0gICAgVkFERC5JMTYgZDAsZDUsZDgKLSAgICBWQURELkkxNiBkMSxkNixkNwotICAgIFZTVUIuSTE2IGQyLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDMsZDUsZDgKLSAgICBWVFJOLjE2ICBkMCxkMQotICAgIFZUUk4uMTYgIGQyLGQzCi0gICAgVlRSTi4zMiAgcTAscTEKLSAgICBWQURELkkxNiBkNSxkMCxkMgotICAgIFZTVUIuSTE2IGQ2LGQwLGQyCi0gICAgVkhBREQuUzE2IGQ3LGQxLGQ0Ci0gICAgVkhBREQuUzE2IGQ4LGQzLGQ0Ci0gICAgVlNVQi5JMTYgZDcsZDcsZDMKLSAgICBWQURELkkxNiBkOCxkMSxkOAotICAgIFZBREQuSTE2IGQwLGQ1LGQ4Ci0gICAgVkFERC5JMTYgZDEsZDYsZDcKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIFZTVUIuSTE2IGQzLGQ1LGQ4Ci0gICAgVlJTSFIuUzE2IGQwLGQwLCM2Ci0gICAgVlJTSFIuUzE2IGQxLGQxLCM2Ci0gICAgVlJTSFIuUzE2IGQyLGQyLCM2Ci0gICAgVlJTSFIuUzE2IGQzLGQzLCM2Ci0gICAgQiAgICAgICAgTDB4MTMwCi1MMHgxMTQ6Ci0gICAgTERSU0ggICAgcjEwLFtyOCwjMF0KLSAgICBBREQgICAgICByMTAscjEwLCMweDIwCi0gICAgQVNSICAgICAgcjEwLHIxMCwjNgotICAgIFZEVVAuMTYgIGQwLHIxMAotICAgIFZEVVAuMTYgIGQxLHIxMAotICAgIFZEVVAuMTYgIGQyLHIxMAotICAgIFZEVVAuMTYgIGQzLHIxMAotTDB4MTMwOgotICAgIExEUiAgICAgIHIxLFtzcCwjMHg1OF0KLSAgICBMRFIgICAgICByMTAsW3NwLCMweDVjXQotICAgIExEUiAgICAgIHIzLFtyN10scjEKLSAgICBMRFIgICAgICByNSxbcjddLHIxCi0gICAgVk1PViAgICAgZDQscjMscjUKLSAgICBMRFIgICAgICByMyxbcjddLHIxCi0gICAgTERSICAgICAgcjUsW3I3LCMwXQotICAgIFZNT1YgICAgIGQ1LHIzLHI1Ci0gICAgVkFERFcuVTggcTMscTAsZDQKLSAgICBWQUREVy5VOCBxNCxxMSxkNQotICAgIFZRTU9WVU4uUzE2IGQwLHEzCi0gICAgVlFNT1ZVTi5TMTYgZDEscTQKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyOV0scjEwCi0gICAgVlNUMS4zMiAge2QwWzFdfSxbcjldLHIxMAotICAgIFZTVDEuMzIgIHtkMVswXX0sW3I5XSxyMTAKLSAgICBWU1QxLjMyICB7ZDFbMV19LFtyOV0KLSAgICBNT1YgICAgICByMCwjMAotICAgIEFERCAgICAgIHNwLHNwLCMweDIwCi0gICAgVlBPUCAgICAge2Q4LWQ5fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLS5MYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlOgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlLShQMCs4KQotLkxhcm1WQ000UDEwX1FQRGl2VGFibGU6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1FQRGl2VGFibGUtKFAxKzgpCi0uTGFybVZDTTRQMTBfVk1hdHJpeFUxNjoKLSAgICAud29yZCAgIGFybVZDTTRQMTBfVk1hdHJpeFUxNi0oUDIrOCkKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4MzUxNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSQotb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSToKLSAgICBQVVNIICAgICB7cjQtcjEwLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgVkxEMS44ICAge2QwW119LFtyMl0hCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgU1VCICAgICAgcjAscjAscjEKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXSEKLSAgICBMRFIgICAgICByNCxbc3AsIzB4NjRdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDYwXQotICAgIExEUiAgICAgIHI5LCA9MHgzMDMwMzAzCi0gICAgTERSICAgICAgcjgsID0weDQwNDA0MDQKLSAgICBWTU9WLkk4ICBkMTQsIzAKLSAgICBWTU9WLkk4ICBkMTUsIzB4MQotICAgIFZNT1YuSTE2IGQxLCMweDQKLSAgICBNT1YgICAgICByNywjMHg0MDAwMDAwMAotTDB4Mzg6Ci0gICAgTERSICAgICAgcjYsW3I0XSwjOAotICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxyMQotICAgIENNUCAgICAgIHI2LCMwCi0gICAgVkxEMS44ICAge2Q0fSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2Q4fSxbcjBdLHIxCi0gICAgVkFCRC5VOCAgZDE5LGQ2LGQ0Ci0gICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCi0gICAgVkFCRC5VOCAgZDEzLGQ0LGQ4Ci0gICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQotICAgIEJFUSAgICAgIEwweGU0Ci0gICAgVkFCRC5VOCAgZDEyLGQ1LGQ0Ci0gICAgVkFCRC5VOCAgZDE4LGQ5LGQ4Ci0gICAgVkNHVC5VOCAgZDE2LGQwLGQxMwotICAgIFZNT1YuMzIgIGQyNlswXSxyNgotICAgIFZNQVguVTggIGQxMixkMTgsZDEyCi0gICAgVk1PVkwuVTggcTEzLGQyNgotICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKLSAgICBWQ0dULlMxNiBkMjcsZDI2LCMwCi0gICAgVkNHVC5VOCAgZDEyLGQyLGQxMgotICAgIFZDR1QuVTggIGQxOSxkMixkMTkKLSAgICBWQU5EICAgICBkMTYsZDE2LGQyNwotICAgIFRTVCAgICAgIHI2LHI5Ci0gICAgVkNHVC5VOCAgZDE3LGQyLGQxNwotICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCi0gICAgVkFORCAgICAgZDEyLGQxNixkMTcKLSAgICBWQU5EICAgICBkMTcsZDE2LGQxOQotICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotICAgIFRTVCAgICAgIHI2LHI4Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCi0gICAgVlRTVC4xNiAgZDI2LGQyNixkMQotICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotICAgIFZCSVQgICAgIGQyOSxkMTMsZDI2Ci0gICAgVkJJVCAgICAgZDI0LGQzMSxkMjYKLSAgICBWQklGICAgICBkMjksZDQsZDE2Ci0gICAgVkJJRiAgICAgZDI0LGQ4LGQxNgotICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjEKLSAgICBBRERTICAgICByNyxyNyxyNwotICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKLSAgICBCTkUgICAgICBMMHgzOAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEwLHBjfQotTDB4ZTQ6Ci0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBBRERTICAgICByNyxyNyxyNwotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgQUREICAgICAgcjUscjUsIzQKLSAgICBCTkUgICAgICBMMHgzOAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEwLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTEwOTMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JCi1vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXSEKLSAgICBTVUIgICAgICByMCxyMCwjNAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdIQotICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KLSAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCi0gICAgTERSICAgICAgcjgsID0weDQwNDA0MDQKLSAgICBMRFIgICAgICByOSwgPTB4MzAzMDMwMwotICAgIFZNT1YuSTggIGQxNCwjMAotICAgIFZNT1YuSTggIGQxNSwjMHgxCi0gICAgVk1PVi5JMTYgZDEsIzB4NAotICAgIE1PViAgICAgIHI3LCMweDQwMDAwMDAwCi1MMHgzNDoKLSAgICBMRFIgICAgICByNixbcjRdLCM4Ci0gICAgQUREICAgICAgcjEwLHIwLHIxCi0gICAgQUREICAgICAgbHIscjEscjEKLSAgICBWTEQxLjggICB7ZDd9LFtyMF0sbHIKLSAgICBWTEQxLjggICB7ZDh9LFtyMTBdLGxyCi0gICAgVkxEMS44ICAge2Q1fSxbcjBdLGxyCi0gICAgVkxEMS44ICAge2QxMH0sW3IxMF0sbHIKLSAgICBWTEQxLjggICB7ZDZ9LFtyMF0sbHIKLSAgICBWTEQxLjggICB7ZDl9LFtyMTBdLGxyCi0gICAgVkxEMS44ICAge2Q0fSxbcjBdLGxyCi0gICAgVkxEMS44ICAge2QxMX0sW3IxMF0sbHIKLSAgICBWWklQLjggICBkNyxkOAotICAgIFZaSVAuOCAgIGQ1LGQxMAotICAgIFZaSVAuOCAgIGQ2LGQ5Ci0gICAgVlpJUC44ICAgZDQsZDExCi0gICAgVlpJUC4xNiAgZDcsZDUKLSAgICBWWklQLjE2ICBkOCxkMTAKLSAgICBWWklQLjE2ICBkNixkNAotICAgIFZaSVAuMTYgIGQ5LGQxMQotICAgIFZUUk4uMzIgIGQ3LGQ2Ci0gICAgVlRSTi4zMiAgZDUsZDQKLSAgICBWVFJOLjMyICBkMTAsZDExCi0gICAgVlRSTi4zMiAgZDgsZDkKLSAgICBDTVAgICAgICByNiwjMAotICAgIFZBQkQuVTggIGQxOSxkNixkNAotICAgIFZBQkQuVTggIGQxMyxkNCxkOAotICAgIEJFUSAgICAgIEwweDE3MAotICAgIFZBQkQuVTggIGQxMixkNSxkNAotICAgIFZBQkQuVTggIGQxOCxkOSxkOAotICAgIFZNT1YuMzIgIGQyNlswXSxyNgotICAgIFZDR1QuVTggIGQxNixkMCxkMTMKLSAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgotICAgIFZNT1ZMLlU4IHExMyxkMjYKLSAgICBWQUJELlU4ICBkMTcsZDEwLGQ4Ci0gICAgVkNHVC5TMTYgZDI3LGQyNiwjMAotICAgIFZDR1QuVTggIGQxMixkMixkMTIKLSAgICBWQ0dULlU4ICBkMTksZDIsZDE5Ci0gICAgVkFORCAgICAgZDE2LGQxNixkMjcKLSAgICBUU1QgICAgICByNixyOQotICAgIFZDR1QuVTggIGQxNyxkMixkMTcKLSAgICBWQU5EICAgICBkMTYsZDE2LGQxMgotICAgIFZBTkQgICAgIGQxMixkMTYsZDE3Ci0gICAgVkFORCAgICAgZDE3LGQxNixkMTkKLSAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLSAgICBUU1QgICAgICByNixyOAotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMwotICAgIFZUU1QuMTYgIGQyNixkMjYsZDEKLSAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLSAgICBWQklUICAgICBkMjksZDEzLGQyNgotICAgIFZCSVQgICAgIGQyNCxkMzEsZDI2Ci0gICAgQUREICAgICAgcjEwLHIwLCMzCi0gICAgVkJJRiAgICAgZDI5LGQ0LGQxNgotICAgIEFERCAgICAgIHIxMixyMTAscjEKLSAgICBBREQgICAgICBscixyMSxyMQotICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKLSAgICBBRERTICAgICByNyxyNyxyNwotICAgIFZTVDEuOCAgIHtkMjlbMF19LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyOVsxXX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzJdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjlbM119LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyOVs0XX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzVdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjlbNl19LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyOVs3XX0sW3IxMl0sbHIKLSAgICBBREQgICAgICByMTIscjAsIzQKLSAgICBBREQgICAgICByMTAscjEyLHIxCi0gICAgVlNUMS44ICAge2QyNFswXX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzFdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjRbMl19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyNFszXX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzRdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjRbNV19LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyNFs2XX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzddfSxbcjEwXSxscgotICAgIEFERCAgICAgIHIwLHIwLCM0Ci0gICAgQk5FICAgICAgTDB4MzQKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLUwweDE3MDoKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIEFERCAgICAgIHIwLHIwLCM0Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCi0gICAgQUREUyAgICAgcjcscjcscjcKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQotICAgIEFERCAgICAgIHI1LHI1LCM0Ci0gICAgQk5FICAgICAgTDB4MzQKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGZmYWQyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kKLW9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBBREQgICAgICByNyxyMiwjMQotICAgIEFERCAgICAgIHI4LHIzLCMxCi0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQotICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KLSAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCi0gICAgTU9WICAgICAgcjExLCMwCi0gICAgVk1PVi5JOCAgZDE0LCMwCi0gICAgVk1PVi5JOCAgZDE1LCMweDEKLSAgICBBREQgICAgICByMTAscjEscjEKLSAgICBNT1YgICAgICByOSwjMHg1NTAwMDAwMAotTDB4Mzg6Ci0gICAgTERSSCAgICAgcjEyLFtyNF0sIzIKLSAgICBBREQgICAgICByNixyMCxyMQotICAgIENNUCAgICAgIHIxMiwjMAotICAgIEJFUSAgICAgIEwweGU0Ci0gICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkNn0sW3I2XSxyMTAKLSAgICBWTEQxLjggICB7ZDV9LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2Q0fSxbcjZdLHIxMAotICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMTAKLSAgICBWQUJELlU4ICBkMTIsZDQsZDUKLSAgICBWTEQxLjggICB7ZDl9LFtyNl0KLSAgICBWQUJELlU4ICBkMTMsZDgsZDQKLSAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCi0gICAgVkFCRC5VOCAgZDE4LGQ5LGQ4Ci0gICAgVkFCRC5VOCAgZDE5LGQ2LGQ0Ci0gICAgVkNHVC5VOCAgZDE2LGQwLGQxMwotICAgIFRTVCAgICAgIHIxMiwjMHhmZgotICAgIFZNQVguVTggIGQxMixkMTgsZDEyCi0gICAgVkFCRC5VOCAgZDE3LGQxMCxkOAotICAgIFZNT1ZFUS4zMiBkMTZbMF0scjExCi0gICAgVFNUICAgICAgcjEyLCMweGZmMDAKLSAgICBWQ0dULlU4ICBkMTksZDIsZDE5Ci0gICAgVkNHVC5VOCAgZDEyLGQyLGQxMgotICAgIFZNT1ZFUS4zMiBkMTZbMV0scjExCi0gICAgVkNHVC5VOCAgZDE3LGQyLGQxNwotICAgIFZMRDEuOCAgIHtkMTF9LFtyMF0KLSAgICBWQU5EICAgICBkMTYsZDE2LGQxMgotICAgIFRTVCAgICAgIHIxMiwjNAotICAgIFZBTkQgICAgIGQxMixkMTYsZDE3Ci0gICAgVkFORCAgICAgZDE3LGQxNixkMTkKLSAgICBCTkUgICAgICBMMHhmOAotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgotICAgIFNVQiAgICAgIHIwLHIwLHIxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjEKLSAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCi0gICAgU1VCICAgICAgcjYscjAscjEsTFNMICMyCi0gICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQotICAgIEFERFMgICAgIHI5LHI5LHI5Ci0gICAgVlNUMS44ICAge2QyNX0sW3IwXQotICAgIEFERCAgICAgIHIwLHI2LCM4Ci0gICAgQkNDICAgICAgTDB4MzgKLSAgICBCICAgICAgICBMMHgxMzAKLUwweGU0OgotICAgIEFERCAgICAgIHIwLHIwLCM4Ci0gICAgQUREUyAgICAgcjkscjkscjkKLSAgICBBREQgICAgICByNSxyNSwjMgotICAgIEJDQyAgICAgIEwweDM4Ci0gICAgQiAgICAgICAgTDB4MTMwCi1MMHhmODoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgVlNUMS44ICAge2QzMX0sW3IwXSxyMQotICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjEKLSAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCi0gICAgU1VCICAgICAgcjYscjAscjEsTFNMICMyCi0gICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQotICAgIEFERFMgICAgIHI5LHI5LHI5Ci0gICAgVlNUMS44ICAge2QyNX0sW3IwXSxyMQotICAgIEFERCAgICAgIHI1LHI1LCMyCi0gICAgVlNUMS44ICAge2QyOH0sW3IwXQotICAgIEFERCAgICAgIHIwLHI2LCM4Ci0gICAgQkNDICAgICAgTDB4MzgKLUwweDEzMDoKLSAgICBTVUIgICAgICByMCxyMCwjMHgxMAotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCi0gICAgQUREICAgICAgcjAscjAscjEsTFNMICMyCi0gICAgVkxEMS44ICAge2QyW119LFtyOF0KLSAgICBCTkUgICAgICBMMHgzOAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTM2ODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSQotb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0k6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIEFERCAgICAgIHI3LHIyLCMxCi0gICAgQUREICAgICAgcjgscjMsIzEKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIFNVQiAgICAgIHIwLHIwLCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBMRFIgICAgICByNCxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDY4XQotICAgIE1PViAgICAgIHI2LCMwCi0gICAgVk1PVi5JOCAgZDE0LCMwCi0gICAgVk1PVi5JOCAgZDE1LCMweDEKLSAgICBNT1YgICAgICByOSwjMHgxMTAwMDAwMAotICAgIEFERCAgICAgIHIxMSxyMSxyMQotTDB4Mzg6Ci0gICAgTERSSCAgICAgcjEyLFtyNF0sIzQKLSAgICBDTVAgICAgICByMTIsIzAKLSAgICBCRVEgICAgICBMMHgxNjAKLSAgICBBREQgICAgICByMTAscjAscjEKLSAgICBWTEQxLjggICB7ZDd9LFtyMF0scjExCi0gICAgVkxEMS44ICAge2Q4fSxbcjEwXSxyMTEKLSAgICBWTEQxLjggICB7ZDV9LFtyMF0scjExCi0gICAgVlpJUC44ICAgZDcsZDgKLSAgICBWTEQxLjggICB7ZDEwfSxbcjEwXSxyMTEKLSAgICBWTEQxLjggICB7ZDZ9LFtyMF0scjExCi0gICAgVlpJUC44ICAgZDUsZDEwCi0gICAgVkxEMS44ICAge2Q5fSxbcjEwXSxyMTEKLSAgICBWTEQxLjggICB7ZDR9LFtyMF0scjExCi0gICAgVkxEMS44ICAge2QxMX0sW3IxMF0scjExCi0gICAgVlpJUC44ICAgZDYsZDkKLSAgICBWWklQLjE2ICBkOCxkMTAKLSAgICBWWklQLjggICBkNCxkMTEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKLSAgICBWWklQLjE2ICBkNyxkNQotICAgIFZaSVAuMTYgIGQ5LGQxMQotICAgIFZaSVAuMTYgIGQ2LGQ0Ci0gICAgVlRSTi4zMiAgZDgsZDkKLSAgICBWVFJOLjMyICBkNSxkNAotICAgIFZUUk4uMzIgIGQxMCxkMTEKLSAgICBWVFJOLjMyICBkNyxkNgotICAgIFZBQkQuVTggIGQxMyxkNCxkOAotICAgIFZBQkQuVTggIGQxMixkNSxkNAotICAgIFZBQkQuVTggIGQxOCxkOSxkOAotICAgIFZBQkQuVTggIGQxOSxkNixkNAotICAgIFRTVCAgICAgIHIxMiwjMHhmZgotICAgIFZDR1QuVTggIGQxNixkMCxkMTMKLSAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgotICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKLSAgICBWTU9WRVEuMzIgZDE2WzBdLHI2Ci0gICAgVFNUICAgICAgcjEyLCMweGZmMDAKLSAgICBWQ0dULlU4ICBkMTksZDIsZDE5Ci0gICAgVkNHVC5VOCAgZDEyLGQyLGQxMgotICAgIFZNT1ZFUS4zMiBkMTZbMV0scjYKLSAgICBWQ0dULlU4ICBkMTcsZDIsZDE3Ci0gICAgVkFORCAgICAgZDE2LGQxNixkMTIKLSAgICBUU1QgICAgICByMTIsIzQKLSAgICBWQU5EICAgICBkMTIsZDE2LGQxNwotICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5Ci0gICAgQk5FICAgICAgTDB4MTdjCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotICAgIFZaSVAuOCAgIGQ3LGQ2Ci0gICAgVlpJUC44ICAgZDMwLGQyOQotICAgIFZaSVAuOCAgIGQyNCxkMjUKLSAgICBWWklQLjggICBkMTAsZDExCi0gICAgVlpJUC4xNiAgZDcsZDMwCi0gICAgQUREICAgICAgcjEwLHIwLHIxCi0gICAgVlpJUC4xNiAgZDI0LGQxMAotICAgIFZaSVAuMTYgIGQyNSxkMTEKLSAgICBWWklQLjE2ICBkNixkMjkKLSAgICBWVFJOLjMyICBkNyxkMjQKLSAgICBWVFJOLjMyICBkMzAsZDEwCi0gICAgVlRSTi4zMiAgZDYsZDI1Ci0gICAgVlRSTi4zMiAgZDI5LGQxMQotICAgIFZTVDEuOCAgIHtkN30sW3IwXSxyMTEKLSAgICBWU1QxLjggICB7ZDI0fSxbcjEwXSxyMTEKLSAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxMQotICAgIFZTVDEuOCAgIHtkMTB9LFtyMTBdLHIxMQotICAgIFZTVDEuOCAgIHtkNn0sW3IwXSxyMTEKLSAgICBWU1QxLjggICB7ZDI1fSxbcjEwXSxyMTEKLSAgICBBRERTICAgICByOSxyOSxyOQotICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjExCi0gICAgQUREICAgICAgcjUscjUsIzIKLSAgICBWU1QxLjggICB7ZDExfSxbcjEwXSxyMQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMwotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCi0gICAgQUREICAgICAgcjAscjAsIzQKLSAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQotICAgIEJDQyAgICAgIEwweDM4Ci0gICAgQiAgICAgICAgTDB4MWYwCi1MMHgxNjA6Ci0gICAgQUREICAgICAgcjAscjAsIzQKLSAgICBBRERTICAgICByOSxyOSxyOQotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCi0gICAgQUREICAgICAgcjUscjUsIzQKLSAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQotICAgIEJDQyAgICAgIEwweDM4Ci0gICAgQiAgICAgICAgTDB4MWYwCi1MMHgxN2M6Ci0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgIFZaSVAuOCAgIGQ3LGQzMQotICAgIFZaSVAuOCAgIGQzMCxkMjkKLSAgICBWWklQLjggICBkMjQsZDI1Ci0gICAgVlpJUC44ICAgZDI4LGQxMQotICAgIFZaSVAuMTYgIGQ3LGQzMAotICAgIEFERCAgICAgIHIxMCxyMCxyMQotICAgIFZaSVAuMTYgIGQyNCxkMjgKLSAgICBWWklQLjE2ICBkMjUsZDExCi0gICAgVlpJUC4xNiAgZDMxLGQyOQotICAgIFZUUk4uMzIgIGQ3LGQyNAotICAgIFZUUk4uMzIgIGQzMCxkMjgKLSAgICBWVFJOLjMyICBkMzEsZDI1Ci0gICAgVlRSTi4zMiAgZDI5LGQxMQotICAgIFZTVDEuOCAgIHtkN30sW3IwXSxyMTEKLSAgICBWU1QxLjggICB7ZDI0fSxbcjEwXSxyMTEKLSAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxMQotICAgIFZTVDEuOCAgIHtkMjh9LFtyMTBdLHIxMQotICAgIFZTVDEuOCAgIHtkMzF9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QyNX0sW3IxMF0scjExCi0gICAgQUREUyAgICAgcjkscjkscjkKLSAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxMQotICAgIEFERCAgICAgIHI1LHI1LCM0Ci0gICAgVlNUMS44ICAge2QxMX0sW3IxMF0scjExCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCi0gICAgVkxEMS44ICAge2QwW119LFtyN10KLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCi0gICAgQkNDICAgICAgTDB4MzgKLUwweDFmMDoKLSAgICBTVUIgICAgICByNCxyNCwjMHhlCi0gICAgU1VCICAgICAgcjUscjUsIzB4ZQotICAgIFNVQiAgICAgIHIwLHIwLCMweDEwCi0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBBREQgICAgICByMCxyMCxyMSxMU0wgIzMKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQotICAgIEJORSAgICAgIEwweDM4Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0ZWFiZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCi1vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgU1VCICAgICAgc3Asc3AsIzB4MTAKLSAgICBMRFIgICAgICByNixbc3AsIzB4NzhdCi0gICAgTERSICAgICAgcjcsW3NwLCMweDdjXQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg4MF0KLSAgICBMRFIgICAgICByNCxbc3AsIzB4ODRdCi0gICAgQUREICAgICAgcjYscjYscjcsTFNMICMyCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgVk1PVi5JMTYgZDMxLCMweDE0Ci0gICAgVk1PVi5JMTYgZDMwLCMweDUKLUwweDJjOgotICAgIFNUTSAgICAgIHIxMSx7cjAtcjN9Ci0gICAgQUREICAgICAgcGMscGMscjYsTFNMICMyCi0gICAgQiAgICAgICAgTDB4M2YwCi0gICAgQiAgICAgICAgTDB4NzgKLSAgICBCICAgICAgICBMMHhhOAotICAgIEIgICAgICAgIEwweGRjCi0gICAgQiAgICAgICAgTDB4MTAwCi0gICAgQiAgICAgICAgTDB4MTM0Ci0gICAgQiAgICAgICAgTDB4MTY4Ci0gICAgQiAgICAgICAgTDB4MWE4Ci0gICAgQiAgICAgICAgTDB4MWYwCi0gICAgQiAgICAgICAgTDB4MjM0Ci0gICAgQiAgICAgICAgTDB4MjU4Ci0gICAgQiAgICAgICAgTDB4MmIwCi0gICAgQiAgICAgICAgTDB4MmQ4Ci0gICAgQiAgICAgICAgTDB4MzMwCi0gICAgQiAgICAgICAgTDB4MzY0Ci0gICAgQiAgICAgICAgTDB4M2E4Ci0gICAgQiAgICAgICAgTDB4M2YwCi1MMHg3ODoKLSAgICBBREQgICAgICByMTIscjAscjEsTFNMICMxCi0gICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2QxMX0sW3IxMl0scjEKLSAgICBWTEQxLjggICB7ZDEwfSxbcjBdCi0gICAgVkxEMS44ICAge2QxMn0sW3IxMl0KLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2Q5WzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QxMVswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDEwWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QxMlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweGE4OgotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDIyLGQyMixkMTQKLSAgICBWUkhBREQuVTggZDI2LGQyNixkMTgKLSAgICBWUkhBREQuVTggZDI0LGQyNCxkMTYKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkMjAKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHhkYzoKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MTAwOgotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDIyLGQyMixkMTUKLSAgICBWUkhBREQuVTggZDI2LGQyNixkMTkKLSAgICBWUkhBREQuVTggZDI0LGQyNCxkMTcKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkMjEKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgxMzQ6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDAsZDAsZDkKLSAgICBWUkhBREQuVTggZDQsZDQsZDExCi0gICAgVlJIQURELlU4IGQyLGQyLGQxMAotICAgIFZSSEFERC5VOCBkNixkNixkMTIKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDE2ODoKLSAgICBNT1YgICAgICByOCxyMAotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgU1VCICAgICAgcjAscjgsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCi0gICAgVlJIQURELlU4IGQyNixkMjYsZDQKLSAgICBWUkhBREQuVTggZDI0LGQyNCxkMgotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2Ci0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MWE4OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgVlFSU0hSVU4uUzE2IGQxNCxxNywjNQotICAgIFZRUlNIUlVOLlMxNiBkMTYscTgsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE4LHE5LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyMCxxMTAsIzUKLSAgICBWUkhBREQuVTggZDAsZDAsZDE0Ci0gICAgVlJIQURELlU4IGQ0LGQ0LGQxOAotICAgIFZSSEFERC5VOCBkMixkMixkMTYKLSAgICBWUkhBREQuVTggZDYsZDYsZDIwCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgxZjA6Ci0gICAgTU9WICAgICAgcjgscjAKLSAgICBBREQgICAgICByMCxyMCwjMQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgU1VCICAgICAgcjAscjgsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCi0gICAgVlJIQURELlU4IGQyNixkMjYsZDQKLSAgICBWUkhBREQuVTggZDI0LGQyNCxkMgotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2Ci0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MjM0OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgyNTg6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNAotICAgIFZFWFQuOCAgIGQyMCxkMjAsZDIxLCM0Ci0gICAgVkVYVC44ICAgZDIyLGQyMixkMjMsIzQKLSAgICBWRVhULjggICBkMjQsZDI0LGQyNSwjNAotICAgIFZRUlNIUlVOLlMxNiBkMTQscTksIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE2LHExMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTgscTExLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyMCxxMTIsIzUKLSAgICBWUkhBREQuVTggZDAsZDAsZDE0Ci0gICAgVlJIQURELlU4IGQ0LGQ0LGQxOAotICAgIFZSSEFERC5VOCBkMixkMixkMTYKLSAgICBWUkhBREQuVTggZDYsZDYsZDIwCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgyYjA6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDJkODoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM2Ci0gICAgVkVYVC44ICAgZDIwLGQyMCxkMjEsIzYKLSAgICBWRVhULjggICBkMjIsZDIyLGQyMywjNgotICAgIFZFWFQuOCAgIGQyNCxkMjQsZDI1LCM2Ci0gICAgVlFSU0hSVU4uUzE2IGQxNCxxOSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTYscTEwLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxOCxxMTEsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDIwLHExMiwjNQotICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKLSAgICBWUkhBREQuVTggZDQsZDQsZDE4Ci0gICAgVlJIQURELlU4IGQyLGQyLGQxNgotICAgIFZSSEFERC5VOCBkNixkNixkMjAKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDMzMDoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMCxkMCxkMTAKLSAgICBWUkhBREQuVTggZDQsZDQsZDEyCi0gICAgVlJIQURELlU4IGQyLGQyLGQxMQotICAgIFZSSEFERC5VOCBkNixkNixkMTMKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDM2NDoKLSAgICBNT1YgICAgICByOCxyMAotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgQUREICAgICAgcjAscjgscjEKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQyMixkMjIsZDAKLSAgICBWUkhBREQuVTggZDI2LGQyNixkNAotICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCi0gICAgVlJIQURELlU4IGQyOCxkMjgsZDYKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgzYTg6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICBWUVJTSFJVTi5TMTYgZDE0LHE4LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxNixxOSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTgscTEwLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyMCxxMTEsIzUKLSAgICBWUkhBREQuVTggZDAsZDAsZDE0Ci0gICAgVlJIQURELlU4IGQ0LGQ0LGQxOAotICAgIFZSSEFERC5VOCBkMixkMixkMTYKLSAgICBWUkhBREQuVTggZDYsZDYsZDIwCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgzZjA6Ci0gICAgTU9WICAgICAgcjgscjAKLSAgICBBREQgICAgICByMCxyMCwjMQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgQUREICAgICAgcjAscjgscjEKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQyMixkMjIsZDAKLSAgICBWUkhBREQuVTggZDI2LGQyNixkNAotICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCi0gICAgVlJIQURELlU4IGQyOCxkMjgsZDYKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi1MMHg0MzQ6Ci0gICAgTERNICAgICAgcjExLHtyMC1yM30KLSAgICBTVUJTICAgICByNSxyNSwjNAotICAgIEFERCAgICAgIHIwLHIwLCM0Ci0gICAgQUREICAgICAgcjIscjIsIzQKLSAgICBCR1QgICAgICBMMHgyYwotICAgIFNVQlMgICAgIHI0LHI0LCM0Ci0gICAgTERSICAgICAgcjUsW3NwLCMweDgwXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMgotICAgIEFERCAgICAgIHIyLHIyLHIzLExTTCAjMgotICAgIFNVQiAgICAgIHIwLHIwLHI1Ci0gICAgU1VCICAgICAgcjIscjIscjUKLSAgICBCR1QgICAgICBMMHgyYwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgQUREICAgICAgc3Asc3AsIzB4MTAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQxMzUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0gICAgLmFsaWduIDQKLQotYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4ODoKLSAgICAud29yZCAgT01YX1ZDX0NIUk9NQV9EQy0oUDArOCksICAgIE9NWF9WQ19DSFJPTUFfSE9SLShQMCs4KQotICAgIC53b3JkICBPTVhfVkNfQ0hST01BX1ZFUlQtKFAwKzgpLCAgT01YX1ZDX0NIUk9NQV9QTEFORS0oUDArOCkKLQotYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDg6Ci0gICAgLmh3b3JkICAgMywgMiwgMSw0Ci0gICAgLmh3b3JkICAtMywtMiwtMSwwCi0gICAgLmh3b3JkICAgMSwgMiwgMyw0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OAotb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4OgotICAgIFBVU0ggICAgIHtyNC1yMTAsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBBRFIgICAgICByOCwgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAotICAgIExEUiAgICAgIHI2LFtzcCwjMHg2OF0KLSAgICBMRFIgICAgICByNCxbc3AsIzB4NjBdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDY0XQotICAgIExEUiAgICAgIHI3LFtzcCwjMHg2Y10KLSAgICBMRFIgICAgICByOCxbcjgscjYsTFNMICMyXQotUDA6IEFERCAgICAgIHBjLHI4Ci0KLU9NWF9WQ19DSFJPTUFfREM6Ci0gICAgVFNUICAgICAgcjcsIzIKLSAgICBCRVEgICAgICBMMHhlOAotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QxWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVsxXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzNdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQotICAgIFRTVCAgICAgIHI3LCMxCi0gICAgQkVRICAgICAgTDB4Y2MKLSAgICBWTEQxLjggICB7ZDB9LFtyMV0KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQQURETC5VOCBkMixkMAotICAgIFZQQURETC5VMTYgZDMsZDIKLSAgICBWUEFEREwuVTggZDIsZDEKLSAgICBWUEFEREwuVTE2IGQxLGQyCi0gICAgVkFERC5JMzIgZDIsZDMsZDEKLSAgICBWUlNIUi5VMzIgZDIsZDIsIzMKLSAgICBWUlNIUi5VMzIgZDMsZDMsIzIKLSAgICBWUlNIUi5VMzIgZDEsZDEsIzIKLSAgICBWTU9WLkk4ICBkNSwjMHhjCi0gICAgVk1PVi5JOCAgZDYsIzB4NAotICAgIFZTSEwuSTY0IGQ1LGQ1LCMzMgotICAgIFZTSFIuVTY0IGQ2LGQ2LCMzMgotICAgIFZBREQuSTggIGQ2LGQ2LGQ1Ci0gICAgVlRCTC44ICAgZDAse2QyLWQzfSxkNQotICAgIFZUQkwuOCAgIGQ0LHtkMS1kMn0sZDYKLUwweDljOgotICAgIEFERCAgICAgIHI5LHIzLHI1Ci0gICAgQUREICAgICAgcjEwLHI1LHI1Ci0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDR9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2Q0fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNH0sW3I5XQotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMCxwY30KLUwweGNjOgotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBBRERMLlU4IGQyLGQxCi0gICAgVlBBRERMLlUxNiBkMSxkMgotICAgIFZSU0hSLlUzMiBkMSxkMSwjMgotICAgIFZEVVAuOCAgIGQwLGQxWzBdCi0gICAgVkRVUC44ICAgZDQsZDFbNF0KLSAgICBCICAgICAgICBMMHg5YwotTDB4ZTg6Ci0gICAgVFNUICAgICAgcjcsIzEKLSAgICBCRVEgICAgICBMMHgxMTQKLSAgICBWTEQxLjggICB7ZDB9LFtyMV0KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQQURETC5VOCBkMixkMAotICAgIFZQQURETC5VMTYgZDMsZDIKLSAgICBWUlNIUi5VMzIgZDMsZDMsIzIKLSAgICBWTU9WLkk4ICBkNSwjMHg0Ci0gICAgVlNITC5JNjQgZDUsZDUsIzMyCi0gICAgVlRCTC44ICAgZDAse2QzfSxkNQotICAgIEIgICAgICAgIEwweDExYwotTDB4MTE0OgotICAgIFZNT1YuSTggIGQwLCMweDgwCi0gICAgTU9WICAgICAgcjAsIzAKLUwweDExYzoKLSAgICBBREQgICAgICByOSxyMyxyNQotICAgIEFERCAgICAgIHIxMCxyNSxyNQotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyOV0KLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTAscGN9Ci1PTVhfVkNfQ0hST01BX1ZFUlQ6Ci0gICAgVkxEMS44ICAge2QwfSxbcjFdCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBCICAgICAgICBMMHgxMWMKLU9NWF9WQ19DSFJPTUFfSE9SOgotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QwW119LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxW119LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QyW119LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzW119LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2Q0W119LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2Q1W119LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2Q2W119LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2Q3W119LFtyOV0KLSAgICBCICAgICAgICBMMHgyOGMKLU9NWF9WQ19DSFJPTUFfUExBTkU6Ci0gICAgQUREICAgICAgcjkscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDB9LFtyMV0KLSAgICBWTEQxLjggICB7ZDJbMF19LFtyMl0KLSAgICBWTEQxLjggICB7ZDFbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzFdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVsyXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbM119LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzddfSxbcjldCi0gICAgVlJFVjY0LjggZDMsZDAKLSAgICBWU1VCTC5VOCBxMyxkMyxkMgotICAgIFZTSFIuVTY0IGQzLGQzLCM4Ci0gICAgVlNVQkwuVTggcTIsZDMsZDAKLSAgICBWUkVWNjQuOCBkMyxkMQotICAgIFZTVUJMLlU4IHE3LGQzLGQyCi0gICAgVlNIUi5VNjQgZDMsZDMsIzgKLSAgICBWU1VCTC5VOCBxNixkMyxkMQotICAgIEFEUiAgICAgIHIyLCBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OAotICAgIFZTSEwuSTY0IGQ0LGQ0LCMxNgotICAgIFZFWFQuOCAgIGQ5LGQ0LGQ2LCMyCi0gICAgVkxEMS4xNiAge2QxMH0sW3IyXSEKLSAgICBWU0hMLkk2NCBkMTIsZDEyLCMxNgotICAgIFZFWFQuOCAgIGQxNixkMTIsZDE0LCMyCi0gICAgVk1VTC5JMTYgZDExLGQ5LGQxMAotICAgIFZNVUwuSTE2IGQzLGQxNixkMTAKLSAgICBWUEFERC5JMTYgZDMsZDExLGQzCi0gICAgVlBBRERMLlMxNiBkMyxkMwotICAgIFZTSEwuSTMyIGQyLGQzLCM0Ci0gICAgVkFERC5JMzIgZDMsZDMsZDIKLSAgICBWTEQxLjE2ICB7ZDEwLGQxMX0sW3IyXQotICAgIFZSU0hSLlMzMiBkMyxkMywjNQotICAgIFZBRERMLlU4IHEwLGQwLGQxCi0gICAgVkRVUC4xNiAgcTAsZDFbM10KLSAgICBWU0hMLkkxNiBxMCxxMCwjNAotICAgIFZEVVAuMTYgIHEyLGQzWzBdCi0gICAgVkRVUC4xNiAgcTMsZDNbMl0KLSAgICBWTVVMLkkxNiBxMixxMixxNQotICAgIFZNVUwuSTE2IHEzLHEzLHE1Ci0gICAgVkFERC5JMTYgcTIscTIscTAKLSAgICBWRFVQLjE2ICBxMCxkNlswXQotICAgIFZEVVAuMTYgIHExLGQ2WzFdCi0gICAgVkRVUC4xNiAgcTQsZDZbMl0KLSAgICBWRFVQLjE2ICBxNSxkNlszXQotICAgIFZEVVAuMTYgIHE2LGQ3WzBdCi0gICAgVkRVUC4xNiAgcTcsZDdbMV0KLSAgICBWRFVQLjE2ICBxOCxkN1syXQotICAgIFZEVVAuMTYgIHE5LGQ3WzNdCi0gICAgVkFERC5JMTYgcTAscTIscTAKLSAgICBWQURELkkxNiBxMSxxMixxMQotICAgIFZBREQuSTE2IHE0LHEyLHE0Ci0gICAgVkFERC5JMTYgcTUscTIscTUKLSAgICBWQURELkkxNiBxNixxMixxNgotICAgIFZBREQuSTE2IHE3LHEyLHE3Ci0gICAgVkFERC5JMTYgcTgscTIscTgKLSAgICBWQURELkkxNiBxOSxxMixxOQotICAgIFZRUlNIUlVOLlMxNiBkMCxxMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMSxxMSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMixxNCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMyxxNSwjNQotICAgIFZRUlNIUlVOLlMxNiBkNCxxNiwjNQotICAgIFZRUlNIUlVOLlMxNiBkNSxxNywjNQotICAgIFZRUlNIUlVOLlMxNiBkNixxOCwjNQotICAgIFZRUlNIUlVOLlMxNiBkNyxxOSwjNQotTDB4MjhjOgotICAgIEFERCAgICAgIHI5LHIzLHI1Ci0gICAgQUREICAgICAgcjEwLHI1LHI1Ci0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMX0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDJ9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QzfSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDV9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2Q2fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkN30sW3I5XQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEwLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDQ2MzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0KLSAgICAudGV4dAotICAgIC5hbGlnbiA0Ci07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTY6Ci0gICAgLndvcmQgIE9NWF9WQ18xNlgxNl9WRVJULShQMCs4KSwgT01YX1ZDXzE2WDE2X0hPUi0oUDArOCkKLSAgICAud29yZCAgT01YX1ZDXzE2WDE2X0RDLShQMCs4KSwgICBPTVhfVkNfMTZYMTZfUExBTkUtKFAwKzgpCi0KLQotYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNjoKLSAgICAuaHdvcmQgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgOAotICAgIC5od29yZCAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3Ci0gICAgLmh3b3JkICAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKLQotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNgotb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTY6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIEFEUiAgICAgIHI5LCBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKLSAgICBMRFIgICAgICByNixbc3AsIzB4NzBdCi0gICAgTERSICAgICAgcjQsW3NwLCMweDY4XQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2Y10KLSAgICBMRFIgICAgICByNyxbc3AsIzB4NzRdCi0gICAgTU9WICAgICAgcjEyLCMweDEwCi0gICAgTERSICAgICAgcjksW3I5LHI2LExTTCAjMl0KLVAwOiBBREQgICAgICBwYyxyOQotT01YX1ZDXzE2WDE2X1ZFUlQ6Ci0gICAgVkxEMS44ICAge2QwLGQxfSxbcjFdCi0gICAgQUREICAgICAgcjgscjMscjUKLSAgICBBREQgICAgICByMTAscjUscjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXQotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotT01YX1ZDXzE2WDE2X0hPUjoKLSAgICBBREQgICAgICByOCxyMCxyNAotICAgIEFERCAgICAgIHI0LHI0LHI0Ci0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjUscjUscjUKLUwweDhjOgotICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKLSAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotICAgIFZTVDEuOCAgIHtkMixkM30sW3IzXSxyNQotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IxMV0scjUKLSAgICBWTEQxLjggICB7ZDJbXSxkM1tdfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QwW10sZDFbXX0sW3I4XSxyNAotICAgIFZTVDEuOCAgIHtkMixkM30sW3IzXSxyNQotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IxMV0scjUKLSAgICBWTEQxLjggICB7ZDJbXSxkM1tdfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QwW10sZDFbXX0sW3I4XSxyNAotICAgIFZTVDEuOCAgIHtkMixkM30sW3IzXSxyNQotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IxMV0scjUKLSAgICBWTEQxLjggICB7ZDJbXSxkM1tdfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QwW10sZDFbXX0sW3I4XSxyNAotICAgIFZTVDEuOCAgIHtkMixkM30sW3IzXSxyNQotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IxMV0scjUKLSAgICBCTkUgICAgICBMMHg4YwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotT01YX1ZDXzE2WDE2X0RDOgotICAgIE1PViAgICAgIHIxMSwjMAotICAgIFRTVCAgICAgIHI3LCMyCi0gICAgQkVRICAgICAgTDB4MTRjCi0gICAgQUREICAgICAgcjgscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDJbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzFdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkMlsyXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbM119LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QyWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMls1XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzddfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1swXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbMV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzJdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1szXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbNF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzVdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbN119LFtyOF0KLSAgICBWUEFEREwuVTggcTAscTEKLSAgICBBREQgICAgICByMTEscjExLCMxCi0gICAgVlBBREQuSTE2IGQwLGQwLGQxCi0gICAgVlBBRERMLlUxNiBkMCxkMAotICAgIFZQQURETC5VMzIgZDYsZDAKLSAgICBWUlNIUi5VNjQgZDgsZDYsIzQKLUwweDE0YzoKLSAgICBUU1QgICAgICByNywjMQotICAgIEJFUSAgICAgIEwweDE3MAotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IxXQotICAgIEFERCAgICAgIHIxMSxyMTEsIzEKLSAgICBWUEFEREwuVTggcTAscTAKLSAgICBWUEFERC5JMTYgZDAsZDAsZDEKLSAgICBWUEFEREwuVTE2IGQwLGQwCi0gICAgVlBBRERMLlUzMiBkNyxkMAotICAgIFZSU0hSLlU2NCBkOCxkNywjNAotTDB4MTcwOgotICAgIENNUCAgICAgIHIxMSwjMgotICAgIEJORSAgICAgIEwweDE4MAotICAgIFZBREQuSTY0IGQ4LGQ3LGQ2Ci0gICAgVlJTSFIuVTY0IGQ4LGQ4LCM1Ci1MMHgxODA6Ci0gICAgVkRVUC44ICAgcTMsZDhbMF0KLSAgICBDTVAgICAgICByMTEsIzAKLSAgICBBREQgICAgICByOCxyMyxyNQotICAgIEFERCAgICAgIHIxMCxyNSxyNQotICAgIEJORSAgICAgIEwweDE5OAotICAgIFZNT1YuSTggIHEzLCMweDgwCi1MMHgxOTg6Ci0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotT01YX1ZDXzE2WDE2X1BMQU5FOgotICAgIEFEUiAgICAgIHI5LCBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2Ci0gICAgVkxEMS44ICAge2QwLGQxfSxbcjFdCi0gICAgVkxEMS44ICAge2Q0WzBdfSxbcjJdCi0gICAgQUREICAgICAgcjgscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDJbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzFdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkMlsyXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbM119LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QyWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMls1XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzddfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1swXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbMV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzJdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1szXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbNF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzVdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbN119LFtyOF0KLSAgICBWUkVWNjQuOCBkNSxkMQotICAgIFZTVUJMLlU4IHEzLGQ1LGQ0Ci0gICAgVlNIUi5VNjQgZDUsZDUsIzgKLSAgICBWU1VCTC5VOCBxNCxkNSxkMAotICAgIFZTSEwuSTY0IGQ5LGQ5LCMxNgotICAgIFZFWFQuOCAgIGQ5LGQ5LGQ2LCMyCi0gICAgVlJFVjY0LjggZDEyLGQzCi0gICAgVlNVQkwuVTggcTcsZDEyLGQ0Ci0gICAgVlNIUi5VNjQgZDEyLGQxMiwjOAotICAgIFZTVUJMLlU4IHE4LGQxMixkMgotICAgIFZMRDEuMTYgIHtkMjAsZDIxfSxbcjldIQotICAgIFZTSEwuSTY0IGQxNyxkMTcsIzE2Ci0gICAgVkVYVC44ICAgZDE3LGQxNyxkMTQsIzIKLSAgICBWTVVMTC5TMTYgcTExLGQ4LGQyMAotICAgIFZNVUxMLlMxNiBxMTIsZDE2LGQyMAotICAgIFZNTEFMLlMxNiBxMTEsZDksZDIxCi0gICAgVk1MQUwuUzE2IHExMixkMTcsZDIxCi0gICAgVlBBREQuSTMyIGQyMixkMjMsZDIyCi0gICAgVlBBREQuSTMyIGQyMyxkMjUsZDI0Ci0gICAgVlBBRERMLlMzMiBxMTEscTExCi0gICAgVlNITC5JNjQgcTEyLHExMSwjMgotICAgIFZBREQuSTY0IHExMSxxMTEscTEyCi0gICAgVlJTSFIuUzY0IHExMSxxMTEsIzYKLSAgICBWU0hMLkk2NCBxMTIscTExLCMzCi0gICAgVlNVQi5JNjQgcTEyLHExMixxMTEKLSAgICBWTEQxLjE2ICB7ZDIwLGQyMX0sW3I5XSEKLSAgICBWRFVQLjE2ICBxNixkMjJbMF0KLSAgICBWRFVQLjE2ICBxNyxkMjNbMF0KLSAgICBWQURETC5VOCBxMTEsZDEsZDMKLSAgICBWU0hMLkkxNiBxMTEscTExLCM0Ci0gICAgVkRVUC4xNiAgcTExLGQyM1szXQotICAgIFZBREQuSTY0IGQxLGQyNCxkMjUKLSAgICBWTEQxLjE2ICB7ZDI0LGQyNX0sW3I5XQotICAgIFZEVVAuMTYgIHExMyxkMVswXQotICAgIFZTVUIuSTE2IHExMyxxMTEscTEzCi0gICAgVk1VTC5JMTYgcTUscTYscTEwCi0gICAgVk1VTC5JMTYgcTYscTYscTEyCi0gICAgVkFERC5JMTYgcTAscTUscTEzCi0gICAgVkFERC5JMTYgcTEscTYscTEzCi1MMHgyZDQ6Ci0gICAgVlFSU0hSVU4uUzE2IGQ2LHEwLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ3LHExLCM1Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjMQotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyNQotICAgIFZBREQuSTE2IHEwLHEwLHE3Ci0gICAgVkFERC5JMTYgcTEscTEscTcKLSAgICBCTkUgICAgICBMMHgyZDQKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Yzg0ODUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0KLSAgICAudGV4dAotICAgIC5hbGlnbiA0Ci0KLWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0OgotICAgIC53b3JkIE9NWF9WQ180eDRfVkVSVC0oUDArOCksICAgICBPTVhfVkNfNHg0X0hPUi0oUDArOCkKLSAgICAud29yZCBPTVhfVkNfNHg0X0RDLShQMCs4KSwgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMLShQMCs4KQotICAgIC53b3JkIE9NWF9WQ180eDRfRElBR19EUi0oUDArOCksICBPTVhfVkNfNHg0X1ZSLShQMCs4KQotICAgIC53b3JkIE9NWF9WQ180eDRfSEQtKFAwKzgpLCAgICAgICBPTVhfVkNfNHg0X1ZMLShQMCs4KQotICAgIC53b3JkIE9NWF9WQ180eDRfSFUtKFAwKzgpCi0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NAotb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0OgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxMn0KLSAgICBBRFIgICAgICByOCwgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKLSAgICBMRFJEICAgICByNixyNyxbc3AsIzB4NThdCi0gICAgTERSRCAgICAgcjQscjUsW3NwLCMweDUwXQotICAgIExEUiAgICAgIHI4LFtyOCxyNixMU0wgIzJdCi1QMDogQUREICAgICAgcGMsIHI4Ci0KLU9NWF9WQ180eDRfSE9SOgotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QwW119LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxW119LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QyW119LFtyMF0KLSAgICBWTEQxLjggICB7ZDNbXX0sW3I5XQotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXSxyMTIKLSAgICBWU1QxLjMyICB7ZDFbMF19LFtyMTFdLHIxMgotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IzXQotICAgIFZTVDEuMzIgIHtkM1swXX0sW3IxMV0KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfVkVSVDoKLSAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLUwweDU4OgotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXSxyMTIKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMTFdLHIxMgotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IxMV0KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfREM6Ci0gICAgVFNUICAgICAgcjcsIzIKLSAgICBCRVEgICAgICBMMHhkYwotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QwWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMFsxXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDBbMl19LFtyMF0KLSAgICBWTEQxLjggICB7ZDBbM119LFtyOV0KLSAgICBUU1QgICAgICByNywjMQotICAgIEJFUSAgICAgIEwweGJjCi0gICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUEFEREwuVTggZDEsZDAKLSAgICBWUEFEREwuVTE2IGQxLGQxCi0gICAgVlBBRERMLlUzMiBkMSxkMQotICAgIFZSU0hSLlU2NCBkMSxkMSwjMwotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZEVVAuOCAgIGQwLGQxWzBdCi0gICAgQiAgICAgICAgTDB4NTgKLUwweGJjOgotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBBRERMLlU4IGQxLGQwCi0gICAgVlBBRERMLlUxNiBkMSxkMQotICAgIFZSU0hSLlUzMiBkMSxkMSwjMgotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZEVVAuOCAgIGQwLGQxWzBdCi0gICAgQiAgICAgICAgTDB4NTgKLUwweGRjOgotICAgIFRTVCAgICAgIHI3LCMxCi0gICAgQkVRICAgICAgTDB4MTA4Ci0gICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUEFEREwuVTggZDEsZDAKLSAgICBWUEFEREwuVTE2IGQxLGQxCi0gICAgVlJTSFIuVTMyIGQxLGQxLCMyCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgVkRVUC44ICAgZDAsZDFbMF0KLSAgICBCICAgICAgICBMMHg1OAotTDB4MTA4OgotICAgIFZNT1YuSTggIGQwLCMweDgwCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBCICAgICAgICBMMHg1OAotT01YX1ZDXzR4NF9ESUFHX0RMOgotICAgIFRTVCAgICAgIHI3LCMweDQwCi0gICAgQkVRICAgICAgTDB4MTM4Ci0gICAgVkxEMS44ICAge2QzfSxbcjFdCi0gICAgVkRVUC44ICAgZDIsZDNbN10KLSAgICBWRVhULjggICBkNCxkMyxkMiwjMQotICAgIFZFWFQuOCAgIGQ1LGQzLGQyLCMyCi0gICAgQiAgICAgICAgTDB4MTRjCi1MMHgxMzg6Ci0gICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCi0gICAgVkRVUC44ICAgZDIsZDBbN10KLSAgICBWRVhULjggICBkMyxkMCxkMiwjNAotICAgIFZFWFQuOCAgIGQ0LGQwLGQyLCM1Ci0gICAgVkVYVC44ICAgZDUsZDAsZDIsIzYKLUwweDE0YzoKLSAgICBWSEFERC5VOCBkNixkMyxkNQotICAgIFZSSEFERC5VOCBkNixkNixkNAotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQotICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1Ci0gICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKLSAgICBWRVhULjggICBkNixkNixkNiwjMQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXQotICAgIEIgICAgICAgIEwweDM0OAotT01YX1ZDXzR4NF9ESUFHX0RSOgotICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQotICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IyXQotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgQUREICAgICAgcjEscjMscjUKLSAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXQotICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XQotICAgIFZFWFQuOCAgIGQzLGQxLGQwLCMzCi0gICAgQUREICAgICAgcjQscjEscjUKLSAgICBWRVhULjggICBkNCxkMSxkMCwjNAotICAgIEFERCAgICAgIHI2LHI0LHI1Ci0gICAgVkVYVC44ICAgZDUsZDEsZDAsIzUKLSAgICBWSEFERC5VOCBkNixkMyxkNQotICAgIFZSSEFERC5VOCBkNixkNixkNAotICAgIFZTVDEuMzIgIHtkNlswXX0sW3I2XQotICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjRdCi0gICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMV0KLSAgICBWRVhULjggICBkNixkNixkNiwjMQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXQotICAgIEIgICAgICAgIEwweDM0OAotT01YX1ZDXzR4NF9WUjoKLSAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KLSAgICBWTEQxLjggICB7ZDBbN119LFtyMl0KLSAgICBWTEQxLjggICB7ZDFbN119LFtyMF0scjQKLSAgICBWTEQxLjggICB7ZDJbN119LFtyMF0scjQKLSAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0KLSAgICBWRVhULjggICBkMTIsZDAsZDAsIzcKLSAgICBWRVhULjggICBkMyxkMSxkMTIsIzYKLSAgICBWRVhULjggICBkNCxkMixkMTIsIzcKLSAgICBWRVhULjggICBkNSxkMSxkMCwjNwotICAgIFZFWFQuOCAgIGQ2LGQyLGQwLCM3Ci0gICAgVkVYVC44ICAgZDExLGQxLGQxMiwjNwotICAgIFZIQURELlU4IGQ4LGQ2LGQxMgotICAgIFZSSEFERC5VOCBkOCxkOCxkMTEKLSAgICBWSEFERC5VOCBkNyxkMyxkNQotICAgIFZSSEFERC5VOCBkNyxkNyxkNAotICAgIFZFWFQuOCAgIGQxMCxkOCxkOCwjMQotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZFWFQuOCAgIGQ5LGQ3LGQ3LCMxCi0gICAgVlNUMS4zMiAge2QxMFswXX0sW3IzXSxyMTIKLSAgICBWU1QxLjMyICB7ZDlbMF19LFtyMTFdLHIxMgotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyMTIKLSAgICBWU1QxLjMyICB7ZDdbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X0hEOgotICAgIFZMRDEuOCAgIHtkMH0sW3IxXQotICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IyXQotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0KLSAgICBWTEQxLjggICB7ZDFbM119LFtyOV0KLSAgICBWRVhULjggICBkMyxkMSxkMCwjMwotICAgIFZFWFQuOCAgIGQ0LGQxLGQwLCMyCi0gICAgVkVYVC44ICAgZDUsZDEsZDAsIzEKLSAgICBWSEFERC5VOCBkNyxkMyxkNQotICAgIFZSSEFERC5VOCBkNyxkNyxkNAotICAgIFZSSEFERC5VOCBkOCxkNCxkMwotICAgIFZTSEwuSTY0IGQ4LGQ4LCMyNAotICAgIFZTSEwuSTY0IGQ2LGQ3LCMxNgotICAgIFZaSVAuOCAgIGQ4LGQ2Ci0gICAgVkVYVC44ICAgZDcsZDcsZDcsIzYKLSAgICBWRVhULjggICBkOCxkNixkNywjMgotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZTVDEuMzIgIHtkOFsxXX0sW3IzXSxyMTIKLSAgICBWU1QxLjMyICB7ZDZbMV19LFtyMTFdLHIxMgotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMV0KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfVkw6Ci0gICAgVFNUICAgICAgcjcsIzB4NDAKLSAgICBCRVEgICAgICBMMHgyYjQKLSAgICBWTEQxLjggICB7ZDN9LFtyMV0KLSAgICBWRVhULjggICBkNCxkMyxkMywjMQotICAgIFZFWFQuOCAgIGQ1LGQ0LGQ0LCMxCi0gICAgQiAgICAgICAgTDB4MmM4Ci1MMHgyYjQ6Ci0gICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCi0gICAgVkRVUC44ICAgZDIsZDBbN10KLSAgICBWRVhULjggICBkMyxkMCxkMiwjNAotICAgIFZFWFQuOCAgIGQ0LGQwLGQyLCM1Ci0gICAgVkVYVC44ICAgZDUsZDAsZDIsIzYKLUwweDJjODoKLSAgICBWUkhBREQuVTggZDcsZDQsZDMKLSAgICBWSEFERC5VOCBkMTAsZDMsZDUKLSAgICBWUkhBREQuVTggZDEwLGQxMCxkNAotICAgIFZFWFQuOCAgIGQ4LGQ3LGQ3LCMxCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgVkVYVC44ICAgZDksZDEwLGQ4LCMxCi0gICAgVlNUMS4zMiAge2Q3WzBdfSxbcjNdLHIxMgotICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyMTFdLHIxMgotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXQotICAgIFZTVDEuMzIgIHtkOVswXX0sW3IxMV0KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfSFU6Ci0gICAgQUREICAgICAgcjkscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXQotICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQotICAgIFZEVVAuOCAgIGQyLGQxWzddCi0gICAgVkVYVC44ICAgZDMsZDEsZDIsIzQKLSAgICBWRVhULjggICBkNCxkMSxkMiwjNQotICAgIFZFWFQuOCAgIGQ1LGQxLGQyLCM2Ci0gICAgVkhBREQuVTggZDcsZDMsZDUKLSAgICBWUkhBREQuVTggZDcsZDcsZDQKLSAgICBWUkhBREQuVTggZDgsZDQsZDMKLSAgICBWWklQLjggICBkOCxkNwotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQotICAgIFZFWFQuOCAgIGQ4LGQ4LGQ4LCMyCi0gICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1Ci0gICAgVkVYVC44ICAgZDgsZDgsZDgsIzIKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKLSAgICBWU1QxLjMyICB7ZDdbMF19LFtyM10KLUwweDM0ODoKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTJ9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjUxMDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLSAgICAuc3ludGF4IHVuaWZpZWQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcgotb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcjoKLSAgICBwdXNoICAgIHtyNC1yMTAsIGxyfQotICAgIGxkciAgICAgcjksIFtyMCwjMF0KLSAgICB2bW92LmkxNiAgICBkMCwgIzAKLSAgICBtb3YgICAgIHI4LCAjMHgxZgotICAgIHZzdDEuMTYgICAge2QwfSwgW3IxXQotICAgIGxkcmIgICAgcjYsIFtyOV0sICMxCi11bnBhY2tMb29wOgotICAgIHRzdCAgICAgcjYsICMweDEwCi0gICAgbGRyc2JuZSByNSwgW3I5LCAjMV0KLSAgICBsZHJibmUgIHI0LCBbcjldLCAjMgotICAgIGFuZCAgICAgcjcsIHI4LCByNiwgbHNsICMxCi0gICAgbGRyc2JlcSByNCwgW3I5XSwgIzEKLSAgICBvcnJuZSAgIHI0LCByNCwgcjUsIGxzbCAjOAotICAgIHRzdCAgICAgcjYsICMweDIwCi0gICAgbGRyYmVxICByNiwgW3I5XSwgIzEKLSAgICBzdHJoICAgIHI0LCBbcjEsIHI3XQotICAgIGJlcSAgICAgdW5wYWNrTG9vcAotICAgIGxkbWlhICAgcjEsIHtyMywgcjR9Ci0gICAgc3RyICAgICByOSwgW3IwLCAjMF0KLSAgICBsZHIgICAgIHI1LCAuTGFybVZDTTRQMTBfUVBEaXZUYWJsZQotUDA6IGFkZCAgICAgcjUsIHBjCi0gICAgbGRyICAgICByNiwgLkxhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi1QMTogYWRkICAgICByNiwgcGMKLSAgICBzYWRkc3VieCAgICAgICAgcjMsIHIzLCByMwotICAgIHNhZGRzdWJ4ICAgICAgICByNCwgcjQsIHI0Ci0gICAgbGRyc2IgICByOSwgW3I1LCByMl0KLSAgICBsZHJzYiAgIHIyLCBbcjYsIHIyXQotICAgIHNhZGQxNiAgcjUsIHIzLCByNAotICAgIHNzdWIxNiAgcjYsIHIzLCByNAotICAgIGxzbCAgICAgcjIsIHIyLCByOQotICAgIHZtb3YgICAgZDAsIHI1LCByNgotICAgIHZyZXYzMi4xNiAgZDAsIGQwCi0gICAgdmR1cC4xNiAgICBkMSwgcjIKLSAgICB2bXVsbC5zMTYgICBxMSwgZDAsIGQxCi0gICAgdnNocm4uaTMyICAgZDIsIHExLCAjMQotICAgIHZzdDEuMTYgICAge2QyfSwgW3IxXQotICAgIG1vdiAgICAgcjAsICMwCi0gICAgcG9wICAgICB7cjQtcjEwLCBwY30KLQotLkxhcm1WQ000UDEwX1FQRGl2VGFibGU6Ci0gICAgLndvcmQgYXJtVkNNNFAxMF9RUERpdlRhYmxlLShQMCs4KQotLkxhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlOgotICAgIC53b3JkIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUtKFAxKzgpCi0KLSAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMTAzMGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0OgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDEzfQotICAgIFZMRDQuMTYgIHtkMCxkMSxkMixkM30sW3IwXQotICAgIExEUiAgICAgIHIyLCAuTGFybVZDTTRQMTBfUVBEaXZUYWJsZQotUDA6IEFERCAgICAgIHIyLCBwYwotICAgIExEUiAgICAgIHIzLCAuTGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLVAxOiBBREQgICAgICByMywgcGMKLSAgICBWQURELkkxNiBkNCxkMCxkMQotICAgIFZBREQuSTE2IGQ1LGQyLGQzCi0gICAgVlNVQi5JMTYgZDYsZDAsZDEKLSAgICBMRFJTQiAgICByNCxbcjIscjFdCi0gICAgVlNVQi5JMTYgZDcsZDIsZDMKLSAgICBMRFJTQiAgICByNSxbcjMscjFdCi0gICAgVkFERC5JMTYgZDAsZDQsZDUKLSAgICBWU1VCLkkxNiBkMSxkNCxkNQotICAgIFZTVUIuSTE2IGQyLGQ2LGQ3Ci0gICAgTFNMICAgICAgcjUscjUscjQKLSAgICBWQURELkkxNiBkMyxkNixkNwotICAgIFZUUk4uMTYgIGQwLGQxCi0gICAgVlRSTi4xNiAgZDIsZDMKLSAgICBWVFJOLjMyICBxMCxxMQotICAgIFZBREQuSTE2IGQ0LGQwLGQxCi0gICAgVkFERC5JMTYgZDUsZDIsZDMKLSAgICBWU1VCLkkxNiBkNixkMCxkMQotICAgIFZTVUIuSTE2IGQ3LGQyLGQzCi0gICAgVkFERC5JMTYgZDAsZDQsZDUKLSAgICBWU1VCLkkxNiBkMSxkNCxkNQotICAgIFZTVUIuSTE2IGQyLGQ2LGQ3Ci0gICAgVkFERC5JMTYgZDMsZDYsZDcKLSAgICBWRFVQLjE2ICBkNSxyNQotICAgIFZNT1YuSTMyIHEzLCMweDIKLSAgICBWTU9WLkkzMiBxNCwjMHgyCi0gICAgVk1PVi5JMzIgcTUsIzB4MgotICAgIFZNT1YuSTMyIHE2LCMweDIKLSAgICBWTUxBTC5TMTYgcTMsZDAsZDUKLSAgICBWTUxBTC5TMTYgcTQsZDEsZDUKLSAgICBWTUxBTC5TMTYgcTUsZDIsZDUKLSAgICBWTUxBTC5TMTYgcTYsZDMsZDUKLSAgICBWU0hSTi5JMzIgZDAscTMsIzIKLSAgICBWU0hSTi5JMzIgZDEscTQsIzIKLSAgICBWU0hSTi5JMzIgZDIscTUsIzIKLSAgICBWU0hSTi5JMzIgZDMscTYsIzIKLSAgICBWU1QxLjE2ICB7ZDAsZDEsZDIsZDN9LFtyMF0KLSAgICBWUE9QICAgICB7ZDgtZDEzfQotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotLkxhcm1WQ000UDEwX1FQRGl2VGFibGU6Ci0gICAgLndvcmQgYXJtVkNNNFAxMF9RUERpdlRhYmxlLShQMCs4KQotLkxhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlOgotICAgIC53b3JkIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUtKFAxKzgpCi0KLS5nbG9iYWwgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKLW9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBNT1YgICAgICByNCxyMQotICAgIE1PViAgICAgIHI1LHIyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgIE1PViAgICAgIHIwLHI0Ci0gICAgTU9WICAgICAgcjEscjUKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLSAgICBNT1YgICAgICByMCwjMAotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmM1ZmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKLSAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWEhVRkZUQUJfSF8KLSNkZWZpbmUgX09NWEhVRkZUQUJfSF8KLQotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF07Ci0KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludGVyVmxjTDBMMVsyMDBdOwotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdOwotLy9leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFszMl07Ci1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdOwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFs1M107Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXQotCi0jZW5kaWYgLyogX09NWEhVRkZUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjRhNjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YWklHWkFHVEFCX0gKLSNkZWZpbmUgX09NWFpJR1pBR1RBQl9ICi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdOwotLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOwotCi0jZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4MzBmYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07IC8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9DbGlwOF9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgQ2xpcHBpbmcgMTYgYml0IHZhbHVlIHRvIFswLDI1NV0gUmFuZ2UKLTsgKi8gCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAKLQotICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICBJRiBDb3J0ZXhBOAotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBTcmMgICAgICAgICAgICAgICAgIFJOIDAKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDEKLXN0ZXAgICAgICAgICAgICAgICAgIFJOIDIKLQotOy8vIE5lb24gUmVnaXN0ZXJzCi0KLXF4MCAgICAgICAgICAgICAgICAgIFFOICBRMC5TMTYgICAgICAgICAgICAgICAgICAKLWR4MDAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKLWR4MDEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLXF4MSAgICAgICAgICAgICAgICAgIFFOICBRMS5TMTYKLWR4MTAgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWR4MTEgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLQotcXgyICAgICAgICAgICAgICAgICAgUU4gIFEyLlMxNiAgICAgICAgICAgICAgICAgIAotZHgyMCAgICAgICAgICAgICAgICAgRE4gIEQ0LlMxNgotZHgyMSAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgotcXgzICAgICAgICAgICAgICAgICAgUU4gIFEzLlMxNgotZHgzMCAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgotZHgzMSAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotCi0KLWRjbGlwMCAgICAgICAgICAgICAgIEROICBEMC5VOAotZGNsaXAxICAgICAgICAgICAgICAgRE4gIEQyLlU4IAotZGNsaXAyICAgICAgICAgICAgICAgRE4gIEQ0LlU4Ci1kY2xpcDMgICAgICAgICAgICAgICBETiAgRDYuVTgKLSAKLSAgICAgICBNX1NUQVJUIGFybVZDTTRQMl9DbGlwOAotCi0gICAgICAgVkxEMSAgICAgICAgICB7ZHgwMCxkeDAxLGR4MTAsZHgxMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCAxNiBlbnRyaWVzIGZyb20gcFNyYwotICAgICAgIFZMRDEgICAgICAgICAge2R4MjAsZHgyMSxkeDMwLGR4MzF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgbmV4dCAxNiBlbnRyaWVzIGZyb20gcFNyYyAgCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDAscXgwLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAwW2ldPWNsaXAgcXgwW2ldIHRvIFswLDI1NV0KLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMSxxeDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDFbaV09Y2xpcCBxeDFbaV0gdG8gWzAsMjU1XQotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMH0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAxfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMixxeDIsIzAKLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMyxxeDMsIzAKLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDJ9LFtwRHN0XSxzdGVwCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAzfSxbcERzdF0sc3RlcAotICAgICAgIAotICAgICAgIFZMRDEgICAgICAgICAge2R4MDAsZHgwMSxkeDEwLGR4MTF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgMTYgZW50cmllcyBmcm9tIHBTcmMKLSAgICAgICBWTEQxICAgICAgICAgIHtkeDIwLGR4MjEsZHgzMCxkeDMxfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIG5leHQgMTYgZW50cmllcyBmcm9tIHBTcmMgIAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAwLHF4MCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMFtpXT1jbGlwIHF4MFtpXSB0byBbMCwyNTVdCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDEscXgxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAxW2ldPWNsaXAgcXgxW2ldIHRvIFswLDI1NV0KLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDB9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMX0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDIscXgyLCMwCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDMscXgzLCMwCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAyfSxbcERzdF0sc3RlcAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwM30sW3BEc3RdLHN0ZXAKLQotCi0gICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNmU2NWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIsIGludHJhIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIAotOyAqCi07ICogCi07ICoKLTsgKiAKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLSAgICAgCi0gICAgICAgIAotCi0KLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLXNob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKLQotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci0KLWZ0eXBlICAgICAgICAgICAgICAgIFJOIDAKLXRlbXAzICAgICAgICAgICAgICAgIFJOIDQKLXRlbXAgICAgICAgICAgICAgICAgIFJOIDUKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLUVzY2FwZSAgICAgICAgICAgICAgIFJOIDUKLQotOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi16aWd6YWcgICAgICAgICAgICAgICBSTiAwCi1zdG9yZUxldmVsICAgICAgICAgICBSTiAxCi10ZW1wMiAgICAgICAgICAgICAgICBSTiA0Ci10ZW1wMSAgICAgICAgICAgICAgICBSTiA1Ci1zaWduICAgICAgICAgICAgICAgICBSTiA1Ci1MYXN0ICAgICAgICAgICAgICAgICBSTiA3Ci1zdG9yZVJ1biAgICAgICAgICAgICBSTiAxNAotCi0KLXBhY2tSZXRJbmRleCAgICAgICAgIFJOIDUKLQotCi1tYXJrZXJiaXQgICAgICAgICAgICBSTiA1Ci0KLTsvLyBTY3JhdGNoIFJlZ2lzdGVycwotCi1SQml0U3RyZWFtICAgICAgICAgICBSTiA4Ci1SQml0QnVmZmVyICAgICAgICAgICBSTiA5Ci1SQml0Q291bnQgICAgICAgICAgICBSTiAxMAotCi1UMSAgICAgICAgICAgICAgICAgICBSTiAxMQotVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKLUxSICAgICAgICAgICAgICAgICAgIFJOIDE0ICAgICAgICAKLSAgICAgICAgCi0KLQotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwT2Zmc2V0LDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBMaW5rUmVnaXN0ZXIsNCAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotICAgICAgICA7Ly8gZ2V0IHRoZSB0YWJsZSBhZGRyZXNzZXMgZnJvbSBzdGFjayAgICAgICAKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQVJHICAgICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgQUxMIHplcm9zIGF0IHBEc3QKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSBDb3VudCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgICAgIExhc3QsIzAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMaW5rIFJlZ2lzdGVyIG9uIFN0YWNrCi0gICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMiwjMAotICAgICAgICBNT1YgICAgICAgICAgICAgTFIsIzAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgTWFjcm8gYW5kIFN0b3JlIGFsbCB6ZXJvcyB0byBwRHN0IAotICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQgIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBwQml0c3RyZWFtIG9uIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcEJpdE9mZnNldCBvbiBzdGFjawotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgICAgICBwRHN0LHBEc3QsIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmVzdG9yZSBwRHN0Ci0KLSAgICAgICAgOy8vIFRoZSBhcm1WQ000UDJfR2V0VkxDQml0cyBiZWdpbnMKLQotZ2V0VkxDYml0cwotICAgICAgICAKLSAgICAgICAgTV9CRF9MT09LOCAgICAgIEVzY2FwZSw3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEVzY2FwZSBWYWx1ZQotICAgICAgICBMU1IgICAgICAgICAgICAgRXNjYXBlLEVzY2FwZSwjMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRXNjYXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGZvciBlc2NhcGUgbW9kZQotICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzAKLSAgICAgICAgQk5FICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggaWYgbm90IGluIEVzY2FwZSBtb2RlIDMKLQotICAgICAgICBNX0JEX1ZTS0lQOCAgICAgIzcsVDEKLSAgICAgICAgQ01QICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBzaG9ydFZpZGVvSGVhZGVyIGZsYWcgdG8ga25vdyB0aGUgdHlwZSBvZiBFc2NhcGUgbW9kZQotICAgICAgICBCRVEgICAgICAgICAgICAgZW5kRmlsbFZMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEVzY2FwZSBNb2RlIDQKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZUxldmVsLDgsVDEKLQotICAgICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHdoZXRoZXIgdGhlIFJlc2VydmVkIHZhbHVlcyBmb3IgTGV2ZWwgYXJlIHVzZWQgYW5kIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGl0IGlzIHNvCi0KLSAgICAgICAgVEVRICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKLSAgICAgICAgVEVRTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIzEyOCAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAotICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGVycm9yIGlmIENvdW50K3N0b3JlUnVuID49IDY0Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBBZGRyZXNzIG9mIFppZ3phZyB0YWJsZQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotICAgICAgICAgICAgICAgIAotICAgICAgICBTWFRCICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gRXh0ZW5kIHN0b3JlTGV2ZWwgdG8gMzIgYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5ndGgKLQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KLSAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKLSAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSBMZXZlbAotICAgICAgICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPawotICAgICAgIAotICAgICAgICAKLQotZW5kRmlsbFZMRAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBGdHlwZSggRXNjYXBlIE1vZGUpIHZhbHVlIGJhc2VkIG9uIHRoZSB0d28gc3VjY2Vzc2l2ZSBiaXRzIGluIHRoZSBiaXRzdHJlYW0KLSAgICAgCi0gICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgIAotICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzEKLSAgICAgICAgQkVRICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMxCi0gICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMwotICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzIKLSAgICAgICAgCi0KLW5vdEVzY2FwZW1vZGUKLQotICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyB0YWJsZSB3aXRoIGxhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQ29tYmluZWQgVkxDIFRhYmxlCi0gICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZnR5cGUgPj0zIGdldCBwZXJmb3JtIEZpeGVkIExlbmd0aCBEZWNvZGluZyAoRXNjYXBlIE1vZGUgMykKLSAgICAgICAgQkdFICAgICAgICAgICAgIEVzY2FwZU1vZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIGNvbnRpbnVlIG5vcm1hbCBWTEMgRGVjb2RpbmcKLSAgICAgICAgCi0gICAgICAgIDsvLyBWYXJpYWJsZSBsZW5naCBkZWNvZGluZywgImFybVVuUGFja1ZMQzMyIiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZMRCAgICAgICAgcGFja1JldEluZGV4LFQxLFQyLHBWbGNUYWJsZUwwTDEsNCwyCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHRlbXAzLD0weEZGRgotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIHBhY2tSZXRJbmRleCx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBmb3IgaW52YWxpZCBzeW1ib2wKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBpbnZhbGlkIHN5bWJvbCBvY2N1cnMgZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgICAgICBMYXN0LHBhY2tSZXRJbmRleCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IExhc3QgZnJvbSBwYWNrZWQgSW5kZXgKLSAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlUnVuLHBhY2tSZXRJbmRleCwjNyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgUnVuIFZhbHVlIGZyb20gUGFja2VkIGluZGV4Ci0gICAgICAgIEFORCAgICAgICAgICAgICBzdG9yZUxldmVsLHBhY2tSZXRJbmRleCwjMHg3YyAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmVMZXZlbD1wYWNrUmV0SW5kZXhbMi02XSxzdG9yZUxldmVsWzAtMV09MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIExNQVggdGFibGUKLSAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTGV2ZWwgdmFsdWUKLQotICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgICAgIGZ0eXBlMgotICAgICAgICAKLSAgICAgICAgOy8vIGZ0eXBlPT0xOyBFc2NhcGUgbW9kZSA9MQotICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBMTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgOy8vIElmIHRoZSBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSxzdG9yZVJ1bl0KLQotICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVMZXZlbCx0ZW1wMSxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgCi0KLWZ0eXBlMgotCi0gICAgICAgIDsvLyBmdHlwZSA9MjsgRXNjYXBlIG1vZGUgPTIKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlIAotICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzIKLSAgICAgICAgQk5FICAgICAgICAgICAgIEZpbGxWTERMMQotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwUk1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgICA7Ly8gSWYgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCi0gICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wMixzdG9yZUxldmVsLCMxCi0gICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsdGVtcDJdCi0KLSAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHN0b3JlUnVuLCMxCi0gICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bix0ZW1wMQotICAgICAgICAKLUZpbGxWTERMMSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHNpZ24sMSxUMQotCi0gICAgICAgIENNUCAgICAgICAgICAgICBzaWduLCMxCi0gICAgICAgIFJTQkVRICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzAKLSAKLSAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCM2NAotICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ2h0Ci0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCi0gCi1zdG9yZUxldmVsTDEKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KLSAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgTGV2ZWwgdmFsIGlzIExhc3Qgbm9uIHplcm8gdmFsCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQotICAgICAgICBMU1IgICAgICAgICAgICAgTGFzdCxMYXN0LCMxCi0gICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgICAgICBlbmQKLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKLSAKLQotCi0gICAgICAgIDsvLyBGaXhlZCBMZW5naCBEZWNvZGluZyBFc2NhcGUgTW9kZSAzCi0KLUVzY2FwZU1vZGUzCi0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKLSAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQotICAgICAgICBURVEgICAgICAgICAgICAgbWFya2VyYml0LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIG1hcmtlciBiaXQgaXMgemVybwotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCi0gICAgICAgIAotICAgICAgICBNX0JEX1JFQUQxNiAgICAgc3RvcmVMZXZlbCwxMixUMQotCi0gICAgICAgIFRTVCAgICAgICAgICAgICBzdG9yZUxldmVsLCMweDgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVzdCBpZiB0aGUgbGV2ZWwgaXMgbmVnYXRpdmUKLSAgICAgICAgU1VCTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjNDA5NgotICAgICAgICBDTVAgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAotICAgICAgICBDTVBORSAgICAgICAgICAgc3RvcmVMZXZlbCwjLTIwNDgKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBMZXZlbD09MCBvciAgLTIwNDggCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKLSAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQotICAgICAgICAgICAKLQotICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIgKCBTaWduIG5vdCB1c2VkIGFzIHN0b3JlTGV2ZWwgaXMgcHJlcHJvY2Vzc2VkKQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAKLQotICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW4gTGVuZ3RoCi0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCi0KLQotIAotc3RvcmVMZXZlbExhc3QKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KLSAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCi0gICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICAgICAgZW5kIAotICAgICAgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKLSAgICAgICAgCi1lbmQKLQotICAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vUnVuIHRoZSBMb29wIHVudGlsbCBDb3VudCByZWFjaGVzIDY0Ci0KLSAgICAgICAgQkxUICAgICAgICAgICAgIGdldFZMQ2JpdHMKLQotICAgICAgICAKLUV4aXRPawotICAgICAgICA7Ly8gRXhpdCBXaGVuIFZMQyBEZWNvZGluZyBpcyBkb25lIFN1Y2Nlc3NmdWxseSAKLSAgIAotICAgICAgICA7Ly8gTG9hZGluZyBwcEJpdFN0cmVhbSBhbmQgcEJpdE9mZnNldCBmcm9tIHN0YWNrCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQotICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0Ci0KLSAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0Ci0gICAgICAgICAgICAgCi0gICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTU9WTkUgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKLSAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIExpbmsgUmVnaXN0ZXIgQmFjawotICAgICAgICBCICAgICAgICAgICAgICAgZXhpdDIKLQotRXhpdEVycm9yCi0gICAgICAgIDsvLyBFeGl0IFdoZW4gYW4gRXJyb3Igb2NjdXJzIAotCi0gICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKLSAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0Ci0gICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyCi0gICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0KLWV4aXQyCi0gICAgICAgCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzc4MzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgSHVmZm1hbiB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLQotCi0KLS8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgUGFja2VkIFZMQyB0YWJsZXMgd2l0aCBMYXN0PTAgYW5kIExhc3Q9MQotCi0vLyAgICAgICAgICAgICAgb3B0aW1pemVkIFBhY2tlZCBWTEMgdGFibGUgRW50cnkgRm9ybWF0IAotLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gCi0vLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLS8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICB8ICBMZW4gICB8ICAgICAgIFJ1biAgICAgICB8ICAgICBMZXZlbCAgICB8TCB8IDEgfAotLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8Ci0vLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKLS8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICAoMCB0byA3KSAgMyBiaXRzCi0vLyAgICBSdW4gICAgPSBSdW5MZW5ndGggb2YgdGhlIFN5bWJvbCAgKDAgdG8gNjMpIDYgYml0cwotLy8gICAgTGV2ZWwgID0gTGV2ZWwgb2YgdGhlIFN5bWJvbCAgICAgICgwIHRvIDMxKSA1IGJpdHMKLS8vICAgIEwgICAgICA9IExhc3QgVmFsdWUgb2YgdGhlIFN5bWJvbCAoMCBvciAxKSAgMSBiaXQKLS8vCi0vLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgotLy8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKLS8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKLS8vCi0vLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCi0vLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCi0vLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCi0KLS8vIFRoZSBWTEMgdGFibGVzIHVzZWQgZm9yIEludHJhIGFuZCBub24gaW50YSBjb2VmZmljaWVudHMgaW4gbm9uIEVzY2FwZSBtb2RlCi0vLyBjb250YWlucyBzeW1ib2xzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MS4KLS8vIElmIGEgc3ltYm9sIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgaXQgd2lsbCBiZSBjb2RlZCBhcyAweEZGRgotIAotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MWIwOSwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjEwOSwgMHgyMTA5LCAweDAyMDksIDB4MDAxMSwKLSAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjExNSwgMHgyMTE1LCAweDIwMWQsIDB4MjAxZCwKLSAgICAweDIwNTksIDB4MjA1OSwgMHgyMDUxLCAweDIwNTEsIDB4MWMwZCwgMHgxYjBkLCAweDFhMGQsIDB4MTkwZCwKLSAgICAweDA5MTEsIDB4MDgxMSwgMHgwNzExLCAweDA2MTEsIDB4MDUxMSwgMHgwMzE5LCAweDAyMTksIDB4MDEyMSwKLSAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwNjEsIDB4MjA2MSwgMHgyMTI5LCAweDIxMjksIDB4MzcwOSwgMHgzNzA5LCAweDM4MDksIDB4MzgwOSwKLSAgICAweDNkMGQsIDB4M2QwZCwgMHgzZTBkLCAweDNlMGQsIDB4M2YwZCwgMHgzZjBkLCAweDIwMGQsIDB4MjAwZCwKLSAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDEzMSwgMHgwMjIxLCAweDA0MTksIDB4MDUxOSwKLSAgICAweDA2MTksIDB4MGExMSwgMHgxOTA5LCAweDFhMDksIDB4MjEwZCwgMHgyMjBkLCAweDIzMGQsIDB4MjQwZCwKLSAgICAweDI1MGQsIDB4MjYwZCwgMHgyNzBkLCAweDI4MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwNDksIDB4MDA0MSwgMHgzODBkLCAweDM4MGQsIDB4MzcwZCwgMHgzNzBkLCAweDM2MGQsIDB4MzYwZCwKLSAgICAweDM1MGQsIDB4MzUwZCwgMHgzNDBkLCAweDM0MGQsIDB4MzMwZCwgMHgzMzBkLCAweDMyMGQsIDB4MzIwZCwKLSAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MzEwZCwgMHgzMTBkLCAweDIwMTUsIDB4MjAxNSwKLSAgICAweDM2MDksIDB4MzYwOSwgMHgzNTA5LCAweDM1MDksIDB4MzQwOSwgMHgzNDA5LCAweDMzMDksIDB4MzMwOSwKLSAgICAweDMyMDksIDB4MzIwOSwgMHgzMTA5LCAweDMxMDksIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKLSAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDEwMGQsIDB4MzAwOSwgMHgzMDA5LCAweDJmMDksIDB4MmYwOSwKLSAgICAweDI0MTEsIDB4MjQxMSwgMHgyMzExLCAweDIzMTEsIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDBmMGQsIDB4MGUwZCwgMHgwZDBkLCAweDBjMGQsIDB4MGIwZCwgMHgwYTBkLCAweDA5MGQsIDB4MGUwOSwKLSAgICAweDBkMDksIDB4MDIxMSwgMHgwMTE5LCAweDAwMjksIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKLSAgICAweDI4MGQsIDB4MjgwZCwgMHgyNzBkLCAweDI3MGQsIDB4MjYwZCwgMHgyNjBkLCAweDI1MGQsIDB4MjUwZCwKLSAgICAweDJjMDksIDB4MmMwOSwgMHhiNzU5LCAweGI3NTksIDB4MmEwOSwgMHgyYTA5LCAweDIwMjEsIDB4MjAyMSwKLSAgICAweDA0MGQsIDB4MDMwZCwgMHgwYjM1LCAweDAxMGQsIDB4MDkwOSwgMHgwODA5LCAweDA3MDksIDB4MDYwOSwKLSAgICAweDAxMTEsIDB4MDAxOSwgMHgyNTA5LCAweDI1MDksIDB4MjQwOSwgMHgyNDA5LCAweDIzMDksIDB4MjMwOQotfTsKLQotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MGYwOSwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjAxMSwgMHgyMDExLCAweDAxMDksIDB4MDAxOSwKLSAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjAzZCwgMHgyMDNkLCAweDIwMzUsIDB4MjAzNSwKLSAgICAweDIwYjEsIDB4MjBiMSwgMHgyMGE5LCAweDIwYTksIDB4MDIxNSwgMHgwMTFkLCAweDAwMmQsIDB4MGQwOSwKLSAgICAweDA1MTksIDB4MDgxMSwgMHgwNDE5LCAweDAzMjEsIDB4MDIyMSwgMHgwMTM5LCAweDAwYTEsIDB4MDA5OSwKLSAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwYjksIDB4MjBiOSwgMHgyMGMxLCAweDIwYzEsIDB4MjE0MSwgMHgyMTQxLCAweDI5MTEsIDB4MjkxMSwKLSAgICAweDIzMTUsIDB4MjMxNSwgMHgyNDE1LCAweDI0MTUsIDB4MmYwZCwgMHgyZjBkLCAweDMwMGQsIDB4MzAwZCwKLSAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBjOSwgMHgwMGQxLCAweDAwZDksIDB4MDE0OSwKLSAgICAweDA2MTksIDB4MDE1MSwgMHgwMjI5LCAweDA3MTksIDB4MGUwOSwgMHgwMDQ1LCAweDA1MTUsIDB4MDYxNSwKLSAgICAweDExMGQsIDB4MTIwZCwgMHgxMzBkLCAweDE0MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwOTEsIDB4MDA4OSwgMHgyZTBkLCAweDJlMGQsIDB4MmQwZCwgMHgyZDBkLCAweDJjMGQsIDB4MmMwZCwKLSAgICAweDJiMGQsIDB4MmIwZCwgMHgyYTBkLCAweDJhMGQsIDB4MjExNSwgMHgyMTE1LCAweDIwMjUsIDB4MjAyNSwKLSAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MmMwOSwgMHgyYzA5LCAweDJiMDksIDB4MmIwOSwKLSAgICAweDI3MTEsIDB4MjcxMSwgMHgyNjExLCAweDI2MTEsIDB4MjUxMSwgMHgyNTExLCAweDIzMTksIDB4MjMxOSwKLSAgICAweDIyMTksIDB4MjIxOSwgMHgyMTMxLCAweDIxMzEsIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKLSAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDA4MGQsIDB4MjEyOSwgMHgyMTI5LCAweDIwODEsIDB4MjA4MSwKLSAgICAweDI0MTEsIDB4MjQxMSwgMHgyMDc5LCAweDIwNzksIDB4MjA3MSwgMHgyMDcxLCAweDIwNjksIDB4MjA2OSwKLSAgICAweDFiYjUsIDB4MDYwZCwgMHgwMDFkLCAweGQzZjksIDB4MDkwOSwgMHgwODA5LCAweDA5MGQsIDB4MDMxMSwKLSAgICAweDAxMjEsIDB4MDA2MSwgMHgwMDU5LCAweDAwNTEsIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKLSAgICAweDI0MGQsIDB4MjQwZCwgMHgyMzBkLCAweDIzMGQsIDB4MjYwOSwgMHgyNjA5LCAweDI1MGQsIDB4MjUwZCwKLSAgICAweDI3MDksIDB4MjcwOSwgMHgyMjExLCAweDIyMTEsIDB4MjExOSwgMHgyMTE5LCAweDIwNDksIDB4MjA0OSwKLSAgICAweDAwMTUsIDB4MDUwOSwgMHgwMjBkLCAweDAxMGQsIDB4MDQwOSwgMHgwMzA5LCAweDAwNDEsIDB4MDAzOSwKLSAgICAweDAxMTEsIDB4MDAzMSwgMHgyMjA5LCAweDIyMDksIDB4MjAyOSwgMHgyMDI5LCAweDIwMjEsIDB4MjAyMQotfTsKLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdID0gewotICAgIDB4MDAyMCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwMSwgMHgyMDAxLAotICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4MDAyOCwgMHgwMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgwMDMwLCAweDAwMTMsIDB4MjAxMSwgMHgyMDExLAotICAgIDB4MDAzOCwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgzZmZmLCAweDNmZmYsIDB4MjAxOSwgMHgyMDE5LAotCi0JMHgwMDIwLCAweDAwMDksIDB4MjAwNywgMHgyMDA3LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCi0gICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHgwMDI4LCAweDAwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDAwMzAsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgwMDM4LCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLCAweDFmZmYsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcKLX07Ci0KLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdID0gewotICAgIDB4MDAxMCwgMHgwMGYwLCAweDAwNDMsIDB4MDAzZiwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLAotICAgIDB4MDAxOCwgMHgwMGQ4LCAweDAwNDcsIDB4MDAzYiwgMHgwMDIwLCAweDAwODAsIDB4MDBhOCwgMHgwMGQwLAotICAgIDB4MDAyOCwgMHgwMDQ4LCAweDAwNzAsIDB4MDA3OCwgMHgxZmZmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLAotICAgIDB4MDA4MSwgMHgwMDAxLCAweDAwN2YsIDB4MDAwMywgMHgyMDdkLCAweDIwN2QsIDB4MjAwNSwgMHgyMDA1LAotICAgIDB4MjA3YiwgMHgyMDdiLCAweDIwMDcsIDB4MjAwNywgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LAotICAgIDB4MjA3OSwgMHgyMDc5LCAweDIwMDksIDB4MjAwOSwgMHgyMDc3LCAweDIwNzcsIDB4MjAwYiwgMHgyMDBiLAotICAgIDB4MjA3NSwgMHgyMDc1LCAweDIwMGQsIDB4MjAwZCwgMHgyMDczLCAweDIwNzMsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MDA3MSwgMHgwMDExLCAweDAwNmYsIDB4MDAxMywgMHgwMDZkLCAweDAwMTUsIDB4MDA2YiwgMHgwMDE3LAotICAgIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMDY5LCAweDAwMTksIDB4MDA2NywgMHgwMDFiLAotICAgIDB4MDA2NSwgMHgwMDFkLCAweDAwNjMsIDB4MDAxZiwgMHgwMDYxLCAweDAwMjEsIDB4MDA1ZiwgMHgwMDIzLAotICAgIDB4MDA1ZCwgMHgwMDI1LCAweDAwNWIsIDB4MDAyNywgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LAotICAgIDB4MDA1OSwgMHgwMDI5LCAweDAwNTcsIDB4MDAyYiwgMHgyMDU1LCAweDIwNTUsIDB4MjAyZCwgMHgyMDJkLAotICAgIDB4MjA1MywgMHgyMDUzLCAweDIwMmYsIDB4MjAyZiwgMHgyMDUxLCAweDIwNTEsIDB4MjAzMSwgMHgyMDMxLAotICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwMzMsIDB4MjAzMywgMHgwMGUwLCAweDAwZTgsIDB4MDA0OSwgMHgwMDM5LAotICAgIDB4MjA0ZCwgMHgyMDRkLCAweDIwMzUsIDB4MjAzNSwgMHgyMDRiLCAweDIwNGIsIDB4MjAzNywgMHgyMDM3LAotICAgIDB4MjA0NSwgMHgyMDQ1LCAweDIwM2QsIDB4MjAzZAotfTsKLQotLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkCi0gICBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5Ci0KLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdID0gCi17Ci0gICAxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsIAotICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxCi19OwotCi0vKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0gcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzEyLTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KLQotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdID0gCi17Ci0gICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCi0JMCwJMCwJMCwJMCwKLSAgICAwLCAgMCwgIDAsICAwLCAgNDAsICAxLCAgMAotfTsKLQotLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludHJhIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkCi0gICBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbMTUtMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5Ci0KLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdID0gCi17Ci0gICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAotICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCi0JMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKLQotCTgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMQotfTsKLQotCi0vKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0gcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KLQotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdID0KLXsKLSAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKLSAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JMCwJMCwJMCwJMCwKLQkKLQkyMCwgIDYsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAKLQotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MTVkM2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBMb29rdXAgdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSAgICAvKiAqIFRhYmxlIEVudHJpZXMgY29udGFpbiBEYyBTY2FsZXIgdmFsdWVzCi0gICAgICAgKiBhcm1WQ000UDJfRENTY2FsZXJbaV09IDggICAgICAgICAgIGZvciBpPTEgIHRvICA0IGFuZCBpPTMzIHRvIDM2Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaSAgICAgICAgIGZvciBpPTUgIHRvICA4Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGkrOCAgICAgICAgIGZvciBpPTkgIHRvICAyNQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmktMTYgICAgICBmb3IgaT0yNiB0byAgMzEKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gKGktMzIrMTMpLzIgZm9yIGk9MzcgdG8gIDU5Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGktNi0zMiAgICAgIGZvciBpPTYwIHRvICA2MwotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgICBmb3IgaT0wIGFuZCBpPTMyCi0gICAgICAgKi8KLSAgICAgICAKLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfRENTY2FsZXJbNjRdPXsKLQkweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweGEsICAweGMsICAweGUsICAKLSAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAKLSAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAotICAgIDB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MmEsIDB4MmMsIDB4MmUsCi0gICAgMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHg5LCAgMHg5LCAgMHhhLCAgCi0gICAgMHhhLCAgMHhiLCAgMHhiLCAgMHhjLCAgMHhjLCAgMHhkLCAgMHhkLCAgMHhlLCAgCi0gICAgMHhlLCAgMHhmLCAgMHhmLCAgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwgCi0gICAgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKLQotfTsKLQotICAgICAgICAgICAgICAKLSAgICAgLyogIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKLSAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNltpXT1yb3VuZCgzMjc2Ny9pKQotICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzBdPSAwCi0gICAgICAqLwotCi1jb25zdCBPTVhfUzE2IGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNls2NF09ewotCTB4MDAwMCwweDdmZmYsMHg0MDAwLDB4MmFhYSwweDIwMDAsMHgxOTk5LDB4MTU1NSwweDEyNDksCi0gICAgMHgxMDAwLDB4MGUzOSwweDBjY2QsMHgwYmEzLDB4MGFhYiwweDA5ZDksMHgwOTI1LDB4MDg4OCwKLSAgICAweDA4MDAsMHgwNzg3LDB4MDcxYywweDA2YmQsMHgwNjY2LDB4MDYxOCwweDA1ZDEsMHgwNTkxLAotICAgIDB4MDU1NSwweDA1MWYsMHgwNGVjLDB4MDRiZSwweDA0OTIsMHgwNDZhLDB4MDQ0NCwweDA0MjEsCi0gICAgMHgwNDAwLDB4MDNlMSwweDAzYzQsMHgwM2E4LDB4MDM4ZSwweDAzNzYsMHgwMzVlLDB4MDM0OCwKLSAgICAweDAzMzMsMHgwMzFmLDB4MDMwYywweDAyZmEsMHgwMmU5LDB4MDJkOCwweDAyYzgsMHgwMmI5LAotICAgIDB4MDJhYiwweDAyOWQsMHgwMjhmLDB4MDI4MiwweDAyNzYsMHgwMjZhLDB4MDI1ZiwweDAyNTQsCi0gICAgMHgwMjQ5LDB4MDIzZiwweDAyMzUsMHgwMjJiLDB4MDIyMiwweDAyMTksMHgwMjExLDB4MDIwOAotCSAgIAotfTsKLSAgICAgCi0gICAgICAvKiBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCi0gICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbaV09cm91bmQoMTMxMDcxL2kpCi0gICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbMF09IDAKLSAgICAgICAqLwotCi1jb25zdCBPTVhfUzMyIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMls2NF09ewotCTB4MDAwMDAwMDAsMHgwMDAxZmZmZiwweDAwMDEwMDAwLDB4MDAwMGFhYWEsIDB4MDAwMDgwMDAsIDB4MDAwMDY2NjYsIDB4MDAwMDU1NTUsIDB4MDAwMDQ5MjQsCi0gICAgMHgwMDAwNDAwMCwweDAwMDAzOGUzLDB4MDAwMDMzMzMsMHgwMDAwMmU4YywgMHgwMDAwMmFhYiwgMHgwMDAwMjc2MiwgMHgwMDAwMjQ5MiwgMHgwMDAwMjIyMiwKLSAgICAweDAwMDAyMDAwLDB4MDAwMDFlMWUsMHgwMDAwMWM3MiwweDAwMDAxYWYyLCAweDAwMDAxOTlhLCAweDAwMDAxODYxLCAweDAwMDAxNzQ2LCAweDAwMDAxNjQzLAotICAgIDB4MDAwMDE1NTUsMHgwMDAwMTQ3YiwweDAwMDAxM2IxLDB4MDAwMDEyZjYsIDB4MDAwMDEyNDksIDB4MDAwMDExYTgsIDB4MDAwMDExMTEsIDB4MDAwMDEwODQsCi0gICAgMHgwMDAwMTAwMCwweDAwMDAwZjg0LDB4MDAwMDBmMGYsMHgwMDAwMGVhMSwgMHgwMDAwMGUzOSwgMHgwMDAwMGRkNiwgMHgwMDAwMGQ3OSwgMHgwMDAwMGQyMSwKLSAgICAweDAwMDAwY2NkLDB4MDAwMDBjN2QsMHgwMDAwMGMzMSwweDAwMDAwYmU4LCAweDAwMDAwYmEzLCAweDAwMDAwYjYxLCAweDAwMDAwYjIxLCAweDAwMDAwYWU1LAotICAgIDB4MDAwMDBhYWIsMHgwMDAwMGE3MywweDAwMDAwYTNkLDB4MDAwMDBhMGEsIDB4MDAwMDA5ZDksIDB4MDAwMDA5YTksIDB4MDAwMDA5N2IsIDB4MDAwMDA5NGYsCi0gICAgMHgwMDAwMDkyNSwweDAwMDAwOGZiLDB4MDAwMDA4ZDQsMHgwMDAwMDhhZSwgMHgwMDAwMDg4OSwgMHgwMDAwMDg2NSwgMHgwMDAwMDg0MiwgMHgwMDAwMDgyMAotCQotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNmMzYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOyAqKgotOyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotOyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotOyAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKLTsgKiBbb3V0XXByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotOyAqIFtvdXRdcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLTsgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotOyAqCi07ICovCi0KLSAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICBJTkNMVURFIG9teFZDX3MuaAotCi0KLSAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0KLSAgICAgICBJRiBBUk0xMTM2SlMKLSAKLTsvLyBJbnB1dCBBcmd1bWVudHMKLUJsb2NrSW5kZXggICAgICAgICBSTiAwCi1wQ29lZkJ1ZlJvdyAgICAgICAgUk4gMQotcENvZWZCdWZDb2wgICAgICAgIFJOIDIKLXByZWREaXIgICAgICAgICAgICBSTiAzCi1wcmVkUVAgICAgICAgICAgICAgUk4gNAotcFFwQnVmICAgICAgICAgICAgIFJOIDUKLQotOy8vIExvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgUk4gMAotYmxvY2tEQ0xlZnQgICAgICAgIFJOIDYgIAotYmxvY2tEQ1RvcCAgICAgICAgIFJOIDcKLWJsb2NrRENUb3BMZWZ0ICAgICBSTiA4Ci10ZW1wMSAgICAgICAgICAgICAgUk4gOQotdGVtcDIgICAgICAgICAgICAgIFJOIDE0Ci0KLSAgICAgICBNX1NUQVJUICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyLHI5Ci0KLSAgICAgICBNX0FSRyAgICAgICBwcHJlZFFQLDQKLSAgICAgICBNX0FSRyAgICAgICBwcFFwQnVmLDQKLSAgICAKLSAgICAgICBMRFJIICAgICAgICBibG9ja0RDVG9wTGVmdCxbcENvZWZCdWZSb3csIy0xNl0KLSAgICAgICBMRFJIICAgICAgICBibG9ja0RDTGVmdCxbcENvZWZCdWZDb2xdCi0gICAgICAgCi0gICAgICAgVEVRICAgICAgICAgQmxvY2tJbmRleCwjMwotICAgICAgIExEUkVRSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmQ29sLCMtMTZdCi0gICAgICAgTERSTkVIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZSb3ddCi0gICAgICAgICAgICAgCi0gICAgICAgU1VCUyAgICAgICAgdGVtcDEsYmxvY2tEQ0xlZnQsYmxvY2tEQ1RvcExlZnQKLSAgICAgICBSU0JMVCAgICAgICB0ZW1wMSx0ZW1wMSwjMAotICAgICAgIFNVQlMgICAgICAgIHRlbXAyLGJsb2NrRENUb3BMZWZ0LGJsb2NrRENUb3AKLSAgICAgICBSU0JMVCAgICAgICB0ZW1wMix0ZW1wMiwjMAotICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgcFFwQnVmLHBwUXBCdWYKLSAgICAgICBNX0xEUiAgICAgICBwcmVkUVAscHByZWRRUAotICAgICAgIENNUCAgICAgICAgIHRlbXAxLHRlbXAyCi0gICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19WRVJUSUNBTAotICAgICAgIExEUkxUQiAgICAgIHRlbXAxLFtwUXBCdWYsIzFdCi0gICAgICAgU1RSTFQgICAgICAgdGVtcDIsW3ByZWREaXJdCi0gICAgICAgU1RSTFQgICAgICAgdGVtcDEsW3ByZWRRUF0KLSAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX0hPUklaT05UQUwgICAgICAgICAgIAotICAgICAgIExEUkdFQiAgICAgIHRlbXAxLFtwUXBCdWZdCi0gICAgICAgU1RSR0UgICAgICAgdGVtcDIsW3ByZWREaXJdCi0gICAgICAgTU9WICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgU1RSR0UgICAgICAgdGVtcDEsW3ByZWRRUF0gCi0KLSAgICAgICAgIAotICAgIAotICAgICAgIE1fRU5ECi0gCi0gICAgICAgRU5ESUYKLQotICAgICAgIEVORCAgICAKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOWI0MzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotLyogQ29udGFpbnMgRG91YmxlIHRoZSB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBaaWd6YWcgVGFibGUKLSAqIENvbnRhaW5zIENsYXNzaWNhbCxWZXRpY2FsIGFuZCBIb3Jpem9udGFsIFppZ3phZ3NjYW4gdGFibGVzIGluIG9uZSBhcnJheSAgCi0gKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXSA9IAotewotICAgICAwLCAgMiwgIDE2LCAzMiwgIDE4LCAgNCwgIDYsIDIwLAotICAgIDM0LCA0OCwgNjQsIDUwLCAzNiwgMjIsICA4LCAgMTAsCi0gICAgMjQsIDM4LCA1MiwgNjYsIDgwLCA5NiwgODIsIDY4LAotICAgIDU0LCA0MCwgMjYsICAxMiwgIDE0LCAyOCwgNDIsIDU2LCAKLSAgICA3MCwgODQsIDk4LCAxMTIsIDExNCwgMTAwLCA4NiwgNzIsCi0gICAgNTgsIDQ0LCAzMCwgNDYsIDYwLCA3NCwgODgsIDEwMiwKLSAgICAxMTYsIDExOCwgMTA0LCA5MCwgNzYsIDYyLCA3OCwgOTIsCi0gICAgMTA2LCAxMjAsIDEyMiwgMTA0LCA5NCwgMTEwLCAxMjQsIDEyNiwKLQotCTAsICAxNiwgMzIsIDQ4LCAgMiwgIDE4LCAgNCwgMjAsCi0gICAgMzQsIDUwLCA2NCwgODAsIDk2LCAxMTIsIDExNCwgOTgsCi0gICAgODIsIDY2LCA1MiwgMzYsICA2LCAyMiwgIDgsIDI0LAotICAgIDM4LCA1NCwgNjgsIDg0LCAxMDAsIDExNiwgNzAsIDg2LAotICAgIDEwMiwgMTE4LCA0MCwgNTYsICAxMCwgMjYsICAxMiwgMjgsCi0gICAgNDIsIDU4LCA3MiwgODgsIDEwNCwgMTIwLCA3NCwgOTAsIAotICAgIDEwNiwgMTIyLCA0NCwgNjAsICAxNCwgMzAsIDQ2LCA2MiwKLSAgICA3NiwgOTIsIDEwOCwgMTI0LCA3OCwgOTQsIDExMCwgMTI2LAotCi0gICAgMCwgIDIsICA0LCAgNiwgIDE2LCAgMTgsIDMyLCAzNCwKLSAgICAyMCwgMjIsICA4LCAgMTAsICAxMiwgIDE0LCAzMCwgMjgsCi0gICAgMjYsIDI0LCAzOCwgMzYsIDQ4LCA1MCwgNjQsIDY2LAotICAgIDUyLCA1NCwgNDAsIDQyLCA0NCwgNDYsIDU2LCA1OCwKLSAgICA2MCwgNjIsIDY4LCA3MCwgODAsIDgyLCA5NiwgOTgsCi0gICAgODQsIDg2LCA3MiwgNzQsIDc2LCA3OCwgODgsIDkwLCAKLSAgICA5MiwgOTQsIDEwMCwgMTAyLCAxMTIsIDExNCwgMTE2LCAxMTgsCi0gICAgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMjAsIDEyMiwgMTI0LCAxMjYKLQotCi19OwotCi0KLQotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzQ2YWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotICogCi0gKi8KLSAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCi0gKiBwb3NpdGlvbmluZyBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKLSAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5Ci0gKiBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvcgotICogZnVydGhlciByZWNvbnN0cnVjdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5Ci0gKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICoJCQkJCQkJCVswLTddCi0gKiBbaW5dCVFQCQkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgaW5kaWNhdGVzIHVzaW5nIHF1YW50aXphdGlvbiBtZXRob2QgZGVmaW5lZCBpbiBzaG9ydAotICogICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBoZWFkZXIgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgaW5kaWNhdGVzIG5vcm1haWwgcXVhbnRpemF0aW9uIG1ldGhvZC4KLSAqIFtvdXRdIHBwQml0U3RyZWFtIAkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSBwRHN0CQkJcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cyBvZgotICogICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBkYXRhIHR5cGUpLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0Ci0gKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOgotICogICAtICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIFFQIDw9IDA7Ci0gKgkgLSBwRHN0IG5vdCAxNi1ieXRlIGFsaWduZWQKLSAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcigKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQKLSAgICAxNSBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KLSAgICBPTVhfUzE2IHRlbXBCdWZbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMTsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1Zik7Ci0gICAgCi0gICAgCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogRGVxdWFudGl6YXRpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAotICAgICBwVGVtcEJ1ZjEsCi0gICAgIFFQKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0JICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWVjNWQyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyogRnVuY3Rpb24gZm9yIHNhdHVyYXRpbmcgMTYgYml0IHZhbHVlcyB0byB0aGUgWzAsMjU1XSByYW5nZSBhbmQgICovCi0vKiB3cml0aW5nIG91dCBhcyA4IGJpdCB2YWx1ZXMuICBEb2VzIDY0IGVudHJpZXMgICAgICAgICAgICAgICAgICAgKi8KLXZvaWQgYXJtVkNNNFAyX0NsaXA4KE9NWF9TMTYgKnBTcmMsIE9NWF9VOCAqcERzdCwgT01YX0lOVCBkc3RTdGVwICk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCi0gKiBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCBmcmFtZS9wbGFuZSBvbgotICogYSBwaXhlbCBiYXNpcy4gRm9yIElOVFJBIGJsb2NrLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgY2xpcHBlZCB0byBbMCwgMjU1XSBhbmQKLSAqIHdyaXR0ZW4gdG8gY29ycmVzcG9uZGluZyBibG9jayBidWZmZXIgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5Ci0gKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICoJCQkJCQkJCVswLTddLgotICogW2luXQlzdGVwCQkJd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lCi0gKiBbaW4vb3V0XQlwQ29lZkJ1ZlJvdwkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IHJ3byBidWZmZXIKLSAqIFtpbi9vdXRdCXBDb2VmQnVmQ29sCQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXQljdXJRUAkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2gKLSAqCQkJCQkJCQl0aGUgY3VycmVudCBibG9jayBiZWxvbmdzIHRvCi0gKiBbaW5dCXBRcEJ1ZgkJIFBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgUVAgYXJyYXkuIHBRcEJ1ZlswXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBsZWZ0IHRvCi0gKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayhRUGEpLiBwUXBCdWZbMV0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sganVzdCBhYm92ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2soUVBjKS4KLSAqICAgICAgICAgICAgICAgICAgIE5vdGUsIGluIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaXMgb3V0IG9mIFZPUCBib3VuZCwgdGhlIFFQIHZhbHVlIHdpbGwgaGF2ZQotICogICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IHRvIHRoZSBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MuIFJlZmVyIHRvIHN1YmNsYXVzZSAgIjcuNC4zLjMgQWRhcHRpdmUKLSAqICAgICAgICAgICAgICAgICAgIGFjIGNvZWZmaWNpZW50IHByZWRpY3Rpb24iIG9mIElTTy9JRUMgMTQ0OTYtMihNUEVHNCBQYXJ0MikgZm9yIGFjY3VyYXRlIGRlc2NyaXB0aW9uLgotICogW2luXQlibG9ja0luZGV4CQlibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLSAqCQkJCQkJCQlwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LAotICoJCQkJCQkJCUZpZ3VyZSA2LTUgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKLSAqIFtpbl0JaW50cmFEQ1ZMQwkJYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuCi0gKgkJCQkJCQkJVGhpcyBhbGxvd3MgYSBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQwotICoJCQkJCQkJCWZvciBjb2Rpbmcgb2YgSW50cmEgREMgY29lZmZpY2llbnRzIGFzIHBlciBUYWJsZQotICoJCQkJCQkJCTYtMjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKLSAqIFtpbl0JQUNQcmVkRmxhZwkJYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nCi0gKgkJCQkJCQkJaWYgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0Ci0gKgkJCQkJCQkJY29sdW1uIGFyZSBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQKLSAqCQkJCQkJCQltYWNyb2Jsb2NrLgotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAotICoJCQkJCQkJYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLSAqCQkJCQkJCQlkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKgkJCQkJCQkJaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XQlwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCQkqcHBCaXRTdHJlYW0KLSAqIFtvdXRdCXBEc3QJCQlwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCi0gKgkJCQkJCQkJcERzdCBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkLgotICogW291dF0JcENvZWZCdWZSb3cJCXBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAtCUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFQQnVmLCBwRHN0LgotICogICAgICBvcgotICogICAtICBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6ICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIGN1clFQIGV4Y2VlZHMgKDEsIDMxKSwKLSAqICAgICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDldLCBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOCwgaW50cmFEQ1ZMQyBpcyB6ZXJvIHdoaWxlCi0gKiAgICAgIGJsb2NrSW5kZXggZ3JlYXRlciB0aGFuIDUuCi0gKiAgICAgIG9yCi0gKiAgIC0JcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkCi0gKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBPTVhfVTggKnBEc3QsCi0gICAgIE9NWF9JTlQgc3RlcCwKLSAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgICBPTVhfVTggY3VyUVAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSApCi17Ci0gICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7Ci0gICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXI7Ci0gICAgT01YX0lOVCAgcHJlZFFQOwotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIAotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOwotICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKLSAgICAKLSAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KLSAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgICAgYmxvY2tJbmRleCwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICAmcHJlZERpciwKLSAgICAgICAgJnByZWRRUCwKLSAgICAgICAgcFFQQnVmKTsKLQotICAgIHByZWRBQ0RpciA9IHByZWREaXI7Ci0KLSAgICAKLSAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQotICAgIHsKLSAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7Ci0gICAgfQotCi0gICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCi0gICAgaWYgKGJsb2NrSW5kZXggPD0gMykKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKLSAgICB9Ci0gICAgCi0KLSAgICAvKiBWTEQgYW5kIHppZ3phZyAqLwotICAgIGlmIChpbnRyYURDVkxDID09IDEpCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgdmlkZW9Db21wKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKLSAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgICAgIHByZWRBQ0RpciwKLSAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICB9Ci0KLSAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKLSAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICBwQ29lZkJ1ZlJvdywKLSAgICAgICAgcENvZWZCdWZDb2wsCi0gICAgICAgIGN1clFQLAotICAgICAgICBwcmVkUVAsCi0gICAgICAgIHByZWREaXIsCi0gICAgICAgIEFDUHJlZEZsYWcsCi0gICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogRGVxdWFudGl6YXRpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAotICAgICBwVGVtcEJ1ZjEsCi0gICAgIGN1clFQLAotICAgICB2aWRlb0NvbXAsCi0gICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCi0gICAgICAgaXQgdG8gMCB0byAyNTUgKi8KLSAgICAKLQlhcm1WQ000UDJfQ2xpcDgocFRlbXBCdWYyLHBEc3Qsc3RlcCk7Ci0JCi0JCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTk1MzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAqKioqKioqKioqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKioKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIERlY29kZXMgYW5kIHBhZHMgZm91ciBtb3Rpb24gdmVjdG9ycyBvZiB0aGUgbm9uLWludHJhIG1hY3JvYmxvY2sgaW4gUC1WT1AuCi07ICogVGhlIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBwcm9jZXNzIGlzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy42LjEuNiBvZgotOyAqIElTTy9JRUMgMTQ0OTYtMi4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgotOyAqIFtpbl0gICAgcFNyY01WTGVmdE1CICAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCi07ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCi07ICogW2luXSAgICBwU3JjTVZVcHBlck1CICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXIgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCi07ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCi07ICogW2luXSAgICBwU3JjTVZVcHBlclJpZ2h0TUIgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCi07ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCi07ICogW2luXSAgICBmY29kZUZvcndhcmQgICAgICAgYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNAotOyAqICAgICAgICAgICAgICAgICAgICAgYml0IHN0cmVhbSBzeW50YXgKLTsgKiBbaW5dICAgIE1CVHlwZSAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZQotOyAqICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24KLTsgKiAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIGZpbGxlZCB3aXRoIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgc2FtZSBkZWNvZGVkIHZlY3Rvci4KLTsgKiBbb3V0XSAgIHBwQml0U3RyZWFtICAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsCi07ICogICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLTsgKiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICBwRHN0TVZDdXJNQiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIHdoaWNoIGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycwotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLW5vIGVycm9yCi07ICogCi07ICogICAgICAgICAgICAgICAgICAgICAKLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqCi07ICoKLSAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLSAgICAgICAgSU5DTFVERSBvbXhWQ19zLmgKLSAgICAgICAgCi0gICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgIElGIEFSTTExMzZKUwotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgICBSTiAxCi1wU3JjTVZMZWZ0TUIgICAgICAgICAgUk4gMgotcFNyY01WVXBwZXJNQiAgICAgICAgIFJOIDMKLXBTcmNNVlVwcGVyUmlnaHRNQiAgICBSTiA0Ci1wRHN0TVZDdXJNQiAgICAgICAgICAgUk4gNQotZmNvZGVGb3J3YXJkICAgICAgICAgIFJOIDYKLU1CVHlwZSAgICAgICAgICAgICAgICBSTiA3Ci0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi16ZXJvICAgICAgICAgICAgICAgICAgUk4gNAotb25lICAgICAgICAgICAgICAgICAgIFJOIDQKLXNjYWxlRmFjdG9yICAgICAgICAgICBSTiAxCi0KLQotUmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKLQotVmxjTVZEICAgICAgICAgICAgICAgIFJOIDAKLWluZGV4ICAgICAgICAgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICAgUk4gNwotCi1tdkhvckRhdGEgICAgICAgICAgICAgUk4gNAotbXZIb3JSZXNpZHVhbCAgICAgICAgIFJOIDAKLQotbXZWZXJEYXRhICAgICAgICAgICAgIFJOIDQgICAgICAgICAgICAgCi1tdlZlclJlc2lkdWFsICAgICAgICAgUk4gMAotCi10ZW1wICAgICAgICAgICAgICAgICAgUk4gMQotCi10ZW1wMSAgICAgICAgICAgICAgICAgUk4gMwotSGlnaCAgICAgICAgICAgICAgICAgIFJOIDQKLUxvdyAgICAgICAgICAgICAgICAgICBSTiAyCi1SYW5nZSAgICAgICAgICAgICAgICAgUk4gMQotCi1CbGtDb3VudCAgICAgICAgICAgICAgUk4gMTQKLQotZGlmZk1WZHggICAgICAgICAgICAgIFJOIDAKLWRpZmZNVmR5ICAgICAgICAgICAgICBSTiAxCi0KLTsvLyBTY3JhdGNoIFJlZ2lzdGVycwotCi1SQml0U3RyZWFtICAgICAgICAgICAgUk4gOAotUkJpdENvdW50ICAgICAgICAgICAgIFJOIDkKLVJCaXRCdWZmZXIgICAgICAgICAgICBSTiAxMAotCi1UMSAgICAgICAgICAgICAgICAgICAgUk4gMTEKLVQyICAgICAgICAgICAgICAgICAgICBSTiAxMgotTFIgICAgICAgICAgICAgICAgICAgIFJOIDE0Ci0KLSAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FWbGNNVkQKLSAgICAgICBJTVBPUlQgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKLQotICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgICAgICAgIAotICAgICAgIAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcERzdE1WQ3VyTUIsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwRHN0TVZQcmVkTUUsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwQmxrQ291bnQsNAotICAgICAgIAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcEJpdE9mZnNldCw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZMZWZ0TUIsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WVXBwZXJNQiw0Ci0gICAgICAgCi0gICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeCw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeSw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBIaWdoLDQKLSAgICAgICAKLSAgICAgICAgICAgICAgCi0KLQotICAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCxyMTEKLSAgICAgICAKLSAgICAgICBNX0FSRyAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1Cb25TdGFjayw0ICAgICAgICAgICA7Ly8gcG9pbnRlciB0byAgcFNyY01WVXBwZXJSaWdodE1CIG9uIHN0YWNrCi0gICAgICAgTV9BUkcgICAgICAgICAgIHBEc3RNVkN1ck1Cb25TdGFjayw0ICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gcERzdE1WQ3VyTUIgb24gc3RhY2sKLSAgICAgICBNX0FSRyAgICAgICAgICAgZmNvZGVGb3J3YXJkb25TdGFjayw0ICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBmY29kZUZvcndhcmQgb24gc3RhY2sgCi0gICAgICAgTV9BUkcgICAgICAgICAgIE1CVHlwZW9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gTUJUeXBlIG9uIHN0YWNrCi0KLSAgICAgIAotICAgICAgIAotICAgICAgIAotICAgICAgIAotICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIEJpdFN0cmVhbSBNYWNybwotCi0gICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBNQlR5cGUgZnJvbSBzdGFjawotICAgICAgIE1fTERSICAgICAgICAgICBwRHN0TVZDdXJNQixwRHN0TVZDdXJNQm9uU3RhY2sgICAgICAgIDsvLyBMb2FkIHBEc3RNVkN1ck1CIGZyb20gc3RhY2sKLSAgICAgICBNT1YgICAgICAgICAgICAgemVybywjMAotCi0gICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkEKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkFfUSAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQV9RCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CXQotICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBNT1YgICAgICAgICAgICAgQmxrQ291bnQsIzAKLSAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCi0gICAgICAgCi0gICAgICAgQkVRICAgICAgICAgICAgIEV4aXRPSwotCi0gICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFYgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0VgotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWX1EgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFZfUQotICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjNAotCi0gICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVIKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUl9RCi0gICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCMxCi0gICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIGZjb2RlRm9yd2FyZCxmY29kZUZvcndhcmRvblN0YWNrICAgICAgOy8vIExvYWQgZmNvZGVGb3J3YXJkICBmcm9tIHN0YWNrCi0KLSAgICAgICA7Ly8gU3RvcmluZyB0aGUgdmFsdWVzIHRlbXBvcmFyaWx5IG9uIHN0YWNrCi0KLSAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAKLSAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAotICAgICAgICAgICAgCi0KLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1mY29kZUZvcndhcmQtMQotICAgICAgIE1PViAgICAgICAgICAgICBvbmUsIzEKLSAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKLSAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isb25lLHRlbXAgICAgICAgICAgICAgICAgICA7Ly8gc2NhbGVGYWN0b3I9MTw8KGZjb2RlRm9yd2FyZC0xKQotICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCi0gICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLHNjYWxlRmFjdG9yLCM1ICAgICAgICAgICAgCi0gICAgICAgTV9TVFIgICAgICAgICAgIHNjYWxlRmFjdG9yLHBIaWdoICAgICAgICAgICAgICAgICAgICAgOy8vIFtwSGlnaF09MzIqc2NhbGVGYWN0b3IKLSAgICAgICAgICAgICAgCi0gICAgICAgOy8vIFZMRCBEZWNvZGluZwotCi0KLUxvb3AKLQotICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWQgdGhlIG9wdGltaXplZCBNVkQgVkxDIHRhYmxlCi0KLSAgICAgICA7Ly8gSG9yaXpvbnRhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgotCi0gICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIHZhcmlhYmxlIGxlbmdodCBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KLSAgICAgIAotICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCi0gICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIHRoZSBkZWNvZGVkIHN5bWJvbCBpcyBhbiBpbnZhbGllZCBzeW1ib2wgCi0gICAgICAgCi0gICAgICAgU1VCICAgICAgICAgICAgIG12SG9yRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCwjMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JSZXNpZHVhbD0xCi0gICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQotICAgICAgIFRFUU5FICAgICAgICAgICBtdkhvckRhdGEsIzAKLSAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZIb3JEYXRhPTAgZGlmZk1WZHg9bXZIb3JEYXRhICAgICAgICAgCi0gICAgICAgQkVRICAgICAgICAgICAgIFZlcnRpY2FsRGF0YQotICAgICAgIAotICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQotICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdkhvclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBnZXQgbXZIb3JSZXNpZHVhbCBmcm9tIGJpdHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbXZIb3JEYXRhIT0wICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgbXZIb3JEYXRhLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIG12SG9yRGF0YSxtdkhvckRhdGEsIzAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1hYnMobXZIb3JEYXRhKQotICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLG12SG9yUmVzaWR1YWwsZmNvZGVGb3J3YXJkCi0gICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSxmY29kZUZvcndhcmQsbXZIb3JSZXNpZHVhbCA7Ly8gZGlmZk1WZHg9YWJzKG12SG9yRGF0YSkqZmNvZGVGb3J3YXJkK212SG9yUmVzaWR1YWwtZmNvZGVGb3J3YXJkCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMxCi0gICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMwCi0gICAgICAgCi0gICAgICAgOy8vIFZlcnRpY2FsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCi0KLVZlcnRpY2FsRGF0YQotCi0gICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSBkaWZmTVZkeCBvbiBzdGFjawotICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWRpbmcgdGhlIGFkZHJlc3Mgb2Ygb3B0aW1pemVkIFZMQyB0YWJsZXMKLQotICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRgotICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyBWTEMgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCi0gICAgICAgCi0gICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKLSAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgYW4gSW52YWxpZWQgU3ltYm9sIG9jY3VycwotICAgICAgIAotICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdlZlckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsIzEgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKLSAgICAgICBURVFORSAgICAgICAgICAgbXZWZXJEYXRhLCMwCi0gICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR5ID0gbXZWZXJEYXRhIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12VmVyRGF0YT0wCi0gICAgICAgQkVRICAgICAgICAgICAgIEZpbmRNVlByZWQKLQotICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQotICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdlZlclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBHZXQgbXZWZXJSZXNpZHVhbCBmcm9tIGJpdCBzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG1uVmVyRGF0YSE9MAotICAgICAgICAgICAgIAotCi0gICAgICAgQ01QICAgICAgICAgICAgIG12VmVyRGF0YSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICBtdlZlckRhdGEsbXZWZXJEYXRhLCMwCi0gICAgICAgU1VCICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsbXZWZXJSZXNpZHVhbCxmY29kZUZvcndhcmQKLSAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhLGZjb2RlRm9yd2FyZCxtdlZlclJlc2lkdWFsIDsvLyBkaWZmTVZkeT1hYnMobXZWZXJEYXRhKSpmY29kZUZvcndhcmQrbXZWZXJSZXNpZHVhbC1mY29kZUZvcndhcmQKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzEKLSAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzAKLQotICAgICAgIDsvL0NhbGxpbmcgdGhlIEZ1bmN0aW9uIG9teFZDTTRQMl9GaW5kTVZwcmVkCi0gICAgICAgIAotRmluZE1WUHJlZAotCi0gICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR5LHBkaWZmTVZkeQotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHBEc3RNVkN1ck1CLEJsa0NvdW50LExTTCAjMiAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQotICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBwRHN0TVZDdXJNQiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wIG9uIHN0YWNrIGZvciBwYXNzaW5nIGFzIGFuIGFyZ3VtZW50IHRvIEZpbmRNVlByZWQKLSAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCwjMAotICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBEc3RNVlByZWRNRSAgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzIHBEc3RNVlByZWRNRT1OVUxMIGFzIGFuIGFyZ3VtZW50ICAgICAgICAgCi0gICAgICAgTV9TVFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3NzIEJsa0NvdW50IGFzIEFyZ3VtZW50IHRocm91Z2ggc3RhY2sKLQotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLHBTcmNNVkxlZnRNQiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wIChSTiAxKT1wU3JjTVZMZWZ0TUIKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2sKLSAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WTGVmdE1CLHBTcmNNVlVwcGVyTUIgICAgICAgICAgICA7Ly8gcFNyY01WTGVmdE1CICggUk4gMikgPSBwU3JjTVZVcHBlck1CCi0gICAgICAgTU9WICAgICAgICAgICAgIHBwQml0U3RyZWFtLHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgOy8vIHBwQml0U3RyZWFtICAoIFJOIDApID0gcERzdE1WQ3VyTUIKLSAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WVXBwZXJNQixwU3JjTVZVcHBlclJpZ2h0TUIgICAgICA7Ly8gcFNyY01WVXBwZXJNQiggUk4gMykgPSBwU3JjTVZVcHBlclJpZ2h0TUIgICAgICAKLSAgICAgICBCTCAgICAgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gc3Vicm91dGluZSBvbXhWQ000UDJfRmluZE1WcHJlZAotCi0gICAgICAgOy8vIFN0b3JlIEhvcml6b250YWwgTW90aW9uIFZlY3RvcgotICAgICAKLSAgICAgICBNX0xEUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBCbGtDb3VudCBmcm9tIHN0YWNrCi0gICAgICAgTV9MRFIgICAgICAgICAgIEhpZ2gscEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9MzIqc2NhbGVGYWN0b3IKLSAgICAgICBMU0wgICAgICAgICAgICAgdGVtcDEsQmxrQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1CbGtDb3VudCo0Ci0gICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHgKLSAgICAgICAKLSAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KLSAgICAgICAKLSAgICAgICAKLSAgICAgICBSU0IgICAgICAgICAgICAgTG93LEhpZ2gsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG93ID0gLTMyKnNjYWxlRmFjdG9yCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4PXBEc3RNVkN1ck1CW0Jsa0NvdW50XStkaWZmTVZkeAotICAgICAgIEFERCAgICAgICAgICAgICBSYW5nZSxIaWdoLEhpZ2ggICAgICAgICAgICAgICAgICAgICAgIDsvLyBSYW5nZT02NCpTY2FsZUZhY3RvcgotICAgICAgIFNVQiAgICAgICAgICAgICBIaWdoLEhpZ2gsIzEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPSAzMipzY2FsZUZhY3Rvci0xCi0KLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHg8TG93ICAgICAgICAgIAotICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeCs9UmFuZ2UKLSAgICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4ID4gSGlnaCBkaWZmTVZkeC09UmFuZ2UKLSAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXQotCi0gICAgICAgOy8vIFN0b3JlIFZlcnRpY2FsCi0KLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsdGVtcDEsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9NCpCbGtDb3VudCsyCi0gICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeSAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHkKLSAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0uZGlmZk1WZHkKLSAgICAgICBBREQgICAgICAgICAgICAgQmxrQ291bnQsQmxrQ291bnQsIzEgICAgICAgICAgICAgICAgICA7Ly8gQmxrQ291bnQ9QmxrQ291bnQrMQotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cKLSAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHk8TG93ICBkaWZmTVZkeSs9UmFuZ2UgICAgICAgICAgICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2gKLSAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHkgPiBIaWdoIGRpZmZNVmR5LT1SYW5nZQotICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgIAotICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBCbGtDb3VudCxDb3VudAotICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgotICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCi0KLSAgICAgICBCTFQgICAgICAgICAgICAgTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgQmxrQ291bnQ8Q291bnQgQ29udGludWUgdGhlIExvb3AKLQotCi0gICAgICAgOy8vIElmIE1CVHlwZT1PTVhfVkNfSU5URVIgb3IgTUJ0eXBlPU9NWF9WQ19JTlRFUl9RIGNvcHkgcERzdE1WQ3VyTUJbMF0gdG8KLSAgICAgICA7Ly8gcERzdE1WQ3VyTUJbMV0sIHBEc3RNVkN1ck1CWzJdLCBwRHN0TVZDdXJNQlszXSAKLQotICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjawotCi0gICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgTERSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CXQotICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzRdCi0gICAgICAgCi0gICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM4XQotICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjMTJdCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKLSAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0gICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hpbmcgdGhlIE1hY3JvICAgICAgIAotCi0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKLSAKLUV4aXRFcnJvcgotCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0Ci0gICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0Ci0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKLQotRXhpdE9LICAgICAgICAgICAgIAotCi0gICAgICAgTV9FTkQKLSAgICAgICBFTkRJRgotICAgICAgIEVORAotCi0KLSAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZkZmU0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXIgY29kZWQgYmxvY2suCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLTsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi07ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLTsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKLTsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCi07ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCi07ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCi07ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQotOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAotOyAqCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0gICAgIAotICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCi0KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIGNsYXNzaWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi0KLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLXNob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgdGhlIFZMQyxaaWd6YWcsTE1BWCBhbmQgUk1BWCB0YWJsZXMKLSAgICAgCi0gICAgICAgIAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIscjEyCi0KLSAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgICAgOy8vIExvYWQgemlnemFnIHRhYmxlCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sgdG8gcGFzcyBhcyBhcmd1bWVudCB0byB1bnNhZmUgZnVuY3Rpb24KLSAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJWbGNMMEwxICAgICAgICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgVkxDIHRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBvcHRpbWl6ZWQgVkxDIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBMTUFYIFRhYmxlcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFSTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgUk1BWCBUYWJsZXMKLSAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHNldCBzdGFydD0wCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSBSTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICAgIDsvLyBjYWxsIFVuc2FmZSBGdW5jdGlvbiBmb3IgVkxDIFppZ3phZyBEZWNvZGluZwotICAgICAgICAgCi0gICAgICAgCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjYzViNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLTsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgotOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKLTsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KLTsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKLTsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCi07ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Ci07ICoKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1QcmVkRGlyICAgICAgICAgICAgICBSTiAzCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLQotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKLSAgICAgCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyxyMTIKLQotICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gSW5wdXQgQXJndW1lbnQgb24gc3RhY2sgICAgICAgICAgIAotCi0gICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBMb2FkIEFkZHJlc3Mgb2YgdGhlIFppZ3phZyB0YWJsZSAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgIDsvLyBMb2FkaW5nIERpZmZlcmVudCB0eXBlIG9mIHppZ3phZyB0YWJsZXMgYmFzZWQgb24gUHJlZERpcgotICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFppZ3phZyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIFRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgVkxDIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggVGFibGUgYWRkcmVzcyBvbiBTdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCi0gICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0PTAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgICAgICAgCi0KLSAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgIDsvLyBnZXQgdGhlIElucHV0IEFyZ3VtZW50IGZyb20gc3RhY2sKLQotICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICA7Ly8gQ2FsbCBVbnNhZmUgRnVuY3Rpb24KLQotCi0KLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmVkODAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLTsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi07ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLTsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKLTsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCi07ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCi07ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCi07ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQotOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAotOyAqCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgIAotICAgICAgCi0KLQotICAgICAgSUYgQ29ydGV4QTgKLQotICAgICAKLSAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgotCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0Ci0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBDTGFzc2ljYWwsIEhvcml6b250YWwsIFZlcnRpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCAgOy8vIENvbnRhaW5zIE9wdGltaXplZCBEQ0x1bWEgYW5kIERDQ2hyb21hIEluZGV4IHRhYmxlIEVudHJpZXMKLSAgICAgICAgCi0KLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1QcmVkRGlyICAgICAgICAgICAgICBSTiAzCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi12aWRlb0NvbXAgICAgICAgICAgICBSTiA1Ci07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wRENMdW1hQ2hyb21hSW5kZXggICBSTiA0Ci1wRENDaHJvbWFJbmRleCAgICAgICBSTiA3Ci1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci1EQ1ZhbHVlU2l6ZSAgICAgICAgICBSTiA2Ci1wb3dPZlNpemUgICAgICAgICAgICBSTiA3Ci10ZW1wMSAgICAgICAgICAgICAgICBSTiA1Ci0KLQotOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLVJCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKLVJCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKLVJCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCi0KLVQxICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICBSTiAxMgotRENWYWwgICAgICAgICAgICAgICAgUk4gMTQKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCi0gICAgIAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBEQ0NvZWZmLDQKLSAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLHIxMgotCi0gICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrICAKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uc3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sKLQotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBEQyBDb2VmZmljaWVudAotCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LCA9YXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4IDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgZm9yIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UKLQotICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRzdHJlYW0gTWFjcm8KLQotICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAotICAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKLSAgICAgICAgQUREICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCxwRENMdW1hQ2hyb21hSW5kZXgsdmlkZW9Db21wLCBMU0wgIzYgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCi0gICAgCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZMRCAgICAgICAgRENWYWx1ZVNpemUsVDEsVDIscERDTHVtYUNocm9tYUluZGV4LDQsMiAgICAgICAgICAgICAgICAgICAgOy8vIFZMQyBEZWNvZGUgdXNpbmcgb3B0aW1pemVkIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UgVkxDIFRhYmxlCi0KLSAgICAKLSAgICAgICAKLQotRGVjb2RlREMKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMxMiAgICAgCi0gICAgICAgIEJHVCAgICAgICAgICAgICBFeGl0RXJyb3IKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMAotICAgICAgICBNT1ZFUSAgICAgICAgICAgRENWYWwsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGlzIHplcm8gdGhlbiBEQyBjb2VmZiA9MAotICAgICAgICBCRVEgICAgICAgICAgICAgQUNEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBwZXJmb3JtIEFDIENvZWZmIERlY29kaW5nCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZSRUFEMTYgICAgRENWYWwsRENWYWx1ZVNpemUsVDEsVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBEQyBWYWx1ZSBGcm9tIEJpdCBzdHJlYW0KLSAgICAgICAgIAotCi0gICAgICAgIE1PViAgICAgICAgICAgICBwb3dPZlNpemUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTFNMICAgICAgICAgICAgIHBvd09mU2l6ZSxEQ1ZhbHVlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb3dPZlNpemU9cG93KDIsRENWYWx1ZVNpemUpCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbCxwb3dPZlNpemUsTFNSICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBEQ1ZhbCB3aXRoIHBvd09mU2l6ZS8yIAotICAgICAgICBBRERMVCAgICAgICAgICAgRENWYWwsRENWYWwsIzEKLSAgICAgICAgU1VCTFQgICAgICAgICAgIERDVmFsLERDVmFsLHBvd09mU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBMZXNzdGhhbiBwb3dPZlNpemUvMiBEQ1ZhbD1EQ1ZhbC1wb3dPZlNpemUrMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgRENWYWw9IGZldGNoYml0cyBmcm9tIGJpdCBzdHJlYW0KLQotQ2hlY2tEQ1ZhbHVlU2l6ZQotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBncmVhdGVyIHRoYW4gOCBjaGVjayBtYXJrZXIgYml0Ci0KLSAgICAgICAgQkxFICAgICAgICAgICAgIEFDRGVjb2RlCi0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKLSAgICAgICAgVEVRICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBNYXJrZXIgYml0IGlzIHplcm8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBEZWNvZGUgQUMgQ29lZmZpY2llbnQKLQotQUNEZWNvZGUKLQotICAgICAgICBNX1NUUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgRGVjb2RlZCBEQyBDb2VmZiBvbiBTdGFjawotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBzdHJlYW0gTWFjcm8KLSAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgICAgIDsvLyBMb2FkIFppZ3phZyB0YWxiZSBhZGRyZXNzICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICAgICAgIDsvLyBNb2RpZnkgdGhlIFppZ3phZyB0YWJsZSBhZHJlc3MgYmFzZWQgb24gUHJlZERpciAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgV2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xIEVudHJpZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIE9wdGltaXplZCBWTEMgVGFibGUgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0ID0xICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIG9uIFN0YWNrCi0gICAgICAgIAotICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgSW5wdXQgQXJndW1lbnQgRnJvbSBTdGFjawotICAgICAgICAKLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICAgICA7Ly8gQ2FsbCB0aGUgVW5zYWZlIEZ1bmN0aW9uCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCB0aGUgRGVjb2RlZCBEQyBWYWx1ZSBGcm9tIFN0YWNrCi0gICAgICAgIFNUUkggICAgICAgICAgICBEQ1ZhbCxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgREMgVmFsdWUgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKLSAgICAgICAgCi0gICAgICAgICAgICAgIAotCi1FeGl0RXJyb3IKLSAKLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgU3RyZWFtIE1hY3JvIGluIGNhc2Ugb2YgYW4gRXJyb3IKLSAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIAotRXhpdE9LCi0gICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDQxMjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCi07Ly8KLSAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycwotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIElOQ0xVREUgYXJtVkNDT01NX3MuaAotCi0gICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgTV9UQUJMRSBhcm1WQ000UDJfcEJsa0luZGV4VGFibGUKLSAgICAgICAgRENEICBPTVhWQ0JsazAsIE9NWFZDQmxrMQotICAgICAgICBEQ0QgIE9NWFZDQmxrMiwgT01YVkNCbGszCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotcFNyY01WQ3VyTUIgICAgICAgICAgICBSTiAwCi1wU3JjQ2FuZE1WMSAgICAgICAgICAgIFJOIDEKLXBTcmNDYW5kTVYyICAgICAgICAgICAgUk4gMgotcFNyY0NhbmRNVjMgICAgICAgICAgICBSTiAzCi1wRHN0TVZQcmVkICAgICAgICAgICAgIFJOIDQKLXBEc3RNVlByZWRNRSAgICAgICAgICAgUk4gNQotaUJsayAgICAgICAgICAgICAgICAgICBSTiA2Ci0KLXBUYWJsZSAgICAgICAgICAgICAgICAgUk4gNAotQ2FuZE1WICAgICAgICAgICAgICAgICBSTiAxMgotCi1wQ2FuZE1WMSAgICAgICAgICAgICAgIFJOIDcKLXBDYW5kTVYyICAgICAgICAgICAgICAgUk4gOAotcENhbmRNVjMgICAgICAgICAgICAgICBSTiA5Ci0KLUNhbmRNVjFkeCAgICAgICAgICAgICAgUk4gMCAKLUNhbmRNVjFkeSAgICAgICAgICAgICAgUk4gMSAKLUNhbmRNVjJkeCAgICAgICAgICAgICAgUk4gMgotQ2FuZE1WMmR5ICAgICAgICAgICAgICBSTiAzCi1DYW5kTVYzZHggICAgICAgICAgICAgIFJOIDEwCi1DYW5kTVYzZHkgICAgICAgICAgICAgIFJOIDExCi0KLXRlbXAgICAgICAgICAgICAgICAgICAgUk4gMTQKLQotemVybyAgICAgICAgICAgICAgICAgICBSTiAxNAotcmV0dXJuICAgICAgICAgICAgICAgICBSTiAwCi0gICAgICAgIAotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1haW4gcm91dGluZQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAKLQotICAgICAgICBNX0FMTE9DNCBNViwgNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlciAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRmluZE1WcHJlZCwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHBwRHN0TVZQcmVkLCAgNAotICAgICAgICBNX0FSRyAgIHBwRHN0TVZQcmVkTUUsIDQKLSAgICAgICAgTV9BUkcgICBCbGssIDQKLSAgICAgICAgCi0gICAgICAgIE1fQURSIENhbmRNViwgTVYKLSAgICAgICAgTU9WICAgemVybywgIzAKLSAgICAgICAgTV9MRFIgaUJsaywgQmxrCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZQotICAgICAgICA7Ly8gdG8gYmUgdXNlZCBpZiBwU3JjQ2FuZE1WWzF8MnwzXSA9PSBOVUxMCi0gICAgICAgIE1PViAgIHBDYW5kTVYxLCBDYW5kTVYKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIENhbmRNVgotICAgICAgICBNT1YgICBwQ2FuZE1WMywgQ2FuZE1WCi0gICAgCi0gICAgICAgIFNUUiAgIHplcm8sIFtDYW5kTVZdCi0KLSAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBibGsgbnVtYmVyCi0gICAgICAgIE1fU1dJVENIIGlCbGsKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGswICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazEgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMiAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGszICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICAKLU9NWFZDQmxrMAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjNAotICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzgKLQotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMSwgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYyCi0gICAgICAgIE1PVkVRIHBDYW5kTVYxLCBwQ2FuZE1WMgotICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjIsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYxLCBwQ2FuZE1WMwotICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjMKLSAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCi0gICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQotICAgICAgICAKLSAgICAgICAgQiAgICAgQmxrRW5kCi0gICAgCi1PTVhWQ0JsazEKLSAgICAgICAgTU9WICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4Ci0gICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjMTIKLSAgICAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQotICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKLSAgICAgICAgICAgIAotICAgICAgICBCICAgICBCbGtFbmQKLQotT01YVkNCbGsyCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAotICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKLSAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAotICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICMxMgotICAgICAgICBCICAgICBCbGtFbmQKLQotT01YVkNCbGszCi0gICAgICAgIEFERCAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQiwgIzgKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCi0gICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKLSAgICAKLUJsa0VuZAotCi0gICAgICAgIDsvLyBVc2luZyB0aGUgdHJhbnNwZXJhbmN5IGluZm8sIHplcm8KLSAgICAgICAgOy8vIG91dCB0aGUgY2FuZGlkYXRlIE1WIGlmIG5lY2Nlc2FyeQotICAgICAgICBMRFJTSCBDYW5kTVYxZHgsIFtwQ2FuZE1WMV0sICMyCi0gICAgICAgIExEUlNIIENhbmRNVjJkeCwgW3BDYW5kTVYyXSwgIzIKLSAgICAgICAgTERSU0ggQ2FuZE1WM2R4LCBbcENhbmRNVjNdLCAjMgotICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiBwRHN0TVZQcmVkTUUsIHBwRHN0TVZQcmVkTUUKLQotICAgICAgICBMRFJTSCBDYW5kTVYxZHksIFtwQ2FuZE1WMV0KLSAgICAgICAgTERSU0ggQ2FuZE1WMmR5LCBbcENhbmRNVjJdCi0gICAgICAgIExEUlNIIENhbmRNVjNkeSwgW3BDYW5kTVYzXQotCi0gICAgICAgIENNUCBwRHN0TVZQcmVkTUUsICMwICAgICAgICAKLQotICAgICAgICA7Ly8gU3RvcmUgdGhlIGNhbmRpZGF0ZSBNVidzIGludG8gdGhlIHBEc3RNVlByZWRNRSwgCi0gICAgICAgIDsvLyB0aGVzZSBjYW4gYmUgdXNlZCBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgCi0KLSAgICAgICAgU1RSSE5FIENhbmRNVjFkeCwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYxZHksIFtwRHN0TVZQcmVkTUVdLCAjMiAgICAgICAgCi0gICAgICAgIFNUUkhORSBDYW5kTVYyZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WMmR5LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjNkeCwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYzZHksIFtwRHN0TVZQcmVkTUVdCi0gICAgICAgICAgIAotICAgICAgICA7IEZpbmQgdGhlIG1lZGlhbiBvZiB0aGUgMyBjYW5kaWRhdGUgTVYncwotICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR4LCBDYW5kTVYyZHgsIENhbmRNVjNkeCwgdGVtcAotCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSIHBEc3RNVlByZWQsIHBwRHN0TVZQcmVkCi0KLSAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeSwgQ2FuZE1WMmR5LCBDYW5kTVYzZHksIHRlbXAKLSAgICAKLSAgICAgICAgU1RSSCBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkXSwgIzIKLSAgICAgICAgU1RSSCBDYW5kTVYzZHksIFtwRHN0TVZQcmVkXQotCi0gICAgICAgIE1PViByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgCi0gICAgICAgIE1fRU5ECi0gICAgRU5ESUYgOy8vIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYjkyNWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsKLTsvLwotICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cwotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgICAgSU5DTFVERSBhcm1DT01NX0lEQ1Rfcy5oICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1DT01NX0lEQ1RQcmVTY2FsZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEZ1bmN0aW9uIHByb3RvdHlwZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICAgICBPTVhSZXN1bHQKLSAgICAgICAgOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsayhjb25zdCBPTVhfUzE2KiBwU3JjLAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2KiBwRHN0KQotICAgICAgICA7Ly8gICAgCi0gICAgICAgIAotICAgIElGIENvcnRleEE4Ci0gICAgICAgIE1fQUxMT0M0ICBwcERlc3QsIDQKLSAgICAgICAgTV9BTExPQzQgIHBTdHJpZGUsIDQKLSAgICAgICAgTV9BTExPQzggIHBCbGssIDIqOCo4Ci0gICAgRU5ESUYKLSAgICAKLSAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9JRENUOHg4YmxrLCByMTEsIGQxNQotICAgIEVORElGCi0gICAgICAgIAotICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotcERzdCAgICAgICAgICAgIFJOIDEKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotUmVzdWx0ICAgICAgICAgIFJOIDAKLQotOy8vIFByb3RvdHlwZSBmb3IgbWFjcm8gTV9JRENUCi07Ly8gcFNyYyAgICAgICAgICAgIFJOIDAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKLTsvLyBTdHJpZGUgICAgICAgICAgUk4gMSAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcwotOy8vIHBEZXN0ICAgICAgICAgICBSTiAyICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKLTsvLyBwU2NhbGUgICAgICAgICAgUk4gMyAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQotCi1wU3JjICAgIFJOIDAgICAgCi1TdHJpZGUgIFJOIDEgICAgCi1wRGVzdCAgIFJOIDIgICAgCi1wU2NhbGUgIFJOIDMgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBEZXN0LCBwRHN0Ci0gICAgICAgIExEUiAgICAgICAgIHBTY2FsZSwgPWFybUNPTU1fSURDVFByZVNjYWxlICAgICAgICAKLSAgICAgICAgTV9JRENUICAgICAgczksIHMxNiwgMTYgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgUmVzdWx0LCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORCAgICAgICAKLSAgICBFTkRJRiAgCi0gICAgICAgIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzFhZWMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8KLTsvLwotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0gICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi0KLSAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBBUk0xMTM2SlMgaW1wbGVtZW50YXRpb24KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIENvcnRleEE4IGltcGxlbWVudGF0aW9uCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgSUYgIENvcnRleEE4Ci07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gTUFDUk8gREVGSU5JVElPTlMKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIERvZXMgaW50ZXJwb2xhdGlvbiBmb3IgdGhlIGNhc2Ugb2YgIkludGVnZXJQaXhlbCIgcHJlZGljdFR5cGUuIEJvdGggCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkLiBKdXN0IGNvcGllcyBhIGJsb2NrIGZyb20gcFNyYyB0byBwRHN0Ci0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6IE5vbmUKLSAgICA7Ly8gT3V0cHV0czogTm9uZQotCi0gICAgTUFDUk8gCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsCi1DYXNlSW50ZWdlclBpeGVsX1JuZDAKLUNhc2VJbnRlZ2VyUGl4ZWxfUm5kMQotCi0gICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3cxLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzMsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c0LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c3LCBbcFNyY10sIHNyY1N0ZXAKLQotICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzIsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzUsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCi0KLSAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIERvZXMgaW50ZXJwb2xhdGlvbiBmb3IgdGhlIGNhc2Ugb2YgIkhhbGZQaXhlbFgiIHByZWRpY3RUeXBlLiBUaGUgdHdvIAotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgcGFyYW1ldGVyICIkcm5kVmFsIi4gQXZlcmFnZXMgYmV0d2VlbgotICAgIDsvLyBhIHBpeGVsIGFuZCBwaXhlbCByaWdodCB0byBpdCwgcm91bmRpbmcgaXQgYmFzZWQgb24gJHJuZFZhbC4gVGhlIAotICAgIDsvLyByb3VuZGluZyBpcyBpbXBsZW1lbnRlZCBieSB1c2luZyBvcENvZGUgc3dpdGNoaW5nIGJldHdlZW4gIlZSSEFERCIgYW5kIAotICAgIDsvLyAiVkhBREQiIGluc3RydWN0aW9ucy4KLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICRybmRWYWwKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czogCi0gICAgOy8vICAgICAkcm5kVmFsOiAwIGZvciByb3VuZGluZyBhbmQgMSBmb3Igbm8gcm91bmRpbmcKLSAgICA7Ly8gT3V0cHV0czogTm9uZQotCi0gICAgTUFDUk8gCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAkcm5kVmFsCi0KLSAgICBMQ0xTIE1fVkhBRERSCi0gICAgSUYgJHJuZFZhbCA9IDAKLU1fVkhBRERSIFNFVFMgIlZSSEFERCIKLSAgICBFTFNFCi1NX1ZIQUREUiBTRVRTICJWSEFERCIKLSAgICBFTkRJRgotCi1DYXNlSGFsZlBpeGVsWF9SbmQkcm5kVmFsCi0KLSAgICBWTEQxICAgICAgICB7ZFJvdzAsIGRSb3cwU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3cwU2hmdCwgZFJvdzAsIGRSb3cwU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzEsIGRSb3cxU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3cxU2hmdCwgZFJvdzEsIGRSb3cxU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzIsIGRSb3cyU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3cyU2hmdCwgZFJvdzIsIGRSb3cyU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzMsIGRSb3czU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3czU2hmdCwgZFJvdzMsIGRSb3czU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzQsIGRSb3c0U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c0U2hmdCwgZFJvdzQsIGRSb3c0U2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzUsIGRSb3c1U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c1U2hmdCwgZFJvdzUsIGRSb3c1U2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzYsIGRSb3c2U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c2U2hmdCwgZFJvdzYsIGRSb3c2U2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzcsIGRSb3c3U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c3U2hmdCwgZFJvdzcsIGRSb3c3U2hmdCwgIzEKLSAgICAkTV9WSEFERFIgICBkUm93MCwgZFJvdzAsIGRSb3cwU2hmdAotICAgICRNX1ZIQUREUiAgIGRSb3cxLCBkUm93MSwgZFJvdzFTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3cyLCBkUm93MiwgZFJvdzJTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3czLCBkUm93MywgZFJvdzNTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzIsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c0LCBkUm93NCwgZFJvdzRTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c1LCBkUm93NSwgZFJvdzVTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c2LCBkUm93NiwgZFJvdzZTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzUsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c3LCBkUm93NywgZFJvdzdTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAKLSAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIERvZXMgaW50ZXJwb2xhdGlvbiBmb3IgdGhlIGNhc2Ugb2YgIkhhbGZQaXhlbFkiIHByZWRpY3RUeXBlLiBUaGUgdHdvIAotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgcGFyYW1ldGVyICIkcm5kVmFsIi4gQXZlcmFnZXMgYmV0d2VlbgotICAgIDsvLyBhIHBpeGVsIGFuZCBwaXhlbCBiZWxvdyBpdCwgcm91bmRpbmcgaXQgYmFzZWQgb24gJHJuZFZhbC4gVGhlIAotICAgIDsvLyByb3VuZGluZyBpcyBpbXBsZW1lbnRlZCBieSB1c2luZyBvcENvZGUgc3dpdGNoaW5nIGJldHdlZW4gIlZSSEFERCIgYW5kIAotICAgIDsvLyAiVkhBREQiIGluc3RydWN0aW9ucy4KLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICRybmRWYWwKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czogCi0gICAgOy8vICAgICAkcm5kVmFsOiAwIGZvciByb3VuZGluZyBhbmQgMSBmb3Igbm8gcm91bmRpbmcKLSAgICA7Ly8gT3V0cHV0czogTm9uZQotCi0gICAgTUFDUk8gCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAkcm5kVmFsCi0KLSAgICBMQ0xTIE1fVkhBRERSCi0gICAgSUYgJHJuZFZhbCA9IDAKLU1fVkhBRERSIFNFVFMgIlZSSEFERCIKLSAgICBFTFNFCi1NX1ZIQUREUiBTRVRTICJWSEFERCIKLSAgICBFTkRJRgotCi1DYXNlSGFsZlBpeGVsWV9SbmQkcm5kVmFsCi0gICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3cxLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzMsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c0LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c3LCBbcFNyY10sIHNyY1N0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MCwgZFJvdzAsIGRSb3cxCi0gICAgVkxEMSAgICAgICAgZFJvdzgsIFtwU3JjXSwgc3JjU3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3cxLCBkUm93MSwgZFJvdzIKLSAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzIsIGRSb3cyLCBkUm93MwotICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MywgZFJvdzMsIGRSb3c0Ci0gICAgVlNUMSAgICAgICAgZFJvdzIsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c0LCBkUm93NCwgZFJvdzUKLSAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzUsIGRSb3c1LCBkUm93NgotICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NiwgZFJvdzYsIGRSb3c3Ci0gICAgVlNUMSAgICAgICAgZFJvdzUsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c3LCBkUm93NywgZFJvdzgKLSAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAotCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJJbnRlZ2VyUGl4ZWwiIHByZWRpY3RUeXBlLiBCb3RoIAotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZC4gCi0gICAgOy8vIFR5cGljYWwgY29tcHV0YXRpb24gZm9yIGEgcm93IGdvZXMgbGlrZSB0aGlzCi0gICAgOy8vICAgICAxLiBWTEQxICAgICAgICB7ZFJvdzAsIGRSb3cwU2hmdH0sIFtwU3JjXSwgc3JjU3RlcCA7Ly8gTG9hZCB0aGUgcm93IGFuZCBuZXh0IDggYnl0ZXMKLSAgICA7Ly8gICAgIDIuIFZFWFQgICAgICAgIGRSb3cwU2hmdCwgZFJvdzAsIGRSb3cwU2hmdCwgIzEgICAgIDsvLyBHZW5lcmF0ZSB0aGUgc2hpZnRlZCByb3cKLSAgICA7Ly8gICAgIDMuIFZBRERMICAgICAgIHFTdW0wLCBkUm93MCwgZFJvdzBTaGZ0ICAgICAgICAgICAgIDsvLyBHZW5lcmF0ZSB0aGUgc3VtIG9mIHJvdyBhbmQgc2hpZnRlZCByb3cKLSAgICA7Ly8gICAgIDUuIFZBREQgICAgICAgIHFTdW0wLCBxU3VtMCwgcVN1bTEgICAgICAgICAgICAgICAgIDsvLyBBZGQgdG8gdGhlIHN1bSBvZiBuZXh0IHJvdyAob2RkIHJvdyBzdW0gaGFzIHJvdW5kaW5nIHZhbHVlIGFkZGVkIHRvIGl0KQotICAgIDsvLyAgICAgNi4gVlNIUk4gICAgICAgZFJvdzAsIHFTdW0wLCAjMiAgICAgICAgICAgICAgICAgICAgOy8vIERpdmlkZSBieSA0Ci0gICAgOy8vICAgICA3LiBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwICAgICAgICAgICA7Ly8gU3RvcmUKLSAgICA7Ly8gT2RkIHJvd3MgdW5kZXJnbyBmb2xsb3dpbmcgY29tcHV0YXRpb24gYWZ0ZXIgc3RlcCAzCi0gICAgOy8vICAgICA0LiBWQUREICAgICAgICBxU3VtMSwgcVN1bTEsIHFSb3VuZAotICAgIDsvLyBUaGlzIHNhdmVzIGZvciBhZGRpbmcgcm91bmRpbmcgdmFsdWUgdG8gZWFjaCBmaW5hbCBzdW0gKG92ZXJhbGwgc2F2ZXMgNCAKLSAgICA7Ly8gaW5zdHJ1Y3Rpb25zKS4KLSAgICA7Ly8gVGhlcmUgaXMgcmV1c2Ugb2YgcmVnaXN0ZXJzIGZvciBxU3VtNiwgcVN1bTcgJiBxU3VtOC4gT3ZlcmFsbCBzY2hlZHVsaW5nIHRha2VzIAotICAgIDsvLyBjYXJlIG9mIHRoaXMgYW5kIGFsc28gbWluaW1pemVzIHN0YWxscy4gUm91bmRpbmcgdmFsdWUgd2FzIG1vZGlmaWVkIGluIAotICAgIDsvLyBBUk0gcmVnaXN0ZXIgcm5kVmFsIChvcmlnaW5hbGx5IHVzZWQgZm9yIHJvdW5kaW5nIGZsYWcpIGJlZm9yZSB0aGUgc3dpdGNoLgotICAgIDsvLyBJdCBpcyB0aGVuIHBvcHVsYXRlZCBpbnRvIGFsbCBsYW5lcyBpbiB0aGlzIG1hY3JvLiBObyBicmFuY2hpbmcgb3V0IHRvIAotICAgIDsvLyBsYWJlbCAiU3dpdGNoUHJlZGljdFR5cGVFbmQiIGlzIHJlcXVpcmVkIGluIHRoZSBlbmQgb2YgdGhlIG1hY3JvIGFzIHRoZXNlIAotICAgIDsvLyBhcmUgdGhlIGxhc3Qgb2Ygc3dpdGNoIGNhc2VzLgotICAgIDsvLyAKLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWQotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOiBOb25lCi0gICAgOy8vIE91dHB1dHM6IE5vbmUKLQotICAgIE1BQ1JPIAotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZCi0KLUNhc2VIYWxmUGl4ZWxYWV9SbmQwCi1DYXNlSGFsZlBpeGVsWFlfUm5kMQotICAgIFZMRDEgICAgICAgIHtkUm93MCwgZFJvdzBTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkRVUCAgICAgICAgcVJvdW5kLCBybmRWYWwKLSAgICBWTEQxICAgICAgICB7ZFJvdzEsIGRSb3cxU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3cwU2hmdCwgZFJvdzAsIGRSb3cwU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzIsIGRSb3cyU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3cxU2hmdCwgZFJvdzEsIGRSb3cxU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzMsIGRSb3czU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3cyU2hmdCwgZFJvdzIsIGRSb3cyU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzQsIGRSb3c0U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZBRERMICAgICAgIHFTdW0wLCBkUm93MCwgZFJvdzBTaGZ0Ci0gICAgVkxEMSAgICAgICAge2RSb3c1LCBkUm93NVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWQURETCAgICAgICBxU3VtMSwgZFJvdzEsIGRSb3cxU2hmdAotICAgIFZMRDEgICAgICAgIHtkUm93NiwgZFJvdzZTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzNTaGZ0LCBkUm93MywgZFJvdzNTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93NywgZFJvdzdTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzRTaGZ0LCBkUm93NCwgZFJvdzRTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93OCwgZFJvdzhTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkFERCAgICAgICAgcVN1bTEsIHFTdW0xLCBxUm91bmQKLSAgICBWQURETCAgICAgICBxU3VtMiwgZFJvdzIsIGRSb3cyU2hmdAotICAgIFZFWFQgICAgICAgIGRSb3c1U2hmdCwgZFJvdzUsIGRSb3c1U2hmdCwgIzEKLSAgICBWQUREICAgICAgICBxU3VtMCwgcVN1bTAsIHFTdW0xCi0gICAgVkFEREwgICAgICAgcVN1bTMsIGRSb3czLCBkUm93M1NoZnQKLSAgICBWRVhUICAgICAgICBkUm93NlNoZnQsIGRSb3c2LCBkUm93NlNoZnQsICMxCi0gICAgVkFERCAgICAgICAgcVN1bTEsIHFTdW0xLCBxU3VtMgotICAgIFZTSFJOICAgICAgIGRSb3cwLCBxU3VtMCwgIzIKLSAgICBWQURETCAgICAgICBxU3VtNCwgZFJvdzQsIGRSb3c0U2hmdAotICAgIFZTSFJOICAgICAgIGRSb3cxLCBxU3VtMSwgIzIKLSAgICBWQUREICAgICAgICBxU3VtMywgcVN1bTMsIHFSb3VuZAotICAgIFZBRERMICAgICAgIHFTdW01LCBkUm93NSwgZFJvdzVTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c3U2hmdCwgZFJvdzcsIGRSb3c3U2hmdCwgIzEKLSAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzhTaGZ0LCBkUm93OCwgZFJvdzhTaGZ0LCAjMQotICAgIFZBREQgICAgICAgIHFTdW01LCBxU3VtNSwgcVJvdW5kCi0gICAgVkFERCAgICAgICAgcVN1bTIsIHFTdW0yLCBxU3VtMwotICAgIFZBREQgICAgICAgIHFTdW0zLCBxU3VtMywgcVN1bTQKLSAgICBWQUREICAgICAgICBxU3VtNCwgcVN1bTQsIHFTdW01Ci0gICAgVlNIUk4gICAgICAgZFJvdzIsIHFTdW0yLCAjMgotICAgIFZTSFJOICAgICAgIGRSb3czLCBxU3VtMywgIzIKLSAgICBWU0hSTiAgICAgICBkUm93NCwgcVN1bTQsICMyCi0gICAgVkFEREwgICAgICAgcVN1bTYsIGRSb3c2LCBkUm93NlNoZnQKLSAgICBWQURETCAgICAgICBxU3VtNywgZFJvdzcsIGRSb3c3U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWQURETCAgICAgICBxU3VtOCwgZFJvdzgsIGRSb3c4U2hmdAotICAgIFZBREQgICAgICAgIHFTdW03LCBxU3VtNywgcVJvdW5kCi0gICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWQUREICAgICAgICBxU3VtNSwgcVN1bTUsIHFTdW02Ci0gICAgVkFERCAgICAgICAgcVN1bTYsIHFTdW02LCBxU3VtNwotICAgIFZBREQgICAgICAgIHFTdW03LCBxU3VtNywgcVN1bTgKLSAgICBWU0hSTiAgICAgICBkUm93NSwgcVN1bTUsICMyCi0gICAgVlNIUk4gICAgICAgZFJvdzYsIHFTdW02LCAjMgotICAgIFZTSFJOICAgICAgIGRSb3c3LCBxU3VtNywgIzIKLSAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKLQotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotOy8vIElucHV0L091dHB1dCBSZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgICAgICAgUk4gMQotcFNyY1Jlc2lkdWUgICAgICAgICAgIFJOIDIKLXBEc3QgICAgICAgICAgICAgICAgICBSTiAzCi1kc3RTdGVwICAgICAgICAgICAgICAgUk4gNAotcHJlZGljdFR5cGUgICAgICAgICAgIFJOIDUKLXJuZFZhbCAgICAgICAgICAgICAgICBSTiA2Ci0KLTsvLyBMb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotcERzdENvcHkgICAgICAgICAgICAgIFJOIDAKLXJldHVybiAgICAgICAgICAgICAgICBSTiAwCi0KLTsvLyBOZW9uIFJlZ2lzdGVycwotZFJvdzAgICAgICAgICAgICAgICAgIEROIEQwLlU4Ci1kUm93MFNoZnQgICAgICAgICAgICAgRE4gRDEuVTgKLWRSb3cxICAgICAgICAgICAgICAgICBETiBEMi5VOAotZFJvdzFTaGZ0ICAgICAgICAgICAgIEROIEQzLlU4Ci1kUm93MiAgICAgICAgICAgICAgICAgRE4gRDQuVTgKLWRSb3cyU2hmdCAgICAgICAgICAgICBETiBENS5VOAotZFJvdzMgICAgICAgICAgICAgICAgIEROIEQ2LlU4Ci1kUm93M1NoZnQgICAgICAgICAgICAgRE4gRDcuVTgKLWRSb3c0ICAgICAgICAgICAgICAgICBETiBEOC5VOAotZFJvdzRTaGZ0ICAgICAgICAgICAgIEROIEQ5LlU4Ci1kUm93NSAgICAgICAgICAgICAgICAgRE4gRDEwLlU4Ci1kUm93NVNoZnQgICAgICAgICAgICAgRE4gRDExLlU4Ci1kUm93NiAgICAgICAgICAgICAgICAgRE4gRDEyLlU4Ci1kUm93NlNoZnQgICAgICAgICAgICAgRE4gRDEzLlU4Ci1kUm93NyAgICAgICAgICAgICAgICAgRE4gRDE0LlU4Ci1kUm93N1NoZnQgICAgICAgICAgICAgRE4gRDE1LlU4Ci1kUm93OCAgICAgICAgICAgICAgICAgRE4gRDE2LlU4Ci1kUm93OFNoZnQgICAgICAgICAgICAgRE4gRDE3LlU4Ci0KLQotcVN1bTAgICAgICAgICAgICAgICAgIFFOIFE5LlUxNgotcVN1bTEgICAgICAgICAgICAgICAgIFFOIFExMC5VMTYKLXFTdW0yICAgICAgICAgICAgICAgICBRTiBRMTEuVTE2Ci1xU3VtMyAgICAgICAgICAgICAgICAgUU4gUTEyLlUxNgotcVN1bTQgICAgICAgICAgICAgICAgIFFOIFExMy5VMTYKLXFTdW01ICAgICAgICAgICAgICAgICBRTiBRMTQuVTE2Ci1xU3VtNiAgICAgICAgICAgICAgICAgUU4gUTAuVTE2Ci1xU3VtNyAgICAgICAgICAgICAgICAgUU4gUTEuVTE2Ci1xU3VtOCAgICAgICAgICAgICAgICAgUU4gUTIuVTE2Ci0KLXFSb3VuZCAgICAgICAgICAgICAgICBRTiBRMTUuVTE2Ci0KLWREc3QwICAgICAgICAgICAgICAgICBETiBEMC5VOAotZERzdDEgICAgICAgICAgICAgICAgIEROIEQxLlU4Ci1kRHN0MiAgICAgICAgICAgICAgICAgRE4gRDIuVTgKLWREc3QzICAgICAgICAgICAgICAgICBETiBEMy5VOAotZERzdDQgICAgICAgICAgICAgICAgIEROIEQ0LlU4Ci1kRHN0NSAgICAgICAgICAgICAgICAgRE4gRDUuVTgKLWREc3Q2ICAgICAgICAgICAgICAgICBETiBENi5VOAotZERzdDcgICAgICAgICAgICAgICAgIEROIEQ3LlU4Ci0KLXFSZXMwICAgICAgICAgICAgICAgICBRTiBRNC5TMTYKLXFSZXMxICAgICAgICAgICAgICAgICBRTiBRNS5TMTYKLXFSZXMyICAgICAgICAgICAgICAgICBRTiBRNi5TMTYKLXFSZXMzICAgICAgICAgICAgICAgICBRTiBRNy5TMTYKLXFSZXM0ICAgICAgICAgICAgICAgICBRTiBROC5TMTYKLXFSZXM1ICAgICAgICAgICAgICAgICBRTiBROS5TMTYKLXFSZXM2ICAgICAgICAgICAgICAgICBRTiBRMTAuUzE2Ci1xUmVzNyAgICAgICAgICAgICAgICAgUU4gUTExLlMxNgotCi0gICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgIE1fU1RBUlQgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2ssIHI2LCBkMTUKLSAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgIE1fQVJHICAgICAgIEFyZ19kc3RTdGVwLCAgICAgICAgNAotICAgIE1fQVJHICAgICAgIEFyZ19wcmVkaWN0VHlwZSwgICAgNAotICAgIE1fQVJHICAgICAgIEFyZ19ybmRWYWwsICAgICAgICAgNAotICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgTV9MRFIgICAgICAgZHN0U3RlcCwgQXJnX2RzdFN0ZXAKLSAgICBNX0xEUiAgICAgICBwcmVkaWN0VHlwZSwgQXJnX3ByZWRpY3RUeXBlCi0gICAgTV9MRFIgICAgICAgcm5kVmFsLCBBcmdfcm5kVmFsCi0gICAgQUREICAgICAgICAgcHJlZGljdFR5cGUsIHJuZFZhbCwgcHJlZGljdFR5cGUsIExTTCAjMQotICAgIFJTQiAgICAgICAgIHJuZFZhbCwgcm5kVmFsLCAjMiAgICAgICAgICAgICAgOy8vIHByZXBhcmluZyBybmRWYWwgZm9yIEhhbGZQaXhlbFhZCi0gICAgCi0gICAgOy8vIFRoZSBmb2xsb3dpbmcgaXMgaW1wbGVtZW50YXRpb24gb2Ygc3dpdGNoaW5nIHRvIGRpZmZlcmVudCBjb2RlIHNlZ21lbnRzCi0gICAgOy8vIGJhc2VkIG9uIGRpZmZlcmVudCBwcmVkaWN0VHlwZSBhbmQgcm5kVmFsIGZsYWdzLiBUaGUgY29ycmVzcG9uZGluZyAKLSAgICA7Ly8gbGFiZWxzIChlLmcuIENhc2VJbnRlZ2VyUGl4ZWxfUm5kMCkgYXJlIGVtYmVkZGVkIGluIHRoZSBtYWNyb3MgZm9sbG93aW5nCi0gICAgOy8vIE1fRU5EU1dJVENIIChlLmcuIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCkuIFdoaWxlICJNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwiIAotICAgIDsvLyBhbmQgIk1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZIiBoYW5kbGUgZm9yIGJvdGggcm91bmRpbmcgY2FzZXM7IAotICAgIDsvLyAiTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCIgYW5kICJNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZIiBtYWNyb3MgaGFuZGxlIAotICAgIDsvLyB0aGUgdHdvIHJvdW5kaW5nIGNhc2VzIGluIHNlcGFyYXRlIGNvZGUgYmFzZXMuCi0gICAgOy8vIEFsbCB0aGVzZSB0b2dldGhlciBpbXBsZW1lbnQgdGhlIGludGVycG9sYXRpb24gZnVuY3Rpb25hbGl0eQotICAgIAotICAgIE1fU1dJVENIICAgIHByZWRpY3RUeXBlCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VJbnRlZ2VyUGl4ZWxfUm5kMAotICAgICAgICBNX0NBU0UgICAgICBDYXNlSW50ZWdlclBpeGVsX1JuZDEKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhfUm5kMAotICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWF9SbmQxCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxZX1JuZDAKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFlfUm5kMQotICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWFlfUm5kMAotICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWFlfUm5kMQotICAgIE1fRU5EU1dJVENICi0KLSAgICBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYIDAKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYIDEKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZIDAKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZIDEKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWQotU3dpdGNoUHJlZGljdFR5cGVFbmQKLQotICAgIDsvLyBBZnRlciBpbnRlcnBvbGF0aW9uIGlzIGRvbmUsIHJlc2lkdWUgbmVlZHMgdG8gYmUgYWRkZWQuIFRoaXMgaXMgZG9uZSAKLSAgICA7Ly8gb25seSBpbiBjYXNlICJwU3JjUmVzaWR1ZSIgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbiBpcyBub3QgTlVMTC4KLSAgICA7Ly8gRm9sbG93aW5nIGlzIGEgY29tcGxldGVseSB1bnJvbGxlZCBjb2RlIHRvIGRvIHNvLiBFYWNoIHJvdyBhbmQgCi0gICAgOy8vIGNvcnJlc3BvbmRpbmcgcmVzaWR1ZSBpcyBsb2FkZWQgYW5kIHJlc2lkdWUgaXMgYWRkZWQgYW5kIHZhbHVlIAotICAgIDsvLyBzdG9yZWQKLSAgICAKLSAgICBDTVAgICAgICAgICBwU3JjUmVzaWR1ZSwgIzAKLSAgICBTVUJORSAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzMgICAgIDsvLyBSZXN0b3JpbmcgcERzdAotICAgIE1PVk5FICAgICAgIHBEc3RDb3B5LCBwRHN0Ci0gICAgQkVRICAgICAgICAgcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKLXBTcmNSZXNpZHVlTm90TnVsbCAgICAKLSAgICBWTEQxICAgICAgICBkRHN0MCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkxEMSAgICAgICAgcVJlczAsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZMRDEgICAgICAgIGREc3QxLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWTEQxICAgICAgICBxUmVzMSwgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkxEMSAgICAgICAgZERzdDIsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZMRDEgICAgICAgIHFSZXMyLCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWQUREVyAgICAgICBxUmVzMCwgcVJlczAsIGREc3QwCi0gICAgVkxEMSAgICAgICAgZERzdDMsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZBRERXICAgICAgIHFSZXMxLCBxUmVzMSwgZERzdDEKLSAgICBWTEQxICAgICAgICBxUmVzMywgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkFERFcgICAgICAgcVJlczIsIHFSZXMyLCBkRHN0MgotICAgIFZMRDEgICAgICAgIGREc3Q0LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0MCwgcVJlczAKLSAgICBWTEQxICAgICAgICBxUmVzNCwgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkFERFcgICAgICAgcVJlczMsIHFSZXMzLCBkRHN0MwotICAgIFZMRDEgICAgICAgIGREc3Q1LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0MSwgcVJlczEKLSAgICBWTEQxICAgICAgICBxUmVzNSwgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkFERFcgICAgICAgcVJlczQsIHFSZXM0LCBkRHN0NAotICAgIFZMRDEgICAgICAgIGREc3Q2LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0MiwgcVJlczIKLSAgICBWTEQxICAgICAgICBxUmVzNiwgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkFERFcgICAgICAgcVJlczUsIHFSZXM1LCBkRHN0NQotICAgIFZMRDEgICAgICAgIGREc3Q3LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0MywgcVJlczMKLSAgICBWTEQxICAgICAgICBxUmVzNywgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkFERFcgICAgICAgcVJlczYsIHFSZXM2LCBkRHN0NgotICAgIFZTVDEgICAgICAgIGREc3QwLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDQsIHFSZXM0Ci0gICAgVlNUMSAgICAgICAgZERzdDEsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWQUREVyAgICAgICBxUmVzNywgcVJlczcsIGREc3Q3Ci0gICAgVlNUMSAgICAgICAgZERzdDIsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0NSwgcVJlczUKLSAgICBWU1QxICAgICAgICBkRHN0MywgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3Q2LCBxUmVzNgotICAgIFZTVDEgICAgICAgIGREc3Q0LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDcsIHFSZXM3Ci0gICAgVlNUMSAgICAgICAgZERzdDUsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkRHN0NiwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGREc3Q3LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgCi1wU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAotICAgIE1PViAgICAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLQotICAgIE1fRU5ECi0gICAgRU5ESUYgOy8vIENvcnRleEE4Ci0gICAgRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gb214VkNNNFAyX01DUmVjb25CbG9jayBlbmRzCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGViMjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07ICoqKioqKioqKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICogCi07ICogRGVzY3JpcHRpb246Ci07ICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCi07ICoKLTsgKiAKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi07ICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLTsgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgCi07ICogICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgCi07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgWy0yMDQ4LCAyMDQ3XS4KLTsgKiBbaW5dICBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkCi07ICogICAgICAgICAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgotOyAqIFtpbl0gIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIAotOyAqICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgotOyAqIFtpbl0gIGN1clFQICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgCi07ICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIAotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotOyAqIFtpbl0gIHByZWRRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLTsgKiBbaW5dICBwcmVkRGlyICAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLTsgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci07ICogW2luXSAgQUNQcmVkRmxhZyAgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCi07ICogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLTsgKiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLTsgKiBbaW5dICB2aWRlb0NvbXAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLTsgKiAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi07ICogW291dF0gcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrCi07ICogW291dF0gcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotOyAqIFtvdXRdIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi07ICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuCi07ICogLSBBdCBsZWFzdCBvbmUgdGhlIGZvbGxvd2luZyBjYXNlczogY3VyUVAgPD0gMCwgcHJlZFFQIDw9IDAsIGN1clFQID4zMSwgCi07ICogICBwcmVkUVAgPiAzMSwgcHJlRGlyIGV4Y2VlZHMgWzEsMl0uCi07ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgCi07ICogICA0LWJ5dGUgYWxpZ25lZC4KLTsgKgotOyAqKioqKioqKioKLSAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgIAotICAgICAgICAgICAgIAotCi0gICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIKLSAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNgotICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCi0gICAgICAgCi0gICAgICAgIElGIENvcnRleEE4Ci07Ly8gSW5wdXQgQXJndW1lbnRzCi0KLXBTcmNEc3QgICAgICAgICAgUk4gMAotcFByZWRCdWZSb3cgICAgICBSTiAxCi1wUHJlZEJ1ZkNvbCAgICAgIFJOIDIKLWN1clFQICAgICAgICAgICAgUk4gMwotUVAgICAgICAgICAgICAgICBSTiAzCi1wcmVkUVAgICAgICAgICAgIFJOIDQKLXByZWREaXIgICAgICAgICAgUk4gNQotQUNQcmVkRmxhZyAgICAgICBSTiA2Ci12aWRlb0NvbXAgICAgICAgIFJOIDcKLQotOy8vIExvY2FsIFZhcmlhYmxlcwotCi1zaG9ydFZpZGVvSGVhZGVyIFJOIDQKLWRjU2NhbGVyICAgICAgICAgUk4gNAotaW5kZXggICAgICAgICAgICBSTiA2Ci1wcmVkQ29lZmZUYWJsZSAgIFJOIDcKLXRlbXAxICAgICAgICAgICAgUk4gNgotdGVtcDIgICAgICAgICAgICBSTiA5Ci10ZW1wICAgICAgICAgICAgIFJOIDE0Ci1Db25zdCAgICAgICAgICAgIFJOIDgKLXRlbXBwUHJlZENvbEJ1ZiAgUk4gOAotdGVtcFByZWQgICAgICAgICBSTiA5Ci0KLWFic0NvZWZmREMgICAgICAgUk4gOAotbmVnZGNTY2FsZXIgICAgICBSTiAxMAotUmVtICAgICAgICAgICAgICBSTiAxMQotdGVtcDMgICAgICAgICAgICBSTiAxMgotCi1kY1Jvd2J1ZkNvZWZmICAgIFJOIDEwCi1kY0NvbEJ1ZmZDb2VmZiAgIFJOIDExCi1SZXR1cm4gICAgICAgICAgIFJOIDAKLQotOy8vTkVPTiBSZWdpc3RlcnMKLQotcVByZWRSb3dCdWYgICAgICAgUU4gUTAuUzE2Ci1kUHJlZFJvd0J1ZjAgICAgICBETiBEMC5TMTYKLWRQcmVkUm93QnVmMSAgICAgIEROIEQxLlMxNgotCi0KLQotCi1xQ29lZmZUYWIgICAgICAgICBRTiBRMS5TMzIKLQotcVByZWRRUCAgICAgICAgICAgUU4gUTIuUzE2Ci1kUHJlZFFQMCAgICAgICAgICBETiBENC5TMTYKLWRQcmVkUVAxICAgICAgICAgIEROIEQ1LlMxNgotCi0KLXF0ZW1wMSAgICAgICAgICAgIFFOIFEzLlMzMgotcXRlbXAgICAgICAgICAgICAgUU4gUTMuUzE2Ci0KLWR0ZW1wMCAgICAgICAgICAgIEROIEQ2LlMxNgotZHRlbXAxICAgICAgICAgICAgRE4gRDcuUzE2Ci0KLWR0ZW1wMiAgICAgICAgICAgIEROIEQ4LlMxNgotZHRlbXAzICAgICAgICAgICAgRE4gRDkuUzE2Ci0KLWR0ZW1wNCAgICAgICAgICAgIEROIEQyLlMxNgotZHRlbXA1ICAgICAgICAgICAgRE4gRDMuUzE2Ci1kdGVtcDYgICAgICAgICAgICBETiBENC5TMTYKLWR0ZW1wNyAgICAgICAgICAgIEROIEQ1LlMxNgotIAotcXRlbXBQcmVkMSAgICAgICAgUU4gUTUuUzMyCi1xdGVtcFByZWQgICAgICAgICBRTiBRNS5TMTYKLQotZHRlbXBQcmVkMCAgICAgICAgRE4gRDEwLlMxNgotZHRlbXBQcmVkMSAgICAgICAgRE4gRDExLlMxNgotIAotICAKLQotICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEscjExLGQxMQotCi0gICAgICA7Ly8gQXNzaWduaW5nIHBvaW50ZXJzIHRvIElucHV0IGFyZ3VtZW50cyBvbiBTdGFjawotICAgIAotICAgICAgTV9BUkcgICAgICAgICAgIHByZWRRUG9uU3RhY2ssNCAgCi0gICAgICBNX0FSRyAgICAgICAgICAgcHJlZERpcm9uU3RhY2ssNAotICAgICAgTV9BUkcgICAgICAgICAgIEFDUHJlZEZsYWdvblN0YWNrLDQKLSAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvblN0YWNrLDQKLSAgICAgIAotICAgICAgOy8vIERDIFByZWRpY3Rpb24KLQotICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvblN0YWNrICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmlkZW9Db21wIEZyb20gU3RhY2sgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgTV9MRFIgICAgICAgICAgIHByZWREaXIscHJlZERpcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUHJlZGljdGlvbiBkaXJlY3Rpb24KLSAgICAgIDsvLyBEQyBTY2FsZXIgY2FsY3VsYXRpb24gICAKLSAgICAgIExEUiAgICAgICAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgQUREICAgICAgICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKLSAgICAgIExEUkIgICAgICAgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCi0KLSAgICAgICAKLSAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMzI3NjcvKDEgdG8gNjMpIAotICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbAotCi0gICAgICA7Ly8gQ2F1bHVjYXRlIHRlbXBQcmVkCi0gICAgICAgICAgICAKLSAgICAgIExEUkVRU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB2ZXRpY2FsIGxvYWQgdGhlIGNvZWZmIGZyb20gUm93IFByZWRpY3Rpb24gQnVmZmVyCi0gICAgICBMRFJORVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgaG9yaXpvbnRhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIGNvbHVtbiBQcmVkaWN0aW9uIEJ1ZmZlcgotICAgICAgCi0gICAgICBSU0IgICAgICAgICAgICAgbmVnZGNTY2FsZXIsZGNTY2FsZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmVnZGNTY2FsZXI9LWRjU2NhbGVyICAgCi0gICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgUHJlZGljdGlvbiBjb2VmZiB0byB0ZW1wIGZvciBjb21wYXJpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmREMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNhbGN1bGF0ZSBhYnNvbHV0ZSB2YWwgb2YgcHJlZGljdGlvbiBjb2VmZgotICAgICAgCi0gICAgICBBREQgICAgICAgICAgICAgdGVtcCxkY1NjYWxlcixkY1NjYWxlcgotICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3ByZWRDb2VmZlRhYmxlLHRlbXBdICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmFsdWUgZnJvbSBjb2VmZiB0YWJsZSBmb3IgcGVyZm9ybWluZyBkaXZpc2lvbiB1c2luZyBtdWx0aXBsaWNhdGlvbgotICAgICAgU01VTEJCICAgICAgICAgIHRlbXBQcmVkLHRlbXAsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBwZWQ9cFByZWRCdWZSb3coQ29sKVswXSozMjc2Ny9kY1NjYWxlcgotICAgICAgQUREICAgICAgICAgICAgIHRlbXAzLGRjU2NhbGVyLCMxCi0gICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE1ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcHBlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdL2RjU2NhbGVyICAgICAgICAgICAgICAgICAgCi0gICAgICBMU1IgICAgICAgICAgICAgdGVtcDMsdGVtcDMsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDM9cm91bmQoZGNTY2FsZXIvMikgICAgICAgICAgIAotICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdkY1NjYWxlcix0ZW1wUHJlZCxhYnNDb2VmZkRDICAgICAgICAgICAgOy8vIFJlbWFpbmRlciBSZW09YWJzKHBQcmVkQnVmUm93KENvbClbMF0pLXRlbXBQcmVkKmRjU2NhbGVyCi0gICAgICAKLSAgICAgIExEUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAKLSAgICAgIAotICAgICAgQ01QICAgICAgICAgICAgIFJlbSx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgUmVtIHdpdGggKGRjU2NhbGVyLzIpCi0gICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9dGVtcFByZWQrMSBpZiBSZW0+PShkY1NjYWxlci8yKQotICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCi0gICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9LXRlbXBQcmVkIGlmIAotICAgICAgIAotICAgICAgU1RSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmUm93LCMtMTZdICAgICAgCi0gICAgICAgCi0KLSAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0KLSAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0rdGVtcFByZWQKLSAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICBTTVVMQkIgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsdGVtcCxkY1NjYWxlciAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9Y2xpcHBlZChwU3JjRHN0WzBdKSpkY1NjYWxlciAgICAgICAgICAgCi0gICAgICBNX0xEUiAgICAgICAgICAgQUNQcmVkRmxhZyxBQ1ByZWRGbGFnb25TdGFjawotICAgICAgU1RSSCAgICAgICAgICAgIGRjQ29sQnVmZkNvZWZmLFtwUHJlZEJ1ZkNvbF0gICAgICAKLSAgICAgIAotCi0gICAgICAgOy8vIEFDIFByZWRpY3Rpb24KLSAgICAgIAotICAgICAgTV9MRFIgICAgICAgICAgIHByZWRRUCxwcmVkUVBvblN0YWNrCi0gICAgICAKLSAgICAgIENNUCAgICAgICAgICAgICBBQ1ByZWRGbGFnLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgQUMgcHJlZGljdGlvbiBmbGFnIGlzIHNldCBvciBub3QKLSAgICAgIEJORSAgICAgICAgICAgICBFeGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBub3Qgc2V0IEV4aXQKLSAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAweDFmZmZmLygxIHRvIDYzKSAKLSAgICAgIE1PViAgICAgICAgICAgICBDb25zdCwjNAotICAgICAgTVVMICAgICAgICAgICAgIGN1clFQLGN1clFQLENvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGN1clFQPTQqY3VyUVAKLSAgICAgIFZEVVAgICAgICAgICAgICBkUHJlZFFQMCxwcmVkUVAKLSAgICAgIExEUiAgICAgICAgICAgICB0ZW1wMixbcHJlZENvZWZmVGFibGUsY3VyUVBdICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPTB4MWZmZmYvY3VyUVAKLSAgICAgIFZEVVAgICAgICAgICAgICBxQ29lZmZUYWIsdGVtcDIKLSAgICAgIEJORSAgICAgICAgICAgICBIb3Jpem9udGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgaG9yaXpvbnRhbCBicmFuY2ggdG8gSG9yaXpvbnRhbAotICAgICAgCi0gICAgIAotICAgICAgCi0gICAgICA7Ly8gVmVydGljYWwKLSAgICAgIDsvL0NhbGN1bGF0aW5nIHRlbXBQcmVkCi0KLSAgICAgIFZMRDEgICAgICAgICAgICB7ZFByZWRSb3dCdWYwLGRQcmVkUm93QnVmMX0sW3BQcmVkQnVmUm93XSAgICAgIDsvLyBMb2FkaW5nIHBQcmVkQnVmUm93W2ldOmk9MCB0MCA3Ci0gICAgICAKLSAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYwLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldOiBpPTAgdDAgMwotICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTAgdDAgMwotICAgICAgCi0gICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMSxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXSA6IGk9NCB0MCA3ICAgICAgCi0KLSAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXS9jdXJRUCkgOiBpPTAgdDAgMwotICAgICAgVlNIUk4gICAgICAgICAgIGRQcmVkUVAxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKLSAgICAgIAotICAgICAgCi0gICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9NCB0MCA3Ci0gICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0vY3VyUVApICA6IGk9NCB0MCA3Ci0gICAgICBWTEQxICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDF9LFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkaW5nIHBTcmNEc3RbaV0gOiBpPTAgdG8gNwotICAgICAgVlNIUk4gICAgICAgICAgIGR0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKLSAgICAgIFZNT1YgICAgICAgICAgICBkdGVtcFByZWQwLGRQcmVkUVAxCi0gICAgICAKLSAgICAgIDsvL3VwZGF0aW5nIHNvdXJjZSBhbmQgcm93IHByZWRpY3Rpb24gYnVmZmVyIGNvbnRlbnRzICAgICAgCi0gICAgICBWQUREICAgICAgICAgICAgcXRlbXAscXRlbXAscXRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9wU3JjRHN0W2ldPXBTcmNEc3RbaV0rcXRlbXBQcmVkW2ldOiBpPTAgdG8gNyAKLSAgICAgIFZRU0hMICAgICAgICAgICBxdGVtcCxxdGVtcCwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NsaXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICBMRFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkaW5nIERjIFZhbHVlIG9mIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcgotICAgICAgVlNIUiAgICAgICAgICAgIHF0ZW1wLHF0ZW1wLCM0Ci0gICAgICAKLSAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvL3N0b3JpbmcgYmFjayB0aGUgdXBkYXRlZCB2YWx1ZXMgCi0gICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDF9LFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICA7Ly9zdG9yaW5nIGJhY2sgdGhlIHVwZGF0ZWQgcm93IHByZWRpY3Rpb24gdmFsdWVzICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU1RSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JpbmcgdGhlIHVwZGF0ZWQgREMgUm93IFByZWRpY3Rpb24gY29lZmYKLSAgICAgIAotICAgICAgQiAgICAgICAgICAgICAgIEV4aXQKLQotSG9yaXpvbnRhbAotCi0gICAgICA7Ly8gQ2FsY3VsYXRpbmcgVGVtcHByZWQKLQotICAgICAgICAgICAgCi0KLSAgICAgIFZMRDEgICAgICAgICAgICB7ZFByZWRSb3dCdWYwLGRQcmVkUm93QnVmMX0sW3BQcmVkQnVmQ29sXSAgICAgIDsvLyBMb2FkaW5nIHBQcmVkQnVmQ29sW2ldOmk9MCB0MCA3Ci0gICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMCxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXTogaT0wIHQwIDMKLSAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT0wIHQwIDMKLSAgICAgIAotICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjEsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0gOiBpPTQgdDAgNyAgICAgIAotCi0gICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0vY3VyUVApIDogaT0wIHQwIDMKLSAgICAgIFZTSFJOICAgICAgICAgICBkUHJlZFFQMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCi0gICAgICAKLSAgICAgIAotICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTQgdDAgNwotICAgICAgCi0gICAgICBNT1YgICAgICAgICAgICAgdGVtcHBQcmVkQ29sQnVmLHBQcmVkQnVmQ29sCi0gICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0vY3VyUVApICA6IGk9NCB0MCA3Ci0gICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3BTcmNEc3RdICAgICAgICA7Ly8gTG9hZGluZyBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKLSAgICAgIFZTSFJOICAgICAgICAgICBkdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCi0gICAgICBWTU9WICAgICAgICAgICAgZHRlbXBQcmVkMCxkUHJlZFFQMQotICAgICAgCi0gICAgICA7Ly8gVXBkYXRpbmcgc291cmNlIGFuZCBjb2x1bW4gcHJlZGljdGlvbiBidWZmZXIgY29udGVudHMgICAgIAotICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHBTcmNEc3QsIzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0gICAgICAgICAgOy8vIExvYWRpbmcgbmV4dCAxNiBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKLSAgICAgIFZVWlAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbnRlcmxlYXZpbmcgYnkgOAotICAgICAgVkFERCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsZHRlbXBQcmVkMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIEFkZGluZyB0ZW1wUHJlZCB0byBjb2VmZnMKLSAgICAgIFZRU0hMICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRvIFstMjA0OCwyMDQ3XQotICAgICAgVlNIUiAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQKLSAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwfSxbcFByZWRCdWZDb2xdISAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGluZyBQcmlkaWN0aW9uIGNvbHVtbiBidWZmZXIKLSAgICAgIFZaSVAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkZWludGVybGVhdmluZwotICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFtwU3JjRHN0XSAgICAgICAgOy8vIFVwZGF0aW5nIHNvdXJjZSBjb2VmZnMgICAgICAgICAKLSAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdIQotICAgICAgCi0gICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsdGVtcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3RlbXAyXSEgICAgICAgICA7Ly8gTG9hZGluZyAgY29lZmZpY2llbnRzIEludGVybGVhdmluZyBieSA0Ci0gICAgICAKLSAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdCi0gICAgICBWVVpQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW50ZXJsZWF2aW5nIGJ5IDgKLSAgICAgIFZBREQgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLGR0ZW1wUHJlZDEKLSAgICAgIFZRU0hMICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRvIFstMjA0OCwyMDQ3XQotICAgICAgVlNIUiAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQKLSAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwfSxbcFByZWRCdWZDb2xdIQotICAgICAgVlpJUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQKLSAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbdGVtcDFdCi0gICAgICBTVFJIICAgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsW3RlbXBwUHJlZENvbEJ1Zl0gCi0gICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXQotICAgICAgCi1FeGl0Ci0KLSAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XQotICAgICAgICAgIAotIAotICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VyciAKLSAKLSAgICAgIE1fRU5ECi0gICAgICBFTkRJRgotCi0KLSAgICAgICBFTkQKLQotCi0gICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0NTcxZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLTsgKiAKLTsgKgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBpbnZlcnNlIHF1YW50aXphdGlvbiBvbiBpbnRyYS9pbnRlciBjb2RlZCBibG9jay4KLTsgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gTWlzbWF0Y2ggY29udHJvbAotOyAqIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IE1QRUctNCBtb2RlIGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2U6IFstMjA0OCwgMjA0N10uCi07ICogTWlzbWF0Y2ggY29udHJvbCBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dIHBTcmNEc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqIFtpbl0gUVAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKLTsgKiBbaW5dIHZpZGVvQ29tcCAgICAgIChJbnRyYSB2ZXJzaW9uIG9ubHkuKSBWaWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0FMUEhBLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKLTsgKiAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCi07ICogW291dF0gICAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiAgTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAgLSBJZiBwU3JjRHN0IGlzIE5VTEwgb3IgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiAgICAgIG9yCi07ICogICAgLSBJZiBRUCA8PSAwLgotOyAqICAgICAgb3IKLTsgKiAgICAtIHZpZGVvQ29tcCBpcyBub25lIG9mIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSBhbmQgT01YX1ZDX0FMUEhBLgotOyAqCi07ICovCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICBJRiBDb3J0ZXhBOAotICAgICAKLSAgICAgCi07Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmNEc3QgICAgICAgICAgICBSTiAwCi1RUCAgICAgICAgICAgICAgICAgUk4gMQotICAgICAKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1Db3VudCAgICAgICAgICAgICAgUk4gMwotZG91YmxlUVAgICAgICAgICAgIFJOIDQKLVJldHVybiAgICAgICAgICAgICBSTiAwCi07Ly8gTmVvbiByZWdpc3RlcnMKLQotCi1kUVAxMCAgICAgICAgICAgICAgRE4gRDAuUzMyWzBdCi1xUVAxICAgICAgICAgICAgICAgUU4gUTAuUzMyCi0KLWRRUDEgICAgICAgICAgICAgICBETiBEMC5TMTYKLWRNaW51c1FQMSAgICAgICAgICBETiBEMS5TMTYKLQotZENvZWZmMCAgICAgICAgICAgIEROIEQyLlMxNgotZENvZWZmMSAgICAgICAgICAgIEROIEQzLlMxNiAgIAotCi1xUmVzdWx0MCAgICAgICAgICAgUU4gUTMuUzMyCi1kUmVzdWx0MCAgICAgICAgICAgRE4gRDcuUzE2Ci1xU2lnbjAgICAgICAgICAgICAgUU4gUTMuUzMyCi1kU2lnbjAgICAgICAgICAgICAgRE4gRDYuUzE2Ci0KLXFSZXN1bHQxICAgICAgICAgICBRTiBRNC5TMzIKLWRSZXN1bHQxICAgICAgICAgICBETiBEOC5TMTYKLXFTaWduMSAgICAgICAgICAgICBRTiBRNC5TMzIKLWRTaWduMSAgICAgICAgICAgICBETiBEOC5TMTYKLQotZDJRUDAgICAgICAgICAgICAgIEROIEQxMC5TMzJbMF0KLXEyUVAwICAgICAgICAgICAgICBRTiBRNS5TMzIKLWQyUVAgICAgICAgICAgICAgICBETiBEMTAuUzE2Ci0KLWRaZXJvMCAgICAgICAgICAgICBETiBEMTEuUzE2Ci1kWmVybzEgICAgICAgICAgICAgRE4gRDEyLlMxNgotZENvbnN0MCAgICAgICAgICAgIEROIEQxMy5TMTYKLQotICAgIAotICAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludGVyX0kscjQsZDEzCi0gICAgIAotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEFERCAgICAgIGRvdWJsZVFQLFFQLFFQICAgICAgICAgICAgICAgICAgIDsvLyBkb3VibGVRUD0gMipRUAotICAgICAgICAgVk1PViAgICAgZDJRUDAsZG91YmxlUVAKLSAgICAgICAgIFZEVVAgICAgIHEyUVAwLGQyUVAwICAgICAgICAgICAgICAgICAgICAgIDsvLyBNb3ZlIGRvdWJsZVFQIGluIHRvIGEgc2NhbGFyCi0gICAgICAgICBUU1QgICAgICBRUCwjMSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkIGZpcnN0IDggdmFsdWVzIHRvIENvZWZmMCxDb2VmZjEKLSAgICAgICAgIFNVQkVRICAgIFFQLFFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgVk1PViAgICAgZFFQMTAsUVAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIFFQIGlzIGV2ZW4gdGhlbiBRUDE9UVAtMSBlbHNlIFFQMT1RUCAgICAgCi0gICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKLSAgICAgICAgIFZEVVAgICAgIHFRUDEsZFFQMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGUgdGVtcFJlc3VsdCB3aXRoIFFQMQotICAgICAgICAgVlNIUk4gICAgZDJRUCxxMlFQMCwjMAotICAgICAgICAgVkVPUiAgICAgZENvbnN0MCxkQ29uc3QwLGRDb25zdDAKLSAgICAgICAgIFZTSFJOICAgIGRRUDEscVFQMSwjMCAgICAgICAgICAgICAgICAgICAgIDsvLyBRUDEgdHJ1bmNhdGVkIHRvIDE2IGJpdHMKLSAgICAgICAgIFZTVUIgICAgIGRNaW51c1FQMSxkQ29uc3QwLGRRUDEgICAgICAgICAgIDsvLyBkTWludXNRUDE9LVFQMQotCi1Mb29wICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly9QZXJmb3JtaW5nIEludmVyc2UgUXVhbnRpemF0aW9uCi0gICAgICAgICAKLSAgICAgICAgIFZDTFQgICAgIGRTaWduMCxkQ29lZmYwLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCAwCi0gICAgICAgICBWQ0xUICAgICBkU2lnbjEsZENvZWZmMSwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgMAotICAgICAgICAgVkNFUSAgICAgZFplcm8wLGRDb2VmZjAsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IHplcm8KLSAgICAgICAgIFZCU0wgICAgIGRTaWduMCxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjAgPSAtUVAxIGlmIENvZWZmMDwgMCBlbHNlIFFQMQotICAgICAgICAgVkNFUSAgICAgZFplcm8xLGRDb2VmZjEsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IHplcm8KLSAgICAgICAgIFZCU0wgICAgIGRTaWduMSxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjEgPSAtUVAxIGlmIENvZWZmMTwgMCBlbHNlIFFQMQotICAgICAgICAgVk1PVkwgICAgcVNpZ24wLGRTaWduMCAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gZXh0ZW5kIHFTaWduMCB0byAzMiBiaXRzCi0gICAgICAgICBWTU9WTCAgICBxU2lnbjEsZFNpZ24xCi0gICAgICAgICBWTUxBTCAgICBxUmVzdWx0MCxkQ29lZmYwLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0rcUNvZWZmMFtpXSooLTIpIGlmIENvZWZmIDwwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCi0gICAgICAgICBWTUxBTCAgICBxUmVzdWx0MSxkQ29lZmYxLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0rcUNvZWZmMVtpXSooLTIpIGlmIENvZWZmIDwwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCi0gICAgICAgICA7Ly8gQ2xpcCBSZXN1bHQgdG8gWy0yMDQ4LDIwNDddICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQwLHFSZXN1bHQwLCMyMCAgICAgICAgICAgIDsvLyBjbGlwIHRvIFstMjA0OCwyMDQ3XQotICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDEscVJlc3VsdDEsIzIwCi0gICAgICAgICAgICAgICAgIAotICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDAscVJlc3VsdDAsIzQgIAotICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDEscVJlc3VsdDEsIzQKLSAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQwLHFSZXN1bHQwLCMxNiAgICAgICAgICAgIDsvLyBOYXJyb3cgdGhlIGNsaXBwZWQgVmFsdWUgdG8gSGFsZndvcmQKLSAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQxLHFSZXN1bHQxLCMxNiAKLSAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQwLGRDb25zdDAsZFplcm8wICAKLSAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQxLGRDb25zdDAsZFplcm8xICAgICAKLSAgICAgICAgIAotICAgICAgICAgVlNUMSAgICAge2RSZXN1bHQwLGRSZXN1bHQxfSxbcFNyY0RzdF0hICAgOy8vIFN0b3JlIHRoZSByZXN1bHQKLSAgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM4Ci0gICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0KLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBCR1QgICAgICBMb29wCi0KLSAgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotCi0KLSAgICAgICAgIE1fRU5ECi0gICAgICAgICBFTkRJRgotICAgICAgICAgCi0KLSAgICAgICAgRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhN2ZkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLTsgKiAKLTsgKgotOyAqCi07ICoKLTsgKgotOyAqIAotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBpbnZlcnNlIHF1YW50aXphdGlvbiBvbiBpbnRyYS9pbnRlciBjb2RlZCBibG9jay4KLTsgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gTWlzbWF0Y2ggY29udHJvbAotOyAqIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IE1QRUctNCBtb2RlIGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2U6IFstMjA0OCwgMjA0N10uCi07ICogTWlzbWF0Y2ggY29udHJvbCBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBTcmNEc3QgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiBbaW5dICAgIFFQICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpc2VyX3NjYWxlKQotOyAqIFtpbl0gICAgdmlkZW9Db21wICAgICAgICAgIChJbnRyYSB2ZXJzaW9uIG9ubHkuKSBWaWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Ci07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0FMUEhBLgotOyAqIFtpbl0gICAgc2hvcnRWaWRlb0hlYWRlciAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAotOyAqICAgICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgotOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiAgTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAgLSAgICBJZiBwU3JjRHN0IGlzIE5VTEwgb3IgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiAgICAgIG9yCi07ICogICAgLSBJZiBRUCA8PSAwLgotOyAqICAgICAgb3IKLTsgKiAgICAtIHZpZGVvQ29tcCBpcyBub25lIG9mIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSBhbmQgT01YX1ZDX0FMUEhBLgotOyAqCi0gCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAKLSAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgIAotICAgCi0gICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgotIAotICAgICBJRiBDb3J0ZXhBOAotICAgICAKLSAgICAgCi07Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmNEc3QgICAgICAgICAgICBSTiAwCi1RUCAgICAgICAgICAgICAgICAgUk4gMQotdmlkZW9Db21wICAgICAgICAgIFJOIDIKLXNob3J0VmlkZW9IZWFkZXIgICBSTiAzCi0gICAgIAotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotZGNTY2FsZXIgICAgICAgICAgIFJOIDQKLXRlbXAgICAgICAgICAgICAgICBSTiAxNAotaW5kZXggICAgICAgICAgICAgIFJOIDUKLQotCi1Db3VudCAgICAgICAgICAgICAgUk4gNQotZG91YmxlUVAgICAgICAgICAgIFJOIDQKLVJldHVybiAgICAgICAgICAgICBSTiAwCi0KLQotOy8vIE5lb24gcmVnaXN0ZXJzCi0KLQotZFFQMTAgICAgICAgICAgICAgIEROIEQwLlMzMlswXQotcVFQMSAgICAgICAgICAgICAgIFFOIFEwLlMzMgotCi1kUVAxICAgICAgICAgICAgICAgRE4gRDAuUzE2Ci1kTWludXNRUDEgICAgICAgICAgRE4gRDEuUzE2Ci0KLWRDb2VmZjAgICAgICAgICAgICBETiBEMi5TMTYKLWRDb2VmZjEgICAgICAgICAgICBETiBEMy5TMTYgICAKLQotcVJlc3VsdDAgICAgICAgICAgIFFOIFEzLlMzMgotZFJlc3VsdDAgICAgICAgICAgIEROIEQ3LlMxNgotcVNpZ24wICAgICAgICAgICAgIFFOIFEzLlMzMgotZFNpZ24wICAgICAgICAgICAgIEROIEQ2LlMxNgotCi1xUmVzdWx0MSAgICAgICAgICAgUU4gUTQuUzMyCi1kUmVzdWx0MSAgICAgICAgICAgRE4gRDguUzE2Ci1xU2lnbjEgICAgICAgICAgICAgUU4gUTQuUzMyCi1kU2lnbjEgICAgICAgICAgICAgRE4gRDguUzE2Ci0KLWQyUVAwICAgICAgICAgICAgICBETiBEMTAuUzMyWzBdCi1xMlFQMCAgICAgICAgICAgICAgUU4gUTUuUzMyCi1kMlFQICAgICAgICAgICAgICAgRE4gRDEwLlMxNgotCi1kWmVybzAgICAgICAgICAgICAgRE4gRDExLlMxNgotZFplcm8xICAgICAgICAgICAgIEROIEQ0LlMxNgotZENvbnN0MCAgICAgICAgICAgIEROIEQ1LlMxNgotCi0KLQotCi0gICAgIAotICAgICAKLSAgICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLHI1LGQxMQotCi0KLSAgICAgICAgOy8vIFBlcmZvcm0gSW52ZXJzZSBRdWFudGl6YXRpb24gZm9yIERDIGNvZWZmaWNpZW50Ci0KLSAgICAgICAgVEVRICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICA7Ly8gVGVzdCBpZiBzaG9ydCBWaWRlbyBIZWFkZXIgZmxhZyA9MCAgICAgICAgICAgICAKLSAgICAgICAgTU9WTkUgICAgIGRjU2NhbGVyLCM4ICAgICAgICAgICAgICA7Ly8gaWYgc2hvcnRWaWRlb0hlYWRlciBpcyBub24gemVybyBkY1NjYWxlcj04Ci0gICAgICAgIEJORSAgICAgICBjYWxEQ1ZhbAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCi0gICAgICBBREQgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQotICAgICAgTERSQiAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KLQotICAgICAgICA7Ly9NX0NhbERDU2NhbGFyICBzaG9ydFZpZGVvSGVhZGVyLHZpZGVvQ29tcCwgUVAKLQotY2FsRENWYWwKLQotICAgICAgICBMRFJIICAgICB0ZW1wLFtwU3JjRHN0XQotICAgICAgICBTTVVMQkIgICB0ZW1wLHRlbXAsZGNTY2FsZXIgICAgICAgOy8vIGRjQ29lZmYgPSBkY1NjYWxlciAqIFF1YW50aXplZCBEQyBjb2VmZmljaWVudChmcm9tIG1lbW9yeSkKLSAgICAgICAgU1NBVCAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgIDsvLyBTYXR1cmF0aW5nIHRvIDEyIGJpdHMKLSAgICAgIAotCi0KLSAgICAgICAgOy8vIFBlcmZvcm0gSW52ZXJzZSBRdWFudGl6YXRpb24gZm9yIEFjIENvZWZmaWNpZW50cwotICAgICAKLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBBREQgICAgICBkb3VibGVRUCxRUCxRUCAgICAgICAgICAgICAgICAgICA7Ly8gZG91YmxlUVA9IDIqUVAKLSAgICAgICAgIFZNT1YgICAgIGQyUVAwLGRvdWJsZVFQCi0gICAgICAgICBWRFVQICAgICBxMlFQMCxkMlFQMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gTW92ZSBkb3VibGVRUCBpbiB0byBhIHNjYWxhcgotICAgICAgICAgVFNUICAgICAgUVAsIzEgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZCBmaXJzdCA4IHZhbHVlcyB0byBDb2VmZjAsQ29lZmYxCi0gICAgICAgICBTVUJFUSAgICBRUCxRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIFZNT1YgICAgIGRRUDEwLFFQICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBRUCBpcyBldmVuIHRoZW4gUVAxPVFQLTEgZWxzZSBRUDE9UVAgICAgIAotICAgICAgICAgTU9WICAgICAgQ291bnQsIzY0Ci0gICAgICAgICBWRFVQICAgICBxUVAxLGRRUDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRHVwbGljYXRlIHRlbXBSZXN1bHQgd2l0aCBRUDEKLSAgICAgICAgIFZTSFJOICAgIGQyUVAscTJRUDAsIzAKLSAgICAgICAgIFZFT1IgICAgIGRDb25zdDAsZENvbnN0MCxkQ29uc3QwCi0gICAgICAgICBWU0hSTiAgICBkUVAxLHFRUDEsIzAgICAgICAgICAgICAgICAgICAgICA7Ly8gUVAxIHRydW5jYXRlZCB0byAxNiBiaXRzCi0gICAgICAgICBWU1VCICAgICBkTWludXNRUDEsZENvbnN0MCxkUVAxICAgICAgICAgICA7Ly8gZE1pbnVzUVAxPS1RUDEKLQotTG9vcCAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vUGVyZm9ybWluZyBJbnZlcnNlIFF1YW50aXphdGlvbgotICAgICAgICAgCi0gICAgICAgICBWQ0xUICAgICBkU2lnbjAsZENvZWZmMCwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgMAotICAgICAgICAgVkNMVCAgICAgZFNpZ24xLGRDb2VmZjEsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IDAKLSAgICAgICAgIFZDRVEgICAgIGRaZXJvMCxkQ29lZmYwLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCB6ZXJvCi0gICAgICAgICBWQlNMICAgICBkU2lnbjAsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24wID0gLVFQMSBpZiBDb2VmZjA8IDAgZWxzZSBRUDEKLSAgICAgICAgIFZDRVEgICAgIGRaZXJvMSxkQ29lZmYxLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCB6ZXJvCi0gICAgICAgICBWQlNMICAgICBkU2lnbjEsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24xID0gLVFQMSBpZiBDb2VmZjE8IDAgZWxzZSBRUDEKLSAgICAgICAgIFZNT1ZMICAgIHFTaWduMCxkU2lnbjAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIGV4dGVuZCBxU2lnbjAgdG8gMzIgYml0cwotICAgICAgICAgVk1PVkwgICAgcVNpZ24xLGRTaWduMQotICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDAsZENvZWZmMCxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldK3FDb2VmZjBbaV0qKC0yKSBpZiBDb2VmZiA8MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAotICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDEsZENvZWZmMSxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldK3FDb2VmZjFbaV0qKC0yKSBpZiBDb2VmZiA8MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAotICAgICAgICAgOy8vIENsaXAgUmVzdWx0IHRvIFstMjA0OCwyMDQ3XSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBWUVNITCAgICBxUmVzdWx0MCxxUmVzdWx0MCwjMjAgICAgICAgICAgICA7Ly8gY2xpcCB0byBbLTIwNDgsMjA0N10KLSAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQxLHFSZXN1bHQxLCMyMAotICAgICAgICAgICAgICAgICAKLSAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQwLHFSZXN1bHQwLCM0ICAKLSAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQxLHFSZXN1bHQxLCM0Ci0gICAgICAgICBWU0hSTiAgICBkUmVzdWx0MCxxUmVzdWx0MCwjMTYgICAgICAgICAgICA7Ly8gTmFycm93IHRoZSBjbGlwcGVkIFZhbHVlIHRvIEhhbGZ3b3JkCi0gICAgICAgICBWU0hSTiAgICBkUmVzdWx0MSxxUmVzdWx0MSwjMTYgCi0gICAgICAgICBWQklUICAgICBkUmVzdWx0MCxkQ29uc3QwLGRaZXJvMCAgCi0gICAgICAgICBWQklUICAgICBkUmVzdWx0MSxkQ29uc3QwLGRaZXJvMSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFZTVDEgICAgIHtkUmVzdWx0MCxkUmVzdWx0MX0sW3BTcmNEc3RdISAgIDsvLyBTdG9yZSB0aGUgcmVzdWx0Ci0gICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjOAotICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdCi0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgQkdUICAgICAgTG9vcAotICAgICAgICAgCi0gICAgICAgICBTVUIgICAgICBwU3JjRHN0LHBTcmNEc3QsIzEyOAotICAgICAgICAgCi0gICAgICAgICA7Ly8gU3RvcmUgdGhlIEludmVyc2UgcXVhbnRpemVkIERjIGNvZWZmaWNpZW50Ci0gICAgICAgICAKLSAgICAgICAgIFNUUkggICAgIHRlbXAsW3BTcmNEc3RdLCMyCi0gICAgICAgIAotICAgICAgICAgTU9WICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgICAKLQotCi0gICAgICAgICBNX0VORAotICAgICAgICAgRU5ESUYKLSAgICAgICAgIAotCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvc3JjL2FybVZDX1ZlcnNpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkzNjgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKLQotI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi1jb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7Ci0jZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwMWYzZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1UaGUgY29udGVudHMgb2YgdGhpcyB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCBieSBIZWRsZXkgRnJhbmNpcwotb2YgQVJNIG9uIDE5LUZlYi0yMDA4LgotCi1JdCBjb250YWlucyB0aGUgQVJNIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGJlbG93LgotCi1UaGlzIGRhdGEsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBpcyBBUk0gUHJvcHJpZXRhcnkgYW5kIGFjY2VzcyB0byBpdAotaXMgc3ViamVjdCB0byB0aGUgYWdyZWVtZW50cyBpbmRpY2F0ZWQgYmVsb3cuCi0KLUlmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhpcyBkYXRhLCBwbGVhc2UgY29udGFjdCBBUk0gc3VwcG9ydAotcXVvdGluZyB0cmFuc2FjdGlvbiByZWZlcmVuY2UgPDk3NDEyPi4KLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi0tIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxCi0gIFZpZGVvIGNvZGVjcyAtIHNhbXBsZSBjb2RlCi0gIFNhbXBsZSBjb2RlIHJlbGVhc2UgZm9yIEhhbnRybyAoVmVyIDEuMC4yKQotICBpbnRlcm5hbCBhY2Nlc3MKLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi1UaGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zIGRlbGl2ZXJhYmxlcyB3aGljaCBhcmUgZGVzaWduYXRlZCBhcyBiZWluZyBvZgotYmV0YSByZWxlYXNlIHN0YXR1cyAoQkVUKS4KLQotQmV0YSByZWxlYXNlIHN0YXR1cyBoYXMgYSBwYXJ0aWN1bGFyIG1lYW5pbmcgdG8gQVJNIG9mIHdoaWNoIHRoZSByZWNpcGllbnQKLW11c3QgYmUgYXdhcmUuIEJldGEgaXMgYSBwcmUtcmVsZWFzZSBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWxpdmVyYWJsZQotc28gZGVzY3JpYmVkIGlzIGJlbGlldmVkIHRvIHJvYnVzdGx5IGRlbW9uc3RyYXRlIHNwZWNpZmllZCBiZWhhdmlvdXIsIHRvIGJlCi1jb25zaXN0ZW50IGFjcm9zcyBpdHMgaW5jbHVkZWQgYXNwZWN0cyBhbmQgYmUgcmVhZHkgZm9yIGdlbmVyYWwgZGVwbG95bWVudC4KLUJ1dCBCZXRhIGFsc28gaW5kaWNhdGVzIHRoYXQgcHJlLXJlbGVhc2UgcmVsaWFiaWxpdHkgdHJpYWxzIGFyZSBvbmdvaW5nIGFuZAotdGhhdCBpdCBpcyBwb3NzaWJsZSByZXNpZHVhbCBkZWZlY3RzIG9yIGVycm9ycyBpbiBvcGVyYXRpb24sIGNvbnNpc3RlbmN5Ci1hbmQgZG9jdW1lbnRhdGlvbiBtYXkgc3RpbGwgYmUgZW5jb3VudGVyZWQuIFRoZSByZWNpcGllbnQgc2hvdWxkIGNvbnNpZGVyCi10aGlzIHBvc2l0aW9uIHdoZW4gdXNpbmcgdGhpcyBCZXRhIG1hdGVyaWFsIHN1cHBsaWVkLiBBUk0gd2lsbCBub3JtYWxseQotYXR0ZW1wdCB0byBwcm92aWRlIGZpeGVzIG9yIGEgd29yay1hcm91bmQgZm9yIGRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUKLXJlY2lwaWVudCwgYnV0IHRoZSBwcm92aXNpb24gb3IgdGltZWxpbmVzcyBvZiB0aGlzIHN1cHBvcnQgY2Fubm90IGJlCi1ndWFyYW50ZWVkLiBBUk0gc2hhbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvciBkaXJlY3Qgb3IgY29uc2VxdWVudGlhbAotZGFtYWdlcyBhcyBhIHJlc3VsdCBvZiBlbmNvdW50ZXJpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVzaWR1YWwgZGVmZWN0cy4KLUJ5IGFjY2VwdGluZyBhIEJldGEgcmVsZWFzZSwgdGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gdGhlc2UgY29uc3RyYWludHMgYW5kCi10byBwcm92aWRpbmcgcmVhc29uYWJsZSBpbmZvcm1hdGlvbiB0byBBUk0gdG8gZW5hYmxlIHRoZSByZXBsaWNhdGlvbiBvZiB0aGUKLWRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUgcmVjaXBpZW50LiBUaGUgc3BlY2lmaWMgQmV0YSB2ZXJzaW9uIHN1cHBsaWVkCi13aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYWZ0ZXIgcmVsZWFzZSBvZiBhIGxhdGVyIG9yIGhpZ2hlciBzdGF0dXMgdmVyc2lvbi4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IFN1cHBvcnQgZm9yIHRoZSBCZXRhIHJlbGVhc2Ugb2YgdGhlIGRlbGl2ZXJhYmxlCi13aWxsIG9ubHkgYmUgcHJvdmlkZWQgYnkgQVJNIHRvIGEgcmVjaXBpZW50IHdobyBoYXMgYSBjdXJyZW50IHN1cHBvcnQgYW5kCi1tYWludGVuYW5jZSBjb250cmFjdCBmb3IgdGhlIGRlbGl2ZXJhYmxlLgotCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotSW4gYWRkaXRpb24gdG8gdGhlIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGFib3ZlLCB0aGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zCi10d28gYWRkaXRpb25hbCBmaWxlcyBhdCB0aGUgdG9wIGxldmVsLgotCi1UaGUgZmlyc3QgaXMgdGhpcyBmaWxlLCBBUk1fREVMSVZFUllfOTc0MTIuVFhULCB3aGljaCBpcyB0aGUgZGVsaXZlcnkKLW5vdGUuCi0KLVRoZSBzZWNvbmQgaXMgQVJNX01BTklGRVNUXzk3NDEyLlRYVCB3aGljaCBjb250YWlucyBhIG1hbmlmZXN0IG9mIGFsbCB0aGUKLWZpbGVzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIHRvZ2V0aGVyIHdpdGggdGhlaXIgY2hlY2tzdW1zLgotCi1UaGUgY2hlY2tzdW1zIHByb3ZpZGVkIGFyZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgotTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobS4KLQotVGhlIGNoZWNrc3VtcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGlzIGRhdGEgdXNpbmcgdGhlCi0ibWQ1c3VtIiB0b29sICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBHTlUgInRleHR1dGlscyIgcGFja2FnZSkgYnkgcnVubmluZzoKLQotICAlIG1kNXN1bSAtLWNoZWNrIEFSTV9NQU5JRkVTVF85NzQxMi5UWFQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTAxYjFlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX01BTklGRVNULlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS8KLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS8KLTg5NzE5MzJkNTZlZWQ2YjFhZDFiYTUwN2YwYmZmNWYwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotZTg4ZWM4NGUxMjI1MzQwOTJiOTBjNjc4NDE1NDlkNmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotNDNjZjQ2YzJjZjJmZTFmOTNjNjE1YjU3YmNiZTQ4MDkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NLmgKLWY4N2ZlZGQ5Y2E0MzJmZWZhNzU3MDA4MTc2ODY0ZWY4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtT01YLmgKLThlNDk4OTlhNDI4ODIyYzM2ZWY5ZGQ5NGUwZTA1ZjE4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXMuaAotYTA2OTgzYWJiMzljNDc2YjA4MWU4N2VhMjcxMzYxYTUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2J1aWxkX3ZjLnBsCi1jMDFmOGI5M2FiNzNkOGMwMGRkZjI0OTlmMDFkYTVmZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvZmlsZWxpc3RfdmMudHh0Ci0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvCi0yNmUyZmYzZjYzMzc2NGViNzIwZGViMzQwOTc4ZGMyZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKLTc5YWEyM2Q5ODE3ZWZkMTFkMGM0YzJiZTM2ZWMxZTVjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTS5jCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy8KLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwLwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjLwotZTQ1Mjk3NzA0ZDcyMzAyZDRhOTQ3ZDA3OThjNjY2ZmIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLTIwNWRmYWZlMWZlN2JiMTYwYmYzNmQyNjAwZTExMDBhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLWJmOTI2NDFlODU0ODU3N2I3N2UwNGUwM2VjMDRjMzU4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYwotZjVlZTZmN2JlODIyZDg3NDcxY2VmM2IxODAxZGJmYzIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKLTI4MTEwYjNhMTNjZWNmNGYyMTZkMTBiY2M3NjFjNDAxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwotOWExYTI1MjQ1Yzk3NWQ2NDFlMWM2Mzc4ODM0YWVhNGQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKLTNhNjQzZWFhYWViMTJlOGQyNzRkYzU5YTczNTdhNTg2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYwotNGM0ZGU1OTczYTZiNzQyNTBjZTkxYWMwYjMxN2E2MTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKLTRlY2RiZTkxOTNhYWJhMWY5YmIwZTI0YzkzOGIzNGY5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCi02NmU5MTJmOGM4OGY2MDE5Y2JhM2VkZTI3MTUwYTQwNyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKLTI2NmRhNDJmNGUzMDE1ZTY3YjJjYmI1ODE2OWQ0MzdmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwotZDkwNTI0N2VlYWE1MmQ0ZTJjZjVmNmJjM2Y2MWIzNDggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCi01YjI5NDQ4ZGIwNDk1Y2QxNzE3YTRiOTI1ZjEzMzc3YyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKLWY2NDUxZGYyN2Y2ZGNjOTkwMzZiNGIxMjUzYzIzYmI2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCi04OTI3ODdkODUwZWVmMDlkYzIxNDhkNDViNDE2YjA2MiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYwotMzNkYTFjMDFhMzFmNDdjMGYzYWVhOWE3YTVlYWE5YmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jCi1lOWZiMTFiMDY2Nzc1MjgzZGNmZWFlOGQxMmE2Yzk3YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwotYWRkOTdiZWMwOGU1ZTFhNTM4YWE4NjA3MTY4ZTYxYmEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwotYjY5NWVjZmM5MTdiMzk0NzBkMWY0MDc3M2I5MjM5NzIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKLTUxYmM1OTZmZDJmZjYxYWQ1NDUwZDcxMzg0NjFmNGExICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYwotZGM2YmFhMGEzODhkYzVlYThmZjY1YzI0YjE3OWU2NzAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0dldFZMQ0luZm8uYwotYTU0OTk5MDI5OTY1NzZmNjcxMjg0OWRiMzRkNWFkNjUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jCi0wYzNiNzY3NDVkNTNlNzRhOGU2NGU4MGRlZjMxZmFiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCi00ZjI3NDJiYTVhM2MyMjA4ZjUzYmMwZjZhNDQzYmUxNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCi1iNGFlMmRjOTQ4ZThjYTY0ODMxZmUzYmJmYmQ4OTUyMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotZTE1MTE4Y2JlMzcyZGI3Y2FkYmEyMjVjOTQ1NmYxODkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYwotNjIzY2YzMzZjZmNlN2QwMTc0ZjRlNTQwNzI0NTZmMzMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKLTg5ZTQ1MmM4MGUzMDM1N2NhZGZiMDRjMDViNmZlMDBjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCi0zYTU1NTFjYzU0ZTg1YmJlMzRmYzk2NmM3ZGMwMGYxYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKLTExNDAzMGZhMGQ4ZjAwYWY2ZDMyODlmNDdhNWU4NWJmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi05ZTM3M2FiMjk2ZmI4NWJiNDU1NjVhNmMzODRmNmVkOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCi0yZDIwMGY3Y2MyMzBmMzAyZGE0OGM1ODlkYTQyYzAyZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYwotZWEzZjFkMWQxNTA3YjU1NjEwYjEzNDljN2I1OTQ2ZTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKLWJkMmJmMTc0M2FlZjJhOTM5NjU0NWVkMDI1MzYyYmUyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKLWNhNjhlODA5NTY3YmY4OTA0NDYzMWI2N2QyMjhjN2NlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotNzdjYWYyYjVjYmVlOTZkMzYwYTkxOWYyN2UxZjE0ZjQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKLTI2MDgxZTM4NGVjNjI3ZmVkYWQ0NzRhMGU3ZGFkODc3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKLTFjODNhZTkyMDdhNTQ5NDQ5MzZmNGE2M2M2NjViZDk5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwotNGMzNmUwNGRiMjAyMDBmNGVjNzJlNWFiYTU3NDQ2ZmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKLWY3NWI3YzVhODBkOGJmMzNlMzE1MzgwZTRlZjBhYjhhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCi00ODg5MjViYjdhZWVhZTBjY2Y5M2VjNDRhZjlmY2UzNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYwotYzkxYTUzNDViNWY4NzdiMzgzMWVkMWFiY2M2MGQ1NzkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCi0zNTUxNWExMTVhMzJmY2FjODQ3OTA3MmE5YTViMGRiOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCi1mZGNmNDYyMmJjNWYwYWU3NWJkYjBhNTFkY2QwMzM5NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKLTc0YzkyNzgxNzc0MDBhMWY3Y2M2ZDc5OWE4YzhhYjM0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYwotNTZhYTJkNTA2ZDBjZmRiNGViZDM2NmMwN2FkYjJkODUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCi0zNmIyMTY1ZmQ0ZDJhN2YzZjNlMWY4ZGFmZjRmOTRlNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwotNGI2YjFiOTMzZmM3YmM4ZjE0YTE4NGMwMmMwMjgwODUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLWNmMGZmMDkzYTliMzcyZGQzMjcxZTNlNWMyODk4NGQ0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYwotOWNjYWQ5Zjg5NGZiZDMyMTk0ZjViNTNkYTIxNzA3MmEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYwotNDk0M2E3YTJkZjdlOWQ3MDA2NzVmOGMxZGViZjRkOTAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCi0yOWU0YTdmMzhmOGMyZTgyNDZlZDc1NmRiMDNjMDEyZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwotMjdiYzY0ZTdjMThkYTBhYWI5Yzk4N2EzODhmNjE2MDggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotODU5MTg1NjE0YmI5ZDAwMTM4NjFlNDU0ZDdiOTE4ZjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS8KLTYzZTNiNjRiOTZjYzQyYTIzNWMwNGYzYTBmOTkxMzE2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyLwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvCi0wYWFlNGY2ODNkODkwM2NiYTk5NTZkMzMwMWVkOWZmZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKLThkNmMxYjQ0OTE1MzI5MTY1ZGY2NDMwODFjYzExYTk3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMKLTA0MzVlY2E5MzBlYWNkYTBmMmE1OWU4NDNkNDA1ZWZmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKLTlhODJkZDBiMWYwNWY3OTg1Njc0MzZhMDA5ZDAyOTY5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCi1lMWUyNDY0NmM0YmQwM2Y1ZGY3ODI5NTQ1MmRkNGViMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYwotNzQ2ZTZiMzM0ZTRhMjZkNGE5YmZhZTZkNzM1ODI2ZjYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYwotOGIxZDg3Yjc0ZDgwZmYxM2ExNjIxNWI2MWQ1ZTUyYmEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKLTMwOTM1OGQzNTdiYWFmYzM4ZDJiMzdiZjFlOTc2OGE5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKLWNjNzdjNzI0MmI1M2MxNTNmOGQwOTUyNzU4M2YyNzcxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCi03Y2Q4ZTc3OTYwMTdlM2RkMDBiNDk0ZDM0ZjYyOWYzZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCi1hNDkwNWNiNWY4ZDRiMjQ0NDU0ZWU0ZjYwZDE4MzU4YiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYwotNTU5NmIzMWU0MzMyMjJjMWU0ODYwZGVlYmZhOThlZjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYwotMzY1ZDA3MmJlNmVhYjIwMWY2ZTA0MDA1OGEzYmFjZmMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYwotNzhlZDIyMTI1ODViMGNjYTc1OTEzYTQ3M2IyZWM0MzAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCi01MGIyZDhkYThmMjBmNmIxZDM5YjhkM2RmMzhhZjU1ZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMKLTRhODUxYTJhZDZkMzU3Y2RjMjMzZDljMGJmNDc1ZTAyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKLTBkNmQ2Mzg3OGYyODI3ZTAwZTVmODViMWU4ZTI2MDE3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi00OGI4NjVhOTgzZmU1YmYzMDc1ZWRkZjY1Mjk1MDcyMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCi01ZjQ4ZmE3OTQxODM1YzQ2YWM3NjdlNjNmYzI5NDAzYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKLWJiYWY0NTRiNjRiMzJiMmM0MmE3NmE3ZWMzOTNkOTc3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ29tcGFyZU1WLmMKLWVlYmZmNzcyZjg3YTQxNDQzNmM1YzUyODZmMmNkMjEzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKLTY1YWUyNDJlYjhjYjZkMTAyNzY3N2M4ZWY4Zjc3Y2EwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCi0xMjU2NDJiMWVhMGMxMjU2ZDc5YWYxZTBkZGVjYWU5MyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCi1jZTI0YmEzZDgzZGE0Y2I3OTE0ODVkMzEyODI2OGJmNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMKLTA5YmMwOWEyZTZmZDk2MmU3MTk5NDQ1ODJlMzhhOGZkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLTZiMGVlN2ExMTY0NzFhNGRhZGJlNWJjOGRiZjQyNWIwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCi0yMTMyMmRjYTAyN2MyODM1M2UzZTdlYjhmMzYyMDA2MiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCi1lZjM1M2Q4MzI0NDI4OGQ4YzM3ZTBmNzAyNDkxNzdjYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYwotNTQxZGU4MjRmOGFlYmU0YTVjYWM2ZjE1ZGE5NDNlZmEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMKLTBiNDBiMTU0YjU5MWM3Zjg4NDJjZmZlNDA0MmQxN2M1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLTJmZmNlYzg4ZDNmY2IzNzI1NDNhOGY0NTA4ZWExYWM2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKLWUwNmQ4NWNhMDAwYWZjYmI1MDU4MGY5OGYwMjAzYWM4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwotYWU4MmI2ZmNmY2Y3MzFhNjFkNzBlMWFhNDJlNjI3N2EgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYwotMWQwNDM5NWUyMzFiNTk3NTYyMjU3ZTk4Y2RhNmNmYjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotNzJjMGEzNjMyN2I2YjliNDM2ZDNiY2U3Yzg5NmM1MjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCi0xYjY1YWE3ZjMxMTEyNGVhNmZiNDdlMzg0ZWMwNmE1MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCi03MTQ5NTcxMDRhNmVmNzEzNDFmYmU2YTllYzY1YzEzNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXIuYwotODY0OTNmMGVlODUzZjY1MzM1NGE3Mzg5ZjE3MjdmNzMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCi01ZGU4YWZjZmIzMDUyOTY4Nzk0NzgyYTdjM2EwYjQxYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCi01MGJjYzIyOGNjNjYwZGJkYTAzNzcyNTMwOWRlM2Y4YiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCi00ZjVjZmExZWNjNjY4OTEzZGRlOTRlM2NhZjk3YTJlMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jCi1jMmVjODA0ZGRmNjRlZTg0MTE0NmUzOWMzYTc4MzQ1MSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCi00MDg3ZjZhODI3OTEyZWU1YjQ1ZWQ0MjE3ZjFhNmQ3NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS8KLTVjNzExNzAyZGRkY2VjODUyOTgwMDM4NjBkNzYwY2VjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKLTFiOTJjOTRiNzg1YzAzZWM3NmQ0ZmFlMmYyYmJkYjhhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi1hZDljNjk4NmQyYTMyMDBkZDVlMWY2MTAzYTU0YTk5YiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvCi1lNjI3YjMzNDZiMGRjOWFmZjE0NDQ2MDA1Y2UwZmE0MyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpLwotN2NhOTRiMWMzM2FjMDIxMWUxN2QzOGJhYWRkN2QxZGQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQy5oCi0xMmNmNzU5NmVkYmJmNjA0OGI2MjZkMTVlOGQwZWQ0OCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDLmgKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy8KLTNhNmRmMDA4NTczNmNiY2JlMmUzZjQ1ZDA4YWY0MjIxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCi0wYmYzY2I1Mjg2M2M4MjliMjhjMDM1MjgzNTE3MDIxMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYwotNTM4YjYyZjUxMGI1YThiZGNlZDRhMzlmYTEyZDlhMjMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKLTY2OTkzZWRkOWQ0NDFiZjNiNWI2YzkxMmY2NDAwYjZlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCi04ZTUyNmE5MDA3ZWIwZDQzZWJmMzYyYzQ5OGIzNzQxNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwotODdmOGYyNmU2ZTkxNzhkZjBhYjc0MTkzMzRkNWEzZGIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKLTFhODU3NzY0NjEzMmFkOWI2M2ExNDc3ZmRhZWMyNDY0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwotNDg1MjljNGY3MGM3ZTk1NGU4MzJlZWNlMWFlZTU3YmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYwotMjUyOTc3NzY0ZDRmMzgyODJiNmE1NmM1OWNjZjRmMDkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYwotY2M3OGNmYWVkOTUwMmMyZTAyODJjOTFmYjk1ZWVhYzQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKLWU0Njg3NTFjMTVhNTgxZWJkMjJkYTAzMWUyMjExN2QxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKLTNmNDQ4ZDE5MWVhZWI4MmVjYjdlMjdlZjhiYTI3ODc1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKLWIxMjkxYzMwNzgwODYzMWZhODMzNjg0YWJiOWMzNGNlICBBUk1fREVMSVZFUllfOTc0MTIuVFhUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDQ4NjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqICAgCi0gKiBGaWxlOiBhcm1DT01NLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqCi0gKi8KLSAKLSAgCi0jaWZuZGVmIF9hcm1Db21tb25fSF8KLSNkZWZpbmUgX2FybUNvbW1vbl9IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0gICAgICAgIAotfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0gICAgICAgIAotfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KLXR5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOwotCi0KLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDb21waWxlciBleHRlbnNpb25zICovCi0jaWZkZWYgQVJNX0RFQlVHCi0vKiBkZWJ1ZyB2ZXJzaW9uICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9Ci0jZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KLSNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQotI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCi0jZWxzZSAKLS8qIHJlbGVhc2UgdmVyc2lvbiAqLwotI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKLSNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKLSNlbmRpZiAvKiBBUk1fREVCVUcgKi8KLQotLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLSNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCi0jZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQotI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKLQotLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLwotCi0jZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludHB0cl90KVB0cikmKE4tMSkpIC8gc2l6ZW9mKCpQdHIpICkpCi0jZGVmaW5lIGFybUFsaWduVG8yQnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDIpCi0jZGVmaW5lIGFybUFsaWduVG80Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDQpCi0jZGVmaW5lIGFybUFsaWduVG84Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDgpCi0jZGVmaW5lIGFybUFsaWduVG8xNkJ5dGVzKFB0cikgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDE2KQotCi0vKiBFcnJvciBhbmQgQWxpZ25tZW50IGNoZWNrICovCi0KLSNkZWZpbmUgYXJtUmV0QXJnRXJySWYoY29uZGl0aW9uLCBjb2RlKSAgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KLSNkZWZpbmUgYXJtUmV0RGF0YUVycklmKGNvbmRpdGlvbiwgY29kZSkgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KLQotI2lmbmRlZiBBTElHTk1FTlRfRE9FU05UX01BVFRFUgotI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKCgoKGludHB0cl90KShQdHIpKSAlIE4pPT0wKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKCgoKGludHB0cl90KShQdHIpKSAlIE4pIT0wKQotI2Vsc2UKLSNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCi0jZW5kaWYKLQotI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCi0jZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQotI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCi0KLSNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQotI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCi0jZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKLSNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotIAotT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcAotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtQ2xpcCAoCi0gICAgICAgIE9NWF9JTlQgbWluLAotICAgICAgICBPTVhfSU5UIG1heCwgCi0gICAgICAgIE9NWF9TMzIgc3JjCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXBfRjMyCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX0YzMiBhcm1DbGlwX0YzMiAoCi0gICAgICAgIE9NWF9GMzIgbWluLAotICAgICAgICBPTVhfRjMyIG1heCwgCi0gICAgICAgIE9NWF9GMzIgc3JjCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKLSAgICAgICAgT01YX0YzMiB2LCAKLSAgICAgICAgT01YX0lOVCBzaGlmdCwgCi0gICAgICAgIE9NWF9JTlQgc2F0Qml0cwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCi0gKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCi0gKi8KLU9NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQotICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQotICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1NZWRpYW5PZjMgKAotICAgIE9NWF9TMzIgZkVudHJ5LAotICAgIE9NWF9TMzIgc0VudHJ5LCAKLSAgICBPTVhfUzMyIHRFbnRyeSAKLSAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTggYXJtTG9nU2l6ZSAoCi0gICAgT01YX1UxNiB2YWx1ZSAKLSAgICApOyAgICAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRBZGRfUzMyKAotICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoCi0gICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKLSAgICAgICAgICAgICAgICApOwotCi0vKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQotICogCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFN1Yl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYwotICoKLSAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAotICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCi0gKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCi0gKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIERlYnVnZ2luZyBtYWNyb3MKLSAqCi0gKi8KLQotCi0vKgotICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKLSAqLwotI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0Ci0KLS8qCi0gKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCi0gKiBBZGQgbW9yZSBpZiBuZWVkZWQuCi0gKi8KLSNpZmRlZiBERUJVR19PTgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQotI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQotI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQotI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQotI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQotI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKLSNlbHNlIC8qIERFQlVHX09OICovCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCi0jZW5kaWYgLyogREVCVUdfT04gKi8KLQotCi0vKgotICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCi0gKgotICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCi0gKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCi0gKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KLSAqLwotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0FDCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0Ci0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9WQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lDCi0vKiBUbyBiZSBmaWxsZWQgaW4gKi8KLSNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX1NQCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fSVAKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUwotI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCi0KLQotI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KLQotLypFbmQgb2YgRmlsZSovCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZiNjZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiBhcm1DT01NX0JpdHN0cmVhbS5oCi0gKiBCcmllZjogRGVjbGFyZXMgY29tbW9uIEFQSSdzL0RhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NYXggRW5jb2RlcnMvRGVjb2RlcnMuCi0gKgotICovCi0KLSNpZm5kZWYgX2FybUNvZGVjX0hfCi0jZGVmaW5lIF9hcm1Db2RlY19IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9VOCAgIGNvZGVMZW47Ci0gICAgT01YX1UzMgkgY29kZVdvcmQ7Ci19IEFSTV9WTEMzMjsKLQotLyogVGhlIGFib3ZlIHNob3VsZCBiZSByZW5hbWVkIGFzICJBUk1fVkxDMzIiICovCi0KLS8qKgotICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLi4zMgotICoKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotICogICAgCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4zMgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0gCi1PTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KTsKLQotLyoqIAotICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLQotT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQotICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCi0gKiBwb2ludGVkIGJ5IHBDb2RlQm9vawotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIHBDb2RlQm9vawotICogCi0gKiBbb3V0XSAgICAqKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAotICogICAgICAgICA6ICJBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAweEZGRkYiIGlmIHNlYXJjaCBmYWlscy4KLSAqKi8KLQotI2RlZmluZSBBUk1fTk9fQ09ERUJPT0tfSU5ERVggKE9NWF9VMTYpKDB4RkZGRikKLQotT01YX1UxNiBhcm1VblBhY2tWTEMzMigKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCi0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwT2Zmc2V0CSAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQljb2RlV29yZAkJQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqIFtpbl0JY29kZUxlbmd0aAkJTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrQml0cyAoCi0gICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIE9NWF9VMzIgY29kZVdvcmQsIAotICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKLSk7Ci0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIEFSTV9WTEMzMiBjb2RlIAotKTsKLQotI2VuZGlmICAgICAgLypfYXJtQ29kZWNfSF8qLwotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OWE0NTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLwotI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0jZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KLQotCi0vKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCi0jZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KLSNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCi0jZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKLQotLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KLSNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKLQotCi0vKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLwotI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCi0KLQotLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCi0vKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLwotCi0vKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLwotI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCi0KLS8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQU5TSSBDIgotCi0vKiBUaGUgQVJNIFRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KLSNkZWZpbmUgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gICAgIkFSTSBSVkNUIDMuMSIKLQotCi0jZW5kaWYgLyogX19BUk1fQ09NTV9WRVJTSU9OX0hfXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybU9NWC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2MwYzI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybU9NWC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1PTVhfUmVsZWFzZVZlcnNpb24uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIFRoaXMgZmlsZSBhbGxvd3MgYSB2ZXJzaW9uIG9mIHRoZSBPTVggREwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IHdoZXJlIHNvbWUgb3IKLSAqIGFsbCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGdpdmVuIGEgdXNlciBzcGVjaWZpZWQgc3VmZml4LiAKLSAqCi0gKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgaXQgd2hlcmU6Ci0gKgotICogLSB5b3Ugd2FudCB0byByZW5hbWUgYSBmdW5jdGlvbiAib3V0IG9mIHRoZSB3YXkiIHNvIHRoYXQgeW91IGNvdWxkIHJlcGxhY2UKLSAqICAgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gKHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdvdWxkIHN0aWxsIGJlCi0gKiAgIGluIHRoZSBsaWJyYXJ5IGp1c3Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lIC0gc28geW91IGNvdWxkIGRlYnVnIHRoZSBuZXcKLSAqICAgdmVyc2lvbiBieSBjb21wYXJpbmcgaXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgb2xkKQotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHZlcnNpb25zIHdpdGggYSBzdWZmaXggc28gdGhhdCAKLSAqICAgeW91IGNhbiBpbmNsdWRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBhbmQgY2hvb3NlIGJldHdlZW4gZnVuY3Rpb25zCi0gKiAgIGF0IHJ1bnRpbWUuCi0gKgotICogICAgIGUuZy4gb214SVBCTV9Db3B5X1U4X0MxUiBjb3VsZCBiZSByZW5hbWVkIG9teElQQk1fQ29weV9VOF9DMVJfQ29ydGV4QTgKLSAqIAotICovCi0KLSAgCi0jaWZuZGVmIF9hcm1PTVhfSF8KLSNkZWZpbmUgX2FybU9NWF9IXwotCi0KLS8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgaW4gb3JkZXIgdG8gZXhwYW5kIGFuZCBjb25jYXRlbmF0ZSB0aGUgbmFtZXMgKi8KLSNkZWZpbmUgT01YQ0FUMkJBUihBLCBCKSBvbXggIyMgQSAjIyBCCi0jZGVmaW5lIE9NWENBVEJBUihBLCBCKSBPTVhDQVQyQkFSKEEsIEIpCi0KLS8qIERlZmluZSB0aGUgc3VmZml4IHRvIGFkZCB0byBhbGwgZnVuY3Rpb25zIC0gdGhlIGRlZmF1bHQgaXMgbm8gc3VmZml4ICovCi0jZGVmaW5lIEJBUkVfU1VGRklYIAotCi0KLQotLyogRGVmaW5lIHdoYXQgaGFwcGVucyB0byB0aGUgYmFyZSBzdWZmaXgtbGVzcyBmdW5jdGlvbnMsIGRvd24gdG8gdGhlIHN1Yi1kb21haW4gYWNjdXJhY3kgKi8KLSNkZWZpbmUgT01YQUNBQUNfU1VGRklYICAgIEJBUkVfU1VGRklYICAgCi0jZGVmaW5lIE9NWEFDTVAzX1NVRkZJWCAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJQ0pQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBCTV9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQ1NfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUFBQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YU1BfU1VGRklYICAgICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDQ09NTV9TVUZGSVggICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ000UDEwX1NVRkZJWCAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAyX1NVRkZJWCAgIEJBUkVfU1VGRklYCi0KLQotCi0KLS8qIERlZmluZSB3aGF0IHRoZSBlYWNoIGJhcmUsIHVuLXN1ZmZpeGVkIE9wZW5NQVggQVBJIGZ1bmN0aW9uIG5hbWVzIGlzIHRvIGJlIHJlbmFtZWQgKi8KLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlRGF0U3RyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRGF0U3RyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUZpbGxFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUZpbGxFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZVByZ0NmZ0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVByZ0NmZ0VsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0VuY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0VuY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0kgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTURDVEZ3ZF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEZ3ZF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTURDVEludl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEludl9TMzJfUzE2LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX05vaXNlbGVzc0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX05vaXNlbGVzc0RlY29kZSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19RdWFudEludl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19RdWFudEludl9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRElGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRElGSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotCi0KLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZV9TMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZV9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfTURDVEludl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfTURDVEludl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZV9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZV9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2LCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTaWRlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTaWRlSW5mbywgT01YQUNNUDNfU1VGRklYKQotCi0jZGVmaW5lIG9teElDSlBfQ29weUV4cGFuZF9VOF9DMyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfQ29weUV4cGFuZF9VOF9DMywgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENURndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENURndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQotCi0jZGVmaW5lIG9teElQQk1fQWRkQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQWRkQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DM1IsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX01pcnJvcl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX01pcnJvcl9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX011bENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX011bENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiAgICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0ZpbHRlckZJUl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlckZJUl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50R2V0U3RhdGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50R2V0U3RhdGVTaXplLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRJbml0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DM1IsIE9NWElQUFBfU1VGRklYKQotCi0jZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQ29weV9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQ29weV9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRG90UHJvZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRG90UHJvZF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV84eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaywgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5MTZ4MTYsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db3B5OHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5OHg4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fRXhwYW5kRnJhbWVfSSwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0xpbWl0TVZUb1JlY3QsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9TQURfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQotCi0jZGVmaW5lIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQXZlcmFnZV80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrTHVtYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgT01YQ0FUQkFSKFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0dldFZMQ0luZm8sIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FSW5pdCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfMTZ4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzh4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQVREXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQVREXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVBhZE1WX1BWT1AsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlTVYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRmluZE1WcHJlZCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0lEQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NQ1JlY29uQmxvY2ssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUluaXQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLCBPTVhWQ000UDJfU1VGRklYKQotCi0KLSNlbmRpZiAvKiBfYXJtT01YX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyY2IwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKgotICogRmlsZTogb214dHlwZXMuaAotICogQnJpZWY6IERlZmluZXMgYmFzaWMgRGF0YSB0eXBlcyB1c2VkIGluIE9wZW5NQVggdjEuMC4yIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqCi0gKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKLSAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCi0gKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCi0gKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAotICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAotICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAotICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCi0gKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKLSAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAotICoKLSAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAotICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCi0gKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKLSAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKLSAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAotICogbWF0ZXJpYWxzLgotICogCi0gKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKgotICovCi0gIAotI2lmbmRlZiBfT01YVFlQRVNfSF8KLSNkZWZpbmUgX09NWFRZUEVTX0hfCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4gCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNkZWZpbmUgT01YX0lOCi0jZGVmaW5lIE9NWF9PVVQKLSNkZWZpbmUgT01YX0lOT1VUCi0KLQotdHlwZWRlZiBlbnVtIHsKLSAgICAKLSAgICAvKiBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAqLwotICAgIE9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgID0gIDAsICAgIC8qIE5vIGVycm9yLCB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLwotICAgIE9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgID0gLTIsICAgIC8qIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgKi8gICAgCi0gICAgT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgPSAtMTgyLCAgLyogSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgKi8gICAgCi0gICAgT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgPSAtOSwgICAgLyogTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uICovCi0gICAgT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgPSAtMTU5LCAgLyogQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAqLwotICAgIE9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgID0gLTE2NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgKi8KLSAgICBPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICA9IC0xNjMsICAvKiBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICovICAgICAKLSAgICBPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICA9IC0xNjIsICAvKiBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAqLyAgICAKLQlPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICA9IC0xNjAsICAvKiBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yICovCi0KLSAgICAvKiBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uKi8KLSAgICBPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICA9IC01LCAgICAvKiBCYWQgQXJndW1lbnRzICovCi0KLSAgICBPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICA9IC0xNTcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAqLwotICAgIE9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgID0gLTE1NiwgIC8qIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgKi8gICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICA9IC0xNTUsICAvKiBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgKi8gICAgICAgICAgICAgICAgICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICA9IC0xNTQsICAvKiBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLwotICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgID0gLTE1MywgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8gICAgICAgICAgICAgICAgICAKLSAgICBPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICA9IC0xNTIsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICovICAKLQotICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgID0gLTE4MywgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgID0gLTE4MSwgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgPSAtMTcsICAgLyogQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uICovCi0KLSAgICBPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICA9IC0xODAsICAvKiBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgKi8KLQotICAgIE9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgID0gSU5UX01BWCAgLypQbGFjZWhvbGRlciwgZm9yY2VzIGVudW0gb2Ygc2l6ZSBPTVhfSU5UKi8KLSAgICAKLSB9IE9NWFJlc3VsdDsgICAgICAgICAgLyoqIFJldHVybiB2YWx1ZSBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24uIElkZW50aWNhbCB0byBPTVhfSU5UICovCi0KLSAKLS8qIE9NWF9VOCAqLwotdHlwZWRlZiB1aW50OF90IE9NWF9VODsKLSAKLS8qIE9NWF9TOCAqLwotdHlwZWRlZiBpbnQ4X3QgT01YX1M4OwotIAotLyogT01YX1UxNiAqLwotdHlwZWRlZiB1aW50MTZfdCBPTVhfVTE2OwotCi0vKiBPTVhfUzE2ICovCi10eXBlZGVmIGludDE2X3QgT01YX1MxNjsKLQotLyogT01YX1UzMiAqLwotdHlwZWRlZiB1aW50MzJfdCBPTVhfVTMyOwotCi0vKiBPTVhfUzMyICovCi10eXBlZGVmIGludDMyX3QgT01YX1MzMjsKLQotLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KLSNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKLSAgICB0eXBlZGVmIF9faW50NjQgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMGk2NCkKLSAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMGk2NCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKLSNlbHNlCi0gICAgdHlwZWRlZiBpbnQ2NF90IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVpbnQ2NF90IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQotICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCi0jZW5kaWYKLQotLyogT01YX1NDOCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M4IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TOCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0M4OyAvKiogU2lnbmVkIDgtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMTYgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMTYgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MxNiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MxNjsgLyoqIFNpZ25lZCAxNi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0MzMiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1MzMiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzMyOyAvKiogU2lnbmVkIDMyLWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzY0ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDNjQ7IC8qKiBTaWduZWQgNjQtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX0YzMiAqLwotdHlwZWRlZiBmbG9hdCBPTVhfRjMyOyAvKiogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9GNjQgKi8KLXR5cGVkZWYgZG91YmxlIE9NWF9GNjQ7IC8qKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCi0KLQotLyogT01YX0lOVCAqLwotdHlwZWRlZiBpbnQgT01YX0lOVDsgLyoqIHNpZ25lZCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gbWFjaGluZSB3b3JkIGxlbmd0aCwgaGFzIG1heGltdW0gc2lnbmVkIHZhbHVlIElOVF9NQVgqLwotCi0KLSNkZWZpbmUgT01YX01JTl9TOCAgCSAgIAkoLTEyOCkKLSNkZWZpbmUgT01YX01JTl9VOCAgCQkwCi0jZGVmaW5lIE9NWF9NSU5fUzE2CQkgCSgtMzI3NjgpCi0jZGVmaW5lIE9NWF9NSU5fVTE2CQkJMAotI2RlZmluZSBPTVhfTUlOX1MzMgkJCSgtMjE0NzQ4MzY0Ny0xKQotI2RlZmluZSBPTVhfTUlOX1UzMgkJCTAKLQotI2RlZmluZSBPTVhfTUFYX1M4CQkJKDEyNykKLSNkZWZpbmUgT01YX01BWF9VOAkJCSgyNTUpCi0jZGVmaW5lIE9NWF9NQVhfUzE2CQkJKDMyNzY3KQotI2RlZmluZSBPTVhfTUFYX1UxNgkJCSgweEZGRkYpCi0jZGVmaW5lIE9NWF9NQVhfUzMyCQkJKDIxNDc0ODM2NDcpCi0jZGVmaW5lIE9NWF9NQVhfVTMyCQkJKDB4RkZGRkZGRkYpCi0KLXR5cGVkZWYgdm9pZCBPTVhWb2lkOwotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAoKHZvaWQqKTApCi0jZW5kaWYKLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBhIHJlY3RhbmdsZSwgCi0gICogd2hlcmUgeCx5IGRlZmluZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIKLSAgKiBvZiB0aGUgcmVjdGFuZ2xlLCB3aXRoIGRpbWVuc2lvbnMgd2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uIAotICAqIGFuZCBoZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JT01YX0lOVCB4OyAgICAgIC8qKiB4LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLwotCU9NWF9JTlQgeTsgICAgICAvKiogeS1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbi4gKi8KLQlPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24uICovCi19T01YUmVjdDsKLQotCi0vKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIG9mIGEgcG9pbnQsICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSBPTVhfSU5UIHg7IC8qKiB4LWNvb3JkaW5hdGUgKi8KLSBPTVhfSU5UIHk7CS8qKiB5LWNvb3JkaW5hdGUgKi8KLQkKLX0gT01YUG9pbnQ7Ci0KLQotLyoqIERlZmluZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSByZWN0YW5nbGUsIG9yIHJlZ2lvbiBvZiBpbnRlcmVzdCBpbiBhbiBpbWFnZSAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeC1kaXJlY3Rpb24gKi8KLSBPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KLQkKLX0gT01YU2l6ZTsKLQotI2VuZGlmIC8qIF9PTVhUWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9idWlsZF92Yy5wbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYnVpbGRfdmMucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1OWNkZWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9idWlsZF92Yy5wbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0jIS91c3IvYmluL3BlcmwKLSMKLSMgCi0jIEZpbGUgTmFtZTogIGJ1aWxkX3ZjLnBsCi0jIE9wZW5NQVggREw6IHYxLjAuMgotIyBSZXZpc2lvbjogICA5NjQxCi0jIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0jIAotIyAKLSMgCi0jCi0jIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KLSMKLQotdXNlIEZpbGU6OlNwZWM7Ci11c2Ugc3RyaWN0OwotCi1teSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOwotCi0kQ0MgICAgICAgPSAnYXJtY2MnOwotJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk03VERNSSAtYyc7Ci0kQVMgICAgICAgPSAnYXJtYXNtJzsKLSRBU19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQVJNN1RETUknOwotIyAkTElCICAgICAgPSAnYXJtbGluayc7Ci0jICRMSUJfT1BUUyA9ICctLXBhcnRpYWwgLW8nOwotIyAkTElCX1RZUEUgPSAnLm8nOwotJExJQiAgICAgID0gJ2FybWFyJzsKLSRMSUJfT1BUUyA9ICctLWNyZWF0ZSAtcic7Ci0kTElCX1RZUEUgPSAnLmEnOwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW15IChAaGVhZGVybGlzdCwgQGZpbGVsaXN0LCAkaGQsICRmaWxlLCAkb2ZpbGUsICRjb21tYW5kLCAkb2JqbGlzdCwgJGxpYmZpbGUsICRoKTsKLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBpbmNsdWRlZCBoZWFkZXIgZmlsZXMuCi1AaGVhZGVybGlzdCA9IHF3KGFwaSB2Yy9hcGkgdmMvbTRwMi9hcGkgdmMvbTRwMTAvYXBpKTsKLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCi1vcGVuKEZJTEVTLCAnPGZpbGVsaXN0X3ZjLnR4dCcpIG9yIGRpZSgiQ2FuJ3Qgb3BlbiBzb3VyY2UgZmlsZSBsaXN0XG4iKTsKLUBmaWxlbGlzdCA9IDxGSUxFUz47Ci1jbG9zZShGSUxFUyk7Ci0KLSMgRml4IHRoZSBmaWxlIHNlcGFyYXRvcnMgaW4gdGhlIGhlYWRlciBwYXRocwotZm9yZWFjaCAkaCAoQGhlYWRlcmxpc3QpCi17Ci0gICAgICAgICRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRoKTsKLX0KLQotIyBDcmVhdGUgdGhlIGluY2x1ZGUgcGF0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCi0kaGQgPSAnLUknIC4gam9pbignIC1JJywgQGhlYWRlcmxpc3QpOwotCi0jIENyZWF0ZSB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgIi9saWIvIiBhbmQgIi9vYmovIiAoaWYgdGhleSBhcmUgbm90IHRoZXJlIGFscmVhZHkpCi1ta2RpciAib2JqIiwgMDc3NyBpZiAoISAtZCAib2JqIik7Ci1ta2RpciAibGliIiwgMDc3NyBpZiAoISAtZCAibGliIik7Ci0KLSRvYmpsaXN0ID0gJyc7Ci0KLSMgQ29tcGlsZSBlYWNoIGZpbGUKLWZvcmVhY2ggJGZpbGUgKEBmaWxlbGlzdCkKLXsKLQlteSAkZjsKLQlteSAkYmFzZTsKLQlteSAkZXh0OwotCW15ICRvYmpmaWxlOwotCi0JY2hvbXAoJGZpbGUpOwotCSRmaWxlID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRmaWxlKTsKLQotCSh1bmRlZiwgdW5kZWYsICRmKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCgkZmlsZSk7Ci0JaWYoKCRiYXNlLCAkZXh0KSA9ICRmID1+IC8oLispXC4oXHcpJC8pCi0JewotCQkkb2JqZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ29iaicsICRiYXNlLicubycpOwotCi0JCWlmKCRleHQgZXEgJ2MnKQotCQl7Ci0JCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKLQkJCSRjb21tYW5kID0gJENDLicgJy4kQ0NfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7Ci0JCQlwcmludCAiJGNvbW1hbmRcbiI7Ci0JCQlzeXN0ZW0oJGNvbW1hbmQpOwotCQl9Ci0JCWVsc2lmKCRleHQgZXEgJ3MnKQotCQl7Ci0JCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKLQkJCSRjb21tYW5kID0gJEFTLicgJy4kQVNfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7Ci0JCQlwcmludCAiJGNvbW1hbmRcbiI7Ci0JCQlzeXN0ZW0oJGNvbW1hbmQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJpbnQgIklnbm9yaW5nIGZpbGU6ICRmXG4iOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWRpZSAiTm8gZmlsZSBleHRlbnNpb24gZm91bmQ6ICRmXG4iOwotCX0KLX0KLQotIyBEbyB0aGUgZmluYWwgbGluayBzdGFnZSB0byBjcmVhdGUgdGhlIGxpYnJhcmllcy4KLSRsaWJmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnbGliJywgJ29teFZDJy4kTElCX1RZUEUpOwotJGNvbW1hbmQgPSAkTElCLicgJy4kTElCX09QVFMuJyAnLiRsaWJmaWxlLicgJy4kb2JqbGlzdDsKLXByaW50ICIkY29tbWFuZFxuIjsKLShzeXN0ZW0oJGNvbW1hbmQpID09IDApIGFuZCBwcmludCAiQnVpbGQgc3VjY2Vzc2Z1bFxuIjsKLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2ZpbGVsaXN0X3ZjLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmMzRhYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2ZpbGVsaXN0X3ZjLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0uL2FwaS9hcm1DT01NLmgKLS4vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKLS4vYXBpL2FybUNPTU1fVmVyc2lvbi5oCi0uL2FwaS9hcm1PTVhfUmVsZWFzZVZlcnNpb24uaAotLi9hcGkvb214dHlwZXMuaAotLi9zcmMvYXJtQ09NTS5jCi0uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCi0uL3ZjL2FwaS9hcm1WQy5oCi0uL3ZjL2FwaS9vbXhWQy5oCi0uL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKLS4vdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCi0uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaAotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ29tcGFyZU1WLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXIuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMKLS4vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkYmY0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU0uYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlZmluZXMgQ29tbW9uIEFQSXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncwotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIE1pc2NlbGxhbmVvdXMgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlICs9IDAuNTsKLSAgICAgICAgCi0gICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMTYpT01YX01BWF9TMTYgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gMC41OwotCi0gICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMTYpT01YX01JTl9TMTYgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgVmFsdWUgKz0gMC41OwotICAgICAgICAKLSAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MzMilPTVhfTUFYX1MzMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUFYX1MzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAwLjU7Ci0KLSAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MzMilPTVhfTUlOX1MzMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUlOX1MzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIFZhbHVlICs9IDAuNTsKLSAgICAKLSAgICBpZihWYWx1ZSA+IChPTVhfVTE2KU9NWF9NQVhfVTE2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UxNilPTVhfTUFYX1UxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTE2KVZhbHVlOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIFZhbHVlICs9IDAuNTsKLSAgICAKLSAgICBpZihWYWx1ZSA+IChPTVhfVTMyKU9NWF9NQVhfVTMyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMilPTVhfTUFYX1UzMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTMyKVZhbHVlOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzY0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIDY0IGJpdCBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzY0IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNpZ25DaGVjawotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6Ci0gKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKi8gCi0KLU9NWF9JTlQgYXJtU2lnbkNoZWNrICgKLSAgICBPTVhfUzE2IHZhcgotKQotCi17Ci0gICAgT01YX0lOVCBTaWduOwotICAgIAotICAgIGlmICh2YXIgPCAwKQotICAgIHsKLSAgICAgICAgU2lnbiA9IC0xOwotICAgIH0KLSAgICBlbHNlIGlmICggdmFyID4gMCkKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTaWduID0gMDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFNpZ247Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXAKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybUNsaXAgKAotICAgIE9NWF9JTlQgbWluLAotICAgIE9NWF9JTlQgbWF4LCAKLSAgICBPTVhfUzMyIHNyYyAKLSkKLSAKLXsKLSAgICBpZiAoc3JjID4gbWF4KQotICAgIHsKLSAgICAgICAgc3JjID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChzcmMgPCBtaW4pCi0gICAgewotICAgICAgICBzcmMgPSBtaW47Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzcmM7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXBfRjMyCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX0YzMiBhcm1DbGlwX0YzMiAoCi0gICAgT01YX0YzMiBtaW4sCi0gICAgT01YX0YzMiBtYXgsIAotICAgIE9NWF9GMzIgc3JjIAotKQotIAotewotICAgIGlmIChzcmMgPiBtYXgpCi0gICAgewotICAgICAgICBzcmMgPSBtYXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1pbjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNyYzsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCi0gKgotICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKLSAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCi0gKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKLSAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAotICogdmFsdWUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgotICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKLSAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKE9NWF9GMzIgdiwgT01YX0lOVCBzaGlmdCwgT01YX0lOVCBzYXRCaXRzKSAKLXsKLSAgICBPTVhfVTMyIGFsbE9uZXMgPSAoT01YX1UzMikoLTEpOwotICAgIE9NWF9VMzIgbWF4ViA9IGFsbE9uZXMgPj4gKDMyLXNhdEJpdHMpOwotICAgIE9NWF9GMzIgdlNoaWZ0ZWQsIHZSb3VuZGVkLCBzaGlmdERpdiA9IChPTVhfRjMyKSgxIDw8IHNoaWZ0KTsKLSAgICBPTVhfVTMyIHZJbnQ7Ci0gICAgT01YX1UzMiB2SW50U2F0OwotICAgIAotICAgIGlmKHYgPD0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgdlNoaWZ0ZWQgPSB2IC8gc2hpZnREaXY7Ci0gICAgdlJvdW5kZWQgPSAoT01YX0YzMikodlNoaWZ0ZWQgKyAwLjUpOwotICAgIHZJbnQgPSAoT01YX1UzMil2Um91bmRlZDsKLSAgICB2SW50U2F0ID0gdkludDsKLSAgICBpZih2SW50U2F0ID4gbWF4VikgCi0gICAgICAgIHZJbnRTYXQgPSBtYXhWOwotICAgIHJldHVybiB2SW50U2F0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoZXNlIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgotICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgotICovCi1PTVhSZXN1bHQgYXJtU3dhcEVsZW0oCi0gICAgICAgIE9NWF9VOCAqcEJ1ZjEsCi0gICAgICAgIE9NWF9VOCAqcEJ1ZjIsCi0gICAgICAgIE9NWF9JTlQgZWxlbVNpemUKLSAgICAgICApCi17Ci0gICAgT01YX0lOVCBpOwotICAgIE9NWF9VOCB0ZW1wOwotICAgIGFybVJldEFyZ0VycklmKCFwQnVmMSB8fCAhcEJ1ZjIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBmb3IoaSA9IDA7IGkgPCBlbGVtU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgdGVtcCA9ICoocEJ1ZjEgKyBpKTsKLSAgICAgICAgKihwQnVmMSArIGkpID0gKihwQnVmMiArIGkpOwotICAgICAgICAqKHBCdWYyICsgaSkgPSB0ZW1wOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKLSAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKLSAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtTWVkaWFuT2YzICgKLSAgICBPTVhfUzMyIGZFbnRyeSwKLSAgICBPTVhfUzMyIHNFbnRyeSwgCi0gICAgT01YX1MzMiB0RW50cnkgCi0pCi17Ci0gICAgT01YX1MzMiBhLCBiLCBjOwotICAgIAotICAgIGEgPSBhcm1NaW4gKGZFbnRyeSwgc0VudHJ5KTsKLSAgICBiID0gYXJtTWF4IChmRW50cnksIHNFbnRyeSk7Ci0gICAgYyA9IGFybU1pbiAoYiwgdEVudHJ5KTsKLSAgICByZXR1cm4gKGFybU1heCAoYSwgYykpOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9VOCAtLSAgICAgUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHBvc2l0aXZlIHZhbHVlLiAKLSAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc21hbGxlc3Qgaz49MCBzdWNoIHRoYXQgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gKDE8PGspLgotICovIAotIAotT01YX1U4IGFybUxvZ1NpemUgKAotICAgIE9NWF9VMTYgdmFsdWUgCi0pCi17Ci0gICAgT01YX1U4IGk7ICAgIAotICAgIGZvciAoIGkgPSAwOyB2YWx1ZSA+IDA7IHZhbHVlID0gdmFsdWUgPj4gMSkgCi0gICAgewotICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRBZGRfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKLSAgICB7Ci0gICAgICAgIC8qU2FtZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0QWRkX1M2NChPTVhfUzY0IFZhbHVlMSxPTVhfUzY0IFZhbHVlMikKLXsKLSAgICBPTVhfUzY0IFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCi0gICAgewotICAgICAgICAvKlNhbWUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgUmVzdWx0ID0gT01YX01BWF9TNjQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1M2NDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKLSAqIAotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRTdWJfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPCAwKQotICAgIHsKLSAgICAgICAgLypPcHBvc2l0ZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCi0gKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICoqLwotCi1PTVhfUzMyIGFybVNhdE1hY19TMzIoT01YX1MzMiBNYWMsT01YX1MxNiBWYWx1ZTEsT01YX1MxNiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gKE9NWF9TMzIpKFZhbHVlMSpWYWx1ZTIpOwotICAgIFJlc3VsdCA9IGFybVNhdEFkZF9TMzIoIE1hYyAsIFJlc3VsdCApOwotCi0gICAgcmV0dXJuIFJlc3VsdDsgICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYwotICoKLSAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAotICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCi0gKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMihPTVhfUzMyIG1hYywgT01YX1MzMiBkZWxheUVsZW0sIE9NWF9TMTYgZmlsVGFwICkKLXsKLSAgICAKLSAgICBPTVhfUzMyIHJlc3VsdDsKLQotICAgIHJlc3VsdCA9IGFybVNhdE11bFMxNlMzMl9TMzIoZmlsVGFwLGRlbGF5RWxlbSk7IAotCi0gICAgaWYgKCByZXN1bHQgPiBPTVhfTUFYX1MxNiApCi0gICAgewotICAgICAgICByZXN1bHQgPSBPTVhfTUFYX1MzMjsKLSAgICB9Ci0gICAgZWxzZSBpZiggcmVzdWx0IDwgT01YX01JTl9TMTYgKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gT01YX01JTl9TMzI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGRlbGF5RWxlbSAqIGZpbFRhcDsKLSAgICB9Ci0KLSAgICBtYWMgPSBhcm1TYXRBZGRfUzMyKG1hYyxyZXN1bHQpOwotICAgIAotICAgIHJldHVybiBtYWM7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKLSAqCi0gKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodC9MZWZ0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzaGlmdCApICkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgotICogW2luXSBzaGlmdCBUaGUgc2hpZnQgbnVtYmVyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KE9NWF9TMzIgaW5wdXQsIE9NWF9JTlQgc2hpZnQpCi17Ci0gICAgaW5wdXQgPSBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoaW5wdXQsLXNoaWZ0KTsKLQotICAgIGlmICggaW5wdXQgPiBPTVhfTUFYX1MxNiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IDwgT01YX01JTl9TMTYpCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgcmV0dXJuIChPTVhfUzE2KWlucHV0OwotICAgIH0KLQotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICogICAgIAotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBTaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKE9NWF9TMzIgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCi17Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgIGlmIChTaGlmdCA8IDApCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDsKLSAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCAoMSA8PCAoU2hpZnQgLSAxKSkpOwotICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoT01YX1M2NCBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgCi0gICAgaWYgKFNoaWZ0IDwgMCkKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OwotICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsICgoT01YX1M2NCkxIDw8IChTaGlmdCAtIDEpKSk7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsIFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVmFsdWU7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoT01YX1MxNiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCi17Ci0gICAgT01YX1MxNiBoaTIsbG8xOwotICAgIE9NWF9VMTYgbG8yOwotICAgIAotICAgIE9NWF9TMzIgdGVtcDEsdGVtcDI7Ci0gICAgT01YX1MzMiByZXN1bHQ7Ci0gICAgCi0gICAgbG8xICA9IGlucHV0MTsKLQotICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKLSAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7Ci0gICAgCi0gICAgdGVtcDEgPSBoaTIgKiBsbzE7Ci0gICAgdGVtcDIgPSAoIGxvMiogbG8xICkgPj4gMTY7Ci0KLSAgICByZXN1bHQgPSAgYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMihPTVhfUzMyIGlucHV0MSxPTVhfUzMyIGlucHV0MikKLXsKLSAgICBPTVhfUzE2IGhpMSxoaTI7Ci0gICAgT01YX1UxNiBsbzEsbG8yOwotICAgIAotICAgIE9NWF9TMzIgdGVtcDEsdGVtcDIsdGVtcDM7Ci0gICAgT01YX1MzMiByZXN1bHQ7Ci0KLSAgICBoaTEgID0gKCBpbnB1dDEgPj4gIDE2ICk7Ci0gICAgbG8xICA9ICggKE9NWF9VMzIpKCBpbnB1dDEgPDwgMTYgKSA+PiAxNiApOwotCi0gICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOwotICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKLSAgICAKLSAgICB0ZW1wMSA9ICAgaGkxICogaGkyOwotICAgIHRlbXAyID0gKCBoaTEqIGxvMiApID4+IDE2OwotICAgIHRlbXAzID0gKCBoaTIqIGxvMSApID4+IDE2OwotCi0gICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7Ci0gICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMihyZXN1bHQsdGVtcDMpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKLSAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybwotICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAotICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKQotewotICAgIE9NWF9GNjQgcmVzdWx0OwotICAgIAotICAgIHJlc3VsdCA9ICgoT01YX0Y2NClOdW0pLygoT01YX0Y2NClEZW5vKTsKLSAgICAKLSAgICBpZiAocmVzdWx0ID49IDApCi0gICAgewotICAgICAgICByZXN1bHQgKz0gMC41OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgLT0gMC41OwotICAgIH0KLQotICAgIHJldHVybiAoT01YX1MzMikocmVzdWx0KTsKLX0KLQotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjUzY2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlZmluZXMgYml0c3RyZWFtIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIGNvZGVjcwotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uLjMyCi0gKgotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKLXsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBSZXR1cm4gTiBiaXRzICovCi0gICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotICogICAgCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4zMgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotCi1PTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKLXsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgIAotICAgIGlmKE4gPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0gICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCi0gICAgT2Zmc2V0ICs9IE47Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKLQotICAgIC8qIFJldHVybiBOIGJpdHMgKi8KLSAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0gCi1PTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KQotewotICAgIGlmKCpwT2Zmc2V0ID4gMCkKLSAgICB7Ci0gICAgICAgICpwcEJpdFN0cmVhbSArPSAxOwotICAgICAgICAqcE9mZnNldCA9IDA7Ci0gICAgfSAgICAKLX0KLQotLyoqIAotICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLQotCi1PTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKQotewotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgCi0gICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KLSAgICBPZmZzZXQgKz0gTjsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgcENvZGVCb29rCi0gKiAKLSAqIFtvdXRdICAgICpwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAotICogICAgICAgICA6IEFSTV9OT19DT0RFQk9PS19JTkRFWCA9IC0xIGlmIHNlYXJjaCBmYWlscy4KLSAqKi8KLSNpZm5kZWYgQ19PUFRJTUlaRURfSU1QTEVNRU5UQVRJT04gCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKQoteyAgICAKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgIE9NWF9JTlQgSW5kZXg7Ci0gICAgICAgIAotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBTZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJvb2sgKi8gICAgCi0gICAgZm9yIChJbmRleD0wOyBwQ29kZUJvb2stPmNvZGVMZW4gIT0gMDsgSW5kZXgrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQ29kZUJvb2stPmNvZGVXb3JkID09IChWYWx1ZSA+PiAoMzIgLSBwQ29kZUJvb2stPmNvZGVMZW4pKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ICAgICAgID0gT2Zmc2V0ICsgcENvZGVCb29rLT5jb2RlTGVuOwotICAgICAgICAgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQgPj4gMykgOwotICAgICAgICAgICAgKnBPZmZzZXQgICAgID0gT2Zmc2V0ICYgNzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIEluZGV4OwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgcENvZGVCb29rKys7Ci0gICAgfQotCi0gICAgLyogTm8gY29kZSBtYXRjaCBmb3VuZCAqLwotICAgIHJldHVybiBBUk1fTk9fQ09ERUJPT0tfSU5ERVg7Ci19Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXSBwT2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXSBjb2RlV29yZCAgICAgICAgQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqIFtpbl0gY29kZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tCaXRzICgKLSAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgT01YX1UzMiBjb2RlV29yZCwgCi0gICAgT01YX0lOVCBjb2RlTGVuZ3RoIAotKQotewotICAgIE9NWF9VOCAgKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgICAgICAKLSAgICAvKiBjaGVja2luZyBhcmd1bWVudCB2YWxpZGl0eSAqLwotICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPiA3LCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA8IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoID4gMzIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIFByZXBhcmUgdGhlIGZpcnN0IGJ5dGUgKi8KLSAgICBjb2RlV29yZCA9IGNvZGVXb3JkIDw8ICgzMi1jb2RlTGVuZ3RoKTsKLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdID4+ICg4LU9mZnNldCkpIDw8ICg4LU9mZnNldCk7Ci0gICAgVmFsdWUgPSBWYWx1ZSB8IChjb2RlV29yZCA+PiAoMjQrT2Zmc2V0KSk7Ci0KLSAgICAvKiBXcml0ZSBvdXQgd2hvbGUgYnl0ZXMgKi8KLSAgICB3aGlsZSAoOC1PZmZzZXQgPD0gY29kZUxlbmd0aCkKLSAgICB7Ci0gICAgICAgICpwQml0U3RyZWFtKysgPSAoT01YX1U4KVZhbHVlOwotICAgICAgICBjb2RlV29yZCAgID0gY29kZVdvcmQgIDw8ICg4LU9mZnNldCk7Ci0gICAgICAgIGNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoIC0gKDgtT2Zmc2V0KTsKLSAgICAgICAgT2Zmc2V0ID0gMDsKLSAgICAgICAgVmFsdWUgPSBjb2RlV29yZCA+PiAyNDsKLSAgICB9Ci0KLSAgICAvKiBXcml0ZSBvdXQgZmluYWwgcGFydGlhbCBieXRlICovCi0gICAgKnBCaXRTdHJlYW0gID0gKE9NWF9VOClWYWx1ZTsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICsgY29kZUxlbmd0aDsKLSAgICAKLSAgICByZXR1cm4gIE9NWF9TdHNfTm9FcnI7Ci19Ci0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIEFSTV9WTEMzMiBjb2RlIAotKQotewotICAgIHJldHVybiAoYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGNvZGUuY29kZVdvcmQsIGNvZGUuY29kZUxlbikpOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJlOGI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL2FybVZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtVmlkZW8uaAotICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCi0gKgotICovCi0KLQotI2lmbmRlZiBfYXJtVmlkZW9fSF8KLSNkZWZpbmUgX2FybVZpZGVvX0hfCi0KLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKgotICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgotICovCi0gCi1zdHJ1Y3QgbTRwMl9NRVNwZWMKLXsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Ci19OwotCi1zdHJ1Y3QgbTRwMTBfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOwotICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKLXR5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKLSAqIGJlc3QgTVYgYW5kIFNBRAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKLSAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKLSAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKLSAqLwotCi1PTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAotICAgIE9NWF9TMTYgbXZYLAotICAgIE9NWF9TMTYgbXZZLAotICAgIE9NWF9JTlQgY2FuZFNBRCwKLSAgICBPTVhfUzE2IGJlc3RNVlgsCi0gICAgT01YX1MxNiBiZXN0TVZZLAotICAgIE9NWF9JTlQgYmVzdFNBRCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAotICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgotICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAotICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bwotICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKLSAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAotICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAotICAgICBPTVhfSU5UIGN1clFQLAotICAgICBPTVhfSU5UIHByZWRRUCwKLSAgICAgT01YX0lOVCBwcmVkRGlyLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCi0gICAgIE9NWF9VOCBmbGFnLAotICAgICBPTVhfSU5UICpwU3VtRXJyCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQwotICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCi0gKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX0lOVCAqcHJlZERpciwKLSAgICAgT01YX0lOVCAqcHJlZFFQLAotICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KLSAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWF9VOCBzdGFydAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCi0gICAgIE9NWF9VOCAgc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCi0gKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAotICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCi0gKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKLSAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAotICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAotICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKLSAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0gICAgT01YX1UzMiBzdG9yZVJ1biwKLSAgICBPTVhfUzE2ICogcERzdCwKLSAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCi0gICAgT01YX1U4ICBzaWduLAotICAgIE9NWF9VOCAgbGFzdCwKLSAgICBPTVhfVTggICogaW5kZXgsCi0gICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0JCQkgIE9NWF9TMTYgKiBwRHN0LAotCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0JCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAotCQkJICBPTVhfVTggICogcExhc3QsCi0JCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKLSAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAotICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcwotICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKLSAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKLSAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKLQkJCSAgT01YX1UzMiBydW5QbHVzLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCi0gICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCi0JCQkgIE9NWF9VOCAgbGFzdCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIAotICogUmV0dXJuIFZhbHVlOgotICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKLSAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAotICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCi0gKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCi0gKgotICovCi0KLU9NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAotICAgICBPTVhfVTMyIHJ1biwKLSAgICAgT01YX1UzMiBydW5QbHVzLAotICAgICBPTVhfUzE2IGxldmVsLAotICAgICBPTVhfUzE2IGxldmVsUGx1cywKLSAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKLSAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKLSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCi0gKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCi0gKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCi0gKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAotICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCi0gKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAotICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKLSAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCi0gKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQotICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAotICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCi0gKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgotICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCi0gKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCi0gKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCi0gKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCi0gKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKLSAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKLSAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCi0gKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAotICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAotICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCi0gKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jawotICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKLSAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCi0gICAgIE9NWF9VOCAqIHBUcmFuc3AKLSk7Ci0KLS8qIAotICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAotICovCi0vKiBEZWZpbmVzICovCi0jZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQotCi0KLS8qIERlcXVhbnQgdGFibGVzICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKLQotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKLSAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCi0gKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKLSAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucwotICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCi0gKgkJCQkJCQkJdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0KLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgblRhYmxlLAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCi0gKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCi0gKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCi0gKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCi0gKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCi0gKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCi0gKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCi0gKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKLSAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscwotICogCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KLSAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KLSAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KLSAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KLSAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLwotICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCi0gICAgaW50IENocm9tYUZsYWcKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucwotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKLSAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCi0JCU9NWF9VMzIgCWlTcmNTdGVwLCAKLQkJT01YX1U4KiAJcERzdCwgCi0JCU9NWF9VMzIgCWlEc3RTdGVwLCAKLQkJT01YX1UzMiAJaVdpZHRoLCAKLQkJT01YX1UzMiAJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCi0JIGNvbnN0IE9NWF9VOCogCXBTcmMsIAotCSBPTVhfVTMyIAlpU3JjU3RlcCwgCi0gCSBPTVhfVTgqIAlwRHN0LAotIAkgT01YX1UzMiAJaURzdFN0ZXAsIAotIAkgT01YX1UzMiAJaVdpZHRoLCAKLSAJIE9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKLSAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7Ci0KLU9NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAotICAgIE9NWF9TMTYgIG12WCwKLSAgICBPTVhfUzE2ICBtdlksCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKLSAgICBPTVhfSU5UIGNhbmRTQUQsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKLSAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCi0JY29uc3QgT01YX1U4KiAJcFNyY09yZywKLQlPTVhfVTMyIAlpU3RlcE9yZywKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAotCU9NWF9VMzIgCWlTdGVwUmVmLAotCU9NWF9TMzIqCXBEc3RTQUQsCi0JT01YX1UzMgkJaUhlaWdodCwKLQlPTVhfVTMyCQlpV2lkdGgpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCi0gKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcwotICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaVdpZHRoLAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAotICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAotICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKLSAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKLQljb25zdCBPTVhfVTgqIAlwU3JjLAotICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICBPTVhfVTMyICAgICBpV2lkdGgKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAotICAgICAgICBPTVhfVTggICAgICAqcFNyYywKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCi0gICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgICAgICBPTVhfVTMyICAgICBkeCwKLSAgICAgICAgT01YX1UzMiAgICAgZHkKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAotICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAotICAgICBPTVhfVTggICAgICpwRHN0LAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwKLSAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAotICAgICBPTVhfVTMyICAgIGR4LAotICAgICBPTVhfVTMyICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAotICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKLSAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCi0gKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAotICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAotICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLSAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKLSAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAotICAgICBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiAqcERzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX1MxNiogcERDLAotICAgICBpbnQgQUMKLSk7Ci0KLSNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLwotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvb214VkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2NjNzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvb214VkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzODEgKzAsMCBAQAotLyoqCi0gKiBGaWxlOiBvbXhWQy5oCi0gKiBCcmllZjogT3Blbk1BWCBETCB2MS4wLjIgLSBWaWRlbyBDb2RpbmcgbGlicmFyeQotICoKLSAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAotICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKLSAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKLSAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCi0gKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCi0gKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKLSAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAotICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCi0gKgotICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCi0gKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKLSAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAotICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAotICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCi0gKiBtYXRlcmlhbHMuCi0gKiAKLSAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqCi0gKi8KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX09NWFZDX0hfCi0jZGVmaW5lIF9PTVhWQ19IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qIDYuMS4xLjEgTW90aW9uIFZlY3RvcnMgICovCi0vKiBJbiBvbXhWQywgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MxNiBkeDsKLSAgICBPTVhfUzE2IGR5OwotfSBPTVhWQ01vdGlvblZlY3RvcjsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCi0gKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAoNi4xLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbi1wbGFjZS4gIFRoZSB1bmV4cGFuZGVkIAotICogc291cmNlIGZyYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwbGFuZSBidWZmZXIgd2l0aCBzdWZmaWNpZW50IHNwYWNlIAotICogcHJlLWFsbG9jYXRlZCBmb3IgZWRnZSBleHBhbnNpb24sIGFuZCB0aGUgaW5wdXQgZnJhbWUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gCi0gKiB0aGUgcGxhbmUgYnVmZmVyIGNlbnRlci4gIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHBpeGVsIGV4cGFuc2lvbiBieSAKLSAqIHJlcGxpY2F0aW5nIHNvdXJjZSBmcmFtZSBlZGdlIHBpeGVsIGludGVuc2l0aWVzIGluIHRoZSBlbXB0eSBwaXhlbCAKLSAqIGxvY2F0aW9ucyAoZXhwYW5zaW9uIHJlZ2lvbikgYmV0d2VlbiB0aGUgc291cmNlIGZyYW1lIGVkZ2UgYW5kIHRoZSBwbGFuZSAKLSAqIGJ1ZmZlciBlZGdlLiAgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgZXhwYW5zaW9uIHJlZ2lvbnMgb24gdGhlIAotICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBlZGdlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgaUV4cGFuZFBlbHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgdG8gYmUgCi0gKiAgICAgICAgICAgIGV4cGFuZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgaUZyYW1lV2lkdGggLSBmcmFtZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRnJhbWVIZWlnaHQgLWZyYW1lIGhlaWdodDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRXhwYW5kUGVscyAtIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGhvcml6b250YWwgYW5kIAotICogICAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb25zOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlQbGFuZVN0ZXAgLSBkaXN0YW5jZSwgaW4gYnl0ZXMsIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIAotICogICAgICAgICAgICBpbiB0aGUgcGxhbmUgYnVmZmVyOyBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIAotICogICAgICAgICAgICAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC1Qb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIChOT1QgdGhlIAotICogICAgICAgICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBsYW5lKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpcyBlaXRoZXIgZXF1YWwgdG8gemVybyBvciBpcyBhIAotICogICAgICAgICAgICAgIG5vbi1tdWx0aXBsZSBvZiA4OiBpRnJhbWVIZWlnaHQsIGlGcmFtZVdpZHRoLCBpUGxhbmVTdGVwLCBvciAKLSAqICAgICAgICAgICAgICBpRXhwYW5kUGVscy4gCi0gKiAgICAtICAgIGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0UGxhbmUsCi0gICAgT01YX1UzMiBpRnJhbWVXaWR0aCwKLSAgICBPTVhfVTMyIGlGcmFtZUhlaWdodCwKLSAgICBPTVhfVTMyIGlFeHBhbmRQZWxzLAotICAgIE9NWF9VMzIgaVBsYW5lU3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCi0gKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKLSAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKLSAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKLSAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKLSAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCi0gKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKLSAqICAgICAgICAgICAgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAotICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCi0gKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgKAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVYsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVjdFZPUFJlZiwKLSAgICBPTVhfSU5UIFhjb29yZCwKLSAgICBPTVhfSU5UIFljb29yZCwKLSAgICBPTVhfSU5UIHNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF8xNnggICAoNi4xLjQuMS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfOHggICAoNi4xLjQuMS41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDQsIDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMipwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qIDYuMi4xLjEgRGlyZWN0aW9uICAqLwotLyogVGhlIGRpcmVjdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIEFDL0RDIHByZWRpY3Rpb24gYW5kIHppZy16YWcgc2Nhbi4gICovCi0KLWVudW0gewotICAgIE9NWF9WQ19OT05FICAgICAgID0gMCwKLSAgICBPTVhfVkNfSE9SSVpPTlRBTCA9IDEsCi0gICAgT01YX1ZDX1ZFUlRJQ0FMICAgPSAyIAotfTsKLQotCi0KLS8qIDYuMi4xLjIgQmlsaW5lYXIgSW50ZXJwb2xhdGlvbiAgKi8KLS8qIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIG1vdGlvbiBlc3RpbWF0aW9uLCBtb3Rpb24gY29tcGVuc2F0aW9uLCBhbmQgcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLiAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX0lOVEVHRVJfUElYRUwgPSAwLCAvKiBjYXNlIGEgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9YICA9IDEsIC8qIGNhc2UgYiAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1kgID0gMiwgLyogY2FzZSBjICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWFkgPSAzICAvKiBjYXNlIGQgKi8gCi19OwotCi0KLQotLyogNi4yLjEuMyBOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSAgKi8KLS8qIE5laWdoYm9yaW5nIG1hY3JvYmxvY2sgYXZhaWxhYmlsaXR5IGlzIGluZGljYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZsYWdzOiAgICovCi0KLWVudW0gewotICAgIE9NWF9WQ19VUFBFUiA9IDEsICAgICAgICAvKiogYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfTEVGVCA9IDIsICAgICAgICAgLyoqIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfQ0VOVEVSID0gNCwKLSAgICBPTVhfVkNfUklHSFQgPSA4LAotICAgIE9NWF9WQ19MT1dFUiA9IDE2LAotICAgIE9NWF9WQ19VUFBFUl9MRUZUID0gMzIsICAvKiogYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19VUFBFUl9SSUdIVCA9IDY0LCAvKiogYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfTE9XRVJfTEVGVCA9IDEyOCwKLSAgICBPTVhfVkNfTE9XRVJfUklHSFQgPSAyNTYgCi19OwotCi0KLQotLyogNi4yLjEuNCBWaWRlbyBDb21wb25lbnRzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIHZpZGVvIGNvbXBvbmVudHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTFVNSU5BTkNFLCAgICAvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLwotICAgIE9NWF9WQ19DSFJPTUlOQU5DRSAgIC8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8gCi19IE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50OwotCi0KLQotLyogNi4yLjEuNSBNYWNyb2Jsb2NrVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19JTlRFUiAgICAgPSAwLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSX1EgICA9IDEsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVI0ViAgID0gMiwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRSQSAgICAgPSAzLCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5UUkFfUSAgID0gNCwgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSNFZfUSA9IDUgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi19IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4yLjEuNiBDb29yZGluYXRlcyAgKi8KLS8qIENvb3JkaW5hdGVzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9JTlQgeDsKLSAgICBPTVhfSU5UIHk7Ci19IE9NWFZDTTRQMkNvb3JkaW5hdGU7Ci0KLQotCi0vKiA2LjIuMS43IE1vdGlvbiBFc3RpbWF0aW9uIEFsZ29yaXRobXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbW90aW9uIGVzdGltYXRpb24gc2VhcmNoIG1ldGhvZHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTTRQMl9GQVNUX1NFQVJDSCA9IDAsICAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCi0gICAgT01YX1ZDX000UDJfRlVMTF9TRUFSQ0ggPSAxICAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKLX0gT01YVkNNNFAyTUVNb2RlOwotCi0KLQotLyogNi4yLjEuOCBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLwotLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9JTlQgc2VhcmNoRW5hYmxlOHg4OyAgICAgLyoqIGVuYWJsZXMgOHg4IHNlYXJjaCAqLwotICAgIE9NWF9JTlQgaGFsZlBlbFNlYXJjaEVuYWJsZTsgLyoqIGVuYWJsZXMgaGFsZi1wZWwgcmVzb2x1dGlvbiAqLwotICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7ICAgICAgICAgLyoqIHNlYXJjaCByYW5nZSAqLwotICAgIE9NWF9JTlQgcm5kVmFsOyAgICAgICAgICAgICAgLyoqIHJvdW5kaW5nIGNvbnRyb2w7IDAtZGlzYWJsZWQsIDEtZW5hYmxlZCovCi19IE9NWFZDTTRQMk1FUGFyYW1zOwotCi0KLQotLyogNi4yLjEuOSBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAgKi8KLS8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgZm9yIAotICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAvKiBNQiB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgT01YX1ZDX0lOVEVSNCAqLwotICAgIE9NWF9TMzIgcXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIqLwotICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCi0gICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbMl1bMl07ICAgIC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9MH4xKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzJdWzJdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9IDB+MSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1U4IHBQcmVkRGlyWzJdWzJdOyAgICAgICAgICAgLyogQUMgcHJlZGljdGlvbiBkaXJlY3Rpb246IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgT01YX1ZDX05PTkUsIE9NWF9WQ19WRVJUSUNBTCwgT01YX1ZDX0hPUklaT05UQUwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IE9NWFZDTTRQMk1CSW5mbywgKk9NWFZDTTRQMk1CSW5mb1B0cjsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICg2LjIuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHVzaW5nIHRoZSBwcm9jZWR1cmUgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuICBUaGUgcmVzdWx0aW5nIHByZWRpY3RlZCBNViBpcyAKLSAqIHJldHVybmVkIGluIHBEc3RNVlByZWQuIElmIHRoZSBwYXJhbWV0ZXIgcERzdE1WUHJlZE1FIGlmIGlzIG5vdCBOVUxMIHRoZW4gCi0gKiB0aGUgc2V0IG9mIHRocmVlIE1WIGNhbmRpZGF0ZXMgdXNlZCBmb3IgcHJlZGljdGlvbiBpcyBhbHNvIHJldHVybmVkLCAKLSAqIG90aGVyd2lzZSBwRHN0TVZQcmVkTUVpcyBOVUxMIHVwb24gcmV0dXJuLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgWSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNDYW5kTVYxIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIAotICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBNQiB0byB0aGUgbGVmdC4gCi0gKiAgIHBTcmNDYW5kTVYyIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIGlmIHRoZXJlIAotICogICAgICAgICAgICBpcyBubyBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcFNyY0NhbmRNVjMgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgcmlnaHQgYW5kIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlcmUgaXMgbm8gTUIgbG9jYXRlZCB0byB0aGUgYWJvdmUtcmlnaHQuIAotICogICBpQmxrIC0gdGhlIGluZGV4IG9mIGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgIHBEc3RNVlByZWRNRSAtIE1WIGNhbmRpZGF0ZSByZXR1cm4gYnVmZmVyOyAgaWYgc2V0IHRvIE5VTEwgdGhlbiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBjYW5kaWRhdGUgTVZzIGFyZSBub3QgcmV0dXJuZWQgYW5kIHBEc3RNVlByZWRNRSB3aWxsIAotICogICAgICAgICAgICBiZSBOVUxMIHVwb24gZnVuY3Rpb24gcmV0dXJuOyBpZiBwRHN0TVZQcmVkTUUgaXMgbm9uLU5VTEwgdGhlbiBpdCAKLSAqICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRocmVlIAotICogICAgICAgICAgICByZXR1cm4gTVZzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WUHJlZCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIAotICogICBwRHN0TVZQcmVkTUUgLSBpZiBub24tTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FICBwb2ludHMgdXBvbiAKLSAqICAgICAgICAgICAgcmV0dXJuIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHRocmVlIG1vdGlvbiB2ZWN0b3IgY2FuZGlkYXRlcyAKLSAqICAgICAgICAgICAgdXNlZCBmb3IgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDcuNi41LCBvdGhlcndpc2UgaWYgTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FIGlzIE5VTEwgCi0gKiAgICAgICAgICAgIHVwb24gb3V0cHV0LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHRoZSBwb2ludGVyIHBEc3RNVlByZWQgaXMgTlVMTCAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBpQmxrIGRvZXMgbm90IGZhbGwgaW50byB0aGUgcmFuZ2UgMCA8PSBpQmxrPD0zIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkICgKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WQ3VyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYxLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWRNRSwKLSAgICBPTVhfSU5UIGlCbGsKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAoNi4yLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBpbnZlcnNlIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1QgaW5wdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIEFjY29yZGluZyB0byAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCB0aGUgaW5wdXQgY29lZmZpY2llbnQgdmFsdWVzIHNob3VsZCBsaWUgd2l0aGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBvdXRwdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9JRENUOHg4YmxrICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NRUluaXQgKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMqcE1FUGFyYW1zLAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCi0gKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAotICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAotICogICAgICAgICAgICAtNC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNQcmVNViwKLSAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAotICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgIE9NWF9JTlQgcm5kVmFsLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICg2LjIuNC4yLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDh4OCBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl84eDguIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDggbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgOHg4IGludGVnZXIgc2VhcmNoLCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKLSAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAotICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCi0gKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAotICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCi0gKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKLSAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKLSAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKLSAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCi0gKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKLSAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCi0gKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKLSAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAotICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKLSAqICAgICAgICAgICAgaWdub3JlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAotICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKLSAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKLSAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKLSAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCi0gKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKLSAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgc3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9TMzIgc3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0KnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDJNQkluZm9QdHIgKnBNQkluZm8sCi0gICAgT01YVkNNNFAyTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9VMTYgKnBEc3RTQUQsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAotICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNi4xLjMuOC4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCi0gKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCi0gKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAotICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAotICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKLSAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAotICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCi0gKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAotICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKLSAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKLSAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKLSAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKLSAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKLSAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKLSAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCi0gKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAotICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCi0gKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKLSAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKLSAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKLSAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCi0gKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKLSAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAotICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCi0gKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKLSAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCi0gKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAotICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCi0gKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCi0gKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAotICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAotICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAotICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKLSAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgIHBTcmMsIHBSZWMuICAKLSAqCi0gKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCAqcFJlYywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICBPTVhfUzE2ICpwUHJlQUNQcmVkaWN0LAotICAgIE9NWF9JTlQgKnBTdW1FcnIsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9VOCBjdXJRcCwKLSAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZiwKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAoNi4yLjQuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW1wbGVtZW50cyBEQ1QsIGFuZCBxdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMgb2YgdGhlIGludGVyIGJsb2NrIAotICogd2hpbGUgcmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgcmVzaWR1YWwuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciAKLSAqIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtcG9pbnRlciB0byB0aGUgcmVzaWR1YWxzIHRvIGJlIGVuY29kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmUgcmVzaWR1YWxzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIGVpdGhlciBOVUxMIG9yIAotICogICAgICAgICBub3QgMTYtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgICAgLSBwU3JjIAotICogICAgICAgICAgICAtIHBEc3QKLSAqICAgICAgICAgICAgLSBwUmVjCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9TMTYgKnBSZWMsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCi0gKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAotICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAotICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAotICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKLSAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKLSAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKLSAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKLSAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKLSAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkN1ck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVkxlZnRNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAotICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKLSAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKLSAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCi0gKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCi0gKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKLSAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAotICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKLSAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAotICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAotICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAotICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBzeW50YXggCi0gKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCi0gKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KLSAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCi0gKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WTGVmdE1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVlVwcGVyTUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVZDdXJNQiwKLSAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKLSAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCi0gKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBpZjoKLSAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKLSAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAotICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAotICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAotICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAotICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKLSAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAotICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAotICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCi0gKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKLSAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyLWNvZGVkIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIAotICogICAgICAgICAgICBieXRlIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLiBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIAotICogICAgICAgICAgICB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIFswLTddLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBkZWNvZGluZyBzdWNoIHRoYXQgaXQgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBzdHJlYW0gYnl0ZSByZWZlcmVuY2VkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZAotICogICAgLSAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8gCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICg2LjIuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgCi0gKiB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIAotICogcGVyZm9ybWVkIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IAotICogZnJhbWUvcGxhbmUgb24gYSBwaXhlbCBiYXNpcy4gIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiAKLSAqIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBvZiBjdXJyZW50IGJsb2NrIGV4aXN0cyBpbiB0aGUgYml0IAotICogc3RyZWFtLiBUaGUgREMgb25seSBjb25kaXRpb24gd2lsbCBiZSBoYW5kbGVkIGluIGFub3RoZXIgZnVuY3Rpb24uIAotICoKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBzdGVwIC0gd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgYmVsb25ncyB0byAKLSAqICAgcFFQQnVmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIgCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24gYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOCwgRmlndXJlIDYtNS4gCi0gKiAgIGludHJhRENWTEMgLSBhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4gVGhpcyBhbGxvd3MgYSAKLSAqICAgICAgICAgICAgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMgZm9yIGNvZGluZyBvZiBJbnRyYSBEQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGFzIHBlciBbSVNPMTQ0OTYtMl0sIFRhYmxlIDYtMjEuIAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nIGlmIAotICogICAgICAgICAgICB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uIGFyZSAKLSAqICAgICAgICAgICAgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkIG1hY3JvYmxvY2suIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgICAgIHVwZGF0ZSBwcm9jZWR1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4yLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIAotICogICAgICAgICBwUVBCdWYsIHBEc3QuIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddIAotICogICAgLSAgICBjdXJRUCBleGNlZWRzICgxLCAzMSkKLSAqICAgIC0gICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDVdCi0gKiAgICAtICAgIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4Ci0gKiAgICAtICAgIGEgcG9pbnRlciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgd2FzIHZpb2xhdGVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50cmEuICAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAsCi0gICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgT01YX1U4IGN1clFQLAotICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfSU5UIGludHJhRENWTEMsCi0gICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAotICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCi0gKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKLSAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKLSAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAotICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBRUCA8PSAwLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKLSAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAotICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCi0gKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCi0gKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIGN1clFQID4zMSwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCi0gKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQotICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICBPTVhfSU5UIGN1clFQLAotICAgIE9NWF9JTlQgcHJlZFFQLAotICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCi0gKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAotICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCi0gKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCi0gKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCi0gKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCi0gKiAgICAgICAgICAgIDYuMi4xLjIuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKLSAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCi0gKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jayAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgcHJlZGljdFR5cGUsCi0gICAgT01YX0lOVCBybmRWYWwKLSk7Ci0KLQotCi0vKiA2LjMuMS4xIEludHJhIDE2eDE2IFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfMTZ4MTYgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDXzE2WDE2X1ZFUlQgPSAwLCAgLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCi0gICAgT01YX1ZDXzE2WDE2X0hPUiA9IDEsICAgLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfMTZYMTZfREMgPSAyLCAgICAvKiogSW50cmFfMTZ4MTZfREMgKi8KLSAgICBPTVhfVkNfMTZYMTZfUExBTkUgPSAzICAvKiogSW50cmFfMTZ4MTZfUGxhbmUgKi8gCi19IE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS4yIEludHJhIDR4NCBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzR4NCBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfNFg0X1ZFUlQgPSAwLCAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ180WDRfSE9SID0gMSwgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfNFg0X0RDID0gMiwgICAgICAgLyoqIEludHJhXzR4NF9EQyAqLwotICAgIE9NWF9WQ180WDRfRElBR19ETCA9IDMsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLwotICAgIE9NWF9WQ180WDRfRElBR19EUiA9IDQsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKi8KLSAgICBPTVhfVkNfNFg0X1ZSID0gNSwgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAqLwotICAgIE9NWF9WQ180WDRfSEQgPSA2LCAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLwotICAgIE9NWF9WQ180WDRfVkwgPSA3LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KLSAgICBPTVhfVkNfNFg0X0hVID0gOCAgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovIAotfSBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjMgQ2hyb21hIFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfQ0hST01BX0RDID0gMCwgICAgLyoqIEludHJhX0Nocm9tYV9EQyAqLwotICAgIE9NWF9WQ19DSFJPTUFfSE9SID0gMSwgICAvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfQ0hST01BX1ZFUlQgPSAyLCAgLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ19DSFJPTUFfUExBTkUgPSAzICAvKiogSW50cmFfQ2hyb21hX1BsYW5lICovIAotfSBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjQgTW90aW9uIEVzdGltYXRpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbW90aW9uIGVzdGltYXRpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0ggPSAwLCAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCi0gICAgT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIID0gMSAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKLX0gT01YVkNNNFAxME1FTW9kZTsKLQotCi0KLS8qIDYuMy4xLjUgTWFjcm9ibG9jayBUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX1BfMTZ4MTYgID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCi0gICAgT01YX1ZDX1BfMTZ4OCAgPSAxLAotICAgIE9NWF9WQ19QXzh4MTYgID0gMiwKLSAgICBPTVhfVkNfUF84eDggID0gMywKLSAgICBPTVhfVkNfUFJFRjBfOHg4ICA9IDQsCi0gICAgT01YX1ZDX0lOVEVSX1NLSVAgID0gNSwKLSAgICBPTVhfVkNfSU5UUkFfNHg0ICA9IDgsCi0gICAgT01YX1ZDX0lOVFJBXzE2eDE2ICA9IDksCi0gICAgT01YX1ZDX0lOVFJBX1BDTSA9IDEwIAotfSBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjMuMS42IFN1Yi1NYWNyb2Jsb2NrIFR5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IHN1Yi1tYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX1NVQl9QXzh4OCA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLwotICAgIE9NWF9WQ19TVUJfUF84eDQgPSAxLAotICAgIE9NWF9WQ19TVUJfUF80eDggPSAyLAotICAgIE9NWF9WQ19TVUJfUF80eDQgPSAzIAotfSBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjMuMS43IFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKFZMQykgSW5mb3JtYXRpb24gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggdVRyYWlsaW5nX09uZXM7ICAgICAgLyogVHJhaWxpbmcgb25lczsgMyBhdCBtb3N0ICovCi0gICAgT01YX1U4IHVUcmFpbGluZ19PbmVfU2lnbnM7IC8qIFRyYWlsaW5nIG9uZXMgc2lnbmFsICovCi0gICAgT01YX1U4IHVOdW1Db2VmZnM7ICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBub24temVybyBjb2VmcywgaW5jbHVkaW5nIHRyYWlsaW5nIG9uZXMgKi8KLSAgICBPTVhfVTggdVRvdGFsWmVyb3M7ICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHplcm8gY29lZnMgKi8KLSAgICBPTVhfUzE2IGlMZXZlbHNbMTZdOyAgICAgICAgLyogTGV2ZWxzIG9mIG5vbi16ZXJvIGNvZWZzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KLSAgICBPTVhfVTggdVJ1bnNbMTZdOyAgICAgICAgICAgLyogUnVucyBmb3IgbGV2ZWxzIGFuZCB0cmFpbGluZyBvbmVzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KLX0gT01YVkNNNFAxMFZMQ0luZm87Ci0KLQotCi0vKiA2LjMuMS44IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KLSAgICBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgICAgICAgICAvKiBNQiB0eXBlICovCi0gICAgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlIHN1Yk1CVHlwZVs0XTsgLyogc3ViLWJsb2NrIHR5cGUgKi8KLSAgICBPTVhfUzMyIHFweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgbHVtYSAqLwotICAgIE9NWF9TMzIgcXBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBjaHJvbWEgKi8KLSAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLwotICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPTB+MykgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIFJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9IDB+MykgKi8KLSAgICBPTVhfVTggcFJlZkwwSWR4WzRdOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgcGljdHVyZSBpbmRpY2VzICovCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBJbnRyYTE2eDE2UHJlZE1vZGU7IC8qIGJlc3QgaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlICovCi0gICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbMTZdOyAvKiBiZXN0IGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2ssIHBNVjAgaW5kZXhlZCBhcyBhYm92ZSAqLwotfSBPTVhWQ000UDEwTUJJbmZvLCAqT01YVkNNNFAxME1CSW5mb1B0cjsKLQotCi0KLS8qIDYuMy4xLjkgTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTh4ODsgLyogZW5hYmxlcyAxNng4LCA4eDE2LCA4eDggKi8KLSAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU0eDQ7IC8qIGVuYWJsZSBzcGxpdHRpbmcgb2YgOHg0LCA0eDgsIDR4NCBibG9ja3MgKi8KLSAgICBPTVhfUzMyIGhhbGZTZWFyY2hFbmFibGU7Ci0gICAgT01YX1MzMiBxdWFydGVyU2VhcmNoRW5hYmxlOwotICAgIE9NWF9TMzIgaW50cmFFbmFibGU0eDQ7ICAgICAgLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2UxNngxNjsgICAgLyogaW50ZWdlciBwaXhlbCB1bml0cyAqLwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U4eDg7Ci0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTR4NDsKLX0gT01YVkNNNFAxME1FUGFyYW1zOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKLSAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKLSAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCi0gKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKLSAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAotICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKLSAqICAgICAgICAgICAgMC4uMTUpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCi0gKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAotICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqIE5vdGU6IAotICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCi0gKiAgICAgICAgICAgIDAuLjcpLiAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAotICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKLSAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiAgTm90ZTogcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlciBpZiAKLSAqICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqICBOb3RlOiBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmEgY2hyb21hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAotICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLSByZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCi0gKiAgIGRzdFN0ZXAgLSBkZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGggCi0gKiAgIGR4IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIGR5IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIHJvaSAtIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOiAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MzMiBzcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgT01YX1MzMiBkeCwKLSAgICBPTVhfUzMyIGR5LAotICAgIE9NWFNpemUgcm9pCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAotICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aC4gCi0gKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6Ci0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX1MzMiBkc3RTdGVwLAotICAgIE9NWF9TMzIgZHgsCi0gICAgT01YX1MzMiBkeSwKLSAgICBPTVhTaXplIHJvaQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAotICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCi0gKiAgICAgICAgICAgICAgaXMgTlVMTC4gCi0gKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKLSAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAotICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKLSAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCi0gKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKLSAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCi0gKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCUyBwYXJhbWV0ZXIgcGFzc2VkIGludG8gRmlsdGVyRGVibG9ja0x1bWFfVmVyRWRnZTsgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIAotICogICAgICAgICAgICBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNCBieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKLSAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKLSAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgKDYuMy4zLjMuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIAotICogdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGltYWdlIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge3ZhbHVlcyBmb3IgdGhlIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgCi0gKiAgICAgICAgICAgIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyfTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcyBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAotICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAotICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAotICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCi0gKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCi0gKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAotICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCi0gKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCi0gKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKLSAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKLSAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICoKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX1MzMipwT2Zmc2V0LAotICAgIE9NWF9VOCAqcE51bUNvZWZmLAotICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCi0gKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAotICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCi0gKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCi0gKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKLSAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCi0gKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCi0gKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKLSAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKLSAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCi0gKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCi0gKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKLSAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCi0gKgotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX1MzMiAqcE9mZnNldCwKLSAgICBPTVhfVTggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTggKipwcFBvc0NvZWZidWYsCi0gICAgT01YX0lOVCBzVkxDU2VsZWN0LAotICAgIE9NWF9JTlQgc01heE51bUNvZWZmCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAotICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKLSAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAotICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCi0gKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAotICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCi0gKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKLSAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKLSAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAotICogMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAotICogICAgICAgICAgICBleGlzdCAKLSAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAotICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAotICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCi0gKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkLAotICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBwcmVkU3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhfSU5UIEFDCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAotICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCi0gKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCi0gKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCi0gKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKLSAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCi0gKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKLSAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCi0gKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAotICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQgKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jazoKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6IAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCi0gKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBOVUxMOgotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAotICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0LAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCi0gKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAotICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCi0gKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAotICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6ICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKLSAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAotICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAoNi4zLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBxdWFydGVyLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBoYWxmLXBlbCAKLSAqIHNlYXJjaC4gIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIAotICogdGhlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uIAotICogbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIAotICogaW5pdGlhbCBoYWxmLXBlbCBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmIG1heSBiZSB1c2VkIGZvciBoYWxmLXBlbCBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKLSAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKLSAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAotICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAotICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAotICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCi0gKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uIAotICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRFUi4gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVFJBLiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKLSAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAotICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAotICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogCi0gKiAgICAgICAgICAgIC0gIE1iVHlwZSAKLSAqICAgICAgICAgICAgLSAgc3ViTUJUeXBlWzRdIAotICogICAgICAgICAgICAtICBwTVYwWzRdWzRdIAotICogICAgICAgICAgICAtICBwTVZQcmVkWzRdWzRdIAotICogICAgICAgICAgICAtICBwUmVmTDBJZHhbNF0gCi0gKiAgICAgICAgICAgIC0gIEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgICAgICAgICAgLSAgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAotICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCi0gKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0WzE1XSwKLSAgICBPTVhfUzMyIFNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLAotICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIE9NWF9VMzIgTGFtYmRhLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9JTlQgKnBEc3RDb3N0LAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKLSAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCi0gKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCi0gKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9VMzIgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAotICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCi0gKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgtMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0TGVmdCwKLSAgICBPTVhfVTggKnBEc3RSaWdodCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaVdpZHRoLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCi0gKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdFVwLAotICAgIE9NWF9VOCAqcERzdERvd24sCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlXaWR0aCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKLSAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAotICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VMzIgaVFQLAotICAgIE9NWF9VOCBiSW50cmEKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKLSAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKLSAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIG1hdHJpeC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKLSAgICBjb25zdCBPTVhfUzE2ICpwRGVxdWFudENvZWZmLAotICAgIE9NWF9VOCAqcERzdFJlY29uLAotICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAotICAgIE9NWF9VMzIgaURzdFJlY29uU3RlcCwKLSAgICBPTVhfVTggYkFDCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKLSAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKLSAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKLSAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCi0gKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKLSAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgNC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAotICogICAgICAgICAgICBvZiA0LiAKLSAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAotICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKLSAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAotICogICAgICAgICAgICAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuIAotICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAotICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAotICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKLSAgICBPTVhfVTMyIGlTcmNPcmdTdGVwLAotICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAotICAgIE9NWF9TMTYgKnBEc3RRdWFudENvZWZmLAotICAgIE9NWF9TMTYgKnBEc3REZVF1YW50Q29lZmYsCi0gICAgT01YX1MxNiAqcERDQ29lZmYsCi0gICAgT01YX1M4ICpwTnVtQ29lZmYsCi0gICAgT01YX1UzMiBuVGhyZXNoU0FELAotICAgIE9NWF9VMzIgaVFQLAotICAgIE9NWF9VOCBiSW50cmEKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKLSAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKLSAqIHN0cnVjdHVyZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKLSAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKLSAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKLSAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKLSAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKLSAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCi0gKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCi0gKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKLSAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNDb2VmZiwKLSAgICBjb25zdCBPTVhfVTggKnBTY2FuTWF0cml4LAotICAgIE9NWF9VOCBiQUMsCi0gICAgT01YX1UzMiBNYXhOdW1Db2VmLAotICAgIE9NWFZDTTRQMTBWTENJbmZvKnBEc3RWTENJbmZvCi0pOwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qKiBlbmQgb2YgI2RlZmluZSBfT01YVkNfSF8gKi8KLQotLyoqIEVPRiAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjM3YmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDQ09NTV9BdmVyYWdlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byBibG9ja3MgaWYgc2l6ZSBpV2lkdGggWCBpSGVpZ2h0Ci0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9BdmVyYWdlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBQcmVkMAkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMAotICoJW2luXQlwUHJlZDEJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaVByZWRTdGVwMAkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMAotICoJW2luXQlpUHJlZFN0ZXAxCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlEc3RTdGVwIAkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKglbaW5dCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9ja3MKLSAqCVtpbl0JaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2tzCi0gKglbb3V0XQlwRHN0UHJlZAkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ0NPTU1fQXZlcmFnZSAoCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQotCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAotCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAotCSBPTVhfVTgqCQlwRHN0UHJlZCwKLQkgT01YX1UzMgkJaURzdFN0ZXAsIAotCSBPTVhfVTMyCQlpV2lkdGgsCi0JIE9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICBPTVhfVTMyICAgICB4LCB5OwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RQcmVkIFt5ICogaURzdFN0ZXAgKyB4XSA9IAotICAgICAgICAgICAgICAgIChPTVhfVTgpKCgoT01YX1UzMilwUHJlZDAgW3kgKiBpUHJlZFN0ZXAwICsgeF0gKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlZDEgW3kgKiBpUHJlZFN0ZXAxICsgeF0gKyAxKSA+PiAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViOTZkYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fU0FELmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIE54TSBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKLSAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCi0JY29uc3QgT01YX1U4KiAJcFNyY09yZywKLQlPTVhfVTMyIAlpU3RlcE9yZywKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAotCU9NWF9VMzIgCWlTdGVwUmVmLAotCU9NWF9TMzIqCXBEc3RTQUQsCi0JT01YX1UzMgkJaUhlaWdodCwKLQlPTVhfVTMyCQlpV2lkdGgKLSkKLXsKLSAgICBPTVhfSU5UICAgICB4LCB5OwotICAgIAotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIAotICAgICpwRHN0U0FEID0gMDsKLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcERzdFNBRCArPSBhcm1BYnMocFNyY09yZyBbKHkgKiBpU3RlcE9yZykgKyB4XSAtIAotICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVmIFsoeSAqIGlTdGVwUmVmKSArIHhdKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzViY2E4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9BdmVyYWdlXzE2eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCi0gKgotICovCi0gT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQotCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAotCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAotCSBPTVhfVTgqCQlwRHN0UHJlZCwKLQkgT01YX1UzMgkJaURzdFN0ZXAsIAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMCA9PSAwKSB8fCAoaVByZWRTdGVwMCAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDEgPT0gMCkgfHwgKGlQcmVkU3RlcDEgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpRHN0U3RlcCA9PSAwKSB8fCAoaURzdFN0ZXAgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAocFByZWQwLCBwUHJlZDEsIGlQcmVkU3RlcDAsIGlQcmVkU3RlcDEsIHBEc3RQcmVkLCBpRHN0U3RlcCwgMTYsIGlIZWlnaHQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzE0ZjQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0F2ZXJhZ2VfOHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDh4NCBvciA4eDggb3IgOHgxNiBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKLSAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAotICoKLSAqLwotIE9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCQotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLSAgICAgT01YX1UzMgkJaVByZWRTdGVwMCwKLSAgICAgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0gICAgIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDEgPT0gMCkgfHwgKGlQcmVkU3RlcDEgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA0KSAmJiAoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0UHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAocFByZWQwLCBwUHJlZDEsIGlQcmVkU3RlcDAsIGlQcmVkU3RlcDEsIHBEc3RQcmVkLCBpRHN0U3RlcCwgOCwgaUhlaWdodCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjUyNDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGNvbXB1dGluZyB0aGUgZXJyb3IgZm9yIGEgTUIgb2Ygc2l6ZSA4eDgKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaygKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICAgT01YX1MxNiAqIHBEc3QKLSkKLXsKLQotICAgIE9NWF9JTlQgICAgIHgsIHksIGNvdW50OwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHNyY1N0ZXAgPD0gMCkgfHwgKHNyY1N0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBlcnJvciBibG9jayAqLwotICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsKLSAgICAgICAgIHkgPCA4OwotICAgICAgICAgeSsrLCBwU3JjICs9IHNyY1N0ZXApCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W2NvdW50XSA9IHBTcmNbeF0gLSBwU3JjUmVmW2NvdW50XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZjQ4YzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgY29tcHV0aW5nIHRoZSBlcnJvciBmb3IgYSBNQiBvZiBzaXplIDh4OAotICogCi0gKi8KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgKDYuMS40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrOyBhbHNvIHJldHVybnMgU0FELiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgKFNBRCkgdmFsdWUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmLCBwRHN0IGFuZCBwRHN0U0FELiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLQotICAgIE9NWF9JTlQgICAgIHgsIHksIGNvdW50OwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHNyY1N0ZXAgPD0gMCkgfHwgKHNyY1N0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBlcnJvciBibG9jayAqLwotICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMCwgKnBEc3RTQUQgPSAwOwotICAgICAgICAgeSA8IDg7Ci0gICAgICAgICB5KyssIHBTcmMgKz0gc3JjU3RlcCkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbY291bnRdID0gcFNyY1t4XSAtIHBTcmNSZWZbY291bnRdOwotICAgICAgICAgICAgKnBEc3RTQUQgKz0gYXJtQWJzKHBEc3RbY291bnRdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTQ2N2E0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db3B5MTZ4MTYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBNUEVHNCAxNngxNiBDb3B5IG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCi0gKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNigKLQkJY29uc3QgT01YX1U4ICpwU3JjLCAKLQkJT01YX1U4ICpwRHN0LCAKLQkJT01YX0lOVCBzdGVwKQotIHsKLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLQotICAgIE9NWF9JTlQgY291bnQsaW5kZXgsIHgsIHk7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKHN0ZXAgPCAxNikgfHwgKHN0ZXAgJSAxNikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgCi0gICAgLyogQ29weWluZyB0aGUgcmVmIDE2eDE2IGJsayB0byB0aGUgY3VyciBibGsgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDE2OyB5KyssIGNvdW50ID0gY291bnQgKyBzdGVwIC0gMTYpCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKywgY291bnQrKywgaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtpbmRleF0gPSBwU3JjW2NvdW50XTsKLSAgICAgICAgfSAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjU5NjliLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29weTh4OC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIE1QRUc0IDh4OCBDb3B5IG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCi0gKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCgKLQkJY29uc3QgT01YX1U4ICpwU3JjLCAKLQkJT01YX1U4ICpwRHN0LCAKLQkJT01YX0lOVCBzdGVwKQotIHsKLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLQotICAgIE9NWF9JTlQgY291bnQsaW5kZXgsIHgsIHk7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChzdGVwIDwgOCkgfHwgKHN0ZXAgJSA4KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICAKLSAgICAvKiBDb3B5aW5nIHRoZSByZWYgOHg4IGJsayB0byB0aGUgY3VyciBibGsgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDg7IHkrKywgY291bnQgPSBjb3VudCArIHN0ZXAgLSA4KQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKywgaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtpbmRleF0gPSBwU3JjW2NvdW50XTsKLSAgICAgICAgfSAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mzc5ZmQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgRXhwYW5kIEZyYW1lIGJvdW5kYXJ5IHBpeGVscyBpbnRvIFBsYW5lCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAoNi4xLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbi1wbGFjZS4gIFRoZSB1bmV4cGFuZGVkIAotICogc291cmNlIGZyYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwbGFuZSBidWZmZXIgd2l0aCBzdWZmaWNpZW50IHNwYWNlIAotICogcHJlLWFsbG9jYXRlZCBmb3IgZWRnZSBleHBhbnNpb24sIGFuZCB0aGUgaW5wdXQgZnJhbWUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gCi0gKiB0aGUgcGxhbmUgYnVmZmVyIGNlbnRlci4gIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHBpeGVsIGV4cGFuc2lvbiBieSAKLSAqIHJlcGxpY2F0aW5nIHNvdXJjZSBmcmFtZSBlZGdlIHBpeGVsIGludGVuc2l0aWVzIGluIHRoZSBlbXB0eSBwaXhlbCAKLSAqIGxvY2F0aW9ucyAoZXhwYW5zaW9uIHJlZ2lvbikgYmV0d2VlbiB0aGUgc291cmNlIGZyYW1lIGVkZ2UgYW5kIHRoZSBwbGFuZSAKLSAqIGJ1ZmZlciBlZGdlLiAgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgZXhwYW5zaW9uIHJlZ2lvbnMgb24gdGhlIAotICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBlZGdlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgaUV4cGFuZFBlbHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgdG8gYmUgCi0gKiAgICAgICAgICAgIGV4cGFuZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgaUZyYW1lV2lkdGggLSBmcmFtZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRnJhbWVIZWlnaHQgLWZyYW1lIGhlaWdodDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRXhwYW5kUGVscyAtIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGhvcml6b250YWwgYW5kIAotICogICAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb25zOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlQbGFuZVN0ZXAgLSBkaXN0YW5jZSwgaW4gYnl0ZXMsIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIAotICogICAgICAgICAgICBpbiB0aGUgcGxhbmUgYnVmZmVyOyBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIAotICogICAgICAgICAgICAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC1Qb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIChOT1QgdGhlIAotICogICAgICAgICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBsYW5lKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpcyBlaXRoZXIgZXF1YWwgdG8gemVybyBvciBpcyBhIAotICogICAgICAgICAgICAgIG5vbi1tdWx0aXBsZSBvZiA4OiBpRnJhbWVIZWlnaHQsIGlGcmFtZVdpZHRoLCBpUGxhbmVTdGVwLCBvciAKLSAqICAgICAgICAgICAgICBpRXhwYW5kUGVscy4gCi0gKiAgICAtICAgIGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSgKLQlPTVhfVTgqCXBTcmNEc3RQbGFuZSwgCi0JT01YX1UzMglpRnJhbWVXaWR0aCwgCi0JT01YX1UzMglpRnJhbWVIZWlnaHQsIAotCU9NWF9VMzIJaUV4cGFuZFBlbHMsIAotCU9NWF9VMzIJaVBsYW5lU3RlcAotKQotewotICAgIE9NWF9JTlQgICAgIHgsIHk7Ci0gICAgT01YX1U4KiAgICAgcExlZnQ7Ci0gICAgT01YX1U4KiAgICAgcFJpZ2h0OwotICAgIE9NWF9VOCogICAgIHBUb3A7Ci0gICAgT01YX1U4KiAgICAgcEJvdHRvbTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RQbGFuZSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdFBsYW5lKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaUZyYW1lV2lkdGggPT0gMCB8fCBpRnJhbWVXaWR0aCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlGcmFtZUhlaWdodD09IDAgfHwgaUZyYW1lSGVpZ2h0ICYgNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaUV4cGFuZFBlbHMgPT0gMCB8fCBpRXhwYW5kUGVscyAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlQbGFuZVN0ZXAgPT0gMCB8fCBpUGxhbmVTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscyksIAotICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogVG9wIGFuZCBCb3R0b20gKi8KLSAgICBwVG9wID0gcFNyY0RzdFBsYW5lIC0gKGlFeHBhbmRQZWxzICogaVBsYW5lU3RlcCk7Ci0gICAgcEJvdHRvbSA9IHBTcmNEc3RQbGFuZSArIChpRnJhbWVIZWlnaHQgKiBpUGxhbmVTdGVwKTsKLQotICAgIGZvciAoeSA9IDA7IHkgPCAoT01YX0lOVClpRXhwYW5kUGVsczsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IChPTVhfSU5UKWlGcmFtZVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUb3AgW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKLSAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgW3hdOwotICAgICAgICAgICAgcEJvdHRvbSBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAotICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbKGlGcmFtZUhlaWdodCAtIDEpICogaVBsYW5lU3RlcCArIHhdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogTGVmdCwgUmlnaHQgYW5kIENvcm5lcnMgKi8KLSAgICBwTGVmdCA9IHBTcmNEc3RQbGFuZSAtIGlFeHBhbmRQZWxzOwotICAgIHBSaWdodCA9IHBTcmNEc3RQbGFuZSArIGlGcmFtZVdpZHRoOwotCi0gICAgZm9yICh5ID0gLShPTVhfSU5UKWlFeHBhbmRQZWxzOyB5IDwgKE9NWF9JTlQpKGlGcmFtZUhlaWdodCArIGlFeHBhbmRQZWxzKTsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IChPTVhfSU5UKWlFeHBhbmRQZWxzOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBMZWZ0IFt5ICogaVBsYW5lU3RlcCArIHhdID0gCi0gICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFt5ICogaVBsYW5lU3RlcCArIDBdOwotICAgICAgICAgICAgcFJpZ2h0IFt5ICogaVBsYW5lU3RlcCArIHhdID0gCi0gICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFt5ICogaVBsYW5lU3RlcCArIChpRnJhbWVXaWR0aCAtIDEpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE5MDkzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIGxpbWl0aW5nIHRoZSBNVgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCi0gKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCi0gKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAotICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAotICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCi0gKiAgICAgICAgICAgIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKLSAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAotICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0KAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNViwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgY29uc3QgT01YUmVjdCAqIHBSZWN0Vk9QUmVmLAotICAgICBPTVhfSU5UIFhjb29yZCwKLSAgICAgT01YX0lOVCBZY29vcmQsCi0gICAgIE9NWF9JTlQgc2l6ZQotKQotewotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVjdFZPUFJlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHNpemUgIT0gOCkgJiYgKHNpemUgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHBSZWN0Vk9QUmVmLT53aWR0aCA8ICgyKiBzaXplKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocFJlY3RWT1BSZWYtPmhlaWdodCA8ICgyKiBzaXplKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBwRHN0TVYtPmR4ID0gYXJtTWluIChhcm1NYXggKHBTcmNNVi0+ZHgsIDIqcFJlY3RWT1BSZWYtPnggLSBYY29vcmQpLAotICAgICAgICAgICAgICAgICAgICAoMipwUmVjdFZPUFJlZi0+eCArIHBSZWN0Vk9QUmVmLT53aWR0aCAtIFhjb29yZCAtIHNpemUpKTsKLSAgICBwRHN0TVYtPmR5ID0gYXJtTWluIChhcm1NYXggKHBTcmNNVi0+ZHksIDIqcFJlY3RWT1BSZWYtPnkgLSBZY29vcmQpLAotICAgICAgICAgICAgICAgICAgICAoMipwUmVjdFZPUFJlZi0+eSArIHBSZWN0Vk9QUmVmLT5oZWlnaHQgLSBZY29vcmQgLSBzaXplKSk7Ci0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2RiYmQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fU0FEXzE2eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4KAotCQkJY29uc3QgT01YX1U4KiAJcFNyY09yZywKLQkJCU9NWF9VMzIgCWlTdGVwT3JnLAotCQkJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQkJCU9NWF9VMzIgCWlTdGVwUmVmLAotCQkJT01YX1MzMioJcERzdFNBRCwKLQkJCU9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3RlcFJlZiA9PSAwKSB8fCAoaVN0ZXBSZWYgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCi0gICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDE2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmQxZWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX1NBRF84eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfOHggICAoNi4xLjQuMS41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDQsIDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF84eCgJCi0JY29uc3QgT01YX1U4KiAJcFNyY09yZywKLQlPTVhfVTMyIAlpU3RlcE9yZywKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAotCU9NWF9VMzIgCWlTdGVwUmVmLAotCU9NWF9TMzIqCXBEc3RTQUQsCi0JT01YX1UzMgkJaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3RlcFJlZiA9PSAwKSB8fCAoaVN0ZXBSZWYgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICByZXR1cm4gYXJtVkNDT01NX1NBRCAKLSAgICAgICAgKHBTcmNPcmcsIGlTdGVwT3JnLCBwU3JjUmVmLCBpU3RlcFJlZiwgcERzdFNBRCwgaUhlaWdodCwgOCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MjQxY2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZpbGU6ICAgICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICogSGVhZGVyIGZpbGUgZm9yIEFSTSBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuTUFYIFZDTTRQMTAKLSAqIAotICovCi0gCi0jaWZuZGVmIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAotI2RlZmluZSBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKLSAgCi0vKiBDQVZMQyB0YWJsZXMgKi8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVHJhaWxpbmdPbmVzWzYyXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9DQVZMQ1RvdGFsQ29lZmZbNjJdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbNV07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENMZXZlbFByZWZpeFsxN107Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1s3XTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTMwNzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBDQVZMQyB0YWJsZXMgZm9yIEguMjY0Ci0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCi0KLS8qIFRhYmxlcyBtYXBwaW5nIGEgY29kZSB0byBUcmFpbGluZ09uZXMgYW5kIFRvdGFsQ29lZmYgKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbNjJdID0gewotIDAsCi0gMCwgMSwKLSAwLCAxLCAyLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMwotfTsKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUb3RhbENvZWZmWzYyXSA9IHsKLSAwLAotIDEsIDEsCi0gMiwgMiwgMiwKLSAzLCAzLCAzLCAzLAotIDQsIDQsIDQsIDQsCi0gNSwgNSwgNSwgNSwKLSA2LCA2LCA2LCA2LAotIDcsIDcsIDcsIDcsCi0gOCwgOCwgOCwgOCwKLSA5LCA5LCA5LCA5LAotIDEwLCAxMCwgMTAsIDEwLAotIDExLCAxMSwgMTEsIDExLAotIDEyLCAxMiwgMTIsIDEyLAotIDEzLCAxMywgMTMsIDEzLAotIDE0LCAxNCwgMTQsIDE0LAotIDE1LCAxNSwgMTUsIDE1LAotIDE2LCAxNiwgMTYsIDE2Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMFs2M10gPSB7Ci0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDA1IH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgOCwgMHgwMDA3IH0sCi0gICAgeyAgNiwgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgOSwgMHgwMDA3IH0sCi0gICAgeyAgOCwgMHgwMDA2IH0sCi0gICAgeyAgNywgMHgwMDA1IH0sCi0gICAgeyAgNSwgMHgwMDAzIH0sCi0gICAgeyAxMCwgMHgwMDA3IH0sCi0gICAgeyAgOSwgMHgwMDA2IH0sCi0gICAgeyAgOCwgMHgwMDA1IH0sCi0gICAgeyAgNiwgMHgwMDAzIH0sCi0gICAgeyAxMSwgMHgwMDA3IH0sCi0gICAgeyAxMCwgMHgwMDA2IH0sCi0gICAgeyAgOSwgMHgwMDA1IH0sCi0gICAgeyAgNywgMHgwMDA0IH0sCi0gICAgeyAxMywgMHgwMDBmIH0sCi0gICAgeyAxMSwgMHgwMDA2IH0sCi0gICAgeyAxMCwgMHgwMDA1IH0sCi0gICAgeyAgOCwgMHgwMDA0IH0sCi0gICAgeyAxMywgMHgwMDBiIH0sCi0gICAgeyAxMywgMHgwMDBlIH0sCi0gICAgeyAxMSwgMHgwMDA1IH0sCi0gICAgeyAgOSwgMHgwMDA0IH0sCi0gICAgeyAxMywgMHgwMDA4IH0sCi0gICAgeyAxMywgMHgwMDBhIH0sCi0gICAgeyAxMywgMHgwMDBkIH0sCi0gICAgeyAxMCwgMHgwMDA0IH0sCi0gICAgeyAxNCwgMHgwMDBmIH0sCi0gICAgeyAxNCwgMHgwMDBlIH0sCi0gICAgeyAxMywgMHgwMDA5IH0sCi0gICAgeyAxMSwgMHgwMDA0IH0sCi0gICAgeyAxNCwgMHgwMDBiIH0sCi0gICAgeyAxNCwgMHgwMDBhIH0sCi0gICAgeyAxNCwgMHgwMDBkIH0sCi0gICAgeyAxMywgMHgwMDBjIH0sCi0gICAgeyAxNSwgMHgwMDBmIH0sCi0gICAgeyAxNSwgMHgwMDBlIH0sCi0gICAgeyAxNCwgMHgwMDA5IH0sCi0gICAgeyAxNCwgMHgwMDBjIH0sCi0gICAgeyAxNSwgMHgwMDBiIH0sCi0gICAgeyAxNSwgMHgwMDBhIH0sCi0gICAgeyAxNSwgMHgwMDBkIH0sCi0gICAgeyAxNCwgMHgwMDA4IH0sCi0gICAgeyAxNiwgMHgwMDBmIH0sCi0gICAgeyAxNSwgMHgwMDAxIH0sCi0gICAgeyAxNSwgMHgwMDA5IH0sCi0gICAgeyAxNSwgMHgwMDBjIH0sCi0gICAgeyAxNiwgMHgwMDBiIH0sCi0gICAgeyAxNiwgMHgwMDBlIH0sCi0gICAgeyAxNiwgMHgwMDBkIH0sCi0gICAgeyAxNSwgMHgwMDA4IH0sCi0gICAgeyAxNiwgMHgwMDA3IH0sCi0gICAgeyAxNiwgMHgwMDBhIH0sCi0gICAgeyAxNiwgMHgwMDA5IH0sCi0gICAgeyAxNiwgMHgwMDBjIH0sCi0gICAgeyAxNiwgMHgwMDA0IH0sCi0gICAgeyAxNiwgMHgwMDA2IH0sCi0gICAgeyAxNiwgMHgwMDA1IH0sCi0gICAgeyAxNiwgMHgwMDA4IH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4xWzYzXSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICA2LCAweDAwMGIgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICA2LCAweDAwMDcgfSwKLSAgICB7ICA1LCAweDAwMDcgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICA3LCAweDAwMDcgfSwKLSAgICB7ICA2LCAweDAwMGEgfSwKLSAgICB7ICA2LCAweDAwMDkgfSwKLSAgICB7ICA0LCAweDAwMDUgfSwKLSAgICB7ICA4LCAweDAwMDcgfSwKLSAgICB7ICA2LCAweDAwMDYgfSwKLSAgICB7ICA2LCAweDAwMDUgfSwKLSAgICB7ICA0LCAweDAwMDQgfSwKLSAgICB7ICA4LCAweDAwMDQgfSwKLSAgICB7ICA3LCAweDAwMDYgfSwKLSAgICB7ICA3LCAweDAwMDUgfSwKLSAgICB7ICA1LCAweDAwMDYgfSwKLSAgICB7ICA5LCAweDAwMDcgfSwKLSAgICB7ICA4LCAweDAwMDYgfSwKLSAgICB7ICA4LCAweDAwMDUgfSwKLSAgICB7ICA2LCAweDAwMDggfSwKLSAgICB7IDExLCAweDAwMGYgfSwKLSAgICB7ICA5LCAweDAwMDYgfSwKLSAgICB7ICA5LCAweDAwMDUgfSwKLSAgICB7ICA2LCAweDAwMDQgfSwKLSAgICB7IDExLCAweDAwMGIgfSwKLSAgICB7IDExLCAweDAwMGUgfSwKLSAgICB7IDExLCAweDAwMGQgfSwKLSAgICB7ICA3LCAweDAwMDQgfSwKLSAgICB7IDEyLCAweDAwMGYgfSwKLSAgICB7IDExLCAweDAwMGEgfSwKLSAgICB7IDExLCAweDAwMDkgfSwKLSAgICB7ICA5LCAweDAwMDQgfSwKLSAgICB7IDEyLCAweDAwMGIgfSwKLSAgICB7IDEyLCAweDAwMGUgfSwKLSAgICB7IDEyLCAweDAwMGQgfSwKLSAgICB7IDExLCAweDAwMGMgfSwKLSAgICB7IDEyLCAweDAwMDggfSwKLSAgICB7IDEyLCAweDAwMGEgfSwKLSAgICB7IDEyLCAweDAwMDkgfSwKLSAgICB7IDExLCAweDAwMDggfSwKLSAgICB7IDEzLCAweDAwMGYgfSwKLSAgICB7IDEzLCAweDAwMGUgfSwKLSAgICB7IDEzLCAweDAwMGQgfSwKLSAgICB7IDEyLCAweDAwMGMgfSwKLSAgICB7IDEzLCAweDAwMGIgfSwKLSAgICB7IDEzLCAweDAwMGEgfSwKLSAgICB7IDEzLCAweDAwMDkgfSwKLSAgICB7IDEzLCAweDAwMGMgfSwKLSAgICB7IDEzLCAweDAwMDcgfSwKLSAgICB7IDE0LCAweDAwMGIgfSwKLSAgICB7IDEzLCAweDAwMDYgfSwKLSAgICB7IDEzLCAweDAwMDggfSwKLSAgICB7IDE0LCAweDAwMDkgfSwKLSAgICB7IDE0LCAweDAwMDggfSwKLSAgICB7IDE0LCAweDAwMGEgfSwKLSAgICB7IDEzLCAweDAwMDEgfSwKLSAgICB7IDE0LCAweDAwMDcgfSwKLSAgICB7IDE0LCAweDAwMDYgfSwKLSAgICB7IDE0LCAweDAwMDUgfSwKLSAgICB7IDE0LCAweDAwMDQgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjJbNjNdID0gewotICAgIHsgIDQsIDB4MDAwZiB9LAotICAgIHsgIDYsIDB4MDAwZiB9LAotICAgIHsgIDQsIDB4MDAwZSB9LAotICAgIHsgIDYsIDB4MDAwYiB9LAotICAgIHsgIDUsIDB4MDAwZiB9LAotICAgIHsgIDQsIDB4MDAwZCB9LAotICAgIHsgIDYsIDB4MDAwOCB9LAotICAgIHsgIDUsIDB4MDAwYyB9LAotICAgIHsgIDUsIDB4MDAwZSB9LAotICAgIHsgIDQsIDB4MDAwYyB9LAotICAgIHsgIDcsIDB4MDAwZiB9LAotICAgIHsgIDUsIDB4MDAwYSB9LAotICAgIHsgIDUsIDB4MDAwYiB9LAotICAgIHsgIDQsIDB4MDAwYiB9LAotICAgIHsgIDcsIDB4MDAwYiB9LAotICAgIHsgIDUsIDB4MDAwOCB9LAotICAgIHsgIDUsIDB4MDAwOSB9LAotICAgIHsgIDQsIDB4MDAwYSB9LAotICAgIHsgIDcsIDB4MDAwOSB9LAotICAgIHsgIDYsIDB4MDAwZSB9LAotICAgIHsgIDYsIDB4MDAwZCB9LAotICAgIHsgIDQsIDB4MDAwOSB9LAotICAgIHsgIDcsIDB4MDAwOCB9LAotICAgIHsgIDYsIDB4MDAwYSB9LAotICAgIHsgIDYsIDB4MDAwOSB9LAotICAgIHsgIDQsIDB4MDAwOCB9LAotICAgIHsgIDgsIDB4MDAwZiB9LAotICAgIHsgIDcsIDB4MDAwZSB9LAotICAgIHsgIDcsIDB4MDAwZCB9LAotICAgIHsgIDUsIDB4MDAwZCB9LAotICAgIHsgIDgsIDB4MDAwYiB9LAotICAgIHsgIDgsIDB4MDAwZSB9LAotICAgIHsgIDcsIDB4MDAwYSB9LAotICAgIHsgIDYsIDB4MDAwYyB9LAotICAgIHsgIDksIDB4MDAwZiB9LAotICAgIHsgIDgsIDB4MDAwYSB9LAotICAgIHsgIDgsIDB4MDAwZCB9LAotICAgIHsgIDcsIDB4MDAwYyB9LAotICAgIHsgIDksIDB4MDAwYiB9LAotICAgIHsgIDksIDB4MDAwZSB9LAotICAgIHsgIDgsIDB4MDAwOSB9LAotICAgIHsgIDgsIDB4MDAwYyB9LAotICAgIHsgIDksIDB4MDAwOCB9LAotICAgIHsgIDksIDB4MDAwYSB9LAotICAgIHsgIDksIDB4MDAwZCB9LAotICAgIHsgIDgsIDB4MDAwOCB9LAotICAgIHsgMTAsIDB4MDAwZCB9LAotICAgIHsgIDksIDB4MDAwNyB9LAotICAgIHsgIDksIDB4MDAwOSB9LAotICAgIHsgIDksIDB4MDAwYyB9LAotICAgIHsgMTAsIDB4MDAwOSB9LAotICAgIHsgMTAsIDB4MDAwYyB9LAotICAgIHsgMTAsIDB4MDAwYiB9LAotICAgIHsgMTAsIDB4MDAwYSB9LAotICAgIHsgMTAsIDB4MDAwNSB9LAotICAgIHsgMTAsIDB4MDAwOCB9LAotICAgIHsgMTAsIDB4MDAwNyB9LAotICAgIHsgMTAsIDB4MDAwNiB9LAotICAgIHsgMTAsIDB4MDAwMSB9LAotICAgIHsgMTAsIDB4MDAwNCB9LAotICAgIHsgMTAsIDB4MDAwMyB9LAotICAgIHsgMTAsIDB4MDAwMiB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuM1s2M10gPSB7Ci0gICAgeyAgNiwgMHgwMDAzIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDA0IH0sCi0gICAgeyAgNiwgMHgwMDA1IH0sCi0gICAgeyAgNiwgMHgwMDA2IH0sCi0gICAgeyAgNiwgMHgwMDA4IH0sCi0gICAgeyAgNiwgMHgwMDA5IH0sCi0gICAgeyAgNiwgMHgwMDBhIH0sCi0gICAgeyAgNiwgMHgwMDBiIH0sCi0gICAgeyAgNiwgMHgwMDBjIH0sCi0gICAgeyAgNiwgMHgwMDBkIH0sCi0gICAgeyAgNiwgMHgwMDBlIH0sCi0gICAgeyAgNiwgMHgwMDBmIH0sCi0gICAgeyAgNiwgMHgwMDEwIH0sCi0gICAgeyAgNiwgMHgwMDExIH0sCi0gICAgeyAgNiwgMHgwMDEyIH0sCi0gICAgeyAgNiwgMHgwMDEzIH0sCi0gICAgeyAgNiwgMHgwMDE0IH0sCi0gICAgeyAgNiwgMHgwMDE1IH0sCi0gICAgeyAgNiwgMHgwMDE2IH0sCi0gICAgeyAgNiwgMHgwMDE3IH0sCi0gICAgeyAgNiwgMHgwMDE4IH0sCi0gICAgeyAgNiwgMHgwMDE5IH0sCi0gICAgeyAgNiwgMHgwMDFhIH0sCi0gICAgeyAgNiwgMHgwMDFiIH0sCi0gICAgeyAgNiwgMHgwMDFjIH0sCi0gICAgeyAgNiwgMHgwMDFkIH0sCi0gICAgeyAgNiwgMHgwMDFlIH0sCi0gICAgeyAgNiwgMHgwMDFmIH0sCi0gICAgeyAgNiwgMHgwMDIwIH0sCi0gICAgeyAgNiwgMHgwMDIxIH0sCi0gICAgeyAgNiwgMHgwMDIyIH0sCi0gICAgeyAgNiwgMHgwMDIzIH0sCi0gICAgeyAgNiwgMHgwMDI0IH0sCi0gICAgeyAgNiwgMHgwMDI1IH0sCi0gICAgeyAgNiwgMHgwMDI2IH0sCi0gICAgeyAgNiwgMHgwMDI3IH0sCi0gICAgeyAgNiwgMHgwMDI4IH0sCi0gICAgeyAgNiwgMHgwMDI5IH0sCi0gICAgeyAgNiwgMHgwMDJhIH0sCi0gICAgeyAgNiwgMHgwMDJiIH0sCi0gICAgeyAgNiwgMHgwMDJjIH0sCi0gICAgeyAgNiwgMHgwMDJkIH0sCi0gICAgeyAgNiwgMHgwMDJlIH0sCi0gICAgeyAgNiwgMHgwMDJmIH0sCi0gICAgeyAgNiwgMHgwMDMwIH0sCi0gICAgeyAgNiwgMHgwMDMxIH0sCi0gICAgeyAgNiwgMHgwMDMyIH0sCi0gICAgeyAgNiwgMHgwMDMzIH0sCi0gICAgeyAgNiwgMHgwMDM0IH0sCi0gICAgeyAgNiwgMHgwMDM1IH0sCi0gICAgeyAgNiwgMHgwMDM2IH0sCi0gICAgeyAgNiwgMHgwMDM3IH0sCi0gICAgeyAgNiwgMHgwMDM4IH0sCi0gICAgeyAgNiwgMHgwMDM5IH0sCi0gICAgeyAgNiwgMHgwMDNhIH0sCi0gICAgeyAgNiwgMHgwMDNiIH0sCi0gICAgeyAgNiwgMHgwMDNjIH0sCi0gICAgeyAgNiwgMHgwMDNkIH0sCi0gICAgeyAgNiwgMHgwMDNlIH0sCi0gICAgeyAgNiwgMHgwMDNmIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW40WzE1XSA9IHsKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDcgfSwKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDQgfSwKLSAgICB7ICA2LCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDMgfSwKLSAgICB7ICA3LCAweDAwMDMgfSwKLSAgICB7ICA3LCAweDAwMDIgfSwKLSAgICB7ICA2LCAweDAwMDUgfSwKLSAgICB7ICA2LCAweDAwMDIgfSwKLSAgICB7ICA4LCAweDAwMDMgfSwKLSAgICB7ICA4LCAweDAwMDIgfSwKLSAgICB7ICA3LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotCi1jb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzVdID0gewotICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjAsIAotICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjEsCi0gICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMywgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuNAotfTsKLQotLyogVGFibGUgZm9yIGxldmVsX3ByZWZpeCAqLwotCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4WzE3XSA9IHsKLSAgICB7ICAxLCAxfSwKLSAgICB7ICAyLCAxfSwKLSAgICB7ICAzLCAxfSwKLSAgICB7ICA0LCAxfSwKLSAgICB7ICA1LCAxfSwKLSAgICB7ICA2LCAxfSwKLSAgICB7ICA3LCAxfSwKLSAgICB7ICA4LCAxfSwKLSAgICB7ICA5LCAxfSwKLSAgICB7IDEwLCAxfSwKLSAgICB7IDExLCAxfSwKLSAgICB7IDEyLCAxfSwKLSAgICB7IDEzLCAxfSwKLSAgICB7IDE0LCAxfSwKLSAgICB7IDE1LCAxfSwKLSAgICB7IDE2LCAxfSwKLSAgICB7ICAwLCAwfQotfTsKLQotLyogVGFibGVzIGZvciB0b3RhbF96ZXJvcyAqLwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMVsxN10gPSB7Ci0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgNCwgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDAyIH0sCi0gICAgeyAgNSwgMHgwMDAzIH0sCi0gICAgeyAgNSwgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDAzIH0sCi0gICAgeyAgNiwgMHgwMDAyIH0sCi0gICAgeyAgNywgMHgwMDAzIH0sCi0gICAgeyAgNywgMHgwMDAyIH0sCi0gICAgeyAgOCwgMHgwMDAzIH0sCi0gICAgeyAgOCwgMHgwMDAyIH0sCi0gICAgeyAgOSwgMHgwMDAzIH0sCi0gICAgeyAgOSwgMHgwMDAyIH0sCi0gICAgeyAgOSwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyWzE2XSA9IHsKLSAgICB7ICAzLCAweDAwMDcgfSwKLSAgICB7ICAzLCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICA0LCAweDAwMDUgfSwKLSAgICB7ICA0LCAweDAwMDQgfSwKLSAgICB7ICA0LCAweDAwMDMgfSwKLSAgICB7ICA0LCAweDAwMDIgfSwKLSAgICB7ICA1LCAweDAwMDMgfSwKLSAgICB7ICA1LCAweDAwMDIgfSwKLSAgICB7ICA2LCAweDAwMDMgfSwKLSAgICB7ICA2LCAweDAwMDIgfSwKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczNbMTVdID0gewotICAgIHsgIDQsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNyB9LAotICAgIHsgIDMsIDB4MDAwNiB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDQsIDB4MDAwNCB9LAotICAgIHsgIDQsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDQsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMyB9LAotICAgIHsgIDUsIDB4MDAwMiB9LAotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNFsxNF0gPSB7Ci0gICAgeyAgNSwgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgNCwgMHgwMDA1IH0sCi0gICAgeyAgNCwgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgNCwgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDAyIH0sCi0gICAgeyAgNSwgMHgwMDAyIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M1WzEzXSA9IHsKLSAgICB7ICA0LCAweDAwMDUgfSwKLSAgICB7ICA0LCAweDAwMDQgfSwKLSAgICB7ICA0LCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDcgfSwKLSAgICB7ICAzLCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICA0LCAweDAwMDIgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczZbMTJdID0gewotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwNyB9LAotICAgIHsgIDMsIDB4MDAwNiB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zN1sxMV0gPSB7Ci0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M4WzEwXSA9IHsKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczlbOV0gPSB7Ci0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMFs4XSA9IHsKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDAgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczExWzddID0gewotICAgIHsgIDQsIDB4MDAwMCB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTJbNl0gPSB7Ci0gICAgeyAgNCwgMHgwMDAwIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxM1s1XSA9IHsKLSAgICB7ICAzLCAweDAwMDAgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE0WzRdID0gewotICAgIHsgIDIsIDB4MDAwMCB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTVbM10gPSB7Ci0gICAgeyAgMSwgMHgwMDAwIH0sCi0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLWNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV0gPSB7Ci0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMiwKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MzLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M0LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M1LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M2LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M3LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M4LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M5LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMCwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTEsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEyLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMywgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTQsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE1IAotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8xWzVdID0gewotICAgIHsgIDEsIDEgfSwKLSAgICB7ICAyLCAxIH0sCi0gICAgeyAgMywgMSB9LAotICAgIHsgIDMsIDAgfSwKLSAgICB7ICAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMls0XSA9IHsKLSAgICB7ICAxLCAxIH0sCi0gICAgeyAgMiwgMSB9LAotICAgIHsgIDIsIDAgfSwKLSAgICB7ICAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfM1szXSA9IHsKLSAgICB7ICAxLCAxIH0sCi0gICAgeyAgMSwgMCB9LAotICAgIHsgIDAsIDAgfQotfTsKLQotY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzIsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8zCi19OwotCi0KLS8qIFRhYmxlcyBmb3IgcnVuX2JlZm9yZSAqLwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUxWzNdID0gewotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDEsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUyWzRdID0gewotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUzWzVdID0gewotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMiB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU0WzZdID0gewotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMiB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU1WzddID0gewotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMiB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU2WzhdID0gewotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMCB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU3WzE2XSA9IHsKLSAgICB7ICAzLCAweDAwMDcgfSwKLSAgICB7ICAzLCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA3LCAweDAwMDEgfSwKLSAgICB7ICA4LCAweDAwMDEgfSwKLSAgICB7ICA5LCAweDAwMDEgfSwKLSAgICB7IDEwLCAweDAwMDEgfSwKLSAgICB7IDExLCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzddID0gewotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUyLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTMsIAotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNCwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU1LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTYsIAotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNwotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjExYTM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIGNvbXBhcmluZyBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIAotICogdGhlIGJlc3QgTVYgYW5kIFNBRAotICoKLSAqLwotICAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfRXhwR29sQml0c1VzZWQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIEV4cC1Hb2xvbWIgY29kZSBsZW5ndGggZm9yIGEgZ2l2ZW4gdmFsdWVzCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgICAgICB2YWwJU2lnbmVkIG51bWJlciBmb3Igd2hpY2ggRXhwLUdvbG9tYiBjb2RlIGxlbmd0aCBoYXMKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGN1bGF0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6IAotICogICAgICAgICAgICAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBFeHAtR29sb21iIGNvZGUgZm9yIHZhbAotICovCi0KLXN0YXRpYyBPTVhfVTE2IGFybVZDTTRQMTBfRXhwR29sQml0c1VzZWQgKE9NWF9TMTYgdmFsKQotewotICAgIE9NWF9VMTYgc2l6ZUNvZGVOdW0sIGNvZGVOdW07Ci0gICAgCi0gICAgLyogTWFwcGluZyB2YWwgdG8gY29kZU51bSAqLwotICAgIGNvZGVOdW0gPSBhcm1BYnMgKHZhbCk7Ci0gICAgaWYgKHZhbCA+IDApCi0gICAgewotICAgICAgICBjb2RlTnVtID0gKDIgKiBjb2RlTnVtKSAtIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNvZGVOdW0gPSAyICogY29kZU51bTsKLSAgICB9Ci0gICAgCi0gICAgLyogU2l6ZSBvZiB0aGUgZXhwLWdvbG9tYiBjb2RlICovCi0gICAgc2l6ZUNvZGVOdW0gPSAoMiAqIGFybUxvZ1NpemUgKGNvZGVOdW0gKyAxKSkgLSAxOwotICAgIAotICAgIHJldHVybiBzaXplQ29kZU51bTsKLX0KLSAgICAgICAgICAgICAgICAKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBNb3Rpb24gY29zdCB0byBkZWNpZGUgdGhlIAotICogYmVzdCBNViBhbmQgYmVzdCBNQwotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgICAgICAgbXZYCXggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IgaW4gMS80IHBlbCB1bml0cwotICogW2luXQkgICAgICAgICBtdlkJeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvciBpbiAxLzQgcGVsIHVuaXRzCi0gKiBbaW5dCSAgICAgIGRpZmZNVglkaWZmZXJlbnRpYWwgTVYKLSAqIFtpbl0JICAgICBjYW5kU0FECUNhbmRpZGF0ZSBTQUQKLSAqIFtpbl0JICAgICAgYmVzdE1WCUJlc3QgTVYsIGNvbnRhaW5zIGJlc3QgTVYgdGlsbCB0aGUgcHJldmlvdXMgaW50ZXJhdGlvbi4KLSAqIFtpbl0gICAgICAgbkxhbWRhICAgIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogW2luXSAgICpwQmVzdENvc3QgICAgQ29udGFpbnMgdGhlIGN1cnJlbnQgYmVzdCBtb3Rpb24gY29zdC4KLSAqIFtvdXRdICAqcEJlc3RDb3N0ICAgIHBCZXN0Q29zdCBNb3Rpb24gY29zdCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNViAKLSAqICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGp1ZGdlbWVudDsgCi0gKiAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCBhcyBTQUQrTGFtZGEqQml0c1VzZWRCeU1WLCBpZiB0aGUgY2FuZENvc3QgaXMgbGVzcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIGJlc3QgY29zdCBwYXNzZWQgdGhlbiB0aGUgKnBCZXN0Q29zdCB3aWxsIGJlIGVxdWFsIHRvIGNhbmRDb3N0Ci0gKiBbb3V0XQkgIGJlc3RNVglGaW5hbGx5IHdpbGwgaGF2ZSB0aGUgYmVzdCBNViBhZnRlciB0aGUganVkZ2VtZW50LgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IG1vdGlvbiBjb3N0IGlzIHRoZSBiZXN0IAotICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IG1vdGlvbiBjb3N0Ci0gKi8KLQotT01YX0lOVCBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCi0gICAgT01YX1MxNiAgbXZYLAotICAgIE9NWF9TMTYgIG12WSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIAotICAgIE9NWF9JTlQgY2FuZFNBRCwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKmJlc3RNViwgCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pIAotewotICAgIE9NWF9TMzIgY2FuZENvc3Q7Ci0gICAgT01YX1UxNiBzaXplQ29kZU51bTsKLSAgICAKLSAgICBzaXplQ29kZU51bSA9IGFybVZDTTRQMTBfRXhwR29sQml0c1VzZWQgKGRpZmZNVi5keCk7Ci0gICAgc2l6ZUNvZGVOdW0gKz0gYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZCAoZGlmZk1WLmR5KTsKLSAgICAKLSAgICAvKiBNb3Rpb24gY29zdCA9IFNBRCArICBsYW1kYSAqICgoYml0c3VzZWQoZGlmZk1WeCkgKyAoYml0c3VzZWQoZGlmZk1WeSkpKi8KLSAgICBjYW5kQ29zdCA9IGNhbmRTQUQgKyAobkxhbWRhICogc2l6ZUNvZGVOdW0pOwotICAgICAgICAKLSAgICAvKiBDYWxjdWxhdGUgY2FuZENvc3QgKi8KLSAgICBpZiAoY2FuZENvc3QgPCAqcEJlc3RDb3N0KQotICAgIHsKLSAgICAgICAgKnBCZXN0Q29zdCA9IGNhbmRDb3N0OwotICAgICAgICBiZXN0TVYtPmR4ID0gbXZYOwotICAgICAgICBiZXN0TVYtPmR5ID0gbXZZOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGNhbmRDb3N0ID4gKnBCZXN0Q29zdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvKiBzaG9ydGVyIG1vdGlvbiB2ZWN0b3IgKi8KLSAgICBpZiAoIChtdlggKiBtdlggKyBtdlkgKiBtdlkpIDwgKChiZXN0TVYtPmR4ICogYmVzdE1WLT5keCkgKyAoYmVzdE1WLT5keSAqIGJlc3RNVi0+ZHkpKSApCi0gICAgewotICAgICAgICAqcEJlc3RDb3N0ID0gY2FuZENvc3Q7Ci0gICAgICAgIGJlc3RNVi0+ZHggPSBtdlg7Ci0gICAgICAgIGJlc3RNVi0+ZHkgPSBtdlk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkYThhYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogSC4yNjQgbHVtYSBkZWJsb2NrIG1vZHVsZQotICogCi0gKi8KLQotI2lmZGVmIERFQlVHX0FSTVZDTTRQMTBfREVCTE9DS1BJWEVMCi0jdW5kZWYgREVCVUdfT04KLSNkZWZpbmUgREVCVUdfT04KLSNlbmRpZiAvKiBERUJVR19BUk1WQ000UDEwX0RFQkxPQ0tQSVhFTCAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCi0gKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCi0gKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCi0gKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKLSAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscwotICogCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KLSAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KLSAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KLSAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KLSAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLwotICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCi0gICAgaW50IENocm9tYUZsYWcKLSkKLXsKLSAgICBpbnQgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOwotICAgIGludCBhcCwgYXEsIGRlbHRhOwotCi0gICAgaWYgKGJTPT0wKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHAzID0gcFEwWy00KlN0ZXBdOwotICAgIHAyID0gcFEwWy0zKlN0ZXBdOwotICAgIHAxID0gcFEwWy0yKlN0ZXBdOwotICAgIHAwID0gcFEwWy0xKlN0ZXBdOwotICAgIHEwID0gcFEwWyAwKlN0ZXBdOwotICAgIHExID0gcFEwWyAxKlN0ZXBdOwotICAgIHEyID0gcFEwWyAyKlN0ZXBdOwotICAgIHEzID0gcFEwWyAzKlN0ZXBdOwotCi0gICAgaWYgKGFybUFicyhwMC1xMCk+PWFscGhhIHx8IGFybUFicyhwMS1wMCk+PWJldGEgfHwgYXJtQWJzKHExLXEwKT49YmV0YSkKLSAgICB7Ci0gICAgICAgIERFQlVHX1BSSU5URl8xMCgiRGVCbG9ja1BpeGVsOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IHwgJTAyeCAlMDJ4ICUwMnggJTAyeCBhbHBoYT0lZCBiZXRhPSVkXG4iLAotICAgICAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBhbHBoYSwgYmV0YSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhcCA9IGFybUFicyhwMiAtIHAwKTsKLSAgICBhcSA9IGFybUFicyhxMiAtIHEwKTsKLQotICAgIGlmIChiUyA8IDQpCi0gICAgewotICAgICAgICBpbnQgdEMgPSB0QzA7Ci0KLSAgICAgICAgaWYgKENocm9tYUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRDKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXAgPCBiZXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRDKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXEgPCBiZXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRDKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7Ci0gICAgICAgIGRlbHRhID0gYXJtQ2xpcCgtdEMsIHRDLCBkZWx0YSk7Ci0KLSAgICAgICAgcFEwWy0xKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcDAgKyBkZWx0YSk7Ci0gICAgICAgIHBRMFsgMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHEwIC0gZGVsdGEpOwotCi0gICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFwPGJldGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbHRhID0gKHAyICsgKChwMCtxMCsxKT4+MSkgLSAocDE8PDEpKT4+MTsKLSAgICAgICAgICAgIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKLSAgICAgICAgICAgIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKHAxICsgZGVsdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXE8YmV0YSkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsdGEgPSAocTIgKyAoKHAwK3EwKzEpPj4xKSAtIChxMTw8MSkpPj4xOwotICAgICAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOwotICAgICAgICAgICAgcFEwWyAxKlN0ZXBdID0gKE9NWF9VOCkocTEgKyBkZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKiBiUz09NCAqLwotICAgIHsKLSAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXA8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KSgocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpPj4zKTsKLSAgICAgICAgICAgIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKChwMiArIHAxICsgcDAgKyBxMCArIDIpPj4yKTsKLSAgICAgICAgICAgIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCgyKnAzICsgMypwMiArIHAxICsgcDAgKyBxMCArIDQpPj4zKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpKCgyKnAxICsgcDAgKyBxMSArIDIpPj4yKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFxPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFEwWyAwKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgMipxMSArIDIqcTAgKyAyKnAwICsgcDEgKyA0KT4+Myk7Ci0gICAgICAgICAgICBwUTBbIDEqU3RlcF0gPSAoT01YX1U4KSgocTIgKyBxMSArIHAwICsgcTAgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwUTBbIDIqU3RlcF0gPSAoT01YX1U4KSgoMipxMyArIDMqcTIgKyBxMSArIHEwICsgcDAgKyA0KT4+Myk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUTBbIDAqU3RlcF0gPSAoT01YX1U4KSgoMipxMSArIHEwICsgcDEgKyAyKT4+Mik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBERUJVR19QUklOVEZfMTMoIkRlQmxvY2tQaXhlbDogJTAyeCAlMDJ4ICUwMnggJTAyeCB8ICUwMnggJTAyeCAlMDJ4ICUwMnggYlM9JWQgLT4gJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBiUywKLSAgICAgICAgcFEwWy0yKlN0ZXBdLCBwUTBbLTEqU3RlcF0scFEwWzAqU3RlcF0scFEwWzEqU3RlcF0pOwotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxZDUzYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaWZkZWYgREVCVUdfQVJNVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVIKLSN1bmRlZiBERUJVR19PTgotI2RlZmluZSBERUJVR19PTgotI2VuZGlmCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgotCi0vKiA0eDQgRGVaaWdaYWcgdGFibGUgKi8KLQotc3RhdGljIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ1sxNl0gPQotewotICAgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKLX07Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAotICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KLSAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCi0gKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAotICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQotICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KLSAqCQkJCQkJCQl0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLQotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTggICoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIG5UYWJsZSwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICkKLXsKLSAgICBpbnQgQ29lZmZUb2tlbiwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzOwotICAgIGludCBMZXZlbCwgTGV2ZWxDb2RlLCBMZXZlbFByZWZpeCwgTGV2ZWxTdWZmaXgsIExldmVsU3VmZml4U2l6ZTsKLSAgICBpbnQgU3VmZml4TGVuZ3RoLCBSdW4sIFplcm9zTGVmdCxDb2VmZk51bTsKLSAgICBpbnQgaSwgRmxhZ3M7Ci0gICAgT01YX1U4ICpwUG9zQ29lZmJ1ZiA9ICpwcFBvc0NvZWZidWY7Ci0gICAgT01YX1MxNiBwTGV2ZWxbMTZdOwotICAgIE9NWF9VOCAgcFJ1blsxNl07Ci0KLSAgICBDb2VmZlRva2VuID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzW25UYWJsZV0pOwotICAgIGFybVJldERhdGFFcnJJZihDb2VmZlRva2VuID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOwotCi0gICAgVHJhaWxpbmdPbmVzID0gYXJtVkNNNFAxMF9DQVZMQ1RyYWlsaW5nT25lc1tDb2VmZlRva2VuXTsKLSAgICBUb3RhbENvZWZmICAgPSBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZltDb2VmZlRva2VuXTsKLSAgICAqcE51bUNvZWZmICAgPSAoT01YX1U4KVRvdGFsQ29lZmY7Ci0KLSAgICBERUJVR19QUklOVEZfMigiVG90YWxDb2VmZiA9ICVkLCBUcmFpbGluZ09uZXMgPSAlZFxuIiwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzKTsKLQotICAgIGlmIChUb3RhbENvZWZmID09IDApCi0gICAgewotICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCi0gICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotICAgIH0KLQotICAgIC8qIERlY29kZSB0cmFpbGluZyBvbmVzICovCi0gICAgZm9yIChpPVRvdGFsQ29lZmYtMTsgaT49VG90YWxDb2VmZi1UcmFpbGluZ09uZXM7IGktLSkKLSAgICB7Ci0gICAgICAgIGlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCAxKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGV2ZWwgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsID0gKzE7Ci0gICAgICAgIH0KLSAgICAgICAgcExldmVsW2ldID0gKE9NWF9TMTYpTGV2ZWw7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRGXzIoIkxldmVsWyVkXSA9ICVkXG4iLCBpLCBwTGV2ZWxbaV0pOwotICAgIH0KLQotICAgIC8qIERlY29kZSAobm9uIHplcm8pIGxldmVsIHZhbHVlcyAqLwotICAgIFN1ZmZpeExlbmd0aCA9IDA7Ci0gICAgaWYgKFRvdGFsQ29lZmY+MTAgJiYgVHJhaWxpbmdPbmVzPDMpCi0gICAgewotICAgICAgICBTdWZmaXhMZW5ndGg9MTsKLSAgICB9Ci0gICAgZm9yICggOyBpPj0wOyBpLS0pCi0gICAgewotICAgICAgICBMZXZlbFByZWZpeCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDTGV2ZWxQcmVmaXgpOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoTGV2ZWxQcmVmaXggPT0gQVJNX05PX0NPREVCT09LX0lOREVYLCBPTVhfU3RzX0Vycik7Ci0KLSAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gU3VmZml4TGVuZ3RoOwotICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE0ICYmIFN1ZmZpeExlbmd0aD09MCkKLSAgICAgICAgewotICAgICAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gNDsKLSAgICAgICAgfQotICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE1KQotICAgICAgICB7Ci0gICAgICAgICAgICBMZXZlbFN1ZmZpeFNpemUgPSAxMjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTGV2ZWxTdWZmaXggPSAwOwotICAgICAgICBpZiAoTGV2ZWxTdWZmaXhTaXplID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgTGV2ZWxTdWZmaXggPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBMZXZlbFN1ZmZpeFNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGV2ZWxDb2RlID0gKExldmVsUHJlZml4IDw8IFN1ZmZpeExlbmd0aCkgKyBMZXZlbFN1ZmZpeDsKLQotCi0gICAgICAgIGlmIChMZXZlbFByZWZpeD09MTUgJiYgU3VmZml4TGVuZ3RoPT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBMZXZlbENvZGUgKz0gMTU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBMZXZlbENvZGUgPSAyKihtYWduaXR1ZGUtMSkgKyBzaWduICovCi0KLSAgICAgICAgaWYgKGk9PVRvdGFsQ29lZmYtMS1UcmFpbGluZ09uZXMgJiYgVHJhaWxpbmdPbmVzPDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIExldmVsIG1hZ25pdHVkZSBjYW4ndCBiZSAxICovCi0gICAgICAgICAgICBMZXZlbENvZGUgKz0gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAoTGV2ZWxDb2RlICYgMSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogMmErMSBtYXBzIHRvIC1hLTEgKi8KLSAgICAgICAgICAgIExldmVsID0gKC1MZXZlbENvZGUtMSk+PjE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAyYSswIG1hcHMgdG8gK2ErMSAqLwotICAgICAgICAgICAgTGV2ZWwgPSAoTGV2ZWxDb2RlKzIpPj4xOwotICAgICAgICB9Ci0gICAgICAgIHBMZXZlbFtpXSA9IChPTVhfUzE2KUxldmVsOwotCi0gICAgICAgIERFQlVHX1BSSU5URl8yKCJMZXZlbFslZF0gPSAlZFxuIiwgaSwgcExldmVsW2ldKTsKLQotICAgICAgICBpZiAoU3VmZml4TGVuZ3RoPT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdWZmaXhMZW5ndGg9MTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICgoTGV2ZWxDb2RlPj4xKSsxKT4oMzw8KFN1ZmZpeExlbmd0aC0xKSkgJiYgU3VmZml4TGVuZ3RoPDYgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdWZmaXhMZW5ndGgrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIERlY29kZSBydW4gdmFsdWVzICovCi0gICAgWmVyb3NMZWZ0ID0gMDsKLSAgICBpZiAoVG90YWxDb2VmZiA8IHNNYXhOdW1Db2VmZikKLSAgICB7Ci0gICAgICAgIC8qIERlY29kZSBUb3RhbFplcm9zIFZMQyAqLwotICAgICAgICBpZiAoc01heE51bUNvZWZmPT00KQotICAgICAgICB7Ci0gICAgICAgICAgICBaZXJvc0xlZnQgPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbVG90YWxDb2VmZi0xXSk7Ci0gICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoWmVyb3NMZWZ0ID09QVJNX05PX0NPREVCT09LX0lOREVYICwgT01YX1N0c19FcnIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgWmVyb3NMZWZ0ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbVG90YWxDb2VmZi0xXSk7Ci0gICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFplcm9zTGVmdCA9PUFSTV9OT19DT0RFQk9PS19JTkRFWCAsIE9NWF9TdHNfRXJyKTsKLQkgICAgfQotICAgIH0KLQotICAgIERFQlVHX1BSSU5URl8xKCJUb3RhbFplcm9zID0gJWRcbiIsIFplcm9zTGVmdCk7Ci0KLQlDb2VmZk51bT1aZXJvc0xlZnQrVG90YWxDb2VmZi0xOwotCi0gICAgZm9yIChpPVRvdGFsQ29lZmYtMTsgaT4wOyBpLS0pCi0gICAgewotICAgICAgICBSdW4gPSAwOwotICAgICAgICBpZiAoWmVyb3NMZWZ0ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IFRhYmxlID0gWmVyb3NMZWZ0OwotICAgICAgICAgICAgaWYgKFRhYmxlID4gNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUYWJsZSA9IDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSdW4gPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1tUYWJsZS0xXSk7Ci0gICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoUnVuID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOwotICAgICAgICB9Ci0gICAgICAgIHBSdW5baV0gPSAoT01YX1U4KVJ1bjsKLQotICAgICAgICBERUJVR19QUklOVEZfMigiUnVuWyVkXSA9ICVkXG4iLCBpLCBwUnVuW2ldKTsKLQotICAgICAgICBaZXJvc0xlZnQgLT0gUnVuOwotICAgIH0KLSAgICBwUnVuWzBdID0gKE9NWF9VOClaZXJvc0xlZnQ7Ci0KLSAgICBERUJVR19QUklOVEZfMSgiUnVuWzBdID0gJWRcbiIsIHBSdW5baV0pOwotCi0KLSAgICAvKiBGaWxsIGluIGNvZWZmaWNpZW50cyAqLwotCSAgICAKLSAgICBpZiAoc01heE51bUNvZWZmPT0xNSkKLSAgICB7Ci0gICAgICAgIENvZWZmTnVtKys7IC8qIFNraXAgdGhlIERDIHBvc2l0aW9uICovCi0gICAgfQotCQotCS8qZm9yIChpPTA7aTxUb3RhbENvZWZmO2krKykKLQkJQ29lZmZOdW0gKz0gcFJ1bltpXSsxOyovCi0gICAgCi0JZm9yIChpPShUb3RhbENvZWZmLTEpOyBpPj0wOyBpLS0pCi0gICAgewotICAgICAgICAvKkNvZWZmTnVtICs9IHBSdW5baV0rMTsqLwotICAgICAgICBMZXZlbCAgICAgPSBwTGV2ZWxbaV07Ci0KLSAgICAgICAgREVCVUdfUFJJTlRGXzIoIkNvZWZbJWRdID0gJWRcbiIsIENvZWZmTnVtLCBMZXZlbCk7Ci0KLSAgICAgICAgRmxhZ3MgPSBDb2VmZk51bTsKLQkJQ29lZmZOdW0gLT0gKHBSdW5baV0rMSk7Ci0gICAgICAgIGlmIChzTWF4TnVtQ29lZmY+NCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogUGVyZm9ybSA0eDQgRGVaaWdaYWcgKi8KLSAgICAgICAgICAgIEZsYWdzID0gYXJtVkNNNFAxMF9aaWdaYWdbRmxhZ3NdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpPT0wKQotICAgICAgICB7ICAgCi0gICAgICAgICAgICAvKiBFbmQgb2YgYmxvY2sgZmxhZyAqLwotICAgICAgICAgICAgRmxhZ3MgKz0gMHgyMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoTGV2ZWw8LTEyOCB8fCBMZXZlbD4xMjcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE92ZXJmbG93IGZsYWcgKi8KLSAgICAgICAgICAgIEZsYWdzICs9IDB4MTA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICpwUG9zQ29lZmJ1ZisrID0gKE9NWF9VOCkoRmxhZ3MpOwotICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKExldmVsICYgMHhGRik7Ci0gICAgICAgIGlmIChGbGFncyAmIDB4MTApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUG9zQ29lZmJ1ZisrID0gKE9NWF9VOCkoTGV2ZWw+PjgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnBwUG9zQ29lZmJ1ZiA9IHBQb3NDb2VmYnVmOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDZjZWYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIHRhYmxlcwotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdID0gCi17Ci0gICAgMCwgMiwgMCwgMiwKLSAgICAyLCAxLCAyLCAxLAotICAgIDAsIDIsIDAsIDIsCi0gICAgMiwgMSwgMiwgMQotfTsKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sMngyWzRdID0gCi17Ci0gICAgMCwgMiwKLSAgICAyLCAxCi19OwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdID0KLXsKLSAgICB7IDEwLCAxNiwgMTMgfSwKLSAgICB7IDExLCAxOCwgMTQgfSwKLSAgICB7IDEzLCAyMCwgMTYgfSwKLSAgICB7IDE0LCAyMywgMTggfSwKLSAgICB7IDE2LCAyNSwgMjAgfSwKLSAgICB7IDE4LCAyOSwgMjMgfQotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkNmMwZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCB0cmFuc2Zvcm0gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotIAotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLXZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKQotewotICAgIGludCBpOwotCi0gICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKLSAgICB7Ci0gICAgICAgIGludCBkMCA9IHBTcmNbaSswXTsKLSAgICAgICAgaW50IGQxID0gcFNyY1tpKzFdOwotICAgICAgICBpbnQgZDIgPSBwU3JjW2krMl07Ci0gICAgICAgIGludCBkMyA9IHBTcmNbaSszXTsKLSAgICAgICAgaW50IGUwID0gZDAgKyBkMzsKLSAgICAgICAgaW50IGUxID0gZDAgLSBkMzsKLSAgICAgICAgaW50IGUyID0gZDEgKyBkMjsKLSAgICAgICAgaW50IGUzID0gZDEgLSBkMjsKLSAgICAgICAgaW50IGYwID0gZTAgKyBlMjsKLSAgICAgICAgaW50IGYxID0gKGUxIDw8IDEpICsgZTM7Ci0gICAgICAgIGludCBmMiA9IGUwIC0gZTI7Ci0gICAgICAgIGludCBmMyA9IGUxIC0gKGUzIDw8IDEpOwotICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNilmMDsKLSAgICAgICAgcERzdFtpKzFdID0gKE9NWF9TMTYpZjE7Ci0gICAgICAgIHBEc3RbaSsyXSA9IChPTVhfUzE2KWYyOwotICAgICAgICBwRHN0W2krM10gPSAoT01YX1MxNilmMzsKLSAgICB9Ci0KLSAgICAvKiBUcmFuc2Zvcm0gY29sdW1ucyAqLwotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGludCBmMCA9IHBEc3RbaSswXTsKLSAgICAgICAgaW50IGYxID0gcERzdFtpKzRdOwotICAgICAgICBpbnQgZjIgPSBwRHN0W2krOF07Ci0gICAgICAgIGludCBmMyA9IHBEc3RbaSsxMl07Ci0gICAgICAgIGludCBnMCA9IGYwICsgZjM7Ci0gICAgICAgIGludCBnMSA9IGYwIC0gZjM7Ci0gICAgICAgIGludCBnMiA9IGYxICsgZjI7Ci0gICAgICAgIGludCBnMyA9IGYxIC0gZjI7Ci0gICAgICAgIGludCBoMCA9IGcwICsgZzI7Ci0gICAgICAgIGludCBoMSA9IChnMSA8PCAxKSArIGczOwotICAgICAgICBpbnQgaDIgPSBnMCAtIGcyOwotICAgICAgICBpbnQgaDMgPSBnMSAtIChnMyA8PCAxKTsKLSAgICAgICAgcERzdFtpKzBdID0gKE9NWF9TMTYpIGgwOwotICAgICAgICBwRHN0W2krNF0gPSAoT01YX1MxNikgaDE7Ci0gICAgICAgIHBEc3RbaSs4XSA9IChPTVhfUzE2KSBoMjsKLSAgICAgICAgcERzdFtpKzEyXSA9IChPTVhfUzE2KSBoMzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5ZGY0OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb25zIHdpbGwgaGVscCB0byBjYWxjdWxhdGUgSGFsZiBQZWwgbHVtYSBpbnRlcnBvbGF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKLSAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAotICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAotICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSkKLXsKLSAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKLSAgICBPTVhfUzE2ICAgICBCdWYgWzIxICogMTZdOyAgLyogMjEgcm93cyBieSAxNiBwaXhlbHMgcGVyIHJvdyAqLwotICAgIE9NWF9VMzIgICAgIHksIHg7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKgotICAgICAqIEludGVybWVkaWF0ZSB2YWx1ZXMgd2lsbCBiZSAxLzIgcGVsIGF0IEhvcml6b250YWwgZGlyZWN0aW9uCi0gICAgICogU3RhcnRpbmcgYXQgKDAuNSwgLTIpIGF0IHRvcCBleHRlbmRpbmcgdG8gKDAuNSwgaGVpZ2h0ICsgMykgYXQgYm90dG9tCi0gICAgICogQnVmIGNvbnRhaW5zIGEgMkQgYXJyYXkgb2Ygc2l6ZSAoaVdpZHRoKVgoaUhlaWdodCArIDUpCi0gICAgICovCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQgKyA1OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvcyA9ICh5LTIpICogaVNyY1N0ZXAgKyB4OwotICAgICAgICAgICAgSGFsZkNvZWZmID0gCi0gICAgICAgICAgICAgICAgcFNyYyBbcG9zIC0gMl0gLSAKLSAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zIC0gMV0gKyAKLSAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3Bvc10gKyAKLSAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3BvcyArIDFdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyArIDJdICsgCi0gICAgICAgICAgICAgICAgcFNyYyBbcG9zICsgM107Ci0gICAgICAgICAgICBCdWYgW3kgKiBpV2lkdGggKyB4XSA9IChPTVhfUzE2KUhhbGZDb2VmZjsKLSAgICAgICAgfSAvKiB4ICovCi0gICAgfSAvKiB5ICovCi0KLSAgICAvKiBWZXJ0aWNhbCBpbnRlcnBvbGF0ZSAqLwotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvcyA9IHkgKiBpV2lkdGggKyB4OwotICAgICAgICAgICAgSGFsZkNvZWZmID0gCi0gICAgICAgICAgICAgICAgQnVmIFtwb3NdIC0gCi0gICAgICAgICAgICAgICAgNSAqIEJ1ZiBbcG9zICsgMSAqIGlXaWR0aF0gKyAKLSAgICAgICAgICAgICAgICAyMCAqIEJ1ZiBbcG9zICsgMiAqIGlXaWR0aF0gKyAKLSAgICAgICAgICAgICAgICAyMCAqIEJ1ZiBbcG9zICsgMyAqIGlXaWR0aF0gLSAKLSAgICAgICAgICAgICAgICA1ICogQnVmIFtwb3MgKyA0ICogaVdpZHRoXSArIAotICAgICAgICAgICAgICAgIEJ1ZiBbcG9zICsgNSAqIGlXaWR0aF07Ci0KLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IChIYWxmQ29lZmYgKyA1MTIpID4+IDEwOwotICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7Ci0KLSAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKE9NWF9VOCkgSGFsZkNvZWZmOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0NjJiMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb25zIHdpbGwgaGVscCB0byBjYWxjdWxhdGUgSGFsZiBQZWwgbHVtYSBpbnRlcnBvbGF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucwotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKLSAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLCAKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAotKQotewotICAgIE9NWF9JTlQgICAgIHgsIHk7Ci0gICAgT01YX1MzMiAgICAgSGFsZkNvZWZmLCBwb3M7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3MgPSB5ICogaVNyY1N0ZXAgKyB4OwotICAgICAgICAgICAgSGFsZkNvZWZmID0gCi0gICAgICAgICAgICAgICAgcFNyYyBbcG9zIC0gMl0gLSAKLSAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zIC0gMV0gKyAKLSAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3Bvc10gKyAKLSAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3BvcyArIDFdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyArIDJdICsgCi0gICAgICAgICAgICAgICAgcFNyYyBbcG9zICsgM107Ci0KLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IChIYWxmQ29lZmYgKyAxNikgPj4gNTsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IGFybUNsaXAoMCwgMjU1LCBIYWxmQ29lZmYpOwotCi0gICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IEhhbGZDb2VmZjsKLSAgICAgICAgfSAvKiB4ICovCi0gICAgfSAvKiB5ICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFkZjQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbnMgd2lsbCBoZWxwIHRvIGNhbGN1bGF0ZSBIYWxmIFBlbCBsdW1hIGludGVycG9sYXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggICAKLSAgICAgY29uc3QgT01YX1U4KiAgICBwU3JjLCAKLSAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwgCi0gICAgIE9NWF9VOCogICAgcERzdCwKLSAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwgCi0gICAgIE9NWF9VMzIgICAgaVdpZHRoLCAKLSAgICAgT01YX1UzMiAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgT01YX1MzMiAgICAgSGFsZkNvZWZmLCBwb3M7Ci0gICAgT01YX0lOVCAgICAgeSwgeDsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcG9zID0geSAqIGlTcmNTdGVwICsgeDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDIgKiBpU3JjU3RlcF0gLSAKLSAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zIC0gMSAqIGlTcmNTdGVwXSArIAotICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zXSArIAotICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zICsgMSAqIGlTcmNTdGVwXSAtIAotICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyICogaVNyY1N0ZXBdICsgCi0gICAgICAgICAgICAgICAgcFNyYyBbcG9zICsgMyAqIGlTcmNTdGVwXTsKLQotICAgICAgICAgICAgSGFsZkNvZWZmID0gKEhhbGZDb2VmZiArIDE2KSA+PiA1OwotICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7Ci0KLSAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKE9NWF9VOCkgSGFsZkNvZWZmOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3MzBmOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKLSAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAotICAgICAgICBPTVhfVTggICAgICAqcERzdCwKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICAgICAgT01YX1UzMiAgICAgZHgsCi0gICAgICAgIE9NWF9VMzIgICAgIGR5Ci0pCi17Ci0gICAgT01YX1UzMiAgICAgRWlnaHRNaW51c2R4ID0gOCAtIGR4OwotICAgIE9NWF9VMzIgICAgIEVpZ2h0TWludXNkeSA9IDggLSBkeTsKLSAgICBPTVhfVTMyICAgICBBQ29lZmYsIEJDb2VmZiwgQ0NvZWZmLCBEQ29lZmY7Ci0gICAgT01YX1UzMiAgICAgeCwgeTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR5ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVNyY1N0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaURzdFN0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVdpZHRoID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlIZWlnaHQgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgCi0gICAgLyogaWYgZnJhY3Rpb25sIG12IGlzIG5vdCAoMCwgMCkgKi8KLSAgICBpZiAoZHggIT0gMCB8fCBkeSAhPSAwKQotICAgIHsKLSAgICAgICAgQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5OwotICAgICAgICBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeTsKLSAgICAgICAgQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHk7Ci0gICAgICAgIERDb2VmZiA9IGR4ICogZHk7Ci0KLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKAotICAgICAgICAgICAgICAgICAgICBBQ29lZmYgKiBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XSArCi0gICAgICAgICAgICAgICAgICAgIEJDb2VmZiAqIHBTcmMgW3kgKiBpU3JjU3RlcCArIHggKyAxXSArCi0gICAgICAgICAgICAgICAgICAgIENDb2VmZiAqIHBTcmMgWyh5ICsgMSkgKiBpU3JjU3RlcCArIHhdICsKLSAgICAgICAgICAgICAgICAgICAgRENvZWZmICogcFNyYyBbKHkgKyAxKSAqIGlTcmNTdGVwICsgeCArIDFdICsKLSAgICAgICAgICAgICAgICAgICAgMzIpID4+IDY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gcFNyYyBbeSAqIGlTcmNTdGVwICsgeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOGQ2MmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybU00UDEwX0NvcHkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29weSBhIGJsb2NrIG9mIGRhdGEgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jawotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uICBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1zdGF0aWMgT01YUmVzdWx0IGFybU00UDEwX0NvcHkoICAKLSAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLAotICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAotICAgIE9NWF9VOCogICAgIHBEc3QsCi0gICAgT01YX1UzMiAgICAgaURzdFN0ZXAsIAotICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKLSAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgT01YX1UzMiAgICAgeCwgeTsKLQotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gcFNyYyBbeSAqIGlTcmNTdGVwICsgeF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0gICAgIGNvbnN0IE9NWF9VOCAgICAgKnBTcmMsCi0gICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsCi0gICAgIE9NWF9VOCAgICAgKnBEc3QsCi0gICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsCi0gICAgIE9NWF9VMzIgICAgaVdpZHRoLAotICAgICBPTVhfVTMyICAgIGlIZWlnaHQsCi0gICAgIE9NWF9VMzIgICAgZHgsCi0gICAgIE9NWF9VMzIgICAgZHkKLSkKLXsKLSAgICBPTVhfVTggICAgICBwQnVmMSBbMTYqMTZdOwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwU3JjSGFsZkhvciA9IHBTcmM7Ci0gICAgY29uc3QgT01YX1U4ICAgICAgKnBTcmNIYWxmVmVyID0gcFNyYzsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeCA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR5ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiBXb3JrIG91dCBwb3NpdGlvbnMgZm9yIGhhbGYgcGl4ZWwgaW50ZXJwb2xhdGlvbiAqLwotICAgIGlmIChkeCA9PSAzKQotICAgIHsKLSAgICAgICAgcFNyY0hhbGZWZXIgKz0gMTsKLSAgICB9Ci0gICAgaWYgKGR5ID09IDMpCi0gICAgewotICAgICAgICBwU3JjSGFsZkhvciArPSBpU3JjU3RlcDsKLSAgICB9Ci0KLSAgICAvKiBTd2l0Y2ggb24gdHlwZSBvZiBwaXhlbAotICAgICAqIFBpeGVscyBhcmUgbmFtZWQgJ2EnIHRvICdzJyBhcyBpbiB0aGUgSC4yNjQgc3RhbmRhcmQKLSAgICAgKi8KLSAgICBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogRyAqLwotICAgICAgICBhcm1NNFAxMF9Db3B5KHBTcmMsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZHkgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGEsIGIsIGMgKi8KLSAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQotICAgICAgICAgICAgKHBTcmNIYWxmSG9yLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7ICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAoZHggPT0gMSB8fCBkeCA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgICAgICAgICAocERzdCwgcFNyY0hhbGZWZXIsIGlEc3RTdGVwLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZHggPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGQsIGgsIG4gKi8KLSAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQotICAgICAgICAgICAgKHBTcmNIYWxmVmVyLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGR5ID09IDEgfHwgZHkgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgICAgICAgICAgKHBEc3QsIHBTcmNIYWxmSG9yLCBpRHN0U3RlcCwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGR4ID09IDIgfHwgZHkgPT0gMikKLSAgICB7Ci0gICAgICAgIC8qIGogKi8KLSAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKLSAgICAgICAgICAgIChwU3JjLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGR4ID09IDEgfHwgZHggPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgLyogaSwgayAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQotICAgICAgICAgICAgICAgIChwU3JjSGFsZlZlciwgaVNyY1N0ZXAsIHBCdWYxLCBpV2lkdGgsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgICAgICAgICAocERzdCwgcEJ1ZjEsIGlEc3RTdGVwLCBpV2lkdGgsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkeSA9PSAxIHx8IGR5ID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGYscSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQotICAgICAgICAgICAgICAgIChwU3JjSGFsZkhvciwgaVNyY1N0ZXAsIHBCdWYxLCBpV2lkdGgsIGlXaWR0aCwgaUhlaWdodCk7Ci0KLSAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAgICAgICAgIChwRHN0LCBwQnVmMSwgaURzdFN0ZXAsIGlXaWR0aCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKiBkeD0xLDMgYW5kIGR5PTEsMyAqLwotICAgIHsKLSAgICAgICAgLyogZSwgZywgcCwgciAqLwotICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gICAgICAgICAgICAocFNyY0hhbGZIb3IsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOwotCi0gICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAgICAgICAgICAgIChwU3JjSGFsZlZlciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotCi0gICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAgICAgKHBCdWYxLCBwRHN0LCBpV2lkdGgsIGlEc3RTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDBkNTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IDR4NCBpbnRyYSBwcmVkaWN0aW9uIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCi0gKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCi0gKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCi0gKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCi0gKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0pCi17Ci0gICAgaW50IHgsIHksIFN1bT0wLCBDb3VudCA9IDA7Ci0KLSAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpCi0gICAgewotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOwotICAgICAgICB9Ci0gICAgICAgIENvdW50Kys7Ci0gICAgfQotICAgIGlmIChDb3VudD09MCkKLSAgICB7Ci0gICAgICAgIFN1bSA9IDEyODsKLSAgICB9Ci0gICAgZWxzZSBpZiAoQ291bnQ9PTEpCi0gICAgewotICAgICAgICBTdW0gPSAoU3VtICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZWxzZSAvKiBDb3VudCA9IDIgKi8KLSAgICB7Ci0gICAgICAgIFN1bSA9IChTdW0gKyA0KSA+PiAzOwotICAgIH0KLSAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMWQ0ZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSB0YWJsZXMKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdID0KLXsKLSAgICB7MTMxMDcsIDUyNDMsIDgwNjZ9LAotICAgIHsxMTkxNiwgNDY2MCwgNzQ5MH0sCi0gICAgezEwMDgyLCA0MTk0LCA2NTU0fSwKLSAgICB7IDkzNjIsIDM2NDcsIDU4MjV9LAotICAgIHsgODE5MiwgMzM1NSwgNTI0M30sCi0gICAgeyA3MjgyLCAyODkzLCA0NTU5fQotfTsgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWY4YWY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfU0FEUXVhci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAotICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAotICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKLSAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKLQljb25zdCBPTVhfVTgqIAlwU3JjLAotICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICBPTVhfVTMyICAgICBpV2lkdGgKLSkKLXsKLSAgICBPTVhfSU5UICAgICB4LCB5OwotICAgIE9NWF9TMzIgICAgIFNBRCA9IDA7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTQUQgKz0gYXJtQWJzKHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdIC0gKCgKLSAgICAgICAgICAgICAgICAgICAgcFNyY1JlZjAgW3kgKiBpUmVmU3RlcDAgKyB4XSArIAotICAgICAgICAgICAgICAgICAgICBwU3JjUmVmMSBbeSAqIGlSZWZTdGVwMSArIHhdICsgMSkgPj4gMSkpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAqcERzdFNBRCA9IFNBRDsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzUzNzMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IHRyYW5zZm9ybSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0gCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBUcmFuc2Zvcm0gcm93cyAqLwotICAgIGZvciAoaT0wOyBpPDE2OyBpKz00KQotICAgIHsKLSAgICAgICAgaW50IGQwID0gcFNyY1tpKzBdOwotICAgICAgICBpbnQgZDEgPSBwU3JjW2krMV07Ci0gICAgICAgIGludCBkMiA9IHBTcmNbaSsyXTsKLSAgICAgICAgaW50IGQzID0gcFNyY1tpKzNdOwotICAgICAgICBpbnQgZTAgPSBkMCArIGQyOwotICAgICAgICBpbnQgZTEgPSBkMCAtIGQyOwotICAgICAgICBpbnQgZTIgPSAoZDE+PjEpIC0gZDM7Ci0gICAgICAgIGludCBlMyA9IGQxICsgKGQzPj4xKTsKLSAgICAgICAgaW50IGYwID0gZTAgKyBlMzsKLSAgICAgICAgaW50IGYxID0gZTEgKyBlMjsKLSAgICAgICAgaW50IGYyID0gZTEgLSBlMjsKLSAgICAgICAgaW50IGYzID0gZTAgLSBlMzsKLSAgICAgICAgcERzdFtpKzBdID0gKE9NWF9TMTYpZjA7Ci0gICAgICAgIHBEc3RbaSsxXSA9IChPTVhfUzE2KWYxOwotICAgICAgICBwRHN0W2krMl0gPSAoT01YX1MxNilmMjsKLSAgICAgICAgcERzdFtpKzNdID0gKE9NWF9TMTYpZjM7Ci0gICAgfQotCi0gICAgLyogVHJhbnNmb3JtIGNvbHVtbnMgKi8KLSAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgewotICAgICAgICBpbnQgZjAgPSBwRHN0W2krMF07Ci0gICAgICAgIGludCBmMSA9IHBEc3RbaSs0XTsKLSAgICAgICAgaW50IGYyID0gcERzdFtpKzhdOwotICAgICAgICBpbnQgZjMgPSBwRHN0W2krMTJdOwotICAgICAgICBpbnQgZzAgPSBmMCArIGYyOwotICAgICAgICBpbnQgZzEgPSBmMCAtIGYyOwotICAgICAgICBpbnQgZzIgPSAoZjE+PjEpIC0gZjM7Ci0gICAgICAgIGludCBnMyA9IGYxICsgKGYzPj4xKTsKLSAgICAgICAgaW50IGgwID0gZzAgKyBnMzsKLSAgICAgICAgaW50IGgxID0gZzEgKyBnMjsKLSAgICAgICAgaW50IGgyID0gZzEgLSBnMjsKLSAgICAgICAgaW50IGgzID0gZzAgLSBnMzsKLSAgICAgICAgcERzdFtpKzBdID0gKE9NWF9TMTYpKChoMCszMik+PjYpOwotICAgICAgICBwRHN0W2krNF0gPSAoT01YX1MxNikoKGgxKzMyKT4+Nik7Ci0gICAgICAgIHBEc3RbaSs4XSA9IChPTVhfUzE2KSgoaDIrMzIpPj42KTsKLSAgICAgICAgcERzdFtpKzEyXSA9IChPTVhfUzE2KSgoaDMrMzIpPj42KTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwMDRlNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIGhlbHBlciBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSkKLXsKLSAgICBjb25zdCBPTVhfVTggKnBTcmMgPSAqcHBTcmM7Ci0gICAgaW50IGk7Ci0gICAgaW50IEZsYWcsIFZhbHVlOwotCi0gICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgIHsKLSAgICAgICAgcERzdFtpXSA9IDA7Ci0gICAgfQotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIEZsYWcgID0gKnBTcmMrKzsKLSAgICAgICAgaWYgKEZsYWcgJiAweDEwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAxNiBiaXQgKi8KLSAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKLSAgICAgICAgICAgIFZhbHVlID0gVmFsdWUgfCAoKCpwU3JjKyspPDw4KTsKLSAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODAwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogOCBiaXQgKi8KLSAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKLSAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IEZsYWcgJiAxNTsKLSAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgIH0KLSAgICB3aGlsZSAoKEZsYWcgJiAweDIwKT09MCk7Ci0KLSAgICAqcHBTcmMgPSBwU3JjOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDBjOTMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBoZWxwZXIgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwU3JjID0gKnBwU3JjOwotICAgIGludCBpOwotICAgIGludCBGbGFnLCBWYWx1ZTsKLQotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotICAgICAgICBwRHN0W2ldID0gMDsKLSAgICB9Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgRmxhZyAgPSAqcFNyYysrOwotICAgICAgICBpZiAoRmxhZyAmIDB4MTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDE2IGJpdCAqLwotICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOwotICAgICAgICAgICAgVmFsdWUgPSBWYWx1ZSB8ICgoKnBTcmMrKyk8PDgpOwotICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MDAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiA4IGJpdCAqLwotICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOwotICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpID0gRmxhZyAmIDE1OwotICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgfQotICAgIHdoaWxlICgoRmxhZyAmIDB4MjApPT0wKTsKLQotICAgICpwcFNyYyA9IHBTcmM7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzg2MDVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQXZlcmFnZV80eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gNHg0IG9yIDR4OCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICg2LjMuNS41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDR4NCwgNHg4IGJsb2Nrcy4gIFRoZSByZXN1bHQgCi0gKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMTsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3M7IG11c3QgYmUgZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgIHBQcmVkMCwgcFByZWQxLCBvciBwRHN0UHJlZCAKLSAqICAgIC0gICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOCAKLSAqCi0gKi8KLSBPTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotCSBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDQpICYmIChpSGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMCA9PSAwKSB8fCAoaVByZWRTdGVwMCAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMSA9PSAwKSB8fCAoaVByZWRTdGVwMSAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaURzdFN0ZXAgPT0gMCkgfHwgKGlEc3RTdGVwICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0UHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAocFByZWQwLCBwUHJlZDEsIGlQcmVkU3RlcDAsIGlQcmVkU3RlcDEsIHBEc3RQcmVkLCBpRHN0U3RlcCwgNCwgaUhlaWdodCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmZGI2NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBoYWxmIHBlbCBCbG9jayBtYXRjaGluZywgCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0gICAgCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCi0gKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAotICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCi0gKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAotICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZS4gSWYgCi0gKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCi0gKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAotICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotIAotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY09yZ1ksIAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsIAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwgCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwgCi0gICAgT01YX1UzMiBuTGFtZGEsIAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwTVZQcmVkLCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0RzdEJlc3RNViwgCi0gICAgT01YX1MzMiogcEJlc3RDb3N0Ci0pCi17Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgT01YX0lOVCAgICAgY2FuZFNBRDsKLSAgICBPTVhfSU5UICAgICBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOwotICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCi0gICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmWSwgKnBUZW1wU3JjT3JnWTsKLSAgICBPTVhfUzE2ICAgICB4LCB5OwotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgY2FuZE1WLCBpbnRlZ2VyTVY7Ci0gICAgT01YX1U4ICAgICAgaW50ZXJwb2xZWzI1Nl07Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChuU3JjT3JnU3RlcCAlIGlCbG9ja1dpZHRoKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgIAotICAgICAgICAgICAgCi0gICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKLSAgICBmcm9tWCA9IDE7Ci0gICAgdG9YICAgPSAxOwotICAgIGZyb21ZID0gMTsKLSAgICB0b1kgICA9IDE7Ci0gICAgCi0gICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLwotICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOwotICAgIAotICAgIGludGVnZXJNVi5keCA9IHBTcmNEc3RCZXN0TVYtPmR4OwotICAgIGludGVnZXJNVi5keSA9IHBTcmNEc3RCZXN0TVYtPmR5OwotICAgIAotICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLwotICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKLSAgICB7Ci0gICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLwotICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIChpbnRlZ2VyTVYuZHkvNCkpICsgKGludGVnZXJNVi5keC80KTsKLSAgICAgICAgICAgIGlmICh4IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwVGVtcFNyY1JlZlkgKyB4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHkgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSArICh5ICogblNyY1JlZlN0ZXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByZXBhcmUgY2FuZCBNViAqLwotICAgICAgICAgICAgY2FuZE1WLmR4ID0gaW50ZWdlck1WLmR4ICsgeCAqIDI7Ci0gICAgICAgICAgICBjYW5kTVYuZHkgPSBpbnRlZ2VyTVYuZHkgKyB5ICogMjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgaGFsZiBwZWwgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFybUFicyh4KSAqIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcm1BYnMoeSkgKiAyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBTQUQgKi8KLSAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoCQotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNPcmdZLAotICAgICAgICAgICAgICAgICAgICAgICAgblNyY09yZ1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjYW5kU0FELAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgpOwotIAotICAgICAgICAgICAgZGlmZk1WLmR4ID0gY2FuZE1WLmR4IC0gcE1WUHJlZC0+ZHg7Ci0gICAgICAgICAgICBkaWZmTVYuZHkgPSBjYW5kTVYuZHkgLSBwTVZQcmVkLT5keTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmTVYsIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5MYW1kYSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBwQmVzdENvc3QpOwotCi0gICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KLSAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwMjAwZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jay4gSWYgCi0gKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlLiBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCi0gKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCi0gKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaXRuZXJzIGFyZSBOVUxMOgotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAotICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLSAKLSBPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotCSBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLQkgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAotICAgICBPTVhfUzMyICpwQmVzdENvc3QsCi0gICAgIHZvaWQgKnBNRVNwZWMKLSkKLXsKLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLSAgICBPTVhfSU5UIGNhbmRTQUQ7Ci0gICAgT01YX0lOVCBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOwotICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCi0gICAgY29uc3QgT01YX1U4ICpwVGVtcFNyY1JlZlksICpwVGVtcFNyY09yZ1k7Ci0gICAgT01YX1MxNiB4LCB5OwotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNVjsKLSAgICBPTVhfUzMyIG5TZWFyY2hSYW5nZTsKLSAgICBBUk1WQ000UDEwX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMTBfTUVTcGVjICopIHBNRVNwZWM7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE1WQ2FuZGlkYXRlID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1JZ25vcmUgKHBNRVNwZWMpOwotCi0gICAgaWYoaUJsb2NrV2lkdGggPT0gNCkKLSAgICB7Ci0gICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U0eDQ7Ci0gICAgfQotICAgIGVsc2UgaWYoaUJsb2NrV2lkdGggPT0gOCkKLSAgICB7Ci0gICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U4eDg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2UxNngxNjsKLSAgICB9Ci0gICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKLSAgICBmcm9tWCA9IG5TZWFyY2hSYW5nZTsKLSAgICB0b1ggICA9IG5TZWFyY2hSYW5nZTsKLSAgICBmcm9tWSA9IG5TZWFyY2hSYW5nZTsKLSAgICB0b1kgICA9IG5TZWFyY2hSYW5nZTsKLSAgICAKLSAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggLSBuU2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPngpCi0gICAgewotICAgICAgICBmcm9tWCA9ICBwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPng7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT54ICsgaUJsb2NrV2lkdGggKyBuU2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKLSAgICB7Ci0gICAgICAgIHRvWCAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eCkgLSBpQmxvY2tXaWR0aDsKLSAgICB9Ci0KLSAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgLSBuU2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPnkpCi0gICAgewotICAgICAgICBmcm9tWSA9IHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eTsKLSAgICB9Ci0KLSAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgKyBpQmxvY2tXaWR0aCArIG5TZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnkgKyBwUmVmUmVjdC0+aGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIHRvWSAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eSkgLSBpQmxvY2tXaWR0aDsKLSAgICB9Ci0gICAgCi0gICAgcEJlc3RNVi0+ZHggPSAtZnJvbVggKiA0OwotICAgIHBCZXN0TVYtPmR5ID0gLWZyb21ZICogNDsKLSAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCi0gICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7Ci0gICAgCi0gICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCi0gICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQotICAgIHsKLSAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCi0gICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogeSkgKyB4OwotICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCi0gICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKLSAgICAJICAgICAgICBwVGVtcFNyY09yZ1ksCi0gICAgCSAgICAgICAgblNyY09yZ1N0ZXAsCi0gICAgCSAgICAgICAgcFRlbXBTcmNSZWZZLAotICAgIAkgICAgICAgIG5TcmNSZWZTdGVwLAotICAgIAkgICAgICAgICZjYW5kU0FELAotICAgIAkgICAgICAgIGlCbG9ja0hlaWdodCwKLSAgICAJICAgICAgICBpQmxvY2tXaWR0aCk7Ci0gICAgCSAgICAKLSAgICAgICAgICAgIGRpZmZNVi5keCA9ICh4ICogNCkgLSBwTVZQcmVkLT5keDsKLSAgICAgICAgICAgIGRpZmZNVi5keSA9ICh5ICogNCkgLSBwTVZQcmVkLT5keTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKCh4ICogNCksICh5ICogNCksIGRpZmZNViwgY2FuZFNBRCwgcEJlc3RNViwgbkxhbWRhLCBwQmVzdENvc3QpOwotCi0gICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KLSAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1MGQyYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBxdWF0ZXIgcGVsIEJsb2NrIG1hdGNoaW5nLCAKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0gCi0gICAgCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAoNi4zLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBxdWFydGVyLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBoYWxmLXBlbCAKLSAqIHNlYXJjaC4gIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIAotICogdGhlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uIAotICogbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIAotICogaW5pdGlhbCBoYWxmLXBlbCBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmIG1heSBiZSB1c2VkIGZvciBoYWxmLXBlbCBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUuIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT04LCAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZSAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBoYWxmLXBlbCBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQgcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgcXVhcnRlci1wZWwgc2VhcmNoLCBleHByZXNzZWQgCi0gKiAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi0gCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIoCi0gICAgY29uc3QgT01YX1U4KiBwU3JjT3JnWSwgCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwgCi0gICAgY29uc3QgT01YX1U4KiBwU3JjUmVmWSwgCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwgCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLCAKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LCAKLSAgICBPTVhfVTMyIG5MYW1kYSwgCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBNVlByZWQsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjRHN0QmVzdE1WLCAKLSAgICBPTVhfUzMyKiBwQmVzdENvc3QKLSkKLXsKLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLSAgICBPTVhfSU5UICAgICBjYW5kU0FEOwotICAgIE9NWF9JTlQgICAgIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7Ci0gICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KLSAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZZLCAqcFRlbXBTcmNPcmdZOwotICAgIE9NWF9TMTYgICAgIHgsIHk7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCBjYW5kTVYsIGluaXRpYWxNVjsKLSAgICBPTVhfVTggICAgICBpbnRlcnBvbFlbMjU2XTsKLSAgICBPTVhfUzMyICAgICBwZWxQb3NYLCBwZWxQb3NZOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoblNyY09yZ1N0ZXAgJSBpQmxvY2tXaWR0aCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZlkgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RCZXN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXN0Q29zdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKChpQmxvY2tXaWR0aCE9NCkmJihpQmxvY2tXaWR0aCE9OCkmJihpQmxvY2tXaWR0aCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja0hlaWdodCE9NCkmJihpQmxvY2tIZWlnaHQhPTgpJiYoaUJsb2NrSGVpZ2h0IT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAKLSAgICAgICAgICAgIAotICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8gCi0gICAgZnJvbVggPSAxOwotICAgIHRvWCAgID0gMTsKLSAgICBmcm9tWSA9IDE7Ci0gICAgdG9ZICAgPSAxOwotICAgIAotICAgIC8qIEluaXRpYWxpemUgdG8gbWF4IHZhbHVlIGFzIGEgc3RhcnQgcG9pbnQgKi8KLSAgICAqcEJlc3RDb3N0ID0gMHg3ZmZmZmZmZjsKLSAgICAKLSAgICBpbml0aWFsTVYuZHggPSBwU3JjRHN0QmVzdE1WLT5keDsKLSAgICBpbml0aWFsTVYuZHkgPSBwU3JjRHN0QmVzdE1WLT5keTsKLSAgICAKLSAgICAvKiBMb29waW5nIG9uIHktIGF4aXMgKi8KLSAgICBmb3IgKHkgPSAtZnJvbVk7IHkgPD0gdG9ZOyB5KyspCi0gICAgewotICAgICAgICAvKiBMb29waW5nIG9uIHgtIGF4aXMgKi8KLSAgICAgICAgZm9yICh4ID0gLWZyb21YOyB4IDw9IHRvWDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLwotICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFNyY1JlZlkgKyAoblNyY1JlZlN0ZXAgKiAoaW5pdGlhbE1WLmR5LzQpKSArIChpbml0aWFsTVYuZHgvNCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBmcmFjdCBwZWwgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIHBlbFBvc1ggPSAoaW5pdGlhbE1WLmR4ICUgNCkgKyB4OwotICAgICAgICAgICAgaWYgKHBlbFBvc1ggPCAwKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwVGVtcFNyY1JlZlkgLSAxOwotICAgICAgICAgICAgICAgIHBlbFBvc1ggKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBlbFBvc1kgPSAoaW5pdGlhbE1WLmR5ICUgNCkgKyB5OwotICAgICAgICAgICAgaWYgKHBlbFBvc1kgPCAwKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwVGVtcFNyY1JlZlkgLSAoMSAqIG5TcmNSZWZTdGVwKTsKLSAgICAgICAgICAgICAgICBwZWxQb3NZICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHBUZW1wU3JjT3JnWSA9IHBTcmNPcmdZOyAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogUHJlcGFyZSBjYW5kIE1WICovCi0gICAgICAgICAgICBjYW5kTVYuZHggPSBpbml0aWFsTVYuZHggKyB4OwotICAgICAgICAgICAgY2FuZE1WLmR5ID0gaW5pdGlhbE1WLmR5ICsgeTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIEludGVycG9sYXRlIFF1YXRlciBwZWwgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlbFBvc1gsCi0gICAgICAgICAgICAgICAgICAgICAgICBwZWxQb3NZKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBTQUQgKi8KLSAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoCQotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNPcmdZLAotICAgICAgICAgICAgICAgICAgICAgICAgblNyY09yZ1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjYW5kU0FELAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgpOwotIAotICAgICAgICAgICAgZGlmZk1WLmR4ID0gY2FuZE1WLmR4IC0gcE1WUHJlZC0+ZHg7Ci0gICAgICAgICAgICBkaWZmTVYuZHkgPSBjYW5kTVYuZHkgLSBwTVZQcmVkLT5keTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmTVYsIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5MYW1kYSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBwQmVzdENvc3QpOwotCi0gICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KLSAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlY2YzZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCi0gKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgICAgICAgICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JKAotCU9NWF9VOCogcFNyY0RzdCwgCi0JT01YX1MzMiBzcmNkc3RTdGVwLCAKLQljb25zdCBPTVhfVTgqIHBBbHBoYSwgCi0JY29uc3QgT01YX1U4KiBwQmV0YSwgCi0JY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKQotewotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKLQotICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCi0gICAgCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzgsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1OTYzMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGx1bWEgZGVibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSAKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAotICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAotICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgICAgICAgICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAotCWNvbnN0IE9NWF9VOCAqcEJTCi0pCi17Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDE1LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKLQotICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCi0gICAgCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKLQotICAgIHJldHVybiBlcnJvckNvZGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMxZWViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAotICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAotICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCi0gKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCi0gKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAotICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCi0gKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCi0gKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKLSAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKLSAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICoKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKiBwcFBvc0NvZWZidWYgICAgICAgIAotICkKLQotewotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtPT1OVUxMICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwT2Zmc2V0PT1OVUxMICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PDAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ+NyAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmY9PU5VTEwgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBwUG9zQ29lZmJ1Zj09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwUG9zQ29lZmJ1Zj09TlVMTCAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIDQsIDQpOwotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWI4MTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKLSAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKLSAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCi0gKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKLSAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKLSAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAotICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKLSAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKLSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAotICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAotICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKLSAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKLSAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAotICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKLSAqCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICkKLXsKLSAgICBpbnQgblRhYmxlOwotCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW09PU5VTEwgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW09PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBPZmZzZXQ9PU5VTEwgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ8MCAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldD43ICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBOdW1Db2VmZj09TlVMTCAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHBQb3NDb2VmYnVmPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBQb3NDb2VmYnVmPT1OVUxMICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNWTENTZWxlY3Q8MCAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc01heE51bUNvZWZmPDE1ICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzTWF4TnVtQ29lZmY+MTYgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIC8qIEZpbmQgVkxDIHRhYmxlIG51bWJlciAqLwotICAgIGlmIChzVkxDU2VsZWN0PDIpCi0gICAgewotICAgICAgICBuVGFibGUgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmIChzVkxDU2VsZWN0PDQpCi0gICAgewotICAgICAgICBuVGFibGUgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChzVkxDU2VsZWN0PDgpCi0gICAgewotICAgICAgICBuVGFibGUgPSAyOwotICAgIH0KLSAgICBlbHNlIC8qIHNWTENTZWxlY3QgPj0gOCAqLwotICAgIHsKLSAgICAgICAgblRhYmxlID0gMzsKLSAgICB9Ci0KLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBuVGFibGUsIHNNYXhOdW1Db2VmZik7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDIyYmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlcXVhbnRpemUgTHVtYSBBQyBibG9jawotICovCi0KLXN0YXRpYyB2b2lkIERlcXVhbnRMdW1hQUM0eDQoCi0gICAgIE9NWF9TMTYqIHBTcmNEc3QsCi0gICAgIE9NWF9JTlQgUVAgICAgICAgIAotKQotewotICAgIGNvbnN0IE9NWF9VOCAqcFZSb3cgPSAmYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdOwotICAgIGludCBTaGlmdCA9IFFQIC8gNjsKLSAgICBpbnQgaTsKLSAgICBPTVhfUzMyIFZhbHVlOwotCi0gICAgZm9yIChpPTA7IGk8MTY7IGkrKykKLSAgICB7Ci0KLSAgICAgICAgVmFsdWUgPSAocFNyY0RzdFtpXSAqIHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSkgPDwgU2hpZnQ7Ci0gICAgICAgIHBTcmNEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKLSAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCi0gKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKLSAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAotICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAotICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCi0gKiAxLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCi0gKiAgICAgICAgICAgIGV4aXN0IAotICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCi0gKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCi0gKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKLSAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKLSAgICAgT01YX1U4ICpwRHN0LAotICAgICBPTVhfSU5UIHByZWRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9JTlQgQUMgICAgICAgIAotKQotewotICAgIE9NWF9TMTYgcEJ1ZmZlclsxNis0XTsKLSAgICBPTVhfUzE2ICpwRGVsdGE7Ci0gICAgaW50IGkseCx5OwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBQcmVkID09IE5VTEwsICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwUHJlZCksT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRTdGVwICYgMywgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiAzLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIChRUDwwKSwgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIChRUD41MSksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIHBwU3JjPT1OVUxMLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmICpwcFNyYz09TlVMTCwgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKEFDPT0wICYmIHBEQz09TlVMTCwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIHBEZWx0YSA9IGFybUFsaWduVG84Qnl0ZXMocEJ1ZmZlcik7ICAgIAotCi0gICAgZm9yIChpPTA7IGk8MTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHBEZWx0YVtpXSA9IDA7Ci0gICAgfQotICAgIGlmIChBQykKLSAgICB7Ci0gICAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQocHBTcmMsIHBEZWx0YSk7Ci0gICAgICAgIERlcXVhbnRMdW1hQUM0eDQocERlbHRhLCBRUCk7Ci0gICAgfQotICAgIGlmIChwREMpCi0gICAgewotICAgICAgICBwRGVsdGFbMF0gPSBwRENbMF07Ci0gICAgfQotICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQocERlbHRhLHBEZWx0YSk7Ci0KLSAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClhcm1DbGlwKDAsMjU1LHBQcmVkW3kqcHJlZFN0ZXAreF0gKyBwRGVsdGFbNCp5K3hdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM0YTk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBjaHJvbWEgZGVibG9jayBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAotICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAotICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAotICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCi0gICAgIE9NWF9VOCogcFNyY0RzdCwKLSAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKLSAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKLSAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAotICkKLXsKLSAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKLQotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZm9yIChZPTA7IFk8ODsgWSs9NCwgSW50ZXJuYWw9MSkKLSAgICB7Ci0gICAgICAgIGZvciAoWD0wOyBYPDg7IFgrKykKLSAgICAgICAgewotICAgICAgICAgICAgSSA9IChYPj4xKSs0KihZPj4xKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA+IDMpICYmIChwQlNbSV0gPT0gNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA8IDQpICAgICAgICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAoIChwQlNbSV0gPT0gNCkgJiYgKHBCU1tJXjFdICE9IDQpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyogRmlsdGVyIGhvcml6b250YWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKLSAgICAgICAgICAgICAgICBzcmNkc3RTdGVwLAotICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzWyhYPj4xKSs0KihZPj4yKV0sCi0gICAgICAgICAgICAgICAgcEFscGhhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQmV0YVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJTW0ldLAotICAgICAgICAgICAgICAgIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYjBlODcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlYmxvY2tpbmcgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBTdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgZm9yIAotICogICAgICAgICAgICBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gQXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2Ugb2YgZWFjaCA0eDIgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzICh2YWx1ZXMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIAotICogICAgICAgICAgICBzYW1lIGFzIHRoZSBwQlNwYXJhbWV0ZXIgcGFzc2VkIGludG8gRmlsdGVyRGVibG9ja0x1bWFfVmVyRWRnZTsgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIAotICogICAgICAgICAgICBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNCBieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKAotICAgICBPTVhfVTgqIHBTcmNEc3QsCi0gICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKLSApCi17Ci0gICAgaW50IEksIFgsIFksIEludGVybmFsPTA7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVswXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzFdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBmb3IgKFg9MDsgWDw4OyBYKz00LCBJbnRlcm5hbD0xKQotICAgIHsKLSAgICAgICAgZm9yIChZPTA7IFk8ODsgWSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJID0gKFk+PjEpKzQqKFg+PjEpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwQlNbSV0gPiA0LCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA+IDMpICYmIChwQlNbSV0gPT0gNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKCAocEJTW0ldID09IDQpICYmIChwQlNbSV4zXSAhPSA0KSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzW1ldID4gMjUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKiBGaWx0ZXIgdmVydGljYWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKLSAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzWyhZPj4xKSs0KihYPj4yKV0sCi0gICAgICAgICAgICAgICAgcEFscGhhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQmV0YVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJTW0ldLAotICAgICAgICAgICAgICAgIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyOTRmOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBsdW1hIGRlYmxvY2sgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC1zIHRlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKLSAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCi0gKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAotICAgICBPTVhfVTgqIHBTcmNEc3QsCi0gICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKLSApCi17Ci0gICAgaW50IEksIFgsIFksIEludGVybmFsPTA7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgZm9yIChZPTA7IFk8MTY7IFkrPTQsIEludGVybmFsPTEpCi0gICAgewotICAgICAgICBmb3IgKFg9MDsgWDwxNjsgWCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJID0gKFg+PjIpKzQqKFk+PjIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwQlNbSV0gPiA0LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJID4gMykgJiYgKHBCU1tJXSA9PSA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJIDwgNCkgICAgICAgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICggKHBCU1tJXSA9PSA0KSAmJiAocEJTW0leMV0gIT0gNCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogRmlsdGVyIGhvcml6b250YWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKLSAgICAgICAgICAgICAgICBzcmNkc3RTdGVwLAotICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzW0ldLAotICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCU1tJXSwKLSAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTIzMmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgbHVtYSBkZWJsb2NrIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKLSAqICAgICAgICAgICAgICBpcyBOVUxMLiAKLSAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAotICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAotICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKLSAgICAgT01YX1U4KiBwU3JjRHN0LAotICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAotICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAotICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCi0gKQotewotICAgIGludCBYLCBZLCBJLCBJbnRlcm5hbD0wOwotCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSxPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDE1LCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzBdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGFbMV0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLQotICAgIGZvciAoWD0wOyBYPDE2OyBYKz00LCBJbnRlcm5hbD0xKQotICAgIHsKLSAgICAgICAgZm9yIChZPTA7IFk8MTY7IFkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSSA9IChZPj4yKSs0KihYPj4yKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW1ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZigocEJTW1ldID09IDQpICYmIChZID4gMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZigoIChwQlNbWV0gPT0gNCkgJiYgKHBCU1tZXjNdICE9IDQpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHNbWV0gPiAyNSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBGaWx0ZXIgdmVydGljYWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKLSAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzW0ldLAotICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCU1tJXSwKLSAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0dldFZMQ0luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwNTUyYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0dldFZMQ0luZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9HZXRWTENJbmZvLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogCi0gKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24KLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAotICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAotICogc3RydWN0dXJlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAotICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAotICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAotICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAotICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAotICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAotICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKLSAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAotICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKLSAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAotICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCi0JY29uc3QgT01YX1MxNioJCSAgICBwU3JjQ29lZmYsCi0JY29uc3QgT01YX1U4KgkJCSAgICBwU2Nhbk1hdHJpeCwKLQlPTVhfVTgJCQkgICAgYkFDLAotCU9NWF9VMzIJCQkgICAgTWF4TnVtQ29lZiwKLQlPTVhWQ000UDEwVkxDSW5mbyoJcERzdFZMQ0luZm8KLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBNaW5JbmRleDsKLSAgICBPTVhfUzMyICAgICBWYWx1ZTsKLSAgICBPTVhfVTMyICAgICBNYXNrID0gNCwgUnVuQmVmb3JlOwotICAgIE9NWF9TMTYgICAgICpwTGV2ZWw7Ci0gICAgT01YX1U4ICAgICAgKnBSdW47Ci0gICAgT01YX1MxNiAgICAgQnVmIFsxNl07Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTY2FuTWF0cml4ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RWTENJbmZvID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGJBQyA+IDEsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKE1heE51bUNvZWYgPiAxNiwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiBJbml0aWFsaXplIFJMRSBJbmZvIHN0cnVjdHVyZSAqLwotICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcyA9IDA7Ci0gICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVfU2lnbnMgPSAwOwotICAgIHBEc3RWTENJbmZvLT51TnVtQ29lZmZzID0gMDsKLSAgICBwRHN0VkxDSW5mby0+dVRvdGFsWmVyb3MgPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBwRHN0VkxDSW5mby0+aUxldmVscyBbaV0gPSAwOwotICAgICAgICBwRHN0VkxDSW5mby0+dVJ1bnMgW2ldID0gMDsKLSAgICB9Ci0gICAgCi0gICAgTWluSW5kZXggPSAoYkFDID09IDAgJiYgTWF4TnVtQ29lZiA9PSAxNSkgPyAxIDogMDsKLSAgICBmb3IgKGkgPSBNaW5JbmRleDsgaSA8IChNYXhOdW1Db2VmICsgTWluSW5kZXgpOyBpKyspCi0gICAgeyAgICAgICAgCi0gICAgICAgIC8qIFNjYW4gKi8KLSAgICAgICAgQnVmIFtpIC0gTWluSW5kZXhdID0gcFNyY0NvZWZmIFtwU2Nhbk1hdHJpeCBbaV1dOwotICAgIH0KLQotICAgIC8qIHNraXAgemVyb3MgYXQgdGhlIGVuZCAqLwotICAgIGkgPSBNYXhOdW1Db2VmIC0gMTsKLSAgICB3aGlsZSAoIUJ1ZiBbaV0gJiYgaSA+PSAwKQotICAgIHsKLSAgICAgICAgaS0tOwotICAgIH0KLSAgICAKLSAgICBpZiAoaSA8IDApCi0gICAgewotICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLSAgICB9Ci0KLSAgICAvKiBGaWxsIFJMRSBJbmZvIHN0cnVjdHVyZSAqLwotICAgIHBMZXZlbCA9IHBEc3RWTENJbmZvLT5pTGV2ZWxzOwotICAgIHBSdW4gPSBwRHN0VkxDSW5mby0+dVJ1bnM7Ci0gICAgUnVuQmVmb3JlID0gMDsKLQotICAgIC8qIEhhbmRsZSBmaXJzdCBub24gemVybyBzZXBhcmF0ZSAqLwotICAgIHBEc3RWTENJbmZvLT51TnVtQ29lZmZzKys7Ci0gICAgVmFsdWUgPSBCdWYgW2ldOwotICAgIGlmIChWYWx1ZSA9PSAxIHx8IFZhbHVlID09IC0xKQotICAgIHsKLSAgICAgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVzKys7Ci0gICAgICAgIAotICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZV9TaWducyB8PSAKLSAgICAgICAgICAgIFZhbHVlID09IC0xID8gTWFzayA6IDA7Ci0gICAgICAgIE1hc2sgPj49IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IChWYWx1ZSA+IDAgPyAxIDogLTEpOwotICAgICAgICAqcExldmVsKysgPSBWYWx1ZTsKLSAgICAgICAgTWFzayA9IDA7Ci0gICAgfQotCi0gICAgLyogUmVtYWluaW5nIG5vbiB6ZXJvICovCi0gICAgd2hpbGUgKC0taSA+PSAwKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBCdWYgW2ldOwotICAgICAgICBpZiAoVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RWTENJbmZvLT51TnVtQ29lZmZzKys7Ci0KLSAgICAgICAgICAgIC8qIE1hc2sgYmVjb21lcyB6ZXJvIGFmdGVyIGVudGVyaW5nICovCi0gICAgICAgICAgICBpZiAoTWFzayAmJgotICAgICAgICAgICAgICAgIChWYWx1ZSA9PSAxIHx8IAotICAgICAgICAgICAgICAgICBWYWx1ZSA9PSAtMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVzKys7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVfU2lnbnMgfD0gCi0gICAgICAgICAgICAgICAgICAgIFZhbHVlID09IC0xID8gTWFzayA6IDA7Ci0gICAgICAgICAgICAgICAgTWFzayA+Pj0gMTsKLSAgICAgICAgICAgICAgICAqcFJ1bisrID0gUnVuQmVmb3JlOwotICAgICAgICAgICAgICAgIFJ1bkJlZm9yZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSWYgMyB0cmFpbGluZyBvbmVzIGFyZSBub3QgY29tcGxldGVkICovCi0gICAgICAgICAgICAgICAgaWYgKE1hc2spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNYXNrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgVmFsdWUgLT0gKFZhbHVlID4gMCA/IDEgOiAtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpwTGV2ZWwrKyA9IFZhbHVlOwotICAgICAgICAgICAgICAgICpwUnVuKysgPSBSdW5CZWZvcmU7Ci0gICAgICAgICAgICAgICAgUnVuQmVmb3JlID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VG90YWxaZXJvcysrOwotICAgICAgICAgICAgUnVuQmVmb3JlKys7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKiBVcGRhdGUgbGFzdCBydW4gKi8KLSAgICBpZiAoUnVuQmVmb3JlKQotICAgIHsKLSAgICAgICAgKnBSdW4rKyA9IFJ1bkJlZm9yZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4MjRkOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDEvOCBQaXhlbCBpbnRlcnBvbGF0aW9uIGZvciBDaHJvbWEgQmxvY2sKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCi0gKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoLiAKLSAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlciBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZCBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyYywKLSAgICAgT01YX1MzMiBzcmNTdGVwLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBkeCwKLSAgICAgT01YX1MzMiBkeSwKLSAgICAgT01YU2l6ZSByb2kKLSApCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHNyY1N0ZXAgPCA4LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkc3RTdGVwIDwgOCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPCAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR5IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHkgPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoICE9IDIpICYmIChyb2kud2lkdGggIT0gNCkgJiYgKHJvaS53aWR0aCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS5oZWlnaHQgIT0gMikgJiYgKHJvaS5oZWlnaHQgIT0gNCkgJiYgKHJvaS5oZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gMikgJiYgYXJtTm90MkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDQpICYmIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA4KSAmJiBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHNyY1N0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkc3RTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEgCi0gICAgICAgICgoT01YX1U4KilwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjODIwOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEhhbGYgaG9yaXpvbnRhbCBsdW1hIGludGVycG9sYXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAotICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAotICogICAgICAgICAgICAoLTEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAotICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKLSAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdExlZnQsIAotICAgICAgICBPTVhfVTgqICAgICBwRHN0UmlnaHQsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSkKLXsKLSAgICBPTVhSZXN1bHQgICBSZXRWYWx1ZTsgICAgCi0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RSaWdodCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDQpICYmIAotICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFJpZ2h0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA4KSAmJiAKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdExlZnQpICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RSaWdodCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gMTYpICYmIAotICAgICAgICAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdExlZnQpICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0UmlnaHQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQlhcm1SZXRBcmdFcnJJZigoaVdpZHRoICE9IDE2KSAmJiAoaVdpZHRoICE9IDgpJiYgKGlXaWR0aCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAotICAgICAgICBwU3JjIC0gMSwgICAgIAotICAgICAgICBpU3JjU3RlcCwgCi0gICAgICAgIHBEc3RMZWZ0LCAgICAgCi0gICAgICAgIGlEc3RTdGVwLCAKLSAgICAgICAgaVdpZHRoLCAgIAotICAgICAgICBpSGVpZ2h0KTsKLQotICAgIGlmIChSZXRWYWx1ZSAhPSBPTVhfU3RzX05vRXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJldFZhbHVlOwotICAgIH0KLQotICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCi0gICAgICAgIHBTcmMsICAgICAKLSAgICAgICAgaVNyY1N0ZXAsIAotICAgICAgICBwRHN0UmlnaHQsICAgICAKLSAgICAgICAgaURzdFN0ZXAsIAotICAgICAgICBpV2lkdGgsICAgCi0gICAgICAgIGlIZWlnaHQpOwotCi0gICAgcmV0dXJuIFJldFZhbHVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmMxODZiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKLSAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi0gT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAKLSAgICAgY29uc3QgT01YX1U4KiAgICBwU3JjLCAKLSAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwgCi0gICAgIE9NWF9VOCogICAgcERzdFVwLCAKLSAgICAgT01YX1U4KiAgICBwRHN0RG93biwgCi0gICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsIAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwgCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodAotKQotewotICAgIE9NWFJlc3VsdCAgIFJldFZhbHVlOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0VXAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdERvd24gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA0KSAmJiAKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFVwKSAmJgotICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0RG93biksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gOCkgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdERvd24pLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDE2KSAmJiAKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3REb3duKSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0JYXJtUmV0QXJnRXJySWYoKGlXaWR0aCAhPSAxNikgJiYgKGlXaWR0aCAhPSA4KSYmIChpV2lkdGggIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgCi0gICAgICAgIHBTcmMgLSBpU3JjU3RlcCwgCi0gICAgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgcERzdFVwLAotICAgICAgICBpRHN0U3RlcCwgCi0gICAgICAgIGlXaWR0aCwgCi0gICAgICAgIGlIZWlnaHQpOwotICAgIAotICAgIGlmIChSZXRWYWx1ZSAhPSBPTVhfU3RzX05vRXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJldFZhbHVlOwotICAgIH0KLQotICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggIAotICAgICAgICBwU3JjLCAKLSAgICAgICAgaVNyY1N0ZXAsIAotICAgICAgICBwRHN0RG93biwKLSAgICAgICAgaURzdFN0ZXAsIAotICAgICAgICBpV2lkdGgsIAotICAgICAgICBpSGVpZ2h0KTsKLSAgICAKLSAgICByZXR1cm4gUmV0VmFsdWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhODE2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCi0gKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC1yZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCi0gKiAgIGRzdFN0ZXAgLWRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aCAKLSAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlciBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZCBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyYywKLSAgICAgT01YX1MzMiBzcmNTdGVwLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBkeCwKLSAgICAgT01YX1MzMiBkeSwKLSAgICAgT01YU2l6ZSByb2kgICAgICAgIAotICkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCA8IHJvaS53aWR0aCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IHJvaS53aWR0aCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPCAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeCA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR5IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHkgPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoICE9IDQpICYmIChyb2kud2lkdGggIT0gOCkgJiYgKHJvaS53aWR0aCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kuaGVpZ2h0ICE9IDQpICYmIChyb2kuaGVpZ2h0ICE9IDgpICYmIChyb2kuaGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA0KSAmJiBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gOCkgJiYgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDE2KSAmJiBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKSAKLQotICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEgCi0gICAgICAgIChwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5ZTc2OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyAgCi0gKiBjb2VmZmljaWVudHMgYW5kIHF1YW50aXphdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiB0aGUgMngyIEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDggYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQygKLQljb25zdCBPTVhfUzE2KiAJcFNyYywKLQlPTVhfUzE2KglwRHN0LAotCU9NWF9VMzIJCWlRUAotKQotewotICAgIE9NWF9JTlQgICAgIGksIGo7Ci0gICAgT01YX1MzMiAgICAgbVsyXVsyXTsKLSAgICBPTVhfUzMyICAgICBRUGVyLCBWMDAsIFZhbHVlOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIEludiBIYWRhbWFyZCBUcmFuc2Zvcm0gZm9yIDJ4MiBibG9jayAqLwotICAgIG1bMF1bMF0gPSBwU3JjWzBdICsgcFNyY1sxXSArICBwU3JjWzJdICsgcFNyY1szXTsKLSAgICBtWzBdWzFdID0gcFNyY1swXSAtIHBTcmNbMV0gKyAgcFNyY1syXSAtIHBTcmNbM107Ci0gICAgbVsxXVswXSA9IHBTcmNbMF0gKyBwU3JjWzFdIC0gIHBTcmNbMl0gLSBwU3JjWzNdOwotICAgIG1bMV1bMV0gPSBwU3JjWzBdIC0gcFNyY1sxXSAtICBwU3JjWzJdICsgcFNyY1szXTsKLQotICAgIC8qIFF1YW50aXphdGlvbiAqLwotICAgIC8qIFNjYWxpbmcgKi8KLSAgICBRUGVyID0gaVFQIC8gNjsKLSAgICBWMDAgPSBhcm1WQ000UDEwX1ZNYXRyaXggW2lRUCAlIDZdWzBdOwotCi0gICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRUGVyIDwgMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSA9IChtW2pdW2ldICogVjAwKSA+PiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlID0gKG1bal1baV0gKiBWMDApIDw8IChRUGVyIC0gMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBEc3RbaiAqIDIgKyBpXSA9IChPTVhfUzE2KSBWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxNWNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCBxdWFudGl6YXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDKAkKLQljb25zdCBPTVhfUzE2KiAJcFNyYywKLQlPTVhfUzE2KglwRHN0LAotCU9NWF9VMzIJCWlRUAotKQotewotICAgIE9NWF9JTlQgICAgIGksIGo7Ci0gICAgT01YX1MzMiAgICAgbTFbNF1bNF0sIG0yWzRdWzRdLCBWYWx1ZTsKLSAgICBPTVhfUzMyICAgICBRUGVyLCBWOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIEludiBIYWRhbWFyZCBUcmFuc2Zvcm0gZm9yIERDIEx1bWEgNHg0IGJsb2NrICovCi0gICAgLyogSG9yaXpvbnRhbCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBqID0gaSAqIDQ7Ci0gICAgICAgIAotICAgICAgICBtMVtpXVswXSA9IHBTcmNbaiArIDBdICsgcFNyY1tqICsgMl07IC8qIGErYyAqLwotICAgICAgICBtMVtpXVsxXSA9IHBTcmNbaiArIDFdICsgcFNyY1tqICsgM107IC8qIGIrZCAqLwotICAgICAgICBtMVtpXVsyXSA9IHBTcmNbaiArIDBdIC0gcFNyY1tqICsgMl07IC8qIGEtYyAqLwotICAgICAgICBtMVtpXVszXSA9IHBTcmNbaiArIDFdIC0gcFNyY1tqICsgM107IC8qIGItZCAqLwotCi0gICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLwotICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KLSAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCi0gICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLwotCi0gICAgfQotCi0gICAgLyogVmVydGljYWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOwotICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07Ci0gICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKLSAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOwotCi0gICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKLSAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOwotICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07Ci0gICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKiBTY2FsaW5nICovCi0gICAgUVBlciA9IGlRUCAvIDY7Ci0gICAgViA9IGFybVZDTTRQMTBfVk1hdHJpeCBbaVFQICUgNl1bMF07Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQZXIgPCAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlID0gKG0yW2pdW2ldICogViArICgxIDw8ICgxIC0gUVBlcikpKSA+PiAoMiAtIFFQZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlID0gbTJbal1baV0gKiBWICogKDEgPDwgKFFQZXIgLSAyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHBEc3RbaiAqIDQgKyBpXSA9IChPTVhfUzE2KSBWYWx1ZTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2U0NTE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnZlcnNlIGludGVnZXIgNHg0IHRyYW5zZm9ybQotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKLSAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKLSAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIG1hdHJpeC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCgKLQljb25zdCBPTVhfVTgqIAlwU3JjUHJlZCwgCi0JY29uc3QgT01YX1MxNiogCXBEZXF1YW50Q29lZmYsIAotCU9NWF9VOCogCXBEc3RSZWNvbiwKLQlPTVhfVTMyIAlpU3JjUHJlZFN0ZXAsIAotCU9NWF9VMzIJCWlEc3RSZWNvblN0ZXAsIAotCU9NWF9VOAkJYkFDCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzE2ICAgICBJblsxNl0sIE91dFsxNl07Ci0gICAgT01YX1MzMiAgICAgVmFsdWU7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY1ByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRGVxdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRGVxdWFudENvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFJlY29uID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0UmVjb24pLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihiQUMgPiAxLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgPT0gMCB8fCBpU3JjUHJlZFN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpRHN0UmVjb25TdGVwID09IDAgfHwgaURzdFJlY29uU3RlcCAmIDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgaWYgKGJBQykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbltpXSA9IHBEZXF1YW50Q29lZmYgW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIENvcHkgREMgKi8KLSAgICAgICAgSW5bMF0gPSBwRGVxdWFudENvZWZmIFswXTsKLSAgICAKLSAgICAgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluW2ldID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFJlc2lkdWFsIFRyYW5zZm9ybSAqLwotICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQgKE91dCwgSW4pOyAgICAKLSAgICAKLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogQWRkIHByZWRpdGlvbiAqLwotICAgICAgICAgICAgVmFsdWUgPSAoT01YX1MzMikgT3V0IFtqICogNCArIGldICsgcFNyY1ByZWQgW2ogKiBpU3JjUHJlZFN0ZXAgKyBpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogU2F0dXJhdGUgVmFsdWUgdG8gT01YX1U4ICovCi0gICAgICAgICAgICBWYWx1ZSA9IGFybUNsaXAgKDAsIDI1NSwgVmFsdWUpOwotCi0gICAgICAgICAgICBwRHN0UmVjb25baiAqIGlEc3RSZWNvblN0ZXAgKyBpXSA9IChPTVhfVTgpIFZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNDVlMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemF0aW9uIG1vZHVsZXMgZm9yIHRoZSB2ZW5kb3Igc3BlY2lmaWMgTW90aW9uIEVzdGltYXRpb24gc3RydWN0dXJlLgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCi0gKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKLSAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FTW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotICAgICkKLXsKLSAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBTaXplLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0gpICYmIAotICAgICAgICAgICAgICAgICAgIChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYgPD0gMCkgfHwgCi0gICAgICAgICAgICAgICAgICAgKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U4eDggPD0gMCkgfHwgCi0gICAgICAgICAgICAgICAgICAgKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U0eDQgPD0gMCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAqcFNpemUgPSAoT01YX0lOVCkgc2l6ZW9mKEFSTVZDTTRQMTBfTUVTcGVjKTsKLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDYzMzUzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTUVJbml0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemF0aW9uIG1vZHVsZXMgZm9yIHRoZSB2ZW5kb3Igc3BlY2lmaWMgTW90aW9uIEVzdGltYXRpb24gc3RydWN0dXJlLgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKLSAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKLSAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAotICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKLSAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAotICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKLSAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCi0gKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVJbml0KAotICAgICAgICBPTVhWQ000UDEwTUVNb2RlIE1FTW9kZSwKLSAgICAgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgICAgIHZvaWQgKnBNRVNwZWMKLSAgICAgICApCi17Ci0gICAgQVJNVkNNNFAxMF9NRVNwZWMgKmFybU1FU3BlYyA9IChBUk1WQ000UDEwX01FU3BlYyAqKSBwTUVTcGVjOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKCFwTUVQYXJhbXMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighcE1FU3BlYywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIKSAmJiAKLSAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2IDw9IDApIHx8IAotICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOHg4IDw9IDApIHx8IAotICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlNHg0IDw9IDApLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ibG9ja1NwbGl0RW5hYmxlOHg4ID0gcE1FUGFyYW1zLT5ibG9ja1NwbGl0RW5hYmxlOHg4OwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuYmxvY2tTcGxpdEVuYWJsZTR4NCA9IHBNRVBhcmFtcy0+YmxvY2tTcGxpdEVuYWJsZTR4NDsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmhhbGZTZWFyY2hFbmFibGUgICAgPSBwTUVQYXJhbXMtPmhhbGZTZWFyY2hFbmFibGU7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5xdWFydGVyU2VhcmNoRW5hYmxlID0gcE1FUGFyYW1zLT5xdWFydGVyU2VhcmNoRW5hYmxlOwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaW50cmFFbmFibGU0eDQgICAgICA9IHBNRVBhcmFtcy0+aW50cmFFbmFibGU0eDQ7ICAgICAKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlMTZ4MTYgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTY7ICAgCi0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTh4OCAgICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTh4ODsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlNHg0ICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlNHg0OwotICAgIGFybU1FU3BlYy0+TUVNb2RlICAgICAgICAgICAgICAgICAgICAgICA9IE1FTW9kZTsKLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjY0Mzk0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Ci0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIE1CIGxldmVsIG1vdGlvbiBlc3RpbWF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLSNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF9GUkFNRVMgICAgICgxNSkKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF80eDRfU0FECQkoMHhmZmZmKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX01PREVfVkFMVUUgICAgICgweGZmZmZmZmZmKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX01PREVTICAgICAgICAgICgxNikKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01CX0JMT0NLX1NJWkUgICAgICAoMTYpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NRURJQU4oYSxiLGMpICAgICAgKGE+Yj9hPmM/Yj5jP2I6YzphOmI+Yz9hPmM/YTpjOmIpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9TSElGVF9RUCAgICAgICAgICAgKDEyKQotCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOICAgICAgKDApCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfTCAgICAgICAgICAgKDEpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfVSAgICAgICAgICAgKDIpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfVVIgICAgICAgICAgKDMpCi0KLSNkZWZpbmUgQVJNX1ZDTTRQMTBfTUJfQkxPQ0tfU0laRSAgICAgICAoMTYpCi0jZGVmaW5lIEFSTV9WQ000UDEwX0JMT0NLX1NJWkUgICAgICAgICAgKDQpCi0jZGVmaW5lIEFSTV9WQ000UDEwX01BWF9DT1NUICAgICAgICAgICAgKDEgPDwgMzApCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLICAgICAgKC0yKQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIENhbGN1bGF0ZSBTQUQgdmFsdWUgZm9yIHRoZSBzZWxlY3RlZCBNQiBlbmNvZGluZyBtb2RlIGFuZCB1cGRhdGUgCi0gKiBwRHN0QmxvY2tTQUQgcGFyYW1ldGVyLiBUaGVzZSBTQUQgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIDR4NCBibG9ja3MgYXQKLSAqIGEgdGltZSBhbmQgaW4gdGhlIHNjYW4gb3JkZXIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjTUJJbmZvICAgIC0gCi0gKiBbaW5dIHBTcmNDdXJyQnVmICAgLSAKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgICAtIAotICogW2luXSBwU3JjUmVmQnVmTGlzdC0gCi0gKiBbaW5dIFNyY1JlZlN0ZXAgICAgLSAKLSAqIFtpbl0gcFNyY1JlY0J1ZiAgICAtIAotICogW2luXSBTcmNSZWNTdGVwICAgIC0gCi0gKiBbaW5dIHBSZWZSZWN0ICAgICAgLSAKLSAqIFtpbl0gcEN1cnJQb2ludFBvcyAtIAotICogW2luXSBMYW1iZGEgICAgICAgIC0gCi0gKiBbaW5dIHBNRVNwZWMgICAgICAgLSAKLSAqIFtpbl0gcE1CSW50ZXIgICAgICAtIAotICogW2luXSBwTUJJbnRyYSAgICAgIC0gCi0gKiBbb3V0XSBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIDE2IGVsZW1lbnQgYXJyYXkgZm9yIFNBRCBjb3JyZXNwb25kaW5nIHRvIDR4NCBibG9ja3MKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqCi0gKi8KLQotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0NhbGN1bGF0ZUJsb2NrU0FEKAotCU9NWFZDTTRQMTBNQkluZm8gKnBTcmNNQkluZm8sIAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCU9NWF9TMzIgU3JjQ3VyclN0ZXAsIAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCi0JT01YX1MzMiBTcmNSZWZTdGVwLAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwgCi0JT01YX1MzMiBTcmNSZWNTdGVwLAotCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0JY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAotCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAotCU9NWF9VMTYgKnBEc3RCbG9ja1NBRCkKLXsKLQlPTVhfSU5UCQlJbnZhbGlkU0FEID0gMDsKLQlPTVhfSU5UCQlpOwotCi0JT01YX1U4CQlCdWZmZXIgWzE2KjE2ICsgMTVdOwotCU9NWF9VOAkJKnBUZW1wRHN0QnVmOwotCU9NWF9TMzIJCVRlbXBEc3RTdGVwOwotCU9NWF9VOAkJKnBUZW1wUmVmQnVmOwotCU9NWF9TMzIJCVRlbXBSZWZTdGVwOyAKLQotCS8qIFRlbXBvcmFyeSBidWZmZXIgdG8gc3RvcmUgdGhlIHByZWRpY3RlZCBtYiBjb2VmZmljaWVudHMgKi8KLQlwVGVtcERzdEJ1ZiA9IGFybUFsaWduVG8xNkJ5dGVzKEJ1ZmZlcik7Ci0JVGVtcERzdFN0ZXAgPSAxNjsKLQotCS8qIFVwZGF0ZSBwRHN0QmxvY2tTQUQgaWYgTUIgaXMgYSB2YWxpZCB0eXBlICovCi0JaWYgKHBTcmNNQkluZm8pCi0JewotCSAgICBPTVhfVTMyICAgICBXaWR0aD0wLCBIZWlnaHQ9MCwgTWF4WFBhcnQsIE1heFlQYXJ0LE1heFN1YlhQYXJ0LE1heFN1YllQYXJ0OwotCSAgICAKLQkJLyogRGVwZW5kaW5nIG9uIHR5cGUgb2YgTUIsIGRvIHByZWRpY3Rpb24gYW5kIGZpbGwgdGVtcCBidWZmZXIgKi8KLQkJc3dpdGNoIChwU3JjTUJJbmZvLT5tYlR5cGUpCi0JCXsKLQkJY2FzZSBPTVhfVkNfUF8xNngxNjoKLQkJCQlXaWR0aCA9IDE2OwotCQkJCUhlaWdodCA9IDE2OwotCQkJCWJyZWFrOwotCQljYXNlIE9NWF9WQ19QXzE2eDg6Ci0JCQkJV2lkdGggPSAxNjsKLQkJCQlIZWlnaHQgPSA4OwotCQkJCWJyZWFrOwotCQljYXNlIE9NWF9WQ19QXzh4MTY6Ci0JCQkJV2lkdGggPSA4OwotCQkJCUhlaWdodCA9IDE2OwotCQkJCWJyZWFrOwotCQljYXNlIE9NWF9WQ19QXzh4ODoKLQkJCQlXaWR0aCA9IDg7Ci0JCQkJSGVpZ2h0ID0gODsKLQkJCQlicmVhazsKLQkJY2FzZSBPTVhfVkNfSU5UUkFfNHg0OgotCQkJewotCQkJCS8qIENyZWF0ZSBwcmVkaWN0ZWQgTUIgSW50cmE0eDQgbW9kZSAqLwotCQkJCU9NWF9TMzIgICAgIFByZWRJbnRyYTR4NE1vZGUgWzVdWzldOwotCQkJCU9NWF9TMzIJCXgsIHksIEJsb2NrOHg4LCBCbG9jazR4NCwgQmxvY2tYLCBCbG9ja1k7Ci0JCQkJT01YX1U4ICAgICAgcFNyY1lCdWZmIFsoMTYqMykqKDE2KjIpXTsKLQkJCQlPTVhfVTgJCSpwU3JjWTsKLQkJCQlPTVhfUzMyICAgICBTdGVwU3JjWTsKLQkJCQlPTVhfUzMyCQlhdmFpbGFiaWxpdHk7Ci0KLQkJCQlmb3IgKHkgPSAwOyB5IDwgNTsgeSsrKQotCQkJCXsKLQkJCQkJZm9yICh4ID0gMDsgeCA8IDk7IHgrKykKLQkJCQkJewotCQkJCQkJLyogCi0JCQkJCQkgKiBJbml0aWFsaXplIHdpdGggdmFsdWUgb2YgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSywgdG8gbWVhbiB0aGlzIAotCQkJCQkJICogNHg0IGJsb2NrIGlzIG5vdCBhdmFpbGFibGUgCi0JCQkJCQkgKi8KLQkJCQkJCVByZWRJbnRyYTR4NE1vZGUgW3ldW3hdID0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSzsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8qIFJlcGxhY2UgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB2YWx1ZSB3aXRoIGF2YWlsYWJsZSBNQnMgdmFsdWVzKi8KLQkJCQlmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCXsKLQkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGIwLCBiMSwgYjIsIGIzICovCi0JCQkJCWlmIChwTUJJbnRyYVsxXSAhPSBOVUxMKQotCQkJCQl7Ci0JCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgMV0gPSAKLQkJCQkJCQlwTUJJbnRyYVsxXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07ICAgICAgICAgICAgCi0JCQkJCX0KLQkJCSAgICAgICAgCi0JCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBkMCwgZDEsIGQyLCBkMyAqLwotCQkJCQlpZiAocE1CSW50cmFbM10gIT0gTlVMTCkKLQkJCQkJewotCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDVdID0gCi0JCQkJCQkJcE1CSW50cmFbM10tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOwotCQkJCQl9Ci0JCQkJfQotCQkgICAgCi0JCQkJLyogU3RvcmUgdmFsdWVzIG9mIGMzICovCi0JCQkJaWYgKHBNQkludHJhWzJdICE9IE5VTEwpCi0JCQkJewotCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVswXSA9IHBNQkludHJhWzJdLT5wSW50cmE0eDRQcmVkTW9kZVsxNV07Ci0JCQkJfQotCQkgICAgCi0JCQkJZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCQl7Ci0JCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBhMCwgYTEsIGEyLCBhMyAqLwotCQkJCQlpZiAocE1CSW50cmFbMF0gIT0gTlVMTCkKLQkJCQkJewotCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeSArIDFdWzBdID0gCi0JCQkJCQkJcE1CSW50cmFbMF0tPnBJbnRyYTR4NFByZWRNb2RlW3kqNCArIDNdOwotCQkJCQl9Ci0JCQkJfQotCQkgICAgICAgIAotCQkJCS8qCi0JCQkJICogVXBkYXRlIG5laWdoYm91cmluZyBQcmVkIG1vZGUgYXJyYXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvcgotCQkJCSAqIHByZWRpY3Rpb24gb2YgSW50cmE0eDQgbW9kZXMuCi0JCQkJICovCi0JCQkgICAgCi0JCQkJcFNyY1kgPSBwU3JjWUJ1ZmY7Ci0JCQkJU3RlcFNyY1kgPSAxNiAqIDM7Ci0JCQkJZm9yICh5ID0gMDsgeSA8ICgxNiAqIDIpOyB5KyspCi0JCQkJewotCQkJCQlmb3IgKHggPSAwOyB4IDwgKDE2ICogMyk7IHgrKykKLQkJCQkJewotCQkJCQkJcFNyY1kgW1N0ZXBTcmNZICogeSArIHhdID0gCi0JCQkJCQkJcFNyY1JlY0J1ZiBbU3JjUmVjU3RlcCAqICh5IC0gMTYpICsgeCAtIDE2XTsKLQkJCQkJfQotCQkJCX0KLQotCQkgICAgCi0JCQkJLyogZm9yIGVhY2ggOHg4IGJsb2NrICovCi0JCQkJZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKLQkJCQl7Ci0JCQkJCS8qIGZvciBlYWNoIDR4NCBibG9jayBpbnNpZGUgOHg4IGJsb2NrICovCi0JCQkJCWZvciAoQmxvY2s0eDQgPSAwOyBCbG9jazR4NCA8IDQ7IEJsb2NrNHg0KyspCi0JCQkJCXsKLQkJCQkJCS8qIEdldCBibG9jayBjb3JkaW5hdGVzIGZyb20gOHg4IGJsb2NrIGluZGV4IGFuZCA0eDQgYmxvY2sgaW5kZXggKi8KLQkJCQkJCUJsb2NrWCA9ICgoQmxvY2s4eDggJiAxKSA8PCAxKSArIChCbG9jazR4NCAmIDEpOwotCQkJCQkJQmxvY2tZID0gKChCbG9jazh4OCA+PiAxKSA8PCAxKSArIChCbG9jazR4NCA+PiAxKTsKLQkJCQkJICAgIAotCQkJCQkJLyogQWRkIG9mZnNldCB0byBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IE1CIGluIHRoZSBhcnJheSBwSW50cmE0eDRQcmVkTW9kZSAqLwotCQkJCQkJeCA9IEJsb2NrWCArIDE7Ci0JCQkJCQl5ID0gQmxvY2tZICsgMTsKLQotCQkJCQkJYXZhaWxhYmlsaXR5ID0gMDsKLQotCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIEJsb2NrICovCi0JCQkJCQlpZiAoUHJlZEludHJhNHg0TW9kZSBbeV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0JCQkJCQl7Ci0JCQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCi0JCQkJCQl9Ci0KLQkJCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgQmxvY2sgKi8KLQkJCQkJCWlmIChQcmVkSW50cmE0eDRNb2RlIFt5IC0gMV1beF0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLQkJCQkJCXsKLQkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCi0JCQkJCQl9Ci0KLQkJCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgTEVGVCBCbG9jayAqLwotCQkJCQkJaWYgKFByZWRJbnRyYTR4NE1vZGUgW3kgLSAxXVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLQkJCQkJCXsKLQkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBwU3JjTUJJbmZvLT5wSW50cmE0eDRQcmVkTW9kZVtCbG9ja1kqNCtCbG9ja1hdOwotCQkJCQkJeCA9IEJsb2NrWCAqIDQ7Ci0JCQkJCQl5ID0gQmxvY2tZICogNDsKLQotCQkJCQkJcFNyY1kgPSBwU3JjWUJ1ZmYgKyAxNiAqIFN0ZXBTcmNZICsgMTYgKyB5ICogU3RlcFNyY1kgKyB4OwotCi0JCQkJCQlvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCi0JCQkJCQkJIHBTcmNZIC0gMSwKLQkJCQkJCQkgcFNyY1kgLSBTdGVwU3JjWSwKLQkJCQkJCQkgcFNyY1kgLSBTdGVwU3JjWSAtIDEsCi0JCQkJCQkJIHBUZW1wRHN0QnVmICsgeCArIHkgKiBUZW1wRHN0U3RlcCwKLQkJCQkJCQkgU3RlcFNyY1ksCi0JCQkJCQkJIFRlbXBEc3RTdGVwLAotCQkJCQkJCSBwU3JjTUJJbmZvLT5wSW50cmE0eDRQcmVkTW9kZVtCbG9ja1kqNCtCbG9ja1hdLAotCQkJCQkJCSBhdmFpbGFiaWxpdHkpOwotCi0JCQkJCQlmb3IgKEJsb2NrWT0wO0Jsb2NrWTw0O0Jsb2NrWSsrKQotCQkJCQkJewotCQkJCQkJCWZvcihCbG9ja1g9MDtCbG9ja1g8NDtCbG9ja1grKykKLQkJCQkJCQl7Ci0JCQkJCQkJCXBTcmNZIFtCbG9ja1kgKiBTdGVwU3JjWSArIEJsb2NrWF0gPSAKLQkJCQkJCQkJCShPTVhfVTgpKCoocFRlbXBEc3RCdWYgKyB4ICsgeSAqIFRlbXBEc3RTdGVwICsgQmxvY2tZICogVGVtcERzdFN0ZXAgKyBCbG9ja1gpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBPTVhfVkNfSU5UUkFfMTZ4MTY6Ci0JCQl7Ci0JCQkJT01YX1UzMiAgICAgTUJQb3NYID0gcEN1cnJQb2ludFBvcy0+eCA+PiA0OyAgICAgICAgCi0JCQkJT01YX1UzMiAgICAgTUJQb3NZID0gcEN1cnJQb2ludFBvcy0+eSA+PiA0OyAgICAgICAgCi0JCQkJT01YX1UzMgkJYXZhaWxhYmlsaXR5ID0gMDsKLQotCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBNQiAqLwotCQkJCWlmICgoTUJQb3NYICE9IDApICYmIChwTUJJbnRyYSBbMF0gIT0gMCB8fCBwTUJJbnRlciBbMF0gIT0gMCkpCi0JCQkJewotCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKLQkJCQl9Ci0KLQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQIE1CICovCi0JCQkJaWYgKChNQlBvc1kgIT0gMCkgJiYgKHBNQkludHJhIFsxXSAhPSAwIHx8IHBNQkludGVyIFsxXSAhPSAwKSkKLQkJCQl7Ci0JCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKLQkJCQl9Ci0KLQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQLUxFRlQgTUIgKi8KLQkJCQlpZiAoKE1CUG9zWCA+IDApICYmIChNQlBvc1kgPiAwKSAmJiAKLQkJCQkJKHBNQkludHJhIFsyXSAhPSAwIHx8IHBNQkludGVyIFsyXSAhPSAwKSkKLQkJCQl7Ci0JCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAotCQkJCX0KLQotCQkJCW9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAotCQkJCQkJcFNyY1JlY0J1ZiAtIDEsIAotCQkJCQkJcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAsIAotCQkJCQkJcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAgLSAxLCAKLQkJCQkJCXBUZW1wRHN0QnVmLCAKLQkJCQkJCVNyY1JlY1N0ZXAsIAotCQkJCQkJVGVtcERzdFN0ZXAsIAotCQkJCQkJcFNyY01CSW5mby0+SW50cmExNngxNlByZWRNb2RlLCAKLQkJCQkJCWF2YWlsYWJpbGl0eSk7Ci0JCQkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJY2FzZSBPTVhfVkNfSU5URVJfU0tJUDoKLQkJY2FzZSBPTVhfVkNfUFJFRjBfOHg4OgotCQljYXNlIE9NWF9WQ19JTlRSQV9QQ006Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBUaGVzZSBjYXNlcyB3aWxsIHVwZGF0ZSBwRHN0QmxvY2tTQUQgd2l0aCBNQVggdmFsdWUgKi8KLQkJCUludmFsaWRTQUQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBJTlRFUiBNQiAqLwotCQlpZiAoKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF8xNngxNikgfHwKLQkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfOHgxNikgfHwKLQkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfMTZ4OCkgfHwKLQkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfOHg4KSkKLQkJewotICAgICAgICAJY29uc3QgT01YX1U4CQkqcFRlbXBTcmNCdWY7Ci0gICAgICAgIAlPTVhfUzMyCQlUZW1wU3JjU3RlcDsKLSAgICAgICAgCU9NWF9TMzIJCW12eCxtdnk7Ci0gICAgICAgIAlPTVhfVTMyCQlQYXJ0WCwgUGFydFksIFN1YlBhcnRYLCBTdWJQYXJ0WTsKLSAgICAgICAgCQotCQkJVGVtcFNyY1N0ZXAgPSBTcmNSZWZTdGVwOwotCi0JCQlNYXhYUGFydCA9IDE2L1dpZHRoOwotCQkJTWF4WVBhcnQgPSAxNi9IZWlnaHQ7Ci0KLQotCQkJZm9yIChQYXJ0WSA9IDA7IFBhcnRZIDwgTWF4WVBhcnQ7IFBhcnRZKyspCi0JCQl7Ci0JCQkJZm9yIChQYXJ0WCA9IDA7IFBhcnRYIDwgTWF4WFBhcnQ7IFBhcnRYKyspCi0JCQkJewotCi0JCQkJCXBUZW1wU3JjQnVmID0gcFNyY1JlZkJ1Zkxpc3RbcFNyY01CSW5mby0+cFJlZkwwSWR4W1BhcnRZICogMiArIFBhcnRYXV07Ci0KLQkJCQkJaWYgKE1heFhQYXJ0ID09IDIgJiYgTWF4WVBhcnQgPT0gMikKLQkJCQkJewotICAgICAgICAJCQkJc3dpdGNoIChwU3JjTUJJbmZvLT5zdWJNQlR5cGVbUGFydFkqMitQYXJ0WF0pCi0gICAgICAgIAkJCQl7Ci0gICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfOHg4OgotCQkJCQkJCQlXaWR0aCA9IDg7Ci0JCQkJCQkJCUhlaWdodCA9IDg7Ci0gICAgICAgICAgICAJCQkJICAgIGJyZWFrOwotICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzh4NDoKLQkJCQkJCQkJV2lkdGggPSA4OwotCQkJCQkJCQlIZWlnaHQgPSA0OwotICAgICAgICAgICAgCQkJCSAgICBicmVhazsKLSAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF80eDg6Ci0JCQkJCQkJCVdpZHRoID0gNDsKLQkJCQkJCQkJSGVpZ2h0ID0gODsKLSAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7Ci0gICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfNHg0OgotCQkJCQkJCQlXaWR0aCA9IDQ7Ci0JCQkJCQkJCUhlaWdodCA9IDQ7Ci0gICAgICAgICAgICAJCQkJICAgIGJyZWFrOwotICAgICAgICAJCQkJICAgIGRlZmF1bHQ6Ci0JCQkJCQkJCS8qIERlZmF1bHQgKi8KLQkJCQkJCQkJV2lkdGggPSA0OwotCQkJCQkJCQlIZWlnaHQgPSA0OwotICAgICAgICAJCQkJICAgIGJyZWFrOwotICAgICAgICAJCQkJfQotCQkJCQkKLSAgICAJCQkJICAgIE1heFN1YlhQYXJ0ID0gOC9XaWR0aDsKLSAgICAJCQkJICAgIE1heFN1YllQYXJ0ID0gOC9IZWlnaHQ7Ci0KLQkJCQkJCWZvciAoU3ViUGFydFkgPSAwOyBTdWJQYXJ0WSA8IE1heFN1YllQYXJ0OyBTdWJQYXJ0WSsrKQotCQkJCQkJewotCQkJCQkJCWZvciAoU3ViUGFydFggPSAwOyBTdWJQYXJ0WCA8IE1heFN1YlhQYXJ0OyBTdWJQYXJ0WCsrKQotCQkJCQkJCXsKLQkJCQkJCQkJbXZ4ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WSArIFN1YlBhcnRZXVsyKlBhcnRYICsgU3ViUGFydFhdLmR4OwotCQkJCQkJCQltdnkgPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZICsgU3ViUGFydFldWzIqUGFydFggKyBTdWJQYXJ0WF0uZHk7Ci0JCQkJCQkJCWFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLQkJCQkJCQkJCXBUZW1wU3JjQnVmICsgKDgqUGFydFggKyA0KlN1YlBhcnRYICsgKG12eC80KSkgKyAoOCpQYXJ0WSArIDQqU3ViUGFydFkgKyAobXZ5LzQpKSAqIFRlbXBTcmNTdGVwLAotCQkJCQkJCQkJVGVtcFNyY1N0ZXAsCi0JCQkJCQkJCQlwVGVtcERzdEJ1ZiArICg4KlBhcnRYICsgNCpTdWJQYXJ0WCkgKyAoOCpQYXJ0WSArIDQqU3ViUGFydFkpICogVGVtcERzdFN0ZXAsCi0JCQkJCQkJCQlUZW1wRHN0U3RlcCwKLQkJCQkJCQkJCVdpZHRoLAotCQkJCQkJCQkJSGVpZ2h0LAotCQkJCQkJCQkJbXZ4ICYgMywKLQkJCQkJCQkJCW12eSAmIDMKLQkJCQkJCQkJCSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCi0JCQkJCQltdnggPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZXVsyKlBhcnRYXS5keDsKLQkJCQkJCW12eSA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFldWzIqUGFydFhdLmR5OwotCQkJCQkJYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotCQkJCQkJCXBUZW1wU3JjQnVmICsgKDgqUGFydFggKyAobXZ4LzQpKSArICg4KlBhcnRZICsgKG12eS80KSkgKiBUZW1wU3JjU3RlcCwKLQkJCQkJCQlUZW1wU3JjU3RlcCwKLQkJCQkJCQlwVGVtcERzdEJ1ZiArICg4KlBhcnRYKSArICg4KlBhcnRZKSAqIFRlbXBEc3RTdGVwLAotCQkJCQkJCVRlbXBEc3RTdGVwLAotCQkJCQkJCVdpZHRoLAotCQkJCQkJCUhlaWdodCwKLQkJCQkJCQltdnggJiAzLAotCQkJCQkJCW12eSAmIDMKLQkJCQkJCQkpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJSW52YWxpZFNBRCA9IDE7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIFNBRCBmcm9tIHByZWRpY3RlZCBidWZmZXIgKi8KLQlpZiAoIUludmFsaWRTQUQpCi0JewotCSAgICBPTVhfVTMyICAgICB4OHg4LCB5OHg4LCB4NHg0LCB5NHg0LCBCbG9jazh4OCwgQmxvY2s0eDQ7Ci0JICAgIE9NWF9TMzIgICAgIFNBRDsKLQkgICAgCi0JCXBUZW1wUmVmQnVmID0gcFRlbXBEc3RCdWY7Ci0JCVRlbXBSZWZTdGVwID0gMTY7Ci0KLQkJLyogU0FEIGZvciBlYWNoIDR4NCBibG9jayBpbiBzY2FuIG9yZGVyICovCi0JCWZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCi0JCXsKLQkJCXg4eDggPSA4KihCbG9jazh4OCAmIDEpOwotCQkJeTh4OCA9IDgqKEJsb2NrOHg4ID4+IDEpOwotCQkJZm9yIChCbG9jazR4NCA9IDA7IEJsb2NrNHg0IDwgNDsgQmxvY2s0eDQrKykKLQkJCXsKLQkJCQl4NHg0ID0gNCooQmxvY2s0eDQgJiAxKTsKLQkJCQl5NHg0ID0gNCooQmxvY2s0eDQgPj4gMSk7Ci0KLQkJCQlhcm1WQ0NPTU1fU0FEKAkKLQkJCQkJcFNyY0N1cnJCdWYgKyAoeDh4OCArIHg0eDQpICsgKHk4eDggKyB5NHg0KSAqIFNyY0N1cnJTdGVwLCAKLQkJCQkJU3JjQ3VyclN0ZXAsCi0JCQkJCXBUZW1wUmVmQnVmICsgKHg4eDggKyB4NHg0KSArICh5OHg4ICsgeTR4NCkgKiBUZW1wUmVmU3RlcCwKLQkJCQkJVGVtcFJlZlN0ZXAsCi0gICAgCQkJCSZTQUQsCi0gICAgCQkJCTQsIC8qIEhlaWdodCAqLwotICAgIAkJCQk0KTsgLyogV2lkdGggKi8KLSAgICAgICAgICAgICAgICAqKHBEc3RCbG9ja1NBRCArIDQgKiBCbG9jazh4OCArIEJsb2NrNHg0KSA9IChTQUQgPCAweDdmZmYpID8gKE9NWF9VMTYpIFNBRCA6IEFSTV9WQ000UDEwX01BWF9NT0RFX1ZBTFVFOyAgIAkJCSAgICAKLSAJCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJLyogRmlsbCBTQURzIHdpdGggbWF4IHZhbHVlcyBhbmQgcmV0dXJuKi8KLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCXsKLQkJCXBEc3RCbG9ja1NBRCBbaV0gPSBBUk1fVkNNNFAxMF9NQVhfNHg0X1NBRDsKLQkJfQotCX0KLQlyZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBJbnRyYSA0eDQgTW9kZSBkZWNpc2lvbiBieSBjYWxjdWxhdGluZyBjb3N0IGZvciBhbGwgcG9zc2libGUgbW9kZXMgYW5kCi0gKiBjaG9vc2luZyB0aGUgYmVzdCBtb2RlCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGN1cnJlbnQgTWFjcm9ibG9jawotICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBvZiB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZgotICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdGhlIE9NWFZDTTRQMTBNQkluZm8gd2hpY2ggd2lsbCBiZSB1cGRhdGVkIGZvcgotICogICAgICAgICAgICAgICAgICAgIGZpZWxkIHBJbnRyYTR4NFByZWRNb2RlIG9mIHRoZSBjdXJyZW50IGJsb2NrLgotICogW2luXSBCbG9jazh4OCAgICAtIEluZGV4IDh4OCBibG9jayBpbiB3aGljaCBjdXJyZW50IDR4NCBibG9jayBiZWxvbmdzCi0gKiBbaW5dIEJsb2NrNHg0ICAgIC0gSW5kZXggb2YgY3VycmVudCA0eDQgYmxvY2sKLSAqIFtpbi9vdXRdIHBQcmVkSW50cmE0eDRTcmNZIC0gUG9pbnRlciB0byBjdXJyZW50IGJsb2NrIGxvY2F0aW9uIGluIGJ1ZmZlciAKLSAqICAgICAgICAgICAgICAgICAgICB3aXRoIHJlY29uc3RydWN0ZWQgdmFsdWVzLiBUaGlzIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhpcwotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpdGggYmVzdCBtb2RlIHByZWRpY3RlZCB2YWx1ZXMgCi0gKiBbaW5dIFN0ZXBQcmVkSW50cmE0eDRTcmNZICAtIFN0ZXAgc2l6ZSBvZiB0aGUgcG9pbnRlciBwUHJlZEludHJhNHg0U3JjWQotICogW2luXSBwSW50cmE0eDRQcmVkTW9kZSAgICAgLSBBcnJheSBvZiBJbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciB0aGUgTUIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgTUIgbW9kZXMgc3RhcnRzIGF0IFsxLDFdLgotICogW2luXSBwQmVzdENvc3QgICAtIENvc3QgZm9yIHRoZSBCZXN0IEludHJhIDR4NCBtb2RlCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDEwX01vZGU0eDREZWNpc2lvbiAoCi0gICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0gICAgT01YX1MzMiBCbG9jazh4OCwKLSAgICBPTVhfUzMyIEJsb2NrNHg0LAotICAgIE9NWF9VOCAgKnBQcmVkSW50cmE0eDRTcmNZLAotICAgIE9NWF9TMzIgU3RlcFByZWRJbnRyYTR4NFNyY1ksCi0gICAgT01YX1MzMiBwSW50cmE0eDRQcmVkTW9kZSBbXVs5XSwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSkKLXsKLSAgICBPTVhfUzMyICAgICBpLCBqLCB4LCB5LCBCbG9ja1gsIEJsb2NrWSwgbW9kZTsKLSAgICBPTVhfUzMyICAgICBDb3N0LCBCZXN0Q29zdDsKLSAgICBPTVhfVTggICAgICAqcFNyY1k7Ci0gICAgT01YX1MzMiAgICAgU3RlcFNyY1k7Ci0gICAgT01YX1MzMiAgICAgYXZhaWxhYmlsaXR5ID0gMDsKLSAgICBPTVhfVTggICAgICBwUHJlZEJsb2NrIFs0KjRdOwotICAgIE9NWFJlc3VsdCAgIFJldCA9IE9NWF9TdHNfRXJyOwotCi0gICAgLyogR2V0IGJsb2NrIGNvcmRpbmF0ZXMgZnJvbSA4eDggYmxvY2sgaW5kZXggYW5kIDR4NCBibG9jayBpbmRleCAqLwotICAgIEJsb2NrWCA9ICgoQmxvY2s4eDggJiAxKSA8PCAxKSArIChCbG9jazR4NCAmIDEpOwotICAgIEJsb2NrWSA9ICgoQmxvY2s4eDggPj4gMSkgPDwgMSkgKyAoQmxvY2s0eDQgPj4gMSk7Ci0gICAgCi0gICAgLyogQWRkIG9mZnNldCB0byBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IE1CIGluIHRoZSBhcnJheSBwSW50cmE0eDRQcmVkTW9kZSAqLwotICAgIHggPSBCbG9ja1ggKyAxOwotICAgIHkgPSBCbG9ja1kgKyAxOwotCi0gICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIEJsb2NrICovCi0gICAgaWYgKHBJbnRyYTR4NFByZWRNb2RlIFt5XVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgQmxvY2sgKi8KLSAgICBpZiAocEludHJhNHg0UHJlZE1vZGUgW3kgLSAxXVt4XSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgTEVGVCBCbG9jayAqLwotICAgIGlmIChwSW50cmE0eDRQcmVkTW9kZSBbeSAtIDFdW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCi0gICAgfQotCi0gICAgcFNyY1kgPSBwUHJlZEludHJhNHg0U3JjWSArIAotICAgICAgICAgICAgU3RlcFByZWRJbnRyYTR4NFNyY1kgKiAoQmxvY2tZIDw8IDIpICsgCi0gICAgICAgICAgICAoQmxvY2tYIDw8IDIpOwotICAgICAgICAgICAgCi0gICAgU3RlcFNyY1kgPSBTdGVwUHJlZEludHJhNHg0U3JjWTsKLSAgICAgICAgICAgICAgCi0gICAgeCA9IEJsb2NrWCAqIDQ7Ci0gICAgeSA9IEJsb2NrWSAqIDQ7Ci0KLSAgICBDb3N0ID0gQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKLSAgICAKLSAgICAvKiBHbyB0aHJvdWdoIGVhY2ggbW9kZSBmb3IgbWluaW0gY29zdCAqLwotICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCA5OyBtb2RlKyspCi0gICAgewotICAgICAgICBSZXQgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCi0gICAgICAgICAgICAgcFNyY1kgLSAxLAotICAgICAgICAgICAgIHBTcmNZIC0gU3RlcFNyY1ksCi0gICAgICAgICAgICAgcFNyY1kgLSBTdGVwU3JjWSAtIDEsCi0gICAgICAgICAgICAgcFByZWRCbG9jaywKLSAgICAgICAgICAgICBTdGVwU3JjWSwKLSAgICAgICAgICAgICA0LAotICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSkgbW9kZSwKLSAgICAgICAgICAgICBhdmFpbGFiaWxpdHkpOwotICAgICAgICAgICAgIAotICAgICAgICBpZiAoUmV0ID09IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoICAgIAotICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmICsgKHkgKiBTcmNDdXJyU3RlcCkgKyB4LAotICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgIHBQcmVkQmxvY2ssCi0gICAgICAgICAgICAgICAgNCwKLSAgICAgICAgICAgICAgICAmQ29zdCwKLSAgICAgICAgICAgICAgICA0LAotICAgICAgICAgICAgICAgIDQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoQ29zdCA8IEJlc3RDb3N0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJlc3RDb3N0ID0gQ29zdDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwSW50cmE0eDRQcmVkTW9kZSBbQmxvY2tZICsgMV1bQmxvY2tYICsgMV0gPSAKLSAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wSW50cmE0eDRQcmVkTW9kZSBbQmxvY2tZICogNCArIEJsb2NrWF0gPSAKLSAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlOwotCi0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNZIFtTdGVwU3JjWSAqIGogKyBpXSA9IHBQcmVkQmxvY2sgWzQgKiBqICsgaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcEJlc3RDb3N0ID0gQmVzdENvc3Q7Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NldE1vdGlvblZlY3RvclByZWRpY3RvcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgVGhpcyBmdW5jdGlvbiB3aWxsIGRvIHRoZSBNViBQcmVkaWN0aW9uIGZvciBJbnRlciBNQnMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBCbG9ja1N0YXJ0WCAtIFN0YXJ0IFggaW5kZXggaW4gaW50ZWdlciBwZWxzIGluIGN1cnJlbnQgQmxvY2sKLSAqIFtpbl0gQmxvY2tTdGFydFkgLSBTdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscyBpbiBjdXJyZW50IEJsb2NrCi0gKiBbaW5dIEJsb2NrU2l6ZVggIC0gV2lkdGggb2YgY3VycmVudCBibG9jawotICogW2luXSBCbG9ja1NpemVZICAtIEhlaWdodCBvZiBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIFJlZkZyYW1lICAgIC0gSW5kZXggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBmb3IgcHJlZGljdGlvbgotICogW2luXSBwUmVmRnJBcnIgICAtIFBvaW50ZXIgdG8gUmVmIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgotICogW2luXSBwTVZBcnIgICAgICAtIFBvaW50ZXIgdG8gTVYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCi0gKiBbb3V0XSBwTVZQcmVkICAgIC0gUG9pbnRlciB0byBwcmVkaWN0ZWQgTVZzCi0gKiBSZW1hcmtzOgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yKAotICAgIE9NWF9VMzIgQmxvY2tTdGFydFgsIAotICAgIE9NWF9VMzIgQmxvY2tTdGFydFksCi0gICAgT01YX1UzMiBCbG9ja1NpemV4LAotICAgIE9NWF9VMzIgQmxvY2tTaXpleSwKLSAgICBPTVhfUzMyIFJlZkZyYW1lLAotICAgIE9NWF9TMzIgcFJlZkZyQXJyW11bNl0sIAotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFycltdWzEyXSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZAotKQotewotICAgIE9NWF9TMzIgICAgIFJGcmFtZUw7ICAgICAgIC8qIExlZnQgKi8KLSAgICBPTVhfUzMyICAgICBSRnJhbWVVOyAgICAgICAvKiBVcCAqLwotICAgIE9NWF9TMzIgICAgIFJGcmFtZVVSOyAgICAgIC8qIFVwLVJpZ2h0ICovCi0KLSAgICBPTVhfUzMyICAgICBCbG9ja1gsIEJsb2NrWSwgQmxvY2tYRnIsIEJsb2NrWUZyLCBNVlByZWRUeXBlOwotICAgIE9NWF9TMzIgICAgIEJsb2NrWFBsdXNPZmYsIEJsb2NrWFBsdXNPZmZGciwgQmxvY2tYTWluMUZyLCBCbG9ja1lNaW4xRnI7Ci0gICAgCi0gICAgQmxvY2tYID0gNCArIChCbG9ja1N0YXJ0WCA+PiAyKTsKLSAgICBCbG9ja1kgPSA0ICsgKEJsb2NrU3RhcnRZID4+IDIpOyAKLSAgICBCbG9ja1hQbHVzT2ZmID0gQmxvY2tYICsgKEJsb2NrU2l6ZXggPj4gMik7Ci0gICAgCi0gICAgQmxvY2tYRnIgPSBCbG9ja1ggPj4gMTsgIAotICAgIEJsb2NrWUZyID0gQmxvY2tZID4+IDE7ICAKLSAgICBCbG9ja1hNaW4xRnIgPSAoQmxvY2tYIC0gMSkgPj4gMTsgIAotICAgIEJsb2NrWU1pbjFGciA9IChCbG9ja1kgLSAxKSA+PiAxOyAgCi0gICAgQmxvY2tYUGx1c09mZkZyID0gQmxvY2tYUGx1c09mZiA+PiAxOwotICAgIAotICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOOwotCi0gICAgUkZyYW1lTCA9IHBSZWZGckFyciBbQmxvY2tZRnJdW0Jsb2NrWE1pbjFGcl07Ci0gICAgUkZyYW1lVSA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hGcl07Ci0gICAgUkZyYW1lVVIgPSBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYUGx1c09mZkZyXTsKLQotICAgIGlmIChSRnJhbWVVUiA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotICAgIHsKLSAgICAgICAgUkZyYW1lVVIgPSBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYTWluMUZyXTsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBQcmVkaWN0aW9uIGlmIG9ubHkgb25lIG9mIHRoZSBuZWlnaGJvcnMgdXNlcyB0aGUgcmVmZXJlbmNlIGZyYW1lCi0gICAgICogd2UgYXJlIGNoZWNraW5nCi0gICAgICovCi0gIAotICAgIGlmIChSRnJhbWVMID09IFJlZkZyYW1lICYmIFJGcmFtZVUgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVVIgIT0gUmVmRnJhbWUpCi0gICAgewotICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7Ci0gICAgfQotICAgIGVsc2UgaWYoUkZyYW1lTCAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVID09IFJlZkZyYW1lICYmIFJGcmFtZVVSICE9IFJlZkZyYW1lKQotICAgIHsKLSAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VOwotICAgIH0KLSAgICBlbHNlIGlmKFJGcmFtZUwgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVSAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVUiA9PSBSZWZGcmFtZSkKLSAgICB7Ci0gICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVVI7Ci0gICAgfQotCi0gICAgLyogRGlyZWN0aW9uYWwgcHJlZGljdGlvbnMgICovCi0gICAgZWxzZSBpZihCbG9ja1NpemV4ID09IDggJiYgQmxvY2tTaXpleSA9PSAxNikKLSAgICB7Ci0gICAgICAgIGlmKEJsb2NrU3RhcnRYID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFJGcmFtZUwgPT0gUmVmRnJhbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9MOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFJGcmFtZVVSID09IFJlZkZyYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZihCbG9ja1NpemV4ID09IDE2ICYmIEJsb2NrU2l6ZXkgPT0gOCkKLSAgICB7Ci0gICAgICAgIGlmKEJsb2NrU3RhcnRZID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFJGcmFtZVUgPT0gUmVmRnJhbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoUkZyYW1lTCA9PSBSZWZGcmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKE1WUHJlZFR5cGUpCi0gICAgewotICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX01FRElBTjoKLSAgICAgICAgaWYgKCEocFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWE1pbjFGcl0gPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB8fCAKLSAgICAgICAgICAgICAgcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWEZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHx8IAotICAgICAgICAgICAgICBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYUGx1c09mZkZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKSkKLSAgICAgICAgewotICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHg7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gCi0gICAgICAgICAgICAgICAgQVJNX1ZDTTRQMTBfTUVESUFOKHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keCwgCi0gICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR4LCAKLSAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR4KTsKLSAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gCi0gICAgICAgICAgICAgICAgQVJNX1ZDTTRQMTBfTUVESUFOKHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keSwgCi0gICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR5LCAKLSAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR5KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX0w6Ci0gICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR4OwotICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfVToKLSAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHg7Ci0gICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR5OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9VUjoKLSAgICAgICAgaWYgKHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keDsKLSAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1ggLSAxXS5keDsKLSAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1ggLSAxXS5keTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0Jsb2NrTW90aW9uU2VhcmNoCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBHZXRzIGJlc3QgTVYgZm9yIHRoZSBjdXJyZW50IGJsb2NrCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCi0gKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKLSAqIFtpbl0gcFNyY1JlZlkgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgotICogW2luXSBuU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCi0gKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCi0gKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCi0gKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAotICogW2luXSBuTGFtZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAotICogW291dF0gcEJlc3RDb3N0ICAtIE1pbmltdW0gY29zdCBmb3IgZW5jb2RpbmcgY3VycmVudCBibG9jayAKLSAqIFtvdXRdIHBCZXN0TVYgICAgLSBNViBjb3JyZXNwb25kaW5nIHRvIGJlc3QgY29zdAotICogW2luXSBCbG9ja1N0YXJ0WCAtIEJsb2NrIHN0YXJ0IFggaW5kZXggaW4gaW50ZWdlciBwZWxzCi0gKiBbaW5dIEJsb2NrU3RhcnRZIC0gQmxvY2sgc3RhcnQgWSBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKLSAqIFtpbl0gQmxvY2tTaXplWCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIEJsb2NrU2l6ZVkgIC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gUmVmRnJhbWUgICAgLSBJbmRleCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciBwcmVkaWN0aW9uCi0gKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBwcmVkaWN0aW9uCi0gKiBbaW5dIHBNVkFyciAgICAgIC0gUG9pbnRlciB0byBNViBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KLSAqIFtpbl0gcE1WUHJlZCAgICAgLSBQb2ludGVyIHRvIE1WIHByZWRpY3RlZCBmcm9tIG5laWdoYm91ciBNVnMKLSAqIFJlbWFya3M6Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0Ci0gKgotICovCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfQmxvY2tNb3Rpb25TZWFyY2goCi0gICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwgCi0gICAgY29uc3QgT01YX1U4KiBwU3JjUmVmWSwgCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwgCi0JY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0JY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICB2b2lkKiBwTUVTcGVjLCAKLQotICAgIE9NWF9TMzIgbkxhbWRhLAotICAgIE9NWF9TMzIqIHBCZXN0Q29zdCwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCi0gICAgCi0gICAgT01YX1UzMiBCbG9ja1N0YXJ0WCwgCi0gICAgT01YX1UzMiBCbG9ja1N0YXJ0WSwKLSAgICBPTVhfVTMyIEJsb2NrU2l6ZVgsCi0gICAgT01YX1UzMiBCbG9ja1NpemVZLAotICAgIE9NWF9TMzIgUmVmRnJhbWUsCi0gICAgT01YX1MzMiBwUmVmRnJBcnIgW11bNl0sIAotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFyciBbXVsxMl0sCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQKLSAgICkKLXsKLQotICAgIE9NWFZDTW90aW9uVmVjdG9yICAgTVZDYWxjdWxhdGVkLCBNVkNhbmRpZGF0ZTsKLSAgICBPTVhfUzMyICAgICAgICAgICAgIENvc3Q7Ci0gICAgT01YUmVzdWx0ICAgICAgICAgICBSZXRWYWx1ZTsKLSAgICBPTVhWQ000UDEwTUVQYXJhbXMgICpwTUVQYXJhbXM7ICAgIAotCU9NWFZDTTRQMkNvb3JkaW5hdGUgQ3VyckJsb2NrUG9zOwotCi0gICAgLyogR2V0IFByZWRpY3RlZCBNb3Rpb24gVmVjdG9ycyAqLwotICAgIGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yICgKLSAgICAgICAgQmxvY2tTdGFydFgsIAotICAgICAgICBCbG9ja1N0YXJ0WSwKLSAgICAgICAgQmxvY2tTaXplWCwgCi0gICAgICAgIEJsb2NrU2l6ZVksCi0gICAgICAgIFJlZkZyYW1lLAotICAgICAgICBwUmVmRnJBcnIsICAgCi0gICAgICAgIHBNVkFyciwgICAgICAKLSAgICAgICAgcE1WUHJlZCk7Ci0KLSAgICAvKiBJbml0aWFsaXplIGNhbmRpZGF0ZSBNViAqLwotICAgIE1WQ2FuZGlkYXRlLmR4ID0gMDsKLSAgICBNVkNhbmRpZGF0ZS5keSA9IDA7Ci0gICAgCi0gICAgQ3VyckJsb2NrUG9zLnggPSBwQ3VyclBvaW50UG9zLT54ICsgQmxvY2tTdGFydFg7Ci0gICAgQ3VyckJsb2NrUG9zLnkgPSBwQ3VyclBvaW50UG9zLT55ICsgQmxvY2tTdGFydFk7Ci0KLSAgICAvKiBCbG9jayBNYXRjaCBJbnRlZ2VyICovCi0gICAgUmV0VmFsdWUgPSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCi0gICAgICAgIHBTcmNDdXJyQnVmLCAKLSAgICAgICAgU3JjQ3VyclN0ZXAsIAotICAgICAgICBwU3JjUmVmWSwgCi0gICAgICAgIG5TcmNSZWZTdGVwLCAKLSAgICAgICAgcFJlZlJlY3QsIAotICAgICAgICAmQ3VyckJsb2NrUG9zLCAKLSAgICAgICAgQmxvY2tTaXplWCwgCi0gICAgICAgIEJsb2NrU2l6ZVksIAotICAgICAgICBuTGFtZGEsIAotICAgICAgICBwTVZQcmVkLCAKLSAgICAgICAgJk1WQ2FuZGlkYXRlLCAKLSAgICAgICAgJk1WQ2FsY3VsYXRlZCwgCi0gICAgICAgICZDb3N0LCAKLSAgICAgICAgcE1FU3BlYyk7Ci0gICAgCi0gICAgLyogdXBkYXRlZCBCZXN0TVYqLwotICAgIC8qKnBCZXN0Q29zdCA9IENvc3Q7Ci0gICAgcEJlc3RNVi0+ZHggPSBNVkNhbGN1bGF0ZWQuZHg7Ci0gICAgcEJlc3RNVi0+ZHkgPSBNVkNhbGN1bGF0ZWQuZHk7Ki8KLQotICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKikgcE1FU3BlYzsKLSAgICAKLSAgICAvKiBCbG9jayBNYXRjaCBIYWxmIHBlbCAqLwotICAgIGlmIChwTUVQYXJhbXMtPmhhbGZTZWFyY2hFbmFibGUpCi0gICAgewotICAgICAgICBSZXRWYWx1ZSA9IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmKAotICAgICAgICAgICAgcFNyY0N1cnJCdWYsIAotICAgICAgICAgICAgU3JjQ3VyclN0ZXAsIAotICAgICAgICAgICAgcFNyY1JlZlksIAotICAgICAgICAgICAgblNyY1JlZlN0ZXAsIAotICAgICAgICAgICAgQmxvY2tTaXplWCwgCi0gICAgICAgICAgICBCbG9ja1NpemVZLCAKLSAgICAgICAgICAgIG5MYW1kYSwgCi0gICAgICAgICAgICBwTVZQcmVkLCAKLSAgICAgICAgICAgICZNVkNhbGN1bGF0ZWQsICAgICAgICAvKiBpbnB1dC9vdXRwdXQqLwotICAgICAgICAgICAgJkNvc3QpOwotICAgIH0KLQotICAgIC8qIEJsb2NrIE1hdGNoIFF1YXJ0ZXIgcGVsICovCi0gICAgaWYgKHBNRVBhcmFtcy0+cXVhcnRlclNlYXJjaEVuYWJsZSkKLSAgICB7Ci0gICAgICAgIFJldFZhbHVlID0gb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIoCi0gICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgCi0gICAgICAgICAgICBTcmNDdXJyU3RlcCwgCi0gICAgICAgICAgICBwU3JjUmVmWSwgCi0gICAgICAgICAgICBuU3JjUmVmU3RlcCwgCi0gICAgICAgICAgICBCbG9ja1NpemVYLCAKLSAgICAgICAgICAgIEJsb2NrU2l6ZVksIAotICAgICAgICAgICAgbkxhbWRhLCAKLSAgICAgICAgICAgIHBNVlByZWQsIAotICAgICAgICAgICAgJk1WQ2FsY3VsYXRlZCwgCi0gICAgICAgICAgICAmQ29zdCk7Ci0gICAgfQotCi0gICAgLyogdXBkYXRlZCBCZXN0IENvc3QgYW5kIEJlc3QgTVYgKi8KLSAgICAqcEJlc3RDb3N0ID0gQ29zdDsKLSAgICBwQmVzdE1WLT5keCA9IE1WQ2FsY3VsYXRlZC5keDsKLSAgICBwQmVzdE1WLT5keSA9IE1WQ2FsY3VsYXRlZC5keTsKLQotICAgIC8qCi0gICAgICogU2tpcCBNQiBjb3N0IGNhbGN1bGF0aW9ucyBvZiAxNngxNiBpbnRlciBtb2RlCi0gICAgICovCi0gICAgcmV0dXJuIFJldFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1BhcnRpdGlvbk1FCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBHZXRzIGJlc3QgY29zdCBmb3IgdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCi0gKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKLSAqIFtpbl0gcFNyY1JlZkJ1Zkxpc3QgICAgLSBQb2ludGVyIHRvIExpc3Qgb2YgcmVmIGJ1ZmZlciBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgotICogW2luXSBuU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCi0gKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCi0gKiBbaW5dIFBhcnRXaWR0aCAgIC0gV2lkdGggb2YgY3VycmVudCBwYXJ0aXRpb24KLSAqIFtpbl0gUGFydEhlaWdodCAgLSBIZWlnaHQgb2YgY3VycmVudCBwYXJ0aXRpb24KLSAqIFtpbl0gQmxvY2tXaWR0aCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIEJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gUGFydFN0YXJ0WCAgLSBQYXJ0aXRpb24gc3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKLSAqIFtpbl0gUGFydFN0YXJ0WSAgLSBQYXJ0aXRpb24gc3RhcnQgWSBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKLSAqIFtpbl0gcE1WQXJyICAgICAgLSBQb2ludGVyIHRvIE1WIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgotICogW2luXSBwUmVmRnJBcnIgICAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgcHJlZGljdGlvbgotICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAotICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50ZXIgTUIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQKLSAqCi0gKi8KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCi0gICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCi0JT01YX1MzMiBTcmNSZWZTdGVwLAotCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgdm9pZCogcE1FU3BlYywgCi0KLSAgICBPTVhfUzMyIFBhcnRXaWR0aCwKLSAgICBPTVhfUzMyIFBhcnRIZWlnaHQsCi0gICAgT01YX1MzMiBCbG9ja1dpZHRoLAotICAgIE9NWF9TMzIgQmxvY2tIZWlnaHQsCi0gICAgT01YX1MzMiBQYXJ0U3RhcnRYLCAKLSAgICBPTVhfUzMyIFBhcnRTdGFydFksCi0KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZBcnIgW11bMTJdLAotICAgIE9NWF9TMzIgcFJlZkZyQXJyIFtdWzZdLAotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRBcnIgW11bNF0sCi0KLSAgICBPTVhfUzMyIExhbWJkYSwKLSAgICBPTVhfUzMyICpwQ29zdAotKQotewotICAgIE9NWF9VMzIgICAgIHgsIHksIGksIGosIHJlZiwgT2ZmWCwgT2ZmWSwgT2ZmU3JjLCBPZmZSZWY7Ci0gICAgT01YX1MzMiAgICAgQmxvY2tDb3N0LCBQYXJ0aXRpb25Db3N0LCBCZXN0Q29zdDsKLSAgICBPTVhfUzMyICAgICBCZXN0UmVmRnJhbWU9MDsKLSAgICBPTVhWQ01vdGlvblZlY3RvciAgIEJlc3RNViBbNF1bNF07Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgICBCZXN0TVZQcmVkIFs0XVs0XTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciAgIE1WUHJlZDsKLSAgICBPTVhWQ01vdGlvblZlY3RvciAgIERzdE1WOwotCi0gICAgQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKLSAgICAKLSAgICBmb3IgKHJlZiA9IDA7IHJlZiA8IEFSTV9WQ000UDEwX01BWF9GUkFNRVM7IHJlZisrKQotICAgIHsKLSAgICAgICAgaWYgKHBTcmNSZWZCdWZMaXN0IFtyZWZdID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgCS8qIE5vIHJlZmVyZW5jZSBmcmFtZSwgY29udGludWUgKi8KLSAgICAgICAgCWNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFydGl0aW9uQ29zdCA9IDA7Ci0gICAgICAgIAotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgUGFydEhlaWdodDsgeSArPSBCbG9ja0hlaWdodCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IFBhcnRXaWR0aDsgeCArPSBCbG9ja1dpZHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCU9mZlNyYyA9IFNyY0N1cnJTdGVwICogKFBhcnRTdGFydFkgKyB5KSArIFBhcnRTdGFydFggKyB4OwotICAgICAgICAgICAgCU9mZlJlZiA9IFNyY1JlZlN0ZXAgKiAoUGFydFN0YXJ0WSArIHkpICsgUGFydFN0YXJ0WCArIHg7Ci0gICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9CbG9ja01vdGlvblNlYXJjaCAoCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmICsgT2ZmU3JjLCAKLSAgICAgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsIAotICAgICAgICAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCBbcmVmXSArIE9mZlJlZiwgCi0gICAgICAgICAgICAgICAgICAgIFNyY1JlZlN0ZXAsIAotICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICAgICAgcE1FU3BlYywgCi0KLSAgICAgICAgICAgICAgICAgICAgTGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAmQmxvY2tDb3N0LCAKLSAgICAgICAgICAgICAgICAgICAgJkRzdE1WLAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeCArIFBhcnRTdGFydFgsIAotICAgICAgICAgICAgICAgICAgICB5ICsgUGFydFN0YXJ0WSwKLSAgICAgICAgICAgICAgICAgICAgQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgcFJlZkZyQXJyLCAKLSAgICAgICAgICAgICAgICAgICAgcE1WQXJyLAotICAgICAgICAgICAgICAgICAgICAmTVZQcmVkKTsKLQotICAgICAgICAgICAgICAgIFBhcnRpdGlvbkNvc3QgKz0gQmxvY2tDb3N0OwotCQkJCQotCQkJCU9mZlggPSAoUGFydFN0YXJ0WCArIHgpID4+IDI7Ci0JCQkJT2ZmWSA9IChQYXJ0U3RhcnRZICsgeSkgPj4gMjsKLQkJCQkKLQkgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDIpOyBqKyspCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMik7IGkrKykKLQkgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHggPSBEc3RNVi5keDsKLQkgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR5ID0gRHN0TVYuZHk7Ci0JICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR4ID0gTVZQcmVkLmR4OwotCSAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keSA9IE1WUHJlZC5keTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQotCQkJCXBSZWZGckFyciBbMiArIChPZmZZID4+IDEpXVsyICsgKE9mZlggPj4gMSldID0gcmVmOwotCSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMyk7IGorKykKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAzKTsgaSsrKQotCSAgICAgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICBwUmVmRnJBcnIgWzIgKyAoT2ZmWSA+PiAxKSArIGpdWzIgKyAoT2ZmWCA+PiAxKSArIGldID0gcmVmOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCQkvKgotCQkgKiBJZiBQYXJ0aXRpb25Db3N0IGlzIGxlc3MgZm9yIHRoaXMgcmVmZXJlbmNlIGZyYW1lLCBtb3Rpb24gdmVjdG9ycyBuZWVkcyB0byBiZSBiYWNrZWR1cAotCQkgKi8KLSAgICAgICAgaWYgKFBhcnRpdGlvbkNvc3QgPD0gQmVzdENvc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJlc3RDb3N0ID0gUGFydGl0aW9uQ29zdDsgICAgICAgICAgICAKLSAgICAgICAgICAgIEJlc3RSZWZGcmFtZSA9IHJlZjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IChQYXJ0SGVpZ2h0L0Jsb2NrSGVpZ2h0KTsgeSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAoUGFydFdpZHRoL0Jsb2NrV2lkdGgpOyB4KyspCi0gICAgICAgICAgICAgICAgewotCQkJCQlPZmZYID0gKFBhcnRTdGFydFggKyB4ICogQmxvY2tXaWR0aCkgPj4gMjsKLQkJCQkJT2ZmWSA9IChQYXJ0U3RhcnRZICsgeSAqIEJsb2NrSGVpZ2h0KSA+PiAyOwotCQkJCQotICAgICAgICAgICAgICAgICAgICBCZXN0TVZbeV1beF0uZHggPSBwTVZBcnIgWzQgKyBPZmZZXVs0ICsgT2ZmWF0uZHg7Ci0gICAgICAgICAgICAgICAgICAgIEJlc3RNVlt5XVt4XS5keSA9IHBNVkFyciBbNCArIE9mZlldWzQgKyBPZmZYXS5keTsKLSAgICAgICAgICAgICAgICAgICAgQmVzdE1WUHJlZFt5XVt4XS5keCA9IHBNVlByZWRBcnIgW09mZlldW09mZlhdLmR4OwotICAgICAgICAgICAgICAgICAgICBCZXN0TVZQcmVkW3ldW3hdLmR5ID0gcE1WUHJlZEFyciBbT2ZmWV1bT2ZmWF0uZHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQkvKgotCSAqIENvcHkgYmFjayBiZXN0IHJlZmVyZW5jZSBmcmFtZSwgbW90aW9uIHZlY3RvcnMgYW5kIGNvc3QuCi0JICovCi0gICAgZm9yICh5ID0gMDsgeSA8IChQYXJ0SGVpZ2h0L0Jsb2NrSGVpZ2h0KTsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IChQYXJ0V2lkdGgvQmxvY2tXaWR0aCk7IHgrKykKLSAgICAgICAgewotCQkJT2ZmWCA9IChQYXJ0U3RhcnRYICsgeCAqIEJsb2NrV2lkdGgpID4+IDI7Ci0JCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5ICogQmxvY2tIZWlnaHQpID4+IDI7ICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMik7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMik7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR4ID0gQmVzdE1WW3ldW3hdLmR4OwotICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keSA9IEJlc3RNVlt5XVt4XS5keTsKLSAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keCA9IEJlc3RNVlByZWRbeV1beF0uZHg7Ci0gICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHkgPSBCZXN0TVZQcmVkW3ldW3hdLmR5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAzKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAzKTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLQkJICAgICAgICAgICAgcFJlZkZyQXJyIFsyICsgKE9mZlkgPj4gMSkgKyBqXVsyICsgKE9mZlggPj4gMSkgKyBpXSA9IEJlc3RSZWZGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQkqcENvc3QgPSBCZXN0Q29zdDsKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludHJhMTZ4MTZFc3RpbWF0aW9uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgSU5URVIgTUIgdHlwZSBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIHN0cmF0ZWd5IGZyb20gCi0gKiB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIElTTy9JRUMgMTQ0OTYtMTAuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAotICogW2luXSBwU3JjUmVjQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWNvbnN0cnVjdGVkIE1CIAotICogW2luXSBTcmNSZWNTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVjQnVmIAotICogW2luXSBuTUJQb3NYICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBYIGF4aXMKLSAqIFtpbl0gbk1CUG9zWSAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWSBheGlzCi0gKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCi0gKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAotICogW2luXSBwTUJJbnRyYSAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgotICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKLSAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICBGb2xsb3dpbmcgbWVtYmVyIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgotICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAotICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50cmExNngxNgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIE5vIEVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKgotICovCi0KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRyYTE2eDE2RXN0aW1hdGlvbigKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4KiBwU3JjUmVjQnVmLCAgIAotICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKLQljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAotICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0gICAgT01YX1UzMiAqcENvc3QpCi17Ci0gICAgT01YX1U4ICAgICAgUHJlZEJ1ZiBbMTYqMTYgKyAxNl07Ci0gICAgT01YX1U4ICAgICAgKnBQcmVkOwotICAgIE9NWF9TMzIgICAgIG1vZGU7Ci0gICAgT01YX1MzMiAgICAgQ29zdDsKLSAgICBPTVhfUzMyICAgICBhdmFpbGFiaWxpdHkgPSAwOwotICAgIE9NWFJlc3VsdCAgIFJldDsKLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlICAgIEludHJhTW9kZTE2eDE2IFs0XSA9IAotICAgICAgICB7T01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IsIAotICAgICAgICBPTVhfVkNfMTZYMTZfREMsIE9NWF9WQ18xNlgxNl9QTEFORX07ICAgICAgICAKLSAgICBPTVhfVTMyICAgICBNQlBvc1ggPSBwQ3VyclBvaW50UG9zLT54ID4+IDQ7ICAgICAgICAKLSAgICBPTVhfVTMyICAgICBNQlBvc1kgPSBwQ3VyclBvaW50UG9zLT55ID4+IDQ7ICAgICAgICAKLQotCXBQcmVkID0gYXJtQWxpZ25UbzE2Qnl0ZXMoUHJlZEJ1Zik7Ci0gICAgCi0JLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIE1CICovCi0gICAgaWYgKChNQlBvc1ggIT0gMCkgJiYgKHBNQkludHJhIFswXSAhPSAwIHx8IHBNQkludGVyIFswXSAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAgTUIgKi8KLSAgICBpZiAoKE1CUG9zWSAhPSAwKSAmJiAocE1CSW50cmEgWzFdICE9IDAgfHwgcE1CSW50ZXIgWzFdICE9IDApKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAtTEVGVCBNQiAqLwotICAgIGlmICgoTUJQb3NYID4gMCkgJiYgKE1CUG9zWSA+IDApICYmIAotICAgICAgICAocE1CSW50cmEgWzJdICE9IDAgfHwgcE1CSW50ZXIgWzJdICE9IDApKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCi0gICAgfQotCi0gICAgKnBDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDQ7IG1vZGUrKykKLSAgICB7Ci0gICAgICAgIFJldCA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAotICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgLSAxLCAKLSAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCwgCi0gICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAgLSAxLCAKLSAgICAgICAgICAgICAgICBwUHJlZCwgCi0gICAgICAgICAgICAgICAgU3JjUmVjU3RlcCwgCi0gICAgICAgICAgICAgICAgMTYsIAotICAgICAgICAgICAgICAgIEludHJhTW9kZTE2eDE2IFttb2RlXSwgCi0gICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgaWYgKFJldCA9PSBPTVhfU3RzX05vRXJyKSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgYXJtVkNDT01NX1NBRCggICAgCi0gICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgICAgICAgICAgcFByZWQsCi0gICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgJkNvc3QsCi0gICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgMTYpOwotICAgICAgICAgICAgaWYgKENvc3QgPCAqcENvc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBDb3N0ID0gQ29zdDsKLSAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5JbnRyYTE2eDE2UHJlZE1vZGUgPSBJbnRyYU1vZGUxNngxNiBbbW9kZV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRyYTR4NEVzdGltYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJbnRyYSA0eDQgTUIgdHlwZSBhbmQgc2VsZWN0cwotICogdGhlIGJlc3Qgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAotICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCi0gKiBbaW5dIHBTcmNSZWNCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlY29uc3RydWN0ZWQgTUIgCi0gKiBbaW5dIFNyY1JlY1N0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWNCdWYgCi0gKiBbaW5dIG5NQlBvc1ggICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFggYXhpcwotICogW2luXSBuTUJQb3NZICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBZIGF4aXMKLSAqIFtpbl0gcE1CSW50cmEgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKLSAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCi0gKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgRm9sbG93aW5nIG1lbWJlciBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKLSAqIFtvdXRdIHBDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludHJhNHg0Ci0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqCi0gKi8KLQotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbigKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4KiBwU3JjUmVjQnVmLCAgIAotICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLSAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9VMzIgKnBDb3N0KQotewotICAgIE9NWF9TMzIgICAgIHgsIHksIEJsb2NrNHg0LCBCbG9jazh4ODsKLSAgICBPTVhfUzMyICAgICBDb3N0OwotCi0gICAgLyoKLSAgICAgKiBQcmVkSW50cmE0eDRNb2RlIHdpbGwgc3RvcmUgcHJlZGljdGlvbiBtb2RlcyBvZiA0eDQgYmxvY2tzLiAKLSAgICAgKiBNb2RlcyBmb3IgY3VycmVudCBNQiBzdGFydHMgYXQgaW5kZXggWzFdWzFdLiAgIAotICAgICAqIE1vZGVzIG9mIG5pZ2hib3VyaW5nIE1CJ3Mgd2lsbCBiZSBhcyBzaG93biBiZWxvdwotICAgICAqIEEgdmFsdWUgb2YgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyBmb3IgYW55IGJsb2NrIGluIHRoaXMgYXJyYXkgbWVhbnMgCi0gICAgICogdGhhdCBibG9jayBpcyBub3QgYXZhaWxhYmxlIGZvciBwcmVkaWN0aW9uLgotICAgICAqCi0gICAgICogYzMgYjAgYjEgYjIgYjMgZDAgZDEgZDIgZDMKLSAgICAgKiBhMCB4eCB4eCB4eCB4eCAtICAtICAtICAtCi0gICAgICogYTEgeHggeHggeHggeHggLSAgLSAgLSAgLQotICAgICAqIGEyIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KLSAgICAgKiBhMyB4eCB4eCB4eCB4eCAtICAtICAtICAtCi0gICAgICoKLSAgICAgKi8KLSAgICBPTVhfUzMyICAgICBQcmVkSW50cmE0eDRNb2RlIFs1XVs5XTsKLQotICAgIC8qCi0gICAgICogcFNyY1kgc3RvcmVzIHJlLWNvbnN0cnVzdGVkIHNvdXJjZSBhcnJheSBvZiBzaXplIDNNQiBYIDJNQiBhcyBiZWxvdwotICAgICAqCi0gICAgICogTUIxMSBNQjEyIE1CMTMgCi0gICAgICogTUIyMSBNQjIyIE1CMjMKLSAgICAgKgotICAgICAqIFRoaXMgYXJyYXkgd2lsbCBiZSB1c2VkIGZvciBsb2NhbCByZWNvbnN0cnVjdGlvbiBvZiA0eDQgYmxvY2tzIAotICAgICAqIHdpdGggYmVzdCBwcmVkaWN0aW9uIG1vZGUgd2l0aGluIGFuIE1CCi0gICAgICovICAgIAotICAgIE9NWF9VOCAgICAgIHBTcmNZIFsoMTYqMykqKDE2KjIpXTsKLSAgICBPTVhfUzMyICAgICBTdGVwU3JjWTsKLSAgICAKLSAgICAvKiBpbml0ICovCi0gICAgKnBDb3N0ID0gMDsKLQotICAgIGZvciAoeSA9IDA7IHkgPCA1OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgOTsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAqIEluaXRpYWxpemUgd2l0aCB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLLCB0byBtZWFuIHRoaXMgCi0gICAgICAgICAgICAgKiA0eDQgYmxvY2sgaXMgbm90IGF2YWlsYWJsZSAKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUmVwbGFjZSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHZhbHVlIHdpdGggYXZhaWxhYmxlIE1CcyB2YWx1ZXMqLwotICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCi0gICAgewotICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYjAsIGIxLCBiMiwgYjMgKi8KLSAgICAgICAgaWYgKHBNQkludHJhWzFdICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyAxXSA9IAotICAgICAgICAgICAgICAgIHBNQkludHJhWzFdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogU3RvcmUgdmFsdWVzIG9mIGQwLCBkMSwgZDIsIGQzICovCi0gICAgICAgIGlmIChwTUJJbnRyYVszXSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgNV0gPSAKLSAgICAgICAgICAgICAgICBwTUJJbnRyYVszXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogU3RvcmUgdmFsdWVzIG9mIGMzICovCi0gICAgaWYgKHBNQkludHJhWzJdICE9IE5VTEwpCi0gICAgewotICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFswXVswXSA9IHBNQkludHJhWzJdLT5wSW50cmE0eDRQcmVkTW9kZVsxNV07Ci0gICAgfQotICAgIAotICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCi0gICAgewotICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYTAsIGExLCBhMiwgYTMgKi8KLSAgICAgICAgaWYgKHBNQkludHJhWzBdICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgW3kgKyAxXVswXSA9IAotICAgICAgICAgICAgICAgIHBNQkludHJhWzBdLT5wSW50cmE0eDRQcmVkTW9kZVt5KjQgKyAzXTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIFByZWQgbW9kZSBhcnJheSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yCi0gICAgICogcHJlZGljdGlvbiBvZiBJbnRyYTR4NCBtb2Rlcy4KLSAgICAgKi8KLSAgICAKLSAgICBTdGVwU3JjWSA9IDE2ICogMzsKLSAgICBmb3IgKHkgPSAwOyB5IDwgKDE2ICogMik7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAoMTYgKiAzKTsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3JjWSBbU3RlcFNyY1kgKiB5ICsgeF0gPSAKLSAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIFtTcmNSZWNTdGVwICogKHkgLSAxNikgKyB4IC0gMTZdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIGZvciBlYWNoIDh4OCBibG9jayAqLwotICAgIGZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCi0gICAgewotICAgICAgICAvKiBmb3IgZWFjaCA0eDQgYmxvY2sgaW5zaWRlIDh4OCBibG9jayAqLwotICAgICAgICBmb3IgKEJsb2NrNHg0ID0gMDsgQmxvY2s0eDQgPCA0OyBCbG9jazR4NCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcm1WQ000UDEwX01vZGU0eDREZWNpc2lvbiAoCi0gICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCi0gICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3VyciwKLSAgICAgICAgICAgICAgICBCbG9jazh4OCwgCi0gICAgICAgICAgICAgICAgQmxvY2s0eDQsCi0gICAgICAgICAgICAgICAgcFNyY1kgKyAxNiAqIFN0ZXBTcmNZICsgMTYsCi0gICAgICAgICAgICAgICAgU3RlcFNyY1ksCi0gICAgICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSwgCi0gICAgICAgICAgICAgICAgJkNvc3QpOwotCi0gICAgICAgICAgICAqcENvc3QgKz0gQ29zdDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlck1FTUIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJTlRFUiBNQiB0eXBlIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gc3RyYXRlZ3kgZnJvbSAKLSAqIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgSVNPL0lFQyAxNDQ5Ni0xMC4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAotICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCi0gKiBbaW5dIHBTcmNSZWZCdWZMaXN0ICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWZlcmVuY2UgTUIKLSAqIFtpbl0gU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCi0gKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCi0gKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCi0gKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAotICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIEZvbGxvd2luZyBtZW1iZXIgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCi0gKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0Ci0gKiBbb3V0XSBwRHN0Q29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRlciBNQgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIE5vIEVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKgotICovCi0KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlck1FTUIoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgCi0JT01YX1MzMiBTcmNDdXJyU3RlcCwgCi0JY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKLQlPTVhfUzMyIFNyY1JlZlN0ZXAsCi0JY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0JY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLQlPTVhfVTMyIExhbWJkYSwKLQl2b2lkICpwTUVTcGVjLAotCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLCAKLSAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCi0JT01YX1UzMiAqcERzdENvc3QpCi17Ci0gICAgT01YX1MzMiAgICAgaSwgaiwgeCwgeSwgbW9kZTsKLSAgICBPTVhfVTMyICAgICBCbG9jazh4OCwgWFBlck1CLCBZUGVyTUIsIEJsb2NrMngsIEJsb2NrMnk7Ci0gICAgT01YX1MzMiAgICAgUGFydFN0YXJ0WCA9IDAsIFBhcnRTdGFydFkgPSAwOwotICAgIE9NWF9TMzIgICAgIFBhcnRXaWR0aCA9IDgsIFBhcnRIZWlnaHQgPSA4LCBCbG9ja1dpZHRoID0gNCwgQmxvY2tIZWlnaHQgPSA0OwotICAgIGNvbnN0IE9NWF9VMzIgICAgIEJsa1N6IFs0XVsyXSA9IHt7NCw0fSwgezQsOH0sIHs4LDR9fTsKLSAgICBjb25zdCBPTVhfVTMyICAgICBQYXJ0U3ogWzRdWzJdID0ge3s4LDh9LCB7OCwxNn0sIHsxNiw4fSwgezE2LDE2fX07Ci0gICAgY29uc3QgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlICAgICAKLSAgICAgICAgICAgICAgICBNb2RlU3ViTUJUeXBlNHg0IFtdID0ge09NWF9WQ19TVUJfUF80eDQsIE9NWF9WQ19TVUJfUF80eDgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1NVQl9QXzh4NCwgT01YX1ZDX1NVQl9QXzh4OH07Ci0gICAgY29uc3QgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlCi0gICAgICAgICAgICAgICAgTW9kZU1CVHlwZSBbXSA9IHtPTVhfVkNfUF84eDgsIE9NWF9WQ19QXzh4MTYsIE9NWF9WQ19QXzE2eDgsIE9NWF9WQ19QXzE2eDE2fTsKLSAgICAKLSAgICBPTVhWQ000UDEwTUVQYXJhbXMgICpwTUJPcHRpb25zOwotICAgIC8qCi0gICAgICogUmVmRnJBcnIgYW5kICBNVkFyciB3aWxsIGJlIHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlIG9mIFJlZmVyZW5jZSBmcmFtZSBpbmRleCBhbmQgTVZzCi0gICAgICogSXQgd2lsbCBzdG9yZSBSZWZJbmRleCBhbmQgTVZzIG9mIDYgTUJzIGFzIHNob3duIGJlbG93Ci0gICAgICogCi0gICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKLSAgICAgKiAgICAgfFRwLUx0IHxUb3AgICB8VHAtUiAgfAotICAgICAqICAgICB8IE1CICAgfCBNQiAgIHwgTUIgICB8Ci0gICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKLSAgICAgKiAgICAgfExlZnQgIHwgQ3VyciB8ICAgICAgfAotICAgICAqICAgICB8IE1CICAgfCBNQiAgIHwgICAgICB8Ci0gICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKLSAgICAgKi8KLSAgICBPTVhfUzMyICAgICBSZWZGckFyciBbNF1bNl07IAotICAgIE9NWFZDTW90aW9uVmVjdG9yIE1WQXJyIFs4XVsxMl07Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgTVZQcmVkQXJyIFs0XVs0XTsKLSAgICAKLSAgICAvKgotICAgICAqIEluZGV4VG9Mb2Mgd2lsbCB0cmFuc2xhdGUgcE1CSW50ZXIgaW5kZXggaW50byBzcGFjaWFsIGFycmFuZ2VtZW50IG9mIE1CcwotICAgICAqLwotICAgIE9NWF9TMzIgICAgIEluZGV4VG9Mb2MgW10gPSB7MiwxLDMsMH07Ci0gICAgT01YX1UzMiAgICAgcGFydCwgTWF4UGFydDsKLSAgICBPTVhfUzMyICAgICBDb3N0LCBNb3Rpb25Db3N0OHg4IFs0XSwgTUJDb3N0LCBCZXN0Q29zdDsKLQotICAgIC8qCi0gICAgICogVXBkYXRlIG5laWdoYm91cmluZyBNViBhcnJheSBhbmQgUmVmIGZyYW1lIGFycmF5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IKLSAgICAgKiBwcmVkaWN0aW9uIG9mIE1WcyBhbmQgUmVmIGZyYW1lcy4KLSAgICAgKi8KLQotICAgIC8qIFNldCBjb3N0IHRvIGEgaGlnaCB2YWx1ZSAqLwotICAgIENvc3QgPSBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOwotICAgIAotICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTI7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaSA9IDMgKiAoeSA+PiAyKSArICh4ID4+IDIpOwotICAgICAgICAgICAgaWYgKCh5IDwgNCB8fCB4IDwgNCkgJiYgKHBNQkludGVyW0luZGV4VG9Mb2NbaV1dICE9IE5VTEwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keCA9IAotICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cE1WMFt5ICUgNF1beCAlIDRdLmR4OwotICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keSA9IAotICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cE1WMFt5ICUgNF1beCAlIDRdLmR5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keCA9IDA7Ci0gICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR5ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gICAgCi0KLSAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDY7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaSA9IDMgKiAoeSA+PiAxKSArICh4ID4+IDEpOwotICAgICAgICAgICAgaWYgKCh5IDwgMiB8fCB4IDwgMikgJiYgKHBNQkludGVyW0luZGV4VG9Mb2NbaV1dICE9IE5VTEwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZkZyQXJyIFt5XVt4XSA9IAotICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cFJlZkwwSWR4IFsoeSAlIDIpICogMiArICh4ICUgMildOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZkZyQXJyIFt5XVt4XSA9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ICAgIAotCi0gICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1WUHJlZEFyciBbeV1beF0uZHggPSAwOwotICAgICAgICAgICAgTVZQcmVkQXJyIFt5XVt4XS5keSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBNb3Rpb24gRXN0aW1hdGlvbiBmb3IgOHg4IE1CIFBhcnRpdGlvbiAKLSAgICAgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBNb3Rpb25Db3N0OHg4IFtpXSA9IDA7Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgcE1CT3B0aW9ucyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKikgcE1FU3BlYzsKLSAgICAKLSAgICBpZiAocE1CT3B0aW9ucy0+YmxvY2tTcGxpdEVuYWJsZTh4OCA9PSAxICYmIAotICAgICAgICBwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlNHg0ID09IDEpCi0gICAgewotICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfUF84eDg7Ci0KLSAgICAgICAgUGFydFdpZHRoID0gUGFydFN6IFswXVswXTsKLSAgICAgICAgUGFydEhlaWdodCA9IFBhcnRTeiBbMF1bMV07Ci0gICAgICAgIAotICAgICAgICAvKiBGb3IgZWFjaCA4eDggcGFydGl0aW9ucyAqLwotICAgICAgICBmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYXJ0U3RhcnRYID0gKEJsb2NrOHg4ICUgMikgPDwgMzsKLSAgICAgICAgICAgIFBhcnRTdGFydFkgPSAoQmxvY2s4eDggLyAyKSA8PCAzOwotCi0gICAgICAgICAgICBCbG9jazJ4ID0gKEJsb2NrOHg4ICYgMSkgPDwgMTsKLSAgICAgICAgICAgIEJsb2NrMnkgPSAoQmxvY2s4eDggPj4gMSkgPDwgMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKLSAgICAgICAgICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCAzOyBtb2RlKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmxvY2tXaWR0aCA9IEJsa1N6IFttb2RlXVswXTsKLSAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCA9IEJsa1N6IFttb2RlXVsxXTsKLQotICAgICAgICAgICAgICAgIGFybVZDTTRQMTBfUGFydGl0aW9uTUUgKAotICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKLSAgICAgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCAgIAotICAgICAgICAgICAgICAgICAgICBTcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICAgICAgcE1FU3BlYywKLQotICAgICAgICAgICAgICAgICAgICBQYXJ0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIFBhcnRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIEJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBQYXJ0U3RhcnRYLAotICAgICAgICAgICAgICAgICAgICBQYXJ0U3RhcnRZLAotCi0gICAgICAgICAgICAgICAgICAgIE1WQXJyLAotICAgICAgICAgICAgICAgICAgICBSZWZGckFyciwKLSAgICAgICAgICAgICAgICAgICAgTVZQcmVkQXJyLAotCi0gICAgICAgICAgICAgICAgICAgIExhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgJkNvc3QpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoQ29zdCA8PSBCZXN0Q29zdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBjb3N0ICovCi0gICAgICAgICAgICAgICAgICAgIEJlc3RDb3N0ID0gQ29zdDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBNQkN1cnIgc3RydWN0ICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnN1Yk1CVHlwZSBbQmxvY2s4eDhdID0gTW9kZVN1Yk1CVHlwZTR4NCBbbW9kZV07Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wUmVmTDBJZHggW0Jsb2NrOHg4XSA9IFJlZkZyQXJyIFsyICsgKFBhcnRTdGFydFkgPj4gMyldWzIgKyAoUGFydFN0YXJ0WCA+PiAzKV07Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBNVjAgYW5kIHBNVlByZWQgb2YgTUJDdXJyIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVkFyciBbNCArIEJsb2NrMnkgKyBqXVs0ICsgQmxvY2syeCArIGldLmR4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVkFyciBbNCArIEJsb2NrMnkgKyBqXVs0ICsgQmxvY2syeCArIGldLmR5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlByZWRBcnIgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WUHJlZEFyciBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogVXBkYXRlIGNvc3QgKi8KLSAgICAgICAgICAgIE1vdGlvbkNvc3Q4eDggW0Jsb2NrOHg4XSA9IEJlc3RDb3N0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKiBDb3N0IGZvciBtYlR5cGUgT01YX1ZDX1BfOHg4ICovCi0gICAgICAgIEJlc3RDb3N0ID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQmVzdENvc3QgKz0gTW90aW9uQ29zdDh4OCBbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2V0IHN1YiBNQiB0eXBlIHRvIDh4OCAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5zdWJNQlR5cGUgW2ldID0gT01YX1ZDX1NVQl9QXzh4ODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogTW90aW9uIEVzdGltYXRpb24gZm9yIDh4OCwgOHgxNiwgMTZ4OCBhbmQgMTZ4MTYgTUIgUGFydGl0aW9uCi0gICAgICogSWYgcE1CT3B0aW9ucy0+Yjh4OEJsb2NrU3BsaXRFbmFibGUgaXMgMCwgZG8gb25seSAxNngxNiBNRSAobW9kZSAzKQotICAgICAqLwotICAgIGZvciAobW9kZSA9IChwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlOHg4ID09IDEgPyAwIDogMyk7IG1vZGUgPCA0OyBtb2RlKyspCi0gICAgewotICAgICAgICBCbG9ja1dpZHRoID0gUGFydFdpZHRoID0gUGFydFN6IFttb2RlXVswXTsKLSAgICAgICAgQmxvY2tIZWlnaHQgPSBQYXJ0SGVpZ2h0ID0gUGFydFN6IFttb2RlXVsxXTsKLSAgICAgICAgCi0gICAgICAgIFhQZXJNQiA9IDE2IC8gUGFydFdpZHRoOwotICAgICAgICBZUGVyTUIgPSAxNiAvIFBhcnRIZWlnaHQ7Ci0gICAgICAgIE1heFBhcnQgPSBYUGVyTUIgKiBZUGVyTUI7Ci0gICAgICAgIAotICAgICAgICBNQkNvc3QgPSAwOwotICAgICAgICAKLSAgICAgICAgLyogcGFydCBzaXplIDQsIDIsIDIgYW5kIDEgY29ycmVzcG9uZGluZyB0byA4eDgsIDh4MTYsIDE2eDggYW5kIDE2eDE2IE1CICovCi0gICAgICAgIGZvciAocGFydCA9IDA7IHBhcnQgPCBNYXhQYXJ0OyBwYXJ0KyspCi0gICAgICAgIHsKLSAgICAgICAgCVBhcnRTdGFydFggPSAocGFydCAlIFhQZXJNQikgKiBQYXJ0V2lkdGg7Ci0gICAgICAgIAlQYXJ0U3RhcnRZID0gKHBhcnQgLyBYUGVyTUIpICogUGFydEhlaWdodDsKLSAgICAgICAgCQotICAgICAgICAgICAgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCi0gICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCi0gICAgICAgICAgICAgICAgU3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgIHBNRVNwZWMsCi0KLSAgICAgICAgICAgICAgICBQYXJ0V2lkdGgsCi0gICAgICAgICAgICAgICAgUGFydEhlaWdodCwKLSAgICAgICAgICAgICAgICBCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0LAotICAgICAgICAgICAgICAgIFBhcnRTdGFydFgsCi0gICAgICAgICAgICAgICAgUGFydFN0YXJ0WSwKLQotICAgICAgICAgICAgICAgIE1WQXJyLAotICAgICAgICAgICAgICAgIFJlZkZyQXJyLAotICAgICAgICAgICAgICAgIE1WUHJlZEFyciwKLQotICAgICAgICAgICAgICAgIExhbWJkYSwKLSAgICAgICAgICAgICAgICAmQ29zdCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTUJDb3N0ICs9IENvc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTUJDb3N0IDw9IEJlc3RDb3N0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY29zdCAqLwotICAgICAgICAgICAgQmVzdENvc3QgPSBNQkNvc3Q7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBtYlR5cGUgb2YgTUJDdXJyIHN0cnVjdCAqLwotICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gTW9kZU1CVHlwZSBbbW9kZV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBwTVYwIGFuZCBwTVZQcmVkIG9mIE1CQ3VyciBzdHJ1Y3QgKi8KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW2pdW2ldLmR4ID0gTVZBcnIgWzQral1bNCtpXS5keDsKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbal1baV0uZHkgPSBNVkFyciBbNCtqXVs0K2ldLmR5OwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtqXVtpXS5keCA9IE1WUHJlZEFyciBbal1baV0uZHg7Ci0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW2pdW2ldLmR5ID0gTVZQcmVkQXJyIFtqXVtpXS5keTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wUmVmTDBJZHggW2oqMitpXSA9IFJlZkZyQXJyIFsyK2pdWzIraV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgQmVzdCBDb3N0ICovCi0gICAgKnBEc3RDb3N0ID0gQmVzdENvc3Q7Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAotICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAotICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAotICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCi0gKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCi0gKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKLSAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gCi0gKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVEVSLiBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRlclsxXSAKLSAqICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gCi0gKiAgICAgICAgICAgIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgCi0gKiAgICAgICAgICAgIGluZm9ybWF0aW9uIAotICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRSQS4gcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50cmFbMV0gCi0gKiAgICAgICAgICAgIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIAotICogICAgICAgICAgICB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIAotICogICAgICAgICAgICBpbmZvcm1hdGlvbiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKLSAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAotICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAotICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogTWJUeXBlIAotICogICAgICAgICAgICBzdWJNQlR5cGVbNF0gcE1WMFs0XVs0XSBwTVZQcmVkWzRdWzRdIHBSZWZMMElkeFs0XSAKLSAqICAgICAgICAgICAgSW50cmExNngxNlByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKLSAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAotICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotIAotT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CKCAgICAgICAgICAgICAgICAgICAgCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JT01YX1MzMiBTcmNDdXJyU3RlcCwgCi0JY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKLQlPTVhfUzMyIFNyY1JlZlN0ZXAsCi0JY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLCAKLQlPTVhfUzMyIFNyY1JlY1N0ZXAsCi0JY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0JY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLQlPTVhfVTMyIExhbWJkYSwKLQl2b2lkICpwTUVTcGVjLAotCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLCAKLQljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLSAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotCU9NWF9JTlQgKnBEc3RDb3N0LAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRCkKLXsKLSAgICBPTVhfVTMyICAgICBDb3N0LCBpLCBJbnRyYUZsYWcgPSAxOwotICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNRVBhcmFtczsgCi0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmTGlzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVjQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocE1FU3BlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwTUJJbnRlciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwTUJJbnRyYSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TUJDdXJyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKFNyY1JlZlN0ZXAgPD0gMCB8fCBTcmNSZWZTdGVwICYgMTUsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKFNyY1JlY1N0ZXAgPD0gMCB8fCBTcmNSZWNTdGVwICYgMTUsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKFNyY0N1cnJTdGVwIDw9IDAgfHwgU3JjQ3VyclN0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNSZWNCdWYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIGZvciAoaSA9IDA7IGkgPCBBUk1fVkNNNFAxMF9NQVhfRlJBTUVTOyBpKyspCi0gICAgewotICAgICAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmTGlzdCBbaV0gIT0gTlVMTCAmJgotICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjUmVmQnVmTGlzdCBbaV0pLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAgICAgICAgIAotICAgICAgICAvKiBDaGVjayBpZiBjdXJyZW50IE1CIG5lZWRzIElOVEVSIGNvc3QgY2FsY3VsYXRpb25zICovCi0gICAgICAgIGlmIChwU3JjUmVmQnVmTGlzdCBbaV0gIT0gTlVMTCAmJiBJbnRyYUZsYWcgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgSW50cmFGbGFnID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpwRHN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOwotICAgIC8qCi0gICAgICogSW50ZXIgY29zdCBjYWxjdWxhdGlvbnMgCi0gICAgICovCi0KLSAgICAgLyogY2hlY2sgdGhpcyBNQiBjYW4gYmUgSW50ZXIgKi8KLSAgICBpZiAoSW50cmFGbGFnICE9IDEpCi0gICAgewotICAgICAgICAgYXJtVkNNNFAxMF9JbnRlck1FTUIoCi0gICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCi0gICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCi0gICAgICAgICAgICAgU3JjUmVmU3RlcCwKLSAgICAgICAgICAgICBwUmVmUmVjdCwgICAgCi0gICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICBMYW1iZGEsCi0gICAgICAgICAgICAgcE1FU3BlYywKLSAgICAgICAgICAgICBwTUJJbnRlciwKLSAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAotICAgICAgICAgICAgICZDb3N0Ci0gICAgICAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgICpwRHN0Q29zdCA9IENvc3Q7Ci0gICAgfSAgICAgCi0KLSAgICBwTUVQYXJhbXMgPSAoT01YVkNNNFAxME1FUGFyYW1zICopcE1FU3BlYzsKLSAgICAKLSAgICBpZiAocE1FUGFyYW1zLT5pbnRyYUVuYWJsZTR4NCA9PSAxKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSW50cmEgNHg0IGNvc3QgY2FsY3VsYXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbigKLSAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAotICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgICAgICBwU3JjUmVjQnVmLCAgIAotICAgICAgICAgICAgU3JjUmVjU3RlcCwKLSAgICAgICAgICAgIHBNQkludHJhLAotICAgICAgICAgICAgcFNyY0RzdE1CQ3VyciwKLSAgICAgICAgICAgICZDb3N0Ci0gICAgICAgICAgICApOwotCi0gICAgICAgIGlmIChDb3N0IDw9ICpwRHN0Q29zdCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKLSAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRSQV80eDQ7Ci0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvc3QgZm9yIEludHJhIDE2eDE2IG1vZGUKLSAgICAgKi8KLQotICAgIGFybVZDTTRQMTBfSW50cmExNngxNkVzdGltYXRpb24oCi0gICAgICAgIHBTcmNDdXJyQnVmLCAgIAotICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgcFNyY1JlY0J1ZiwgICAKLSAgICAgICAgU3JjUmVjU3RlcCwKLSAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgcE1CSW50ZXIsCi0gICAgICAgIHBNQkludHJhLAotICAgICAgICBwU3JjRHN0TUJDdXJyLAotICAgICAgICAmQ29zdAotICAgICAgICApOwotCi0gICAgaWYgKENvc3QgPD0gKnBEc3RDb3N0KQotICAgIHsKLSAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVFJBXzE2eDE2OwotICAgIH0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHBEc3RCbG9ja1NBRCB0byBtYXggdmFsdWUKLSAgICAgKi8KLQlhcm1WQ000UDEwX0NhbGN1bGF0ZUJsb2NrU0FEKAlwU3JjRHN0TUJDdXJyLCAKLSAgICAgICAgcFNyY0N1cnJCdWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAlTcmNDdXJyU3RlcCwgCi0gICAgCXBTcmNSZWZCdWZMaXN0LAotICAgIAlTcmNSZWZTdGVwLAotICAgIAlwU3JjUmVjQnVmLCAKLSAgICAJU3JjUmVjU3RlcCwKLSAgICAJcFJlZlJlY3QsCi0gICAgCXBDdXJyUG9pbnRQb3MsCi0gICAgCXBNQkludGVyLCAKLSAgICAJcE1CSW50cmEsCi0gICAgCXBEc3RCbG9ja1NBRCk7Ci0KLQotCXJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1MDc3MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYworKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IENocm9tYSA4eDggaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgdXBwZXIgYmxvY2sgaGFzIHByaW9yaXR5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi1zdGF0aWMgdm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDVXA0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKQotewotICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOwotCi0gICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKLSAgICB7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOwotICAgICAgICB9Ci0gICAgICAgIENvdW50Kys7Ci0gICAgfQotICAgIGlmIChDb3VudD09MCkKLSAgICB7Ci0gICAgICAgIFN1bSA9IDEyODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7Ci0gICAgfQotICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBsZWZ0IGJsb2NrIGhhcyBwcmlvcml0eQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKLSAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKLSAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKLSAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKLSAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKi8KLQotc3RhdGljIHZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ0xlZnQ0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKQotewotICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOwotCi0gICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQotICAgIHsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgIH0KLSAgICAgICAgQ291bnQrKzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOwotICAgICAgICB9Ci0gICAgICAgIENvdW50Kys7Ci0gICAgfQotICAgIGlmIChDb3VudD09MCkKLSAgICB7Ci0gICAgICAgIFN1bSA9IDEyODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7Ci0gICAgfQotICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKLSAqICAgICAgICAgICAgMC4uNykuIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCi0gKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAotICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIE5vdGU6IAotICogICAgICAgICAgICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCi0gKiAgICAgICAgICAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqICAgICAgICAgICAgICAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSAKLSAqICAgICAgICAgICAgICBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotICkKLXsKLSAgICBpbnQgeCwgeSwgU3VtOwotICAgIGludCBILCBWLCBhLCBiLCBjOwotCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDgsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgJSA4KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDgpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNBYm92ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSAgICAgICYmIHBTcmNBYm92ZSAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCApICAgICAgJiYgcFNyY0xlZnQgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSAmJiBwU3JjQWJvdmVMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9WRVJUICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX0hPUiAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDX0NIUk9NQV9QTEFORSwgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotCi0gICAgc3dpdGNoIChwcmVkTW9kZSkKLSAgICB7Ci0gICAgY2FzZSBPTVhfVkNfQ0hST01BX0RDOgotICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KCAgICAgICBwU3JjTGVmdCwgICAgICAgICAgICBwU3JjQWJvdmUsICAgcERzdCwgICAgICAgICAgICAgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENVcDR4NCggICAgIHBTcmNMZWZ0LCAgICAgICAgICAgIHBTcmNBYm92ZSs0LCBwRHN0KzQsICAgICAgICAgICBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ0xlZnQ0eDQoICAgcFNyY0xlZnQrNCpsZWZ0U3RlcCwgcFNyY0Fib3ZlLCAgIHBEc3QrNCpkc3RTdGVwLCAgIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOwotICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KCAgICAgICBwU3JjTGVmdCs0KmxlZnRTdGVwLCBwU3JjQWJvdmUrNCwgcERzdCs0KzQqZHN0U3RlcCwgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfQ0hST01BX0hPUjoKLSAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9WRVJUOgotICAgICAgICBmb3IgKHk9MDsgeTw4OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDg7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNBYm92ZVt4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9QTEFORToKLSAgICAgICAgSCA9IDQqKHBTcmNBYm92ZVs3XSAtIHBTcmNBYm92ZUxlZnRbMF0pOwotICAgICAgICBmb3IgKHg9MjsgeD49MDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBIICs9ICh4KzEpKihwU3JjQWJvdmVbNCt4XSAtIHBTcmNBYm92ZVsyLXhdKTsKLSAgICAgICAgfQotICAgICAgICBWID0gNCoocFNyY0xlZnRbNypsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKLSAgICAgICAgZm9yICh5PTI7IHk+PTA7IHktLSkKLSAgICAgICAgewotICAgICAgICAgICAgViArPSAoeSsxKSoocFNyY0xlZnRbKDQreSkqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbKDIteSkqbGVmdFN0ZXBdKTsKLSAgICAgICAgfQotICAgICAgICBhID0gMTYqKHBTcmNBYm92ZVs3XSArIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdKTsKLSAgICAgICAgYiA9ICgxNypIKzE2KT4+NTsKLSAgICAgICAgYyA9ICgxNypWKzE2KT4+NTsKLSAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3VtID0gKGEgKyBiKih4LTMpICsgYyooeS0zKSArIDE2KT4+NTsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxTdW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDQ1MjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgMTZ4MTYgaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAotICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCi0gKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAotICogICAgICAgICAgICAwLi4xNSkgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKLSAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICogTm90ZTogCi0gKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoCi0gICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwgCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsIAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwgCi0gICAgT01YX1U4KiBwRHN0LCAKLSAgICBPTVhfSU5UIGxlZnRTdGVwLCAKLSAgICBPTVhfSU5UIGRzdFN0ZXAsIAotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgcHJlZE1vZGUsIAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5KQotewotICAgIGludCB4LHksU3VtLENvdW50OwotICAgIGludCBILFYsYSxiLGM7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihkc3RTdGVwIDwgMTYsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgJSAxNikgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigobGVmdFN0ZXAgJSAxNikgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNBYm92ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgICAgICAKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSAgICAgICYmIHBTcmNBYm92ZSAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCApICAgICAgJiYgcFNyY0xlZnQgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSAmJiBwU3JjQWJvdmVMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1ZFUlQgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9IT1IgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCh1bnNpZ25lZClwcmVkTW9kZSA+IE9NWF9WQ18xNlgxNl9QTEFORSwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIHN3aXRjaCAocHJlZE1vZGUpCi0gICAgewotICAgIGNhc2UgT01YX1ZDXzE2WDE2X1ZFUlQ6Ci0gICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjQWJvdmVbeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ18xNlgxNl9IT1I6Ci0gICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzE2WDE2X0RDOgotICAgICAgICAvKiBUaGlzIGNhbiBhbHdheXMgYmUgdXNlZCBldmVuIGlmIG5vIGJsb2NrcyBhdmFpbGFibGUgKi8KLSAgICAgICAgU3VtID0gMDsKLSAgICAgICAgQ291bnQgPSAwOwotICAgICAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDb3VudD09MCkKLSAgICAgICAgewotICAgICAgICAgICAgU3VtID0gMTI4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKENvdW50PT0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gPSAoU3VtICsgOCkgPj4gNDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIENvdW50ID0gMiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gPSAoU3VtICsgMTYpID4+IDU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpU3VtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfMTZYMTZfUExBTkU6Ci0gICAgICAgIEggPSA4KihwU3JjQWJvdmVbMTVdIC0gcFNyY0Fib3ZlTGVmdFswXSk7Ci0gICAgICAgIGZvciAoeD02OyB4Pj0wOyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEggKz0gKHgrMSkqKHBTcmNBYm92ZVs4K3hdIC0gcFNyY0Fib3ZlWzYteF0pOwotICAgICAgICB9Ci0gICAgICAgIFYgPSA4KihwU3JjTGVmdFsxNSpsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKLSAgICAgICAgZm9yICh5PTY7IHk+PTA7IHktLSkKLSAgICAgICAgewotICAgICAgICAgICAgViArPSAoeSsxKSoocFNyY0xlZnRbKDgreSkqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbKDYteSkqbGVmdFN0ZXBdKTsKLSAgICAgICAgfQotICAgICAgICBhID0gMTYqKHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0pOwotICAgICAgICBiID0gKDUqSCszMik+PjY7Ci0gICAgICAgIGMgPSAoNSpWKzMyKT4+NjsKLSAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdW0gPSAoYSArIGIqKHgtNykgKyBjKih5LTcpICsgMTYpPj41OwotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClhcm1DbGlwKDAsMjU1LFN1bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzI1ZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCA0eDQgaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCi0gKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCi0gKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAotICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAotICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotICkKLXsKLSAgICBpbnQgeCwgeTsKLSAgICBPTVhfVTggcFRtcFsxMF07Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigobGVmdFN0ZXAgJSA0KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgNCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCA8IDQpLCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpICAgICAgJiYgcFNyY0Fib3ZlICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUICkgICAgICAmJiBwU3JjTGVmdCAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpICYmIHBTcmNBYm92ZUxlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZFUlQgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IT1IgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19ETCAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfRFIgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RSICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19EUiAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZSICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WUiAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVlIgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hEICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IRCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSEQgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZMICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IVSAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDXzRYNF9IVSwgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIAotICAgIC8qIE5vdGU6IFRoaXMgY29kZSBtdXN0IG5vdCByZWFkIHRoZSBwU3JjIGFycmF5cyB1bmxlc3MgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBibG9jayBpcyBtYXJrZWQgYXMgYXZhaWxhYmxlLiBJZiB0aGUgYmxvY2sgaXMgbm90IGF2YWliYWJsZSB0aGVuIHBTcmMKLSAgICAgKiBtYXkgbm90IGJlIGEgdmFsaWQgcG9pbnRlci4KLSAgICAgKgotICAgICAqIE5vdGU6IFRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZSB3ZSByZWZlciB0byB0aGUgbmVpZ2hib3VyaW5nIHBpeGVscwotICAgICAqIGluIHZhcmlhYmxlcyBuYW1lZCBhcyBiZWxvdzoKLSAgICAgKgotICAgICAqICAgIFVMIFUwIFUxIFUyIFUzIFU0IFU1IFU2IFU3Ci0gICAgICogICAgTDAgeHggeHggeHggeHgKLSAgICAgKiAgICBMMSB4eCB4eCB4eCB4eAotICAgICAqICAgIEwyIHh4IHh4IHh4IHh4Ci0gICAgICogICAgTDMgeHggeHggeHggeHgKLSAgICAgKi8KLSAgICAgCi0jZGVmaW5lIFVMIHBTcmNBYm92ZUxlZnRbMF0KLSNkZWZpbmUgVTAgcFNyY0Fib3ZlWzBdCi0jZGVmaW5lIFUxIHBTcmNBYm92ZVsxXQotI2RlZmluZSBVMiBwU3JjQWJvdmVbMl0KLSNkZWZpbmUgVTMgcFNyY0Fib3ZlWzNdCi0jZGVmaW5lIFU0IHBTcmNBYm92ZVs0XQotI2RlZmluZSBVNSBwU3JjQWJvdmVbNV0KLSNkZWZpbmUgVTYgcFNyY0Fib3ZlWzZdCi0jZGVmaW5lIFU3IHBTcmNBYm92ZVs3XQotI2RlZmluZSBMMCBwU3JjTGVmdFswKmxlZnRTdGVwXQotI2RlZmluZSBMMSBwU3JjTGVmdFsxKmxlZnRTdGVwXQotI2RlZmluZSBMMiBwU3JjTGVmdFsyKmxlZnRTdGVwXQotI2RlZmluZSBMMyBwU3JjTGVmdFszKmxlZnRTdGVwXQotCi0gICAgc3dpdGNoIChwcmVkTW9kZSkKLSAgICB7Ci0gICAgY2FzZSBPTVhfVkNfNFg0X1ZFUlQ6Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArMF0gPSBVMDsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzFdID0gVTE7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCsyXSA9IFUyOwotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArM10gPSBVMzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzRYNF9IT1I6Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFswKmRzdFN0ZXAreF0gPSBMMDsKLSAgICAgICAgICAgIHBEc3RbMSpkc3RTdGVwK3hdID0gTDE7Ci0gICAgICAgICAgICBwRHN0WzIqZHN0U3RlcCt4XSA9IEwyOwotICAgICAgICAgICAgcERzdFszKmRzdFN0ZXAreF0gPSBMMzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIE9NWF9WQ180WDRfREM6Ci0gICAgICAgIC8qIFRoaXMgY2FuIGFsd2F5cyBiZSB1c2VkIGV2ZW4gaWYgbm8gYmxvY2tzIGF2YWlsYWJsZSAqLwotICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KHBTcmNMZWZ0LCBwU3JjQWJvdmUsIHBEc3QsIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBPTVhfVkNfNFg0X0RJQUdfREw6Ci0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7Ci0gICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfUklHSFQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTIgKyAyKlUzICsgVTQgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFUzICsgMipVNCArIFU1ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVNCArIDIqVTUgKyBVNiArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTUgKyAyKlU2ICsgVTcgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFU2ICsgMypVNyAgICAgICsgMik+PjIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMiArIDMqVTMgICAgICArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbM10gPSBVMzsKLSAgICAgICAgICAgIHBUbXBbNF0gPSBVMzsKLSAgICAgICAgICAgIHBUbXBbNV0gPSBVMzsKLSAgICAgICAgICAgIHBUbXBbNl0gPSBVMzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbeCt5XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzRYNF9ESUFHX0RSOiAgICAgICAgCi0gICAgICAgIC8qIHgteSA9IC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMgKi8KLSAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChMMCArIDIqTDEgKyBMMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVTCArIDIqTDAgKyBMMSArIDIpPj4yKTsKLSAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVMCArIDIqVUwgKyBMMCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVMSArIDIqVTAgKyBVTCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDIqVTEgKyBVMCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVMyArIDIqVTIgKyBVMSArIDIpPj4yKTsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzMreC15XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzRYNF9WUjoKLSAgICAgICAgLyogelZSPTJ4LXkgPSAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2Ci0gICAgICAgICAqIHgtKHk+PjEpID0gLTEsIC0xLCAgMCwgMCwgMSwgMSwgMiwgMiwgMywgMwotICAgICAgICAgKiB5ICAgICAgICA9ICAzLCAgMiwgID8sID8sID8sID8sID8sID8sIDEsIDAKLSAgICAgICAgICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoTDIgKyAyKkwxICsgTDAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoTDEgKyAyKkwwICsgVUwgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoTDAgKyAyKlVMICsgVTAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVUwgKyBVMCArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVTCArIDIqVTAgKyBVMSArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMCArIFUxICsgMSk+PjEpOwotICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFUwICsgMipVMSArIFUyICsgMik+PjIpOwotICAgICAgICBwVG1wWzddID0gKE9NWF9VOCkoKFUxICsgVTIgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbOF0gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbOV0gPSAoT01YX1U4KSgoVTIgKyBVMyArIDEpPj4xKTsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzMrMip4LXldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfNFg0X0hEOgotICAgICAgICAvKiB6SEQ9MnkteCA9IC0zIC0yIC0xICAwICAxICAyICAzICA0ICA1ICA2Ci0gICAgICAgICAqIHktKHg+PjEpID0gLTEgLTEgIDAgIDAgIDEgIDEgIDIgIDIgIDMgIDMKLSAgICAgICAgICogeCAgICAgICAgPSAgMyAgMiAgICAgICAgICAgICAgICAgICAgMSAgMAotICAgICAgICAgKi8KLSAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMiArIDIqVTEgKyBVMCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChVMSArIDIqVTAgKyBVTCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMCArIDIqVUwgKyBMMCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVTCArIEwwICsgMSk+PjEpOwotICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFVMICsgMipMMCArIEwxICsgMik+PjIpOwotICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKEwwICsgTDEgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoTDAgKyAyKkwxICsgTDIgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoTDEgKyBMMiArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs4XSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs5XSA9IChPTVhfVTgpKChMMiArIEwzICsgMSk+PjEpOwotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMysyKnkteF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfVkw6Ci0gICAgICAgIC8qIE5vdGU6IHgrKHk+PjEpID0gKDIqeCt5KT4+MQotICAgICAgICAgKiAyeCt5ID0gMCAxIDIgMyA0IDUgNiA3IDggOQotICAgICAgICAgKi8KLSAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMCArIFUxICsgMSk+PjEpOwotICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKFUwICsgMipVMSArIFUyICsgMik+PjIpOwotICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUxICsgVTIgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVTIgKyBVMyArIDEpPj4xKTsKLSAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9SSUdIVCkKLSAgICAgICAgewotICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDIqVTMgKyBVNCArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTMgKyBVNCArIDEpPj4xKTsKLSAgICAgICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoVTMgKyAyKlU0ICsgVTUgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzhdID0gKE9NWF9VOCkoKFU0ICsgVTUgKyAxKT4+MSk7Ci0gICAgICAgICAgICBwVG1wWzldID0gKE9NWF9VOCkoKFU0ICsgMipVNSArIFU2ICsgMik+PjIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDMqVTMgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzZdID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzddID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzhdID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzldID0gVTM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzIqeCt5XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzRYNF9IVToKLSAgICAgICAgLyogekhVID0geCsyKnkgKi8KLSAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMCArIEwxICsgMSk+PjEpOwotICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKEwwICsgMipMMSArIEwyICsgMik+PjIpOwotICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKEwxICsgTDIgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoTDEgKyAyKkwyICsgTDMgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoTDIgKyBMMyArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChMMiArIDMqTDMgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNl0gPSBMMzsKLSAgICAgICAgcFRtcFs3XSA9IEwzOwotICAgICAgICBwVG1wWzhdID0gTDM7Ci0gICAgICAgIHBUbXBbOV0gPSBMMzsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wW3grMip5XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwYTc4NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcwotICogb2YgMTZ4MTYgb3IgMTZ4OAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4KAotCWNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQotICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCi0gICAgT01YX1UzMioJcERzdFNBRCwKLSAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTcmNTdGVwID09IDApIHx8IChpU3JjU3RlcCAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgCi0KLSAgICByZXR1cm4gYXJtVkNNNFAxMF9TQURRdWFyCi0gICAgICAgIChwU3JjLCBwU3JjUmVmMCwgcFNyY1JlZjEsIGlTcmNTdGVwLCAKLSAgICAgICAgaVJlZlN0ZXAwLCBpUmVmU3RlcDEsIHBEc3RTQUQsIGlIZWlnaHQsIDE2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjBkMzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEUXVhcl80eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCi0gKiBvZiA0eDggb3IgNHg0IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAotICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHgoIAotCSAgY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCSAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQotICAgICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgICBPTVhfVTMyCWlSZWZTdGVwMCwKLSAgICAgIE9NWF9VMzIJaVJlZlN0ZXAxLAotICAgICAgT01YX1UzMioJcERzdFNBRCwKLSAgICAgIE9NWF9VMzIgICBpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpU3JjU3RlcCA9PSAwKSB8fCAoaVNyY1N0ZXAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIHJldHVybiBhcm1WQ000UDEwX1NBRFF1YXIKLSAgICAgICAgKHBTcmMsIHBTcmNSZWYwLCBwU3JjUmVmMSwgaVNyY1N0ZXAsIAotICAgICAgICBpUmVmU3RlcDAsIGlSZWZTdGVwMSwgcERzdFNBRCwgaUhlaWdodCwgNCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhjZGYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfOHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcwotICogb2YgOHgxNiBvciA4eDggb3IgOHg0Ci0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCggCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpICYmIAotICAgICAgICAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVNyY1N0ZXAgPT0gMCkgfHwgKGlTcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIAotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfU0FEUXVhcgotICAgICAgICAocFNyYywgcFNyY1JlZjAsIHBTcmNSZWYxLCBpU3JjU3RlcCwgCi0gICAgICAgIGlSZWZTdGVwMCwgaVJlZlN0ZXAxLCBwRHN0U0FELCBpSGVpZ2h0LCA4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjJkOGRkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQURfNHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHgoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3RlcFJlZiA9PSAwKSB8fCAoaVN0ZXBSZWYgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICByZXR1cm4gYXJtVkNDT01NX1NBRCAKLSAgICAgICAgKHBTcmNPcmcsIGlTdGVwT3JnLCBwU3JjUmVmLCBpU3RlcFJlZiwgcERzdFNBRCwgaUhlaWdodCwgNCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzQ0OTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBVERfNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4NCBibG9ja3MKLSAqIAotICovCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQVREXzR4NCAgICg2LjMuNS40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN1bSBvZiBhYnNvbHV0ZSB0cmFuc2Zvcm0gZGlmZmVyZW5jZXMgKFNBVEQpIAotICogZm9yIGEgNHg0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgSGFkYW1hcmQgdHJhbnNmb3JtIHRvIHRoZSBkaWZmZXJlbmNlIGJsb2NrIAotICogYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhYnNvbHV0ZSBjb2VmZmljaWVudCB2YWx1ZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwU3JjUmVmIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIGVpdGhlciBwU3JjT3JnIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3RlcE9yZyA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBVERfNHg0KCAKLQljb25zdCBPTVhfVTgqCQlwU3JjT3JnLAotCU9NWF9VMzIgICAgIGlTdGVwT3JnLCAgICAgICAgICAgICAgICAgICAgICAgICAKLQljb25zdCBPTVhfVTgqCQlwU3JjUmVmLAotCU9NWF9VMzIJCWlTdGVwUmVmLAotCU9NWF9VMzIqICAgIHBEc3RTQUQKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TMzIgICAgIFNBVEQgPSAwOwotICAgIE9NWF9TMzIgICAgIGQgWzRdWzRdLCBtMVs0XVs0XSwgbTJbNF1bNF07Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3RlcFJlZiA9PSAwKSB8fCAoaVN0ZXBSZWYgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY1JlZiksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlICovCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGQgW2pdW2ldID0gcFNyY09yZyBbaiAqIGlTdGVwT3JnICsgaV0gLSBwU3JjUmVmIFtqICogaVN0ZXBSZWYgKyBpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEhhZGFtYXJkIFRyYW5zZm9yIGZvciA0eDQgYmxvY2sgKi8KLQotICAgIC8qIEhvcml6b250YWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgbTFbaV1bMF0gPSBkW2ldWzBdICsgZFtpXVsyXTsgLyogYStjICovCi0gICAgICAgIG0xW2ldWzFdID0gZFtpXVsxXSArIGRbaV1bM107IC8qIGIrZCAqLwotICAgICAgICBtMVtpXVsyXSA9IGRbaV1bMF0gLSBkW2ldWzJdOyAvKiBhLWMgKi8KLSAgICAgICAgbTFbaV1bM10gPSBkW2ldWzFdIC0gZFtpXVszXTsgLyogYi1kICovCi0KLSAgICAgICAgbTJbaV1bMF0gPSBtMVtpXVswXSArIG0xW2ldWzFdOyAvKiBhK2IrYytkICovCi0gICAgICAgIG0yW2ldWzFdID0gbTFbaV1bMl0gKyBtMVtpXVszXTsgLyogYStiLWMtZCAqLwotICAgICAgICBtMltpXVsyXSA9IG0xW2ldWzJdIC0gbTFbaV1bM107IC8qIGEtYi1jK2QgKi8KLSAgICAgICAgbTJbaV1bM10gPSBtMVtpXVswXSAtIG0xW2ldWzFdOyAvKiBhLWIrYy1kICovCi0KLSAgICB9Ci0KLSAgICAvKiBWZXJ0aWNhbCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBtMVswXVtpXSA9IG0yWzBdW2ldICsgbTJbMl1baV07Ci0gICAgICAgIG0xWzFdW2ldID0gbTJbMV1baV0gKyBtMlszXVtpXTsKLSAgICAgICAgbTFbMl1baV0gPSBtMlswXVtpXSAtIG0yWzJdW2ldOwotICAgICAgICBtMVszXVtpXSA9IG0yWzFdW2ldIC0gbTJbM11baV07Ci0KLSAgICAgICAgbTJbMF1baV0gPSBtMVswXVtpXSArIG0xWzFdW2ldOwotICAgICAgICBtMlsxXVtpXSA9IG0xWzJdW2ldICsgbTFbM11baV07Ci0gICAgICAgIG0yWzJdW2ldID0gbTFbMl1baV0gLSBtMVszXVtpXTsKLSAgICAgICAgbTJbM11baV0gPSBtMVswXVtpXSAtIG0xWzFdW2ldOwotICAgIH0KLSAgICAKLSAgICAvKiBjYWxjdWxhdGUgU0FEIGZvciBUcmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU0FURCArPSBhcm1BYnMobTIgW2pdW2ldKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgKnBEc3RTQUQgPSAoU0FURCArIDEpIC8gMjsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTg0ZDdjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCi0gKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCi0gKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCi0gKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAotICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCi0gKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIDQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKLSAqICAgICAgICAgICAgb2YgNC4gCi0gKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKLSAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCi0gKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKLSAqICAgICAgICAgICAgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKLSAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKLSAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi0gT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAotCSBjb25zdCBPTVhfVTgqCQlwU3JjT3JnLAotCSBjb25zdCBPTVhfVTgqCQlwU3JjUHJlZCwKLQkgT01YX1UzMgkJaVNyY09yZ1N0ZXAsCi0JIE9NWF9VMzIJCWlTcmNQcmVkU3RlcCwKLQkgT01YX1MxNioJICAgIHBEc3RRdWFudENvZWZmLAotCSBPTVhfUzE2KiAJICAgIHBEc3REZVF1YW50Q29lZmYsCi0JIE9NWF9TMTYqCSAgICBwRENDb2VmZiwKLQkgT01YX1M4KgkJcE51bUNvZWZmLAotCSBPTVhfVTMyCQluVGhyZXNoU0FELAotCSBPTVhfVTMyCQlpUVAsCi0JIE9NWF9VOAkJICAgIGJJbnRyYQotKQotewotICAgIE9NWF9JTlQgICAgIGksIGo7Ci0gICAgT01YX1M4ICAgICAgTnVtQ29lZmYgPSAwOwotICAgIE9NWF9TMTYgICAgIEJ1ZlsxNl0sIG1bMTZdOwotICAgIE9NWF9VMzIgICAgIFFCaXRzLCBRUHBlciwgUVBtb2QsIGY7Ci0gICAgT01YX1MzMiAgICAgVmFsdWUsIE1GLCBUaHJlc2hEQzsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0JYXJtUmV0QXJnRXJySWYocERzdERlUXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLQlhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0JYXJtUmV0QXJnRXJySWYocERDQ29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY1ByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFF1YW50Q29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocERzdERlUXVhbnRDb2VmZiAhPSBOVUxMKSAmJiAKLQkJCWFybU5vdDhCeXRlQWxpZ25lZChwRHN0RGVRdWFudENvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGJJbnRyYSAhPSAwKSAmJiAoYkludHJhICE9IDEpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVNyY09yZ1N0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNPcmdTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiAKLSAgICAgKiBaZXJvLUJsb2NrIEVhcmx5IGRldGVjdGlvbiB1c2luZyBuVGhyZXNoU0FEIHBhcmFtIAotICAgICAqLwotCi0gICAgUVBwZXIgPSBpUVAgLyA2OwotICAgIFFQbW9kID0gaVFQICUgNjsgICAgCi0gICAgUUJpdHMgPSAxNSArIFFQcGVyOwotICAgIAotICAgIGYgPSAoMSA8PCBRQml0cykgLyAoYkludHJhID8gMyA6IDYpOwotICAgIAotICAgIC8qIERvIFplcm8tQmxvY2sgRWFybHkgZGV0ZWN0aW9uIGlmIGVuYWJsZWQgKi8KLSAgICBpZiAoblRocmVzaFNBRCkKLSAgICB7Ci0gICAgICAgIFRocmVzaERDID0gKCgxIDw8IFFCaXRzKSAtIGYpIC8gYXJtVkNNNFAxMF9NRk1hdHJpeFtRUG1vZF1bMF07Ci0gICAgICAgIGlmIChuVGhyZXNoU0FEIDwgVGhyZXNoREMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNldCBibG9jayB0byB6ZXJvICovCi0gICAgICAgICAgICBpZiAocERDQ29lZmYgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcERDQ29lZmYgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwRHN0UXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRHN0RGVRdWFudENvZWZmICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYgWzQgKiBqICsgaV0gPSAwOyAgICAKLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocE51bUNvZWZmICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBOdW1Db2VmZiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAvKiBDYWxjdWxhdGUgZGlmZmVyZW5jZSAqLwotICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBCdWYgW2ogKiA0ICsgaV0gPSAKLSAgICAgICAgICAgICAgICBwU3JjT3JnIFtqICogaVNyY09yZ1N0ZXAgKyBpXSAtIHBTcmNQcmVkIFtqICogaVNyY1ByZWRTdGVwICsgaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZXNpZHVhbCBUcmFuc2Zvcm0gKi8KLSAgICBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0IChtLCBCdWYpOwotCi0gICAgaWYgKHBEQ0NvZWZmICE9IE5VTEwpCi0gICAgewotICAgICAgICAvKiBDb3B5IHVucXVhbnRpemVkIERDIHZhbHVlIGludG8gcG9pbnRlciAqLwotICAgICAgICAqcERDQ29lZmYgPSBtWzBdOwotICAgIH0KLQotICAgIC8qIFF1YW50aXphdGlvbiAqLwotICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNRiA9IGFybVZDTTRQMTBfTUZNYXRyaXhbUVBtb2RdW2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ogKiA0ICsgaV1dOwotICAgICAgICAgICAgVmFsdWUgPSBhcm1BYnMobVtqICogNCArIGldKSAqIE1GICsgZjsKLSAgICAgICAgICAgIFZhbHVlID4+PSBRQml0czsKLSAgICAgICAgICAgIFZhbHVlID0gbVtqICogNCArIGldIDwgMCA/IC1WYWx1ZSA6IFZhbHVlOwotICAgICAgICAgICAgQnVmWzQgKiBqICsgaV0gPSBwRHN0UXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgICAgICAgICAgaWYgKChwTnVtQ29lZmYgIT0gTlVMTCkgJiYgVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTnVtQ29lZmYrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIE91dHB1dCBudW1iZXIgb2Ygbm9uLXplcm8gQ29lZmZzICovCi0gICAgaWYgKHBOdW1Db2VmZiAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgKnBOdW1Db2VmZiA9IE51bUNvZWZmOwotICAgIH0KLSAgICAKLSAgICAvKiBSZXNpZHVhbCBJbnYgVHJhbnNmb3JtICovCi0gICAgaWYgKHBEc3REZVF1YW50Q29lZmYgIT0gTlVMTCkKLSAgICB7ICAgIAotICAgICAgICAvKiBSZSBTY2FsZSAqLwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG0gW2ogKiA0ICsgaV0gID0gQnVmIFtqICogNCArIGldICogKDEgPDwgUVBwZXIpICoKLSAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9WTWF0cml4W1FQbW9kXVthcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtqICogNCArIGldXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0IChwRHN0RGVRdWFudENvZWZmLCBtKTsgICAgICAgIAotICAgIH0KLSAgICAgICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWY1YTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlcXVhbnRpemUgQ2hyb21hIDJ4MiBEQyBibG9jawotICovCi0KLXN0YXRpYyB2b2lkIERlcXVhbnRDaHJvbWFEQzJ4MigKLSAgICAgT01YX1MxNiogcERzdCwKLSAgICAgT01YX0lOVCBRUCAgICAgICAgCi0pCi17Ci0gICAgaW50IFNoaWZ0ID0gKFFQLzYpLTEgOwotICAgIGludCBTY2FsZSA9IGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKLSAgICBpbnQgaSwgVmFsdWU7Ci0KLSAgICBpZiAoU2hpZnQgPj0gMCkKLSAgICB7Ci0gICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlKSA8PCBTaGlmdDsKLSAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSkgPj4gMTsKLSAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLSAKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogSW52ZXJzZSBUcmFuc2Zvcm0gREMgMngyIENvZWZmaWNpZW50cwotICovCi0KLXN0YXRpYyB2b2lkIEludlRyYW5zZm9ybURDMngyKE9NWF9TMTYqIHBEYXRhKQotewotICAgIGludCBjMDAgPSBwRGF0YVswXTsKLSAgICBpbnQgYzAxID0gcERhdGFbMV07Ci0gICAgaW50IGMxMCA9IHBEYXRhWzJdOwotICAgIGludCBjMTEgPSBwRGF0YVszXTsKLQotICAgIGludCBkMDAgPSBjMDAgKyBjMDE7Ci0gICAgaW50IGQwMSA9IGMwMCAtIGMwMTsKLSAgICBpbnQgZDEwID0gYzEwICsgYzExOwotICAgIGludCBkMTEgPSBjMTAgLSBjMTE7Ci0KLSAgICBwRGF0YVswXSA9IChPTVhfUzE2KShkMDAgKyBkMTApOwotICAgIHBEYXRhWzFdID0gKE9NWF9TMTYpKGQwMSArIGQxMSk7Ci0gICAgcERhdGFbMl0gPSAoT01YX1MxNikoZDAwIC0gZDEwKTsKLSAgICBwRGF0YVszXSA9IChPTVhfUzE2KShkMDEgLSBkMTEpOwotfQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAotICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0LAotICAgICBPTVhfSU5UIFFQICAgICAgICAKLSApCi17Ci0gICAgYXJtUmV0QXJnRXJySWYocHBTcmMgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwU3JjID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCAgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoUVA8MCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoUVA+NTEsICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKHBwU3JjLCBwRHN0KTsKLSAgICBJbnZUcmFuc2Zvcm1EQzJ4MihwRHN0KTsKLSAgICBEZXF1YW50Q2hyb21hREMyeDIocERzdCwgUVApOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzM2Q0OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBEZXF1YW50aXplIEx1bWEgREMgYmxvY2sKLSAqLwotCi1zdGF0aWMgdm9pZCBEZXF1YW50THVtYURDNHg0KAotICAgICBPTVhfUzE2KiBwRHN0LAotICAgICBPTVhfSU5UIFFQICAgICAgICAKLSkKLXsKLSAgICBpbnQgU2hpZnQgPSAoUVAvNiktMiA7Ci0gICAgaW50IFNjYWxlID0gYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdOwotICAgIGludCBpLCBSb3VuZCwgVmFsdWU7Ci0KLSAgICBpZiAoU2hpZnQgPj0gMCkKLSAgICB7Ci0gICAgICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSkgPDwgU2hpZnQ7Ci0gICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7OwotICAgICAgICBSb3VuZCA9IDE8PChTaGlmdC0xKTsKLQotICAgICAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUgKyBSb3VuZCkgPj4gU2hpZnQ7Ci0gICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSAKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogSW52ZXJzZSBUcmFuc2Zvcm0gREMgNHg0IENvZWZmaWNpZW50cwotICovCi1zdGF0aWMgdm9pZCBJbnZUcmFuc2Zvcm1EQzR4NChPTVhfUzE2KiBwRGF0YSkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIFRyYW5zZm9ybSByb3dzICovCi0gICAgZm9yIChpPTA7IGk8MTY7IGkrPTQpCi0gICAgewotICAgICAgICBpbnQgYzAgPSBwRGF0YVtpKzBdOwotICAgICAgICBpbnQgYzEgPSBwRGF0YVtpKzFdOwotICAgICAgICBpbnQgYzIgPSBwRGF0YVtpKzJdOwotICAgICAgICBpbnQgYzMgPSBwRGF0YVtpKzNdOwotICAgICAgICBwRGF0YVtpKzBdID0gKE9NWF9TMTYpKGMwK2MxK2MyK2MzKTsKLSAgICAgICAgcERhdGFbaSsxXSA9IChPTVhfUzE2KShjMCtjMS1jMi1jMyk7Ci0gICAgICAgIHBEYXRhW2krMl0gPSAoT01YX1MxNikoYzAtYzEtYzIrYzMpOwotICAgICAgICBwRGF0YVtpKzNdID0gKE9NWF9TMTYpKGMwLWMxK2MyLWMzKTsKLSAgICB9Ci0KLSAgICAvKiBUcmFuc2Zvcm0gY29sdW1ucyAqLwotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGludCBjMCA9IHBEYXRhW2krMF07Ci0gICAgICAgIGludCBjMSA9IHBEYXRhW2krNF07Ci0gICAgICAgIGludCBjMiA9IHBEYXRhW2krOF07Ci0gICAgICAgIGludCBjMyA9IHBEYXRhW2krMTJdOwotICAgICAgICBwRGF0YVtpKzBdID0gKE9NWF9TMTYpKGMwK2MxK2MyK2MzKTsKLSAgICAgICAgcERhdGFbaSs0XSA9IChPTVhfUzE2KShjMCtjMS1jMi1jMyk7Ci0gICAgICAgIHBEYXRhW2krOF0gPSAoT01YX1MxNikoYzAtYzEtYzIrYzMpOwotICAgICAgICBwRGF0YVtpKzEyXSA9IChPTVhfUzE2KShjMC1jMStjMi1jMyk7Ci0gICAgfQotfQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICg2LjMuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdHMgdGhlIDR4NCBMdW1hREMgYmxvY2sgZnJvbSB0aGUgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciAKLSAqIGJ1ZmZlciwgcGVyZm9ybXMgaW50ZWdlciBpbnZlcnNlLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDR4NCBMdW1hREMgCi0gKiBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGVzIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcFkgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgTHVtYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0LAotICAgICBPTVhfSU5UIFFQICAgICAgICAKLSApCi17Ci0gICAgYXJtUmV0QXJnRXJySWYocHBTcmMgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwU3JjID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCAgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoUVA8MCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoUVA+NTEsICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KHBwU3JjLCBwRHN0KTsKLSAgICAvKkludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQocERzdCwgUVApOyovCi0gICAgSW52VHJhbnNmb3JtREM0eDQocERzdCk7Ci0gICAgRGVxdWFudEx1bWFEQzR4NChwRHN0LCBRUCk7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2YTNkMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDICAKLSAqIGNvZWZmaWNpZW50cyBhbmQgcXVhbnRpemF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLiAxLUlOVFJBLCAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQygKLQlPTVhfUzE2KiAJcFNyY0RzdCwKLQlPTVhfVTMyCQlpUVAsCi0JT01YX1U4CQliSW50cmEKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TMzIgICAgIG1bMl1bMl07Ci0gICAgT01YX1MzMiAgICAgVmFsdWU7Ci0gICAgT01YX1MzMiAgICAgUWJpdHNQbHVzT25lLCBUd29fZiwgTUYwMDsKLQotICAgIC8qIENoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBIYWRhbWFyZCBUcmFuc2Zvcm0gZm9yIDJ4MiBibG9jayAqLwotICAgIG1bMF1bMF0gPSBwU3JjRHN0WzBdICsgcFNyY0RzdFsxXSArICBwU3JjRHN0WzJdICsgcFNyY0RzdFszXTsKLSAgICBtWzBdWzFdID0gcFNyY0RzdFswXSAtIHBTcmNEc3RbMV0gKyAgcFNyY0RzdFsyXSAtIHBTcmNEc3RbM107Ci0gICAgbVsxXVswXSA9IHBTcmNEc3RbMF0gKyBwU3JjRHN0WzFdIC0gIHBTcmNEc3RbMl0gLSBwU3JjRHN0WzNdOwotICAgIG1bMV1bMV0gPSBwU3JjRHN0WzBdIC0gcFNyY0RzdFsxXSAtICBwU3JjRHN0WzJdICsgcFNyY0RzdFszXTsKLQotICAgIC8qIFF1YW50aXphdGlvbiAqLwotICAgIFFiaXRzUGx1c09uZSA9IEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNik7IC8qZmxvb3IgKFFQLzYpKi8KLSAgICBNRjAwID0gYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF07Ci0KLSAgICBUd29fZiA9ICgxIDw8IFFiaXRzUGx1c09uZSkgLyAoYkludHJhID8gMyA6IDYpOyAvKiAzLT5JTlRSQSwgNi0+SU5URVIgKi8KLQotICAgIC8qIFNjYWxpbmcgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSAoYXJtQWJzKG1bal1baV0pICogTUYwMCArIFR3b19mKSA+PiBRYml0c1BsdXNPbmU7Ci0gICAgICAgICAgICBwU3JjRHN0W2ogKiAyICsgaV0gPSAoT01YX1MxNikoKG1bal1baV0gPCAwKSA/IC1WYWx1ZSA6IFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTlhMmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgcXVhbnRpemF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQygKLQlPTVhfUzE2KiAJcFNyY0RzdCwKLQlPTVhfVTMyCQlpUVAKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TMzIgICAgIG0xWzRdWzRdLCBtMls0XVs0XTsKLSAgICBPTVhfUzMyICAgICBWYWx1ZTsKLSAgICBPTVhfVTMyICAgICBRYml0c1BsdXNPbmUsIFR3b19mLCBNRjsKLQotICAgIC8qIENoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogSGFkYW1hcmQgVHJhbnNmb3JtIGZvciA0eDQgYmxvY2sgKi8KLSAgICAvKiBIb3Jpem9udGFsIEhhZGFtYXJkICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGogPSBpICogNDsKLSAgICAgICAgCi0gICAgICAgIG0xW2ldWzBdID0gcFNyY0RzdFtqICsgMF0gKyBwU3JjRHN0W2ogKyAyXTsgLyogYStjICovCi0gICAgICAgIG0xW2ldWzFdID0gcFNyY0RzdFtqICsgMV0gKyBwU3JjRHN0W2ogKyAzXTsgLyogYitkICovCi0gICAgICAgIG0xW2ldWzJdID0gcFNyY0RzdFtqICsgMF0gLSBwU3JjRHN0W2ogKyAyXTsgLyogYS1jICovCi0gICAgICAgIG0xW2ldWzNdID0gcFNyY0RzdFtqICsgMV0gLSBwU3JjRHN0W2ogKyAzXTsgLyogYi1kICovCi0KLSAgICAgICAgbTJbaV1bMF0gPSBtMVtpXVswXSArIG0xW2ldWzFdOyAvKiBhK2IrYytkICovCi0gICAgICAgIG0yW2ldWzFdID0gbTFbaV1bMl0gKyBtMVtpXVszXTsgLyogYStiLWMtZCAqLwotICAgICAgICBtMltpXVsyXSA9IG0xW2ldWzJdIC0gbTFbaV1bM107IC8qIGEtYi1jK2QgKi8KLSAgICAgICAgbTJbaV1bM10gPSBtMVtpXVswXSAtIG0xW2ldWzFdOyAvKiBhLWIrYy1kICovCi0KLSAgICB9Ci0KLSAgICAvKiBWZXJ0aWNhbCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBtMVswXVtpXSA9IG0yWzBdW2ldICsgbTJbMl1baV07Ci0gICAgICAgIG0xWzFdW2ldID0gbTJbMV1baV0gKyBtMlszXVtpXTsKLSAgICAgICAgbTFbMl1baV0gPSBtMlswXVtpXSAtIG0yWzJdW2ldOwotICAgICAgICBtMVszXVtpXSA9IG0yWzFdW2ldIC0gbTJbM11baV07Ci0KLSAgICAgICAgbTJbMF1baV0gPSBtMVswXVtpXSArIG0xWzFdW2ldOwotICAgICAgICBtMlsxXVtpXSA9IG0xWzJdW2ldICsgbTFbM11baV07Ci0gICAgICAgIG0yWzJdW2ldID0gbTFbMl1baV0gLSBtMVszXVtpXTsKLSAgICAgICAgbTJbM11baV0gPSBtMVswXVtpXSAtIG0xWzFdW2ldOwotICAgIH0KLQotICAgIAotICAgIC8qIFF1YW50aXphdGlvbiAqLwotICAgIFFiaXRzUGx1c09uZSA9IEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNik7IC8qZmxvb3IgKFFQLzYpKi8KLSAgICBUd29fZiA9ICgxIDw8IFFiaXRzUGx1c09uZSkgLyAzOyAvKiAzLT5JTlRSQSwgNi0+SU5URVIgKi8KLSAgICBNRiA9IGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdOwotCi0gICAgLyogU2NhbGluZyAqLwotICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IChhcm1BYnMoKG0yW2pdW2ldLyogKyAxKi8pIC8gMikgKiBNRiArIFR3b19mKSA+PiBRYml0c1BsdXNPbmU7Ci0gICAgICAgICAgICBwU3JjRHN0W2ogKiA0ICsgaV0gPSAoT01YX1MxNikoKG0yW2pdW2ldIDwgMCkgPyAtVmFsdWUgOiBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJkYTEzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EQ1RfVGFibGUuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0RDVF9UYWJsZS5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIERDVC9JRENUIG1vZHVsZQotICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YRENUVEFCX0hfCi0jZGVmaW5lIF9PTVhEQ1RUQUJfSF8KLQotZXh0ZXJuIGNvbnN0IE9NWF9GNjQgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbOF1bOF07Ci0KLSNlbmRpZiAvKiBfT01YRENUVEFCX0hfICovCi0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OGJkYmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAotICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YSFVGRlRBQl9IXwotI2RlZmluZSBfT01YSFVGRlRBQl9IXwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwUnVuSWR4WzExXTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludHJhVmxjTDBbNjhdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMVJ1bklkeFs3XTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludHJhVmxjTDFbMzZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMExNQVhbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMUxNQVhbMjFdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJNQVhbMjddOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMVJNQVhbOF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUnVuSWR4WzEyXTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludGVyVmxjTDBbNTldOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeFszXTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludGVyVmxjTDFbNDVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMExNQVhbMjddOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMUxNQVhbNDFdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJNQVhbMTJdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMVJNQVhbM107Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleFsxNF07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzE0XTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FWbGNNVkRbNjZdOwotCi0jZW5kaWYgLyogX09NWEhVRkZUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjMTYzZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWFpJR1pBR1RBQl9IXwotI2RlZmluZSBfT01YWklHWkFHVEFCX0hfCi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFs2NF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKLQotI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkzZjczLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9BQ0RDUHJlZGljdC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCi0gKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jawotICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCi0gKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00Ci0gKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCi0gKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQotICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgotICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCi0gKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKLSAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQotICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cwotICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCi0gICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgIE9NWF9JTlQgcHJlZFFQLAotICAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAotICAgICBPTVhfVTggZmxhZywKLSAgICAgT01YX0lOVCAqcFN1bUVycgotKQotewotICAgIE9NWF9JTlQgZGNTY2FsZXIsIGk7Ci0gICAgT01YX1MxNiB0ZW1wUHJlZDsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY3VyUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRRUCA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gMSkgJiYgKHByZWREaXIgIT0gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFByZWRCdWZSb3cpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmQ29sKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgCi0gICAgLyogU2V0IERDIHNjYWxlciB2YWx1ZSB0byBhdm9pZCBzb21lIGNvbXBpbGVycyBnaXZpbmcgYSB3YXJuaW5nLiAqLwotICAgIGRjU2NhbGVyPTA7Ci0gICAgCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBEQyBzY2FsZXIgdmFsdWUgKi8KLSAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCi0gICAgewotICAgICAgICBpZiAoY3VyUVAgPj0gMSAmJiBjdXJRUCA8PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3VyUVAgPj0gNSAmJiBjdXJRUCA8PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9IDIgKiBjdXJRUDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJRUCA+PSA5ICYmIGN1clFQIDw9IDI0KQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9IGN1clFQICsgODsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRjU2NhbGVyID0gKDIgKiBjdXJRUCkgLSAxNjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQotICAgIHsKLSAgICAgICAgaWYgKGN1clFQID49IDEgJiYgY3VyUVAgPD0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1clFQID49IDUgJiYgY3VyUVAgPD0gMjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRjU2NhbGVyID0gKGN1clFQICsgMTMpLzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9IGN1clFQIC0gNjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwUHJlQUNQcmVkaWN0ICE9IE5VTEwpCi0gICAgewotICAgICAgICBwUHJlQUNQcmVkaWN0WzBdID0gcHJlZERpcjsKLSAgICB9Ci0KLSAgICBpZiAocHJlZERpciA9PSBPTVhfVkNfVkVSVElDQUwpCi0gICAgewotICAgICAgICAvKiBGWzBdWzBdLy9kY19zY2FsZXIgKi8KLSAgICAgICAgdGVtcFByZWQgPSBhcm1JbnREaXZBd2F5RnJvbVplcm8ocFByZWRCdWZSb3dbMF0sIGRjU2NhbGVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogRlswXVswXS8vZGNfc2NhbGVyICovCi0gICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvKHBQcmVkQnVmQ29sWzBdLCBkY1NjYWxlcik7Ci0gICAgfQotCi0gICAgLyogVXBkYXRpbmcgdGhlIERDIHZhbHVlIHRvIHRoZSByb3cgYW5kIGNvbCBidWZmZXIgKi8KLSAgICAqKHBQcmVkQnVmUm93IC0gOCkgPSAqcFByZWRCdWZDb2w7Ci0KLSAgICBpZiAoZmxhZykKLSAgICB7Ci0gICAgICAgIC8qIENhbCBhbmQgc3RvcmUgRlswXVswXSBpbnRvIHRoZSBjb2wgYnVmZmVyICovCi0gICAgICAgICpwUHJlZEJ1ZkNvbCA9IHBTcmNEc3RbMF0gKiBkY1NjYWxlcjsKLQotICAgICAgICAvKiBQUUYgPSBRRiAtIEZbMF1bMF0vL2RjX3NjYWxlciAqLwotICAgICAgICBwU3JjRHN0WzBdIC09IHRlbXBQcmVkOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBRRiA9IFBRRiArIEZbMF1bMF0vL2RjX3NjYWxlciAqLwotICAgICAgICBwU3JjRHN0WzBdICs9IHRlbXBQcmVkOwotICAgICAgICAKLSAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgcFNyY0RzdFswXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0WzBdKTsKLQotICAgICAgICAvKiBDYWwgYW5kIHN0b3JlIEZbMF1bMF0gaW50byB0aGUgY29sIGJ1ZmZlciAqLwotICAgICAgICAqcFByZWRCdWZDb2wgPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7Ci0gICAgfQotCi0KLSAgICBpZiAoQUNQcmVkRmxhZyA9PSAxKQotICAgIHsKLSAgICAgICAgaWYgKHByZWREaXIgPT0gT01YX1ZDX1ZFUlRJQ0FMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUHJlZEJ1ZlJvd1tpXSAqIHByZWRRUCwgY3VyUVApOwotICAgICAgICAgICAgICAgIGlmIChmbGFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gdGhlIHJvdyBidWZmICovCi0gICAgICAgICAgICAgICAgICAgIHBQcmVkQnVmUm93W2ldID0gcFNyY0RzdFtpXTsKLSAgICAgICAgICAgICAgICAgICAgLypQUUZYW3ZdWzBdID0gUUZYW3ZdWzBdIC0gKFFGQVt2XVswXSAqIFFQQSkgLy8gUVBYICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gLT0gdGVtcFByZWQ7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFN1bSBvZiBhYnNvbHV0ZSB2YWx1ZXMgb2YgQUMgcHJlZGljdGlvbiBlcnJvciwgdGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgQUMgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAqcFN1bUVyciArPSBhcm1BYnMocFNyY0RzdFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHBQcmVBQ1ByZWRpY3RbMX43XSBzdG9yZSB0aGUgZXJyb3Igc2lnbmFsCi0gICAgICAgICAgICAgICAgICAgIGFmdGVyIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZUFDUHJlZGljdFtpXSA9IHBTcmNEc3RbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qUUZYW3ZdWzBdID0gUFFGWFt2XVswXSArIChRRkFbdl1bMF0gKiBRUEEpIC8vIFFQWCAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldICs9IHRlbXBQcmVkOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIHRoZSByb3cgYnVmZiAqLwotICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZlJvd1tpXSA9IHBTcmNEc3RbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gODsgaSA8IDY0OyBpICs9IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcFByZWQgPSBhcm1JbnREaXZBd2F5RnJvbVplcm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQcmVkQnVmQ29sW2k+PjNdICogcHJlZFFQLCBjdXJRUCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZsYWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byBjb2wgYnVmZiAqLwotICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZkNvbFtpPj4zXSA9IHBTcmNEc3RbaV07Ci0gICAgICAgICAgICAgICAgICAgIC8qUFFGWFswXVt1XSA9IFFGWFswXVt1XSAtIChRRkFbMF1bdV0gKiBRUEEpIC8vIFFQWCAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldIC09IHRlbXBQcmVkOwotICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2YgYWJzb2x1dGUgdmFsdWVzIG9mIEFDIHByZWRpY3Rpb24gZXJyb3IsIHRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlIEFDCi0gICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKnBTdW1FcnIgKz0gYXJtQWJzKHBTcmNEc3RbaV0pOwotICAgICAgICAgICAgICAgICAgICAvKiBwUHJlQUNQcmVkaWN0WzF+N10gc3RvcmUgdGhlIGVycm9yIHNpZ25hbAotICAgICAgICAgICAgICAgICAgICBhZnRlciBBQyBwcmVkaWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbaT4+M10gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlFGWFswXVt1XSA9IFBRRlhbMF1bdV0gKyAoUUZBWzBdW3VdICogUVBBKSAvLyBRUFggKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSArPSB0ZW1wUHJlZDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byBjb2wgYnVmZiAqLwotICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZkNvbFtpPj4zXSA9IHBTcmNEc3RbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmZkYTEwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIGVzdGltYXRlZCAKLSAqIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCAKLSAqIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCAKLSAqIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCAKLSAqIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIAotICogc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gIAotICogVGhlIGZ1bmN0aW9uIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICAgICAgICAgIHRoZQljdXJyZW50IHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlCi0gKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgCi0gKiAgICAgICAgICAgICAgICAgICAgKGxpbmVhciBhcnJheSwgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqIFtpbl0JcFNlYXJjaFBvaW50UmVmUG9zCXBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCBzZWFyY2ggKHNwZWNpZmllZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXQlybmRWYWwJCQkgIHJvdW5kaW5nIGNvbnRyb2wgYml0IGZvciBoYWxmIHBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAwPXJvdW5kaW5nIGNvbnRyb2wgZGlzYWJsZWQ7IDE9cm91bmRpbmcgY29udHJvbCBlbmFibGVkCi0gKiBbaW5dCXBTcmNEc3RNVgkJcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgYSBwcmlvciAKLSAqICAgICAgICAgICAgICAgICAgMTZYMTYgaW50ZWdlciBzZWFyY2ggYW5kIGl0cyB1bml0IGlzIGhhbGYgcGl4ZWwuCi0gKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgotICogW291dF1wU3JjRHN0TVYJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKQotewotICAgIE9NWF9JTlQgICAgIG91dGVyLCBpbm5lciwgY291bnQsIGluZGV4OwotICAgIE9NWF9TMTYgICAgIGhhbGZQZWxYID0gMCwgaGFsZlBlbFkgPSAwLCB4LCB5OwotICAgIE9NWF9JTlQgICAgIGNhbmRTQUQsIHJlZlNBRCA9IDA7Ci0gICAgT01YX0lOVCAgICAgbWluU0FELCBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOwotICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCi0gICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmQnVmOwotICAgIE9NWF9VOCB0ZW1wUGVsOwotICAgICAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTZWFyY2hQb2ludFJlZlBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgcFRlbXBTcmNSZWZCdWYgPSBwU3JjUmVmQnVmICsgKHJlZldpZHRoICogKHBTcmNEc3RNVi0+ZHkvMikpICsgKHBTcmNEc3RNVi0+ZHgvMik7Ci0KLSAgICAvKiBDb3B5IHRoZSBjYW5kaWRhdGUgdG8gdGhlIHRlbXBvcmFyeSBsaW5lYXIgYXJyYXkgKi8KLSAgICBmb3IgKG91dGVyID0gMCwgY291bnQgPSAwLGluZGV4ID0gMDsKLSAgICAgICAgIG91dGVyIDwgQmxvY2tTaXplOwotICAgICAgICAgb3V0ZXIrKywgaW5kZXggKz0gcmVmV2lkdGggLSBCbG9ja1NpemUpCi0gICAgewotICAgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBCbG9ja1NpemU7IGlubmVyKyssIGNvdW50KyssIGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZlNBRCArPSBhcm1BYnMgKHBUZW1wU3JjUmVmQnVmW2luZGV4XSAtIHBTcmNDdXJyQnVmW2NvdW50XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIG1pblNhZCBhcyByZWZlcmVuY2UgU0FEICovCi0gICAgbWluU0FEID0gcmVmU0FEOwotICAgICpwRHN0U0FEID0gcmVmU0FEOwotCi0gICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLwotICAgIGZyb21YID0gMTsKLSAgICB0b1ggICA9IDE7Ci0gICAgZnJvbVkgPSAxOwotICAgIHRvWSAgID0gMTsKLSAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eCAtIDEpIDwgcFJlZlJlY3QtPngpCi0gICAgewotICAgICAgICBmcm9tWCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnggKyBCbG9ja1NpemUgKyAxKSA+IChwUmVmUmVjdC0+eCArIHBSZWZSZWN0LT53aWR0aCkpCi0gICAgewotICAgICAgICB0b1ggICA9IDA7Ci0gICAgfQotCi0gICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnkgLSAxKSA8IHBSZWZSZWN0LT55KQotICAgIHsKLSAgICAgICAgZnJvbVkgPSAwOwotICAgIH0KLQotICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT55ICsgQmxvY2tTaXplICsgMSkgPiAocFJlZlJlY3QtPnkgKyBwUmVmUmVjdC0+aGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIHRvWSAgID0gMDsKLSAgICB9Ci0KLSAgICAvKiBMb29waW5nIG9uIHktIGF4aXMgKi8KLSAgICBmb3IgKHkgPSAtZnJvbVk7IHkgPD0gdG9ZOyB5KyspCi0gICAgewotICAgICAgICAvKiBMb29waW5nIG9uIHgtIGF4aXMgKi8KLSAgICAgICAgZm9yICh4ID0gLWZyb21YOyB4IDw9IHRvWDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjaGVjayBmb3IgaW50ZWdlciBwb3NpdGlvbiAqLwotICAgICAgICAgICAgaWYgKCB4ID09IDAgJiYgeSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChyZWZXaWR0aCAqIChwU3JjRHN0TVYtPmR5LzIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChwU3JjRHN0TVYtPmR4LzIpOwotCi0gICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB0aGUgcGl4ZWwgYW5kIGNhbGN1bGF0ZSB0aGUgU0FEKi8KLSAgICAgICAgICAgIGZvciAob3V0ZXIgPSAwLCBjb3VudCA9IDAsIGNhbmRTQUQgPSAwLGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgb3V0ZXIgPCBCbG9ja1NpemU7Ci0gICAgICAgICAgICAgICAgIG91dGVyKyssIGluZGV4ICs9IHJlZldpZHRoIC0gQmxvY2tTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IEJsb2NrU2l6ZTsgaW5uZXIrKywgY291bnQrKyxpbmRleCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFBlbCA9ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZCdWZbaW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFRlbXBTcmNSZWZCdWZbaW5kZXggKyB4XSAqIGFybUFicyh4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBUZW1wU3JjUmVmQnVmW2luZGV4ICsgcmVmV2lkdGggKiB5XSAqIGFybUFicyh5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBUZW1wU3JjUmVmQnVmW2luZGV4ICsgcmVmV2lkdGggKiB5ICsgeF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFybUFicyh4KnkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJtQWJzICh4KSArIGFybUFicyAoeSkgLSBybmRWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyAoMiAqIChhcm1BYnMgKHgpICsgYXJtQWJzICh5KSkpOwotICAgICAgICAgICAgICAgICAgICBjYW5kU0FEICs9IGFybUFicyAodGVtcFBlbCAtIHBTcmNDdXJyQnVmW2NvdW50XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCi0gICAgICAgICAgICBpZiAoYXJtVkNNNFAyX0NvbXBhcmVNViAoeCwgeSwgY2FuZFNBRCwgaGFsZlBlbFgsIGhhbGZQZWxZLCBtaW5TQUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwRHN0U0FEID0gY2FuZFNBRDsKLSAgICAgICAgICAgICAgICBtaW5TQUQgICA9IGNhbmRTQUQ7Ci0gICAgICAgICAgICAgICAgaGFsZlBlbFggPSB4OwotICAgICAgICAgICAgICAgIGhhbGZQZWxZID0geTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICBwU3JjRHN0TVYtPmR4ICs9IGhhbGZQZWxYOwotICAgIHBTcmNEc3RNVi0+ZHkgKz0gaGFsZlBlbFk7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwNTY2MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKLSAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKLSAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKLSAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCi0gKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKLSAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCi0gKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAotICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00Ci0gKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCi0gKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKLSAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgotICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCi0gKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKLSAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KLSAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pCi17Ci0KLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLQotICAgIE9NWF9JTlQgICAgIG91dGVyLCBpbm5lciwgY291bnQsaW5kZXg7Ci0gICAgT01YX0lOVCAgICAgY2FuZFNBRDsKLSAgICAvKigyNTYqMjU2ICsxKSB0aGlzIGlzIHRvIG1ha2UgdGhlIFNBRCBtYXggaW5pdGlhbGx5Ki8KLSAgICBPTVhfSU5UICAgICBtaW5TQUQgPSAweDEwMDAxLCBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOwotICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCi0gICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmQnVmOwotICAgIE9NWF9TMTYgICAgIHgsIHk7Ci0gICAgT01YX0lOVCBzZWFyY2hSYW5nZTsKLSAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE1FU3BlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgCi0gICAgc2VhcmNoUmFuZ2UgPSAoKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYyktPnNlYXJjaFJhbmdlOwotICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8KLSAgICBmcm9tWCA9IHNlYXJjaFJhbmdlOwotICAgIHRvWCAgID0gc2VhcmNoUmFuZ2U7Ci0gICAgZnJvbVkgPSBzZWFyY2hSYW5nZTsKLSAgICB0b1kgICA9IHNlYXJjaFJhbmdlOwotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT54IC0gc2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPngpCi0gICAgewotICAgICAgICBmcm9tWCA9ICBwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPng7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT54ICsgQmxvY2tTaXplICsgc2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKLSAgICB7Ci0gICAgICAgIHRvWCAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eCkgLSBCbG9ja1NpemU7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT55IC0gc2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPnkpCi0gICAgewotICAgICAgICBmcm9tWSA9IHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eTsKLSAgICB9Ci0KLSAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgKyBCbG9ja1NpemUgKyBzZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnkgKyBwUmVmUmVjdC0+aGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIHRvWSAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eSkgLSBCbG9ja1NpemU7Ci0gICAgfQotCi0gICAgcERzdE1WLT5keCA9IC1mcm9tWDsKLSAgICBwRHN0TVYtPmR5ID0gLWZyb21ZOwotICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLwotICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKLSAgICB7Ci0KLSAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCi0gICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChyZWZXaWR0aCAqIHkpICsgeDsKLQotICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBTQUQgKi8KLSAgICAgICAgICAgIGZvciAob3V0ZXIgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMCwgY2FuZFNBRCA9IDA7Ci0gICAgICAgICAgICAgICAgIG91dGVyIDwgQmxvY2tTaXplOwotICAgICAgICAgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBCbG9ja1NpemU7IGlubmVyKyssIGNvdW50KyssIGluZGV4KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYW5kU0FEICs9IGFybUFicyAocFRlbXBTcmNSZWZCdWZbaW5kZXhdIC0gcFNyY0N1cnJCdWZbY291bnRdKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLwotICAgICAgICAgICAgaWYgKGFybVZDTTRQMl9Db21wYXJlTVYgKHgsIHksIGNhbmRTQUQsIHBEc3RNVi0+ZHgvMiwgcERzdE1WLT5keS8yLCBtaW5TQUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwRHN0U0FEID0gY2FuZFNBRDsKLSAgICAgICAgICAgICAgICBtaW5TQUQgICA9IGNhbmRTQUQ7Ci0gICAgICAgICAgICAgICAgcERzdE1WLT5keCA9IHgqMjsKLSAgICAgICAgICAgICAgICBwRHN0TVYtPmR5ID0geSoyOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KLSAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTUxMGU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBlc2NhcGUgbW9kZSBjaGVjayAKLSAqCi0gKi8gCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAKLSAqIFJldHVybiBWYWx1ZToKLSAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCi0gKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKLSAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMwotICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgotICoKLSAqLwotCi1PTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgT01YX1UzMiBydW4sCi0gICAgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgT01YX1MxNiBsZXZlbCwKLSAgICAgT01YX1MxNiBsZXZlbFBsdXMsCi0gICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCi0gICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCi0pCi17Ci0gICAgT01YX1U4IGVzY2FwZSA9IDAsIGZNb2RlID0gMCwgZW50cmllczsKLSAgICAKLSAgICBsZXZlbCA9IGFybUFicyAobGV2ZWwpOwotICAgIGxldmVsUGx1cyA9IGFybUFicyAobGV2ZWxQbHVzKTsKLSAgICAKLSAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSB3aXRoIHJ1biwgbGV2ZWwgYW5kIExhc3QgY29tYmluYXRpb24gCi0gICAgICAgTW9kZSAwIGNoZWNrICovCi0gICAgaWYgKHJ1biA8PSBtYXhTdG9yZVJ1bikKLSAgICB7Ci0gICAgICAgIGVudHJpZXMgPSBwUnVuSW5kZXhUYWJsZVtydW4gKyAxXQotICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5dOwotICAgICAgICBpZiAocnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyaWVzID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGV2ZWwgPiBlbnRyaWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlc2NhcGUgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVzY2FwZSA9IDE7Ci0gICAgfQotICAgIGlmKGVzY2FwZSAmJiBzaG9ydFZpZGVvSGVhZGVyKQotICAgIHsKLSAgICAgICAgZXNjYXBlID0gMDsKLSAgICAgICAgZk1vZGUgPSA0OwotICAgIH0KLSAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSB3aXRoIHJ1biwgbGV2ZWxQbHVzIGFuZCBMYXN0IGNvbWJpbmF0aW9uIAotICAgICAgIE1vZGUgMSBjaGVjayAqLyAgICAKLSAgICBpZiAoZXNjYXBlKQotICAgIHsKLSAgICAgICAgZXNjYXBlID0gMDsKLSAgICAgICAgZk1vZGUgPSAxOwotICAgICAgICBpZiAocnVuIDw9IG1heFN0b3JlUnVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuICsgMV0KLSAgICAgICAgICAgICAgICAgICAgICAtIHBSdW5JbmRleFRhYmxlW3J1bl07Ci0gICAgICAgICAgICBpZiAocnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJpZXMgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxldmVsUGx1cyA+IGVudHJpZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXNjYXBlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVzY2FwZSA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW5QbHVzLCBsZXZlbCBhbmQgTGFzdCBjb21iaW5hdGlvbiAKLSAgICAgICBNb2RlIDIgY2hlY2sgKi8gICAgCi0gICAgaWYgKGVzY2FwZSkKLSAgICB7Ci0gICAgICAgIGVzY2FwZSA9IDA7Ci0gICAgICAgIGZNb2RlID0gMjsKLSAgICAgICAgaWYgKHJ1blBsdXMgPD0gbWF4U3RvcmVSdW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJpZXMgPSBwUnVuSW5kZXhUYWJsZVtydW5QbHVzICsgMV0KLSAgICAgICAgICAgICAgICAgICAgICAtIHBSdW5JbmRleFRhYmxlW3J1blBsdXNdOwotICAgICAgICAgICAgaWYgKHJ1blBsdXMgPiBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cmllcyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGV2ZWwgPiBlbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVzY2FwZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlc2NhcGUgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIHNlbGVjdCBtb2RlIDMgLS0+IEZMQyAqLwotICAgIGlmIChlc2NhcGUpCi0gICAgewotICAgICAgICBmTW9kZSA9IDM7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmTW9kZTsKLX0KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ29tcGFyZU1WLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjIxYTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ29tcGFyZU1WLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NvbXBhcmVNVi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBjb21wYXJpbmcgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSAKLSAqIHRoZSBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKi8KLSAgCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ29tcGFyZU1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIHRoZSAKLSAqIGJlc3QgTVYgYW5kIFNBRAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgIG12WAkJeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXQkgICAgbXZZCQl5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dCSAgICBjYW5kU0FECUNhbmRpZGF0ZSBTQUQKLSAqIFtpbl0JICAgIGJlc3RNVlgJeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0JICAgIGJlc3RNVlkJeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0JICAgIGJlc3RTQUQJYmVzdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QgCi0gKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECi0gKi8KLQotT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKLSAgICBPTVhfUzE2IG12WCwgCi0gICAgT01YX1MxNiBtdlksIAotICAgIE9NWF9JTlQgY2FuZFNBRCwgCi0gICAgT01YX1MxNiBiZXN0TVZYLCAKLSAgICBPTVhfUzE2IGJlc3RNVlksIAotICAgIE9NWF9JTlQgYmVzdFNBRAotKSAKLXsKLSAgICBpZiAoY2FuZFNBRCA8IGJlc3RTQUQpCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGNhbmRTQUQgPiBiZXN0U0FEKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIHNob3J0ZXIgbW90aW9uIHZlY3RvciAqLwotICAgIGlmICggKG12WCAqIG12WCArIG12WSAqIG12WSkgPCAoYmVzdE1WWCpiZXN0TVZYK2Jlc3RNVlkqYmVzdE1WWSkgKQotICAgIHsKLSAgICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA1NWQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RDVF9UYWJsZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9EQ1RfVGFibGUuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBEQ1QvSURDVCBjb2VmZmljZW50IG1hdHJpeAotICoKLSAqLwotCi0jaWZuZGVmIF9PTVhEQ1RDT1NUQUJfQ18KLSNkZWZpbmUgX09NWERDVENPU1RBQl9DXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotY29uc3QgT01YX0Y2NCBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1s4XVs4XSA9Ci17Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUyMjAsIAotICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMzcwLCAKLSAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjYyMCwgCi0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3OTAsIAotICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAxMTQwLCAKLSAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NDkyMCwgCi0gICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQxNTIgCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAotICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0OTIwLCAKLSAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQwOTYsIAotICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKLSAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDM0MjAsIAotICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMTA5MAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAxMTQwLCAKLSAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDQ4NjAsIAotICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCi0gICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczODQwLCAKLSAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDEzOCwgCi0gICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMyNjAsIAotICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNzMwIAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0MTUyLCAKLSAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDMzNzAsIAotICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMTA5MCwgCi0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM2ODAsIAotICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNzMwLCAKLSAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDQ5MjAsIAotICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTMzMAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDA5NiwgCi0gICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzNDIwLCAKLSAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMDkyMCwgCi0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM4NDAsIAotICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjYyMCwgCi0gICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ1MjgwLCAKLSAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDA5ODAsIAotICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NTE3MCwgCi0gICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUyMjAsIAotICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzM0MCwgCi0gICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0MDEzLCAKLSAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzM3MCwgCi0gICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNTEwCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjcwLCAKLSAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NTAwMCwgCi0gICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQzODgsIAotICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzYyMCwgCi0gICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUzMzAsIAotICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzIwMCwgCi0gICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDA3NjAgCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKLSAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzI2MCwgCi0gICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzI5MCwgCi0gICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAwNzYwLCAKLSAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NDc4MCwgCi0gICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0Mjc3Ci0gICAgICAgIH0KLX07Ci0KLSNlbmRpZiAvKl9PTVhEQ1RDT1NUQUJfQ18qLwotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhYTE5OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyCi0gKgotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCi0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KLSAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhfVTggIHN0YXJ0Ci0pCi17Ci0gICAgT01YX1U4ICBsYXN0ID0gMDsKLSAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgPiAyKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgc3dpdGNoIChwcmVkRGlyKQotICAgIHsKLSAgICAgICAgY2FzZSBPTVhfVkNfTk9ORToKLSAgICAgICAgewotICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9WQ19IT1JJWk9OVEFMOgotICAgICAgICB7Ci0gICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfVkNfVkVSVElDQUw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfR2V0VkxDQml0cyAoCi0gICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotCQkJICBwRHN0LAotCQkJICBzaG9ydFZpZGVvSGVhZGVyLAotCQkJICBzdGFydCwKLQkJCSAgJmxhc3QsCi0JCQkgIDEwLAotCQkJICA2MiwKLQkJCSAgIDcsCi0JCQkgIDIxLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDAsCi0JCQkgIGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMUxNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUk1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFSTUFYLAotICAgICAgICAgICAgICBwWmlnemFnVGFibGUgKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICBpZiAobGFzdCA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE9NWF9TdHNfRXJyOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxYzU0Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKLSAqIGZvciBpbnRyYSBibG9jay4KLSAqCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KLSAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWF9VOCBzdGFydAotKQotewotICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBRRGN0QmxrQ29lZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHN0YXJ0ID4gMSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWREaXIgPiAyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBpZiAocGF0dGVybikKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocHJlZERpcikKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBPTVhfVkNfTk9ORToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgT01YX1ZDX0hPUklaT05UQUw6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgT01YX1ZDX1ZFUlRJQ0FMOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGVycm9yQ29kZSA9IGFybVZDTTRQMl9QdXRWTENCaXRzICgKLSAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIHBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgc3RhcnQsCi0gICAgICAgICAgICAgIDE0LAotICAgICAgICAgICAgICAyMCwKLSAgICAgICAgICAgICAgOSwKLSAgICAgICAgICAgICAgNiwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwLAotCQkJICBhcm1WQ000UDJfSW50cmFMMVJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDEsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxUk1BWCwKLSAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlCi0gICAgICAgICk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgICAgICAKLSAgICB9IC8qIFBhdHRlcm4gY2hlY2sgZW5kcyovCi0KLSAgICByZXR1cm4gKE9NWF9TdHNfTm9FcnIpOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjc3MTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBwdXR0aW5nIFZMQyBiaXRzCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKLSAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0gKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCi0JCQkgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAotICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAotCQkJICBPTVhfVTggIGxhc3QsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCi0pCi17Ci0gICAgT01YX0lOVCB0ZW1wSW5kZXg7Ci0JT01YX1UzMiB0ZW1wUnVuID0gcnVuLCBzaWduID0gMDsKLSAgICBPTVhfUzE2IHRlbXBMZXZlbCA9IGxldmVsOyAKLSAgICAKLSAgICAvKiBFc2NhcGUgc2VxdWVuY2UgYWRkaXRpb24gKi8KLSAgICBpZiAoZk1vZGUgPT0gMSkKLSAgICB7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDAsIDEpOwotCQl0ZW1wTGV2ZWwgPSBsZXZlbFBsdXM7Ci0KLSAgICB9Ci0gICAgZWxzZSBpZihmTW9kZSA9PSAyKQotICAgIHsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOwotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMiwgMik7Ci0JCXRlbXBSdW4gPSBydW5QbHVzOwotICAgIH0KLSAgICBlbHNlIGlmIChmTW9kZSA9PSAzKQotICAgIHsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOwotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgMik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGZNb2RlID09IDQpCi0gICAgewotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilsYXN0LCAxKTsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHRlbXBSdW4sIDYpOwotCQlpZigodGVtcExldmVsICE9IDApICYmICh0ZW1wTGV2ZWwgIT0gLTEyOCkpCi0JCXsKLQkJICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotCQkJICAgKE9NWF9VMzIpIHRlbXBMZXZlbCwgOCk7Ci0JCX0KLQkJcmV0dXJuIE9NWF9TdHNfTm9FcnI7CQkKLSAgICB9Ci0gICAgCi0gICAgaWYgKHRlbXBMZXZlbCA8IDApCi0gICAgewotICAgICAgICBzaWduID0gMTsKLSAgICAgICAgdGVtcExldmVsID0gYXJtQWJzKHRlbXBMZXZlbCk7Ci0gICAgfQotICAgIC8qIFB1dHRpbmcgVkxDIGJpdHMgaW4gdGhlIHN0cmVhbSAqLwotCWlmIChmTW9kZSA8IDMpCi0JewotCQlpZiAodGVtcFJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKLQkJewotCQkJdGVtcEluZGV4ID0gcFJ1bkluZGV4VGFibGUgW21heFJ1bkZvck11bHRpcGxlRW50cmllcyArIDFdICsgCi0JCQkJCQkodGVtcFJ1biAtIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAtIDEpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJdGVtcEluZGV4ID0gcFJ1bkluZGV4VGFibGUgW3RlbXBSdW5dICsgKHRlbXBMZXZlbCAtMSk7Ci0JCX0KLSAgICAKLQkJYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLQkJCQkJICBwVmxjVGFibGUgW3RlbXBJbmRleF0pOwotCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpc2lnbiwgMSk7Ci0JfQotICAgIGVsc2UKLQl7Ci0JCWlmIChzaWduKQotCQl7Ci0JCQl0ZW1wTGV2ZWwgPSAtdGVtcExldmVsOwotCQl9Ci0JCXRlbXBSdW4gID0gcnVuOwotCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpbGFzdCwgMSk7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCB0ZW1wUnVuLCA2KTsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEsIDEpOwotCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLQkJCSAgIChPTVhfVTMyKSB0ZW1wTGV2ZWwsIDEyKTsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEsIDEpOwotCX0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5ZjVkNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIGdldCBiaXRzIGZyb20gdGhlIHN0cmVhbSAKLSAqCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAotICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKLSAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQotICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAotICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4Ci0gKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKLSAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCi0gKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotICAgIE9NWF9VMzIgc3RvcmVSdW4sCi0gICAgT01YX1MxNiAqIHBEc3QsCi0gICAgT01YX1MxNiBzdG9yZUxldmVsLAotICAgIE9NWF9VOCAgc2lnbiwKLSAgICBPTVhfVTggIGxhc3QsCi0gICAgT01YX1U4ICAqIHBJbmRleCwKLSAgICBjb25zdCBPTVhfVTggKiBwWmlnemFnVGFibGUKLSkKLXsKLSAgICAvKiBTdG9yZSB0aGUgemVybydzIGFzIHBlciB0aGUgcnVuIGxlbmd0aCBjb3VudCAqLwotICAgIGZvciAoO3N0b3JlUnVuID4gMDsgc3RvcmVSdW4tLSwgKCpwSW5kZXgpKyspCi0gICAgewotICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSAwOwotICAgIH0KLSAgICAvKiBTdG9yZSB0aGUgbGV2ZWwgZGVwZW5kaW5nIG9uIHRoZSBzaWduKi8KLSAgICBpZiAoc2lnbiA9PSAxKQotICAgIHsKLSAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gLXN0b3JlTGV2ZWw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IHN0b3JlTGV2ZWw7Ci0gICAgfQotICAgICgqcEluZGV4KSsrOwotCi0gICAgLyogSWYgbGFzdCBpcyAxLCBmaWxsIHRoZSByZW1haW5pbmcgZWxtZW50cyBvZiB0aGUgYnVmZmVyIHdpdGggemVyb3MgKi8KLSAgICBpZiAobGFzdCA9PSAxKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCpwSW5kZXggPCA2NCkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gMDsKLSAgICAgICAgICAgICgqcEluZGV4KSsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViMTQxMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9HZXRWTENCaXRzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBnZXQgYml0cyBmcm9tIHRoZSBzdHJlYW0gCi0gKgotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0KLSAKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9HZXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW4vb3V0XSBwTGFzdCAgICAgICBwb2ludGVyIHRvIGxhc3Qgc3RhdHVzIGZsYWcKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAwCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMQotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwwICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBWbGNUYWJsZUwwICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMSAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSBwVmxjVGFibGVMMSAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBMTUFYVGFibGVMMCAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcExNQVhUYWJsZUwxICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSBwUk1BWFRhYmxlTDAgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUk1BWFRhYmxlTDEgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF1wRHN0CQkJICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKgkJCQkJCQlibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfR2V0VkxDQml0cyAoCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLQkJCSAgT01YX1MxNiAqIHBEc3QsCi0JCQkgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLQkJCSAgT01YX1U4ICAgIHN0YXJ0LAkJCSAgCi0JCQkgIE9NWF9VOCAgKiBwTGFzdCwKLQkJCSAgT01YX1U4ICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0JCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSkKLXsKLSAgICBPTVhfVTMyIHN0b3JlUnVuOwotICAgIE9NWF9VOCAgdGFiSW5kZXgsIG1hcmtlckJpdDsKLSAgICBPTVhfUzE2IHN0b3JlTGV2ZWw7Ci0gICAgT01YX1UxNiB1bnBhY2tSZXRJbmRleDsKLQlPTVhfVTggIGksIGZUeXBlLCBlc2NhcGU7CQotCU9NWF9VOCAgc2lnbiA9IDA7Ci0JCi0JLyogVW5wYWNraW5nIHRoZSBiaXRzdHJlYW0gYW5kIFJMRCAqLwotICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgNjQ7KQotICAgIHsKLQkJZXNjYXBlID0gYXJtTG9va0FoZWFkQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNyk7Ci0JCWlmIChlc2NhcGUgIT0gMykKLQkJewkKLQkJCWZUeXBlID0gMDsgLyogTm90IGluIGVzY2FwZSBtb2RlICovCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlhcm1Ta2lwQml0cyAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDcpOwotCQkJaWYoc2hvcnRWaWRlb0hlYWRlcikKLQkJCXsKLQkJCSAgKnBMYXN0ID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7Ci0JCQkgIHN0b3JlUnVuID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNik7Ci0JCQkgIHN0b3JlTGV2ZWwgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA4KTsKLQkJCSAgCi0JCQkgIC8qIFJlZiB0byBUYWJsZSBCLTE4IChjKSBpbiBNUEVHNCBTdGFuZGFyZC0gRkxDIGNvZGUgZm9yICAqLwotCQkJICAvKiBMRVZFTCB3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAxLCB0aGUgc3RvcmVMZXZlbCBpcyAgKi8KLQkJCSAgLyogYSBzaWduZWQgdmFsdWUgYW5kIHRoZSBzaWduIGFuZCB0aGUgdW5zaWduZWQgdmFsdWUgZm9yICovCi0JCQkgIC8qIHN0b3JlTGV2ZWwgbmVlZCB0byBiZSBleHRyYWN0ZWQgYW5kIHBhc3NlZCB0byBhcm0gICAgICAqLwotCQkJICAvKiBGaWxsVkxEQnVmZmVyIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgICAgCi0JCQkgIHNpZ24gPSAoc3RvcmVMZXZlbCAmIDB4ODApOwotCQkJICBpZihzaWduPT0weDgwKQotCQkJICB7Ci0JCQkgIAlzdG9yZUxldmVsPShzdG9yZUxldmVsXjB4ZmYpKzE7CQkJICAKLQkJCSAgCXNpZ249MTsKLQkJCSAgCQotCQkJICB9Ci0JCQkgIAotCQkJICBhcm1SZXREYXRhRXJySWYoIHN0b3JlTGV2ZWwgPT0gMCB8fCBzaWduKnN0b3JlTGV2ZWwgPT0gMTI4ICwgT01YX1N0c19FcnIpOyAvKiBJbnZhbGlkIEZMQyAqLwotCQkJICBhcm1SZXREYXRhRXJySWYoKGkgKyBzdG9yZVJ1bikgPj0gNjQsIE9NWF9TdHNfRXJyKTsKLQkJCSAgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0JCQkgICAgc3RvcmVSdW4sCi0JCQkgICAgcERzdCwKLQkJCSAgICBzdG9yZUxldmVsLAotCQkJICAgIHNpZ24sCi0JCQkgICAgKnBMYXN0LAotCQkJICAgICZpLAotCQkJICAgIHBaaWd6YWdUYWJsZSk7Ci0JCQkgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0JCQkgICAgCi0JCQl9Ci0JCQlpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSkpCi0JCQl7Ci0JCQkJaWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpKQotCQkJCXsKLQkJCQkJZlR5cGUgPSAzOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlmVHlwZSA9IDI7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZUeXBlID0gMTsKLQkJCX0KLQkJfQotCi0JICAgIGlmIChmVHlwZSA8IDMpCi0JICAgIHsKLQkgICAgICAgIHVucGFja1JldEluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0JCQkJCQkJCQkJcFZsY1RhYmxlTDApOwotCQkJaWYgKHVucGFja1JldEluZGV4ICE9IEFSTV9OT19DT0RFQk9PS19JTkRFWCkKLQkJICAgIHsKLQkJCSAgICAvKiBEZWNvZGUgcnVuIGFuZCBsZXZlbCBmcm9tIHRoZSBpbmRleCAqLwotCQkJICAgIC8qIGxhc3QgPSAwICovCi0JCQkgICAgKnBMYXN0ID0gMDsKLQkJCSAgICBpZiAodW5wYWNrUmV0SW5kZXggPiBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwKQotCQkJICAgIHsKLQkJCQkgICAgc3RvcmVMZXZlbCA9IDE7Ci0JCQkJICAgIHN0b3JlUnVuID0gKHVucGFja1JldEluZGV4IC0gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCkgCi0JCQkJCQkJKyBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwOwotCQkJICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgewotCQkJCSAgICB0YWJJbmRleCA9IDE7Ci0JCQkJICAgIHdoaWxlIChwUnVuSW5kZXhUYWJsZUwwW3RhYkluZGV4XSA8PSB1bnBhY2tSZXRJbmRleCkKLQkJCQkgICAgewotCQkJCQkgICAgdGFiSW5kZXgrKzsKLQkJCQkgICAgfQotCQkJCSAgICBzdG9yZVJ1biA9IHRhYkluZGV4IC0gMTsKLQkJCQkgICAgc3RvcmVMZXZlbCA9IHVucGFja1JldEluZGV4IC0gcFJ1bkluZGV4VGFibGVMMFt0YWJJbmRleCAtIDFdICsgMTsKLQkJCSAgICB9Ci0JCQkgICAgc2lnbiA9IChPTVhfVTgpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCQkJCi0JCQkgICAgaWYgKGZUeXBlID09IDEpCi0JCQkgICAgewotCQkJCSAgICBzdG9yZUxldmVsID0gKGFybUFicyhzdG9yZUxldmVsKSArIHBMTUFYVGFibGVMMFtzdG9yZVJ1bl0pOwotCQkJICAgIH0KLQkJCSAgICBlbHNlIGlmIChmVHlwZSA9PSAyKQotCQkJICAgIHsKLQkJCQkgICAgc3RvcmVSdW4gPSBzdG9yZVJ1biArIHBSTUFYVGFibGVMMFtzdG9yZUxldmVsLTFdICsgMTsKLQkJCSAgICB9Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICB7Ci0JCQkgICAgdW5wYWNrUmV0SW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCi0JCQkJCQkJCQkJCXBWbGNUYWJsZUwxKTsKLQotCQkJICAgIGFybVJldERhdGFFcnJJZih1bnBhY2tSZXRJbmRleCA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKLQotCQkJICAgIC8qIERlY29kZSBydW4gYW5kIGxldmVsIGZyb20gdGhlIGluZGV4ICovCi0JCQkgICAgLyogbGFzdCA9IDEgKi8KLQkJCSAgICAqcExhc3QgPSAxOwotCQkJICAgIGlmICh1bnBhY2tSZXRJbmRleCA+IG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEpCi0JCQkgICAgewotCQkJCSAgICBzdG9yZUxldmVsID0gMTsKLQkJCQkgICAgc3RvcmVSdW4gPSAodW5wYWNrUmV0SW5kZXggLSBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxKSAKLQkJCQkJCQkrIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxOwotCQkgICAgICAgIH0KLQkJICAgICAgICBlbHNlCi0JCQkgICAgewotCQkJCSAgICB0YWJJbmRleCA9IDE7Ci0JCQkJICAgIHdoaWxlIChwUnVuSW5kZXhUYWJsZUwxW3RhYkluZGV4XSA8PSB1bnBhY2tSZXRJbmRleCkKLQkJCQkgICAgewotCQkJCQkgICAgdGFiSW5kZXgrKzsKLQkJCQkgICAgfQotCQkJCSAgICBzdG9yZVJ1biA9IHRhYkluZGV4IC0gMTsKLQkJCQkgICAgc3RvcmVMZXZlbCA9IHVucGFja1JldEluZGV4IC0gcFJ1bkluZGV4VGFibGVMMVt0YWJJbmRleCAtIDFdICsgMTsKLQkJCSAgICB9Ci0JCQkgICAgc2lnbiA9IChPTVhfVTgpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCi0JCQkgICAgaWYgKGZUeXBlID09IDEpCi0JCQkgICAgewotCQkJICAgICAgICBzdG9yZUxldmVsID0gKGFybUFicyhzdG9yZUxldmVsKSArIHBMTUFYVGFibGVMMVtzdG9yZVJ1bl0pOwkJCQkKLQkJCSAgICB9Ci0JCQkgICAgZWxzZSBpZiAoZlR5cGUgPT0gMikKLQkJCSAgICB7Ci0JCQkJICAgIHN0b3JlUnVuID0gc3RvcmVSdW4gKyBwUk1BWFRhYmxlTDFbc3RvcmVMZXZlbC0xXSArIDE7Ci0JCQkgICAgfQotCQkgICAgfQotICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKChpICsgc3RvcmVSdW4pID49IDY0LCBPTVhfU3RzX0Vycik7Ci0JCSAgICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKLQkJCSAgICBzdG9yZVJ1biwKLQkJCSAgICBwRHN0LAotCQkJICAgIHN0b3JlTGV2ZWwsCi0JCQkgICAgc2lnbiwKLQkJCSAgICAqcExhc3QsCi0JCQkgICAgJmksCi0JCQkgICAgcFppZ3phZ1RhYmxlKTsJCQotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQkgICAgKnBMYXN0ID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7Ci0JCSAgICBzdG9yZVJ1biAgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA2KTsKLQkJICAgIGFybVJldERhdGFFcnJJZigoaSArIHN0b3JlUnVuKSA+PSA2NCwgT01YX1N0c19FcnIpOwotCQkgICAgbWFya2VyQml0ID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7Ci0JCSAgICBhcm1SZXREYXRhRXJySWYoIG1hcmtlckJpdCA9PSAwLCBPTVhfU3RzX0Vycik7Ci0JCSAgICBzdG9yZUxldmVsICA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEyKTsKLQkJICAgIGlmIChzdG9yZUxldmVsICYgMHg4MDApCi0JCSAgICB7Ci0JCQkgICAgc3RvcmVMZXZlbCAtPSA0MDk2OwotCQkgICAgfQkJCQotCQkgICAgYXJtUmV0RGF0YUVycklmKCBzdG9yZUxldmVsID09IDAgfHwgc3RvcmVMZXZlbCA9PSAtMjA0OCAsIE9NWF9TdHNfRXJyKTsgLyogSW52YWxpZCBGTEMgKi8KLQkJICAgIGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCQkgICAgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0JCQkgICAgc3RvcmVSdW4sCi0JCQkgICAgcERzdCwKLQkJCSAgICBzdG9yZUxldmVsLAotCQkJICAgIDAsIC8qIFNpZ24gaXMgbm90IHVzZWQsIHByZXByb2Nlc3NpbmcgZG9uZSAqLwotCQkJICAgICpwTGFzdCwKLQkJCSAgICAmaSwKLQkJCSAgICBwWmlnemFnVGFibGUpOwotCi0JICAgIH0KLSAgICB9IC8qIEVuZCBvZiBmb3Jsb29wIGZvciBpICovCi0JcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBGaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDFkNDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBIdWZmbWFuIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyogCi0qICBGb3IgSW50cmEKLSogIGxhc3QgPSAwIAotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJ1bklkeFsxMV0gPSAKLXsgCi0gICAgMCwgMjcsIDM3LCA0MiwgNDYsIDQ5LCA1MiwgCi0gICAgNTUsIDU4LCA2MCwgNjIKLX07Ci0KLS8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCi0qICBmb3IgcnVuID0gMCB0byAxNAotKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCi0qLwotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wwWzY4XSA9IAotewotICAgICAgICB7MiwgICAgMn0sCi0gICAgICAgIHszLCAgICA2fSwKLSAgICAgICAgezQsICAgIDE1fSwKLSAgICAgICAgezUsICAgIDEzfSwKLSAgICAgICAgezUsICAgIDEyfSwKLSAgICAgICAgezYsICAgIDIxfSwKLSAgICAgICAgezYsICAgIDE5fSwKLSAgICAgICAgezYsICAgIDE4fSwKLSAgICAgICAgezcsICAgIDIzfSwKLSAgICAgICAgezgsICAgIDMxfSwKLSAgICAgICAgezgsICAgIDMwfSwKLSAgICAgICAgezgsICAgIDI5fSwKLSAgICAgICAgezksICAgIDM3fSwKLSAgICAgICAgezksICAgIDM2fSwKLSAgICAgICAgezksICAgIDM1fSwKLSAgICAgICAgezksICAgIDMzfSwKLSAgICAgICAgezEwLCAgIDMzfSwKLSAgICAgICAgezEwLCAgIDMyfSwKLSAgICAgICAgezEwLCAgIDE1fSwKLSAgICAgICAgezEwLCAgIDE0fSwKLSAgICAgICAgezExLCAgICA3fSwKLSAgICAgICAgezExLCAgICA2fSwKLSAgICAgICAgezExLCAgIDMyfSwKLSAgICAgICAgezExLCAgIDMzfSwKLSAgICAgICAgezEyLCAgIDgwfSwKLSAgICAgICAgezEyLCAgIDgxfSwKLSAgICAgICAgezEyLCAgIDgyfSwKLSAgICAgICAgezQsICAgIDE0fSwKLSAgICAgICAgezYsICAgIDIwfSwKLSAgICAgICAgezcsICAgIDIyfSwKLSAgICAgICAgezgsICAgIDI4fSwKLSAgICAgICAgezksICAgIDMyfSwKLSAgICAgICAgezksICAgIDMxfSwKLSAgICAgICAgezEwLCAgIDEzfSwKLSAgICAgICAgezExLCAgIDM0fSwKLSAgICAgICAgezEyLCAgIDgzfSwKLSAgICAgICAgezEyLCAgIDg1fSwKLSAgICAgICAgezUsICAgIDExfSwKLSAgICAgICAgezcsICAgIDIxfSwKLSAgICAgICAgezksICAgIDMwfSwKLSAgICAgICAgezEwLCAgIDEyfSwKLSAgICAgICAgezEyLCAgIDg2fSwKLSAgICAgICAgezYsICAgIDE3fSwKLSAgICAgICAgezgsICAgIDI3fSwKLSAgICAgICAgezksICAgIDI5fSwKLSAgICAgICAgezEwLCAgIDExfSwKLSAgICAgICAgezYsICAgIDE2fSwKLSAgICAgICAgezksICAgIDM0fSwKLSAgICAgICAgezEwLCAgIDEwfSwKLSAgICAgICAgezYsICAgIDEzfSwKLSAgICAgICAgezksICAgIDI4fSwKLSAgICAgICAgezEwLCAgICA4fSwKLSAgICAgICAgezcsICAgIDE4fSwKLSAgICAgICAgezksICAgIDI3fSwKLSAgICAgICAgezEyLCAgIDg0fSwKLSAgICAgICAgezcsICAgIDIwfSwKLSAgICAgICAgezksICAgIDI2fSwKLSAgICAgICAgezEyLCAgIDg3fSwKLSAgICAgICAgezgsICAgIDI1fSwKLSAgICAgICAgezEwLCAgICA5fSwKLSAgICAgICAgezgsICAgIDI0fSwKLSAgICAgICAgezExLCAgIDM1fSwKLSAgICAgICAgezgsICAgIDIzfSwKLSAgICAgICAgezksICAgIDI1fSwKLSAgICAgICAgezksICAgIDI0fSwKLSAgICAgICAgezEwLCAgICA3fSwKLSAgICAgICAgezEyLCAgIDg4fSwKLSAgICAgICAgezAsICAgICAwfQotfTsKLQotLyogCi0qICBGb3IgSW50cmEKLSogIGxhc3QgPSAxIAotKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4WzhdID0gCi17Ci0gICAgMCwgIDgsIDExLCAxMywgMTUsIDE3LCAxOSwgMjEKLX07Ci0KLS8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCi0qICBmb3IgcnVuID0gMCB0byAyMAotKiAgKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCi0qLwotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wxWzM2XSA9IAotewotICAgICAgICB7NCwgICAgIDd9LAotICAgICAgICB7NiwgICAgMTJ9LAotICAgICAgICB7OCwgICAgMjJ9LAotICAgICAgICB7OSwgICAgMjN9LAotICAgICAgICB7MTAsICAgIDZ9LAotICAgICAgICB7MTEsICAgIDV9LAotICAgICAgICB7MTEsICAgIDR9LAotICAgICAgICB7MTIsICAgODl9LAotICAgICAgICB7NiwgICAgMTV9LAotICAgICAgICB7OSwgICAgMjJ9LAotICAgICAgICB7MTAsICAgIDV9LAotICAgICAgICB7NiwgICAgMTR9LAotICAgICAgICB7MTAsICAgIDR9LAotICAgICAgICB7NywgICAgMTd9LAotICAgICAgICB7MTEsICAgMzZ9LAotICAgICAgICB7NywgICAgMTZ9LAotICAgICAgICB7MTEsICAgMzd9LAotICAgICAgICB7NywgICAgMTl9LAotICAgICAgICB7MTIsICAgOTB9LAotICAgICAgICB7OCwgICAgMjF9LAotICAgICAgICB7MTIsICAgOTF9LAotICAgICAgICB7OCwgICAgMjB9LAotICAgICAgICB7OCwgICAgMTl9LAotICAgICAgICB7OCwgICAgMjZ9LAotICAgICAgICB7OSwgICAgMjF9LAotICAgICAgICB7OSwgICAgMjB9LAotICAgICAgICB7OSwgICAgMTl9LAotICAgICAgICB7OSwgICAgMTh9LAotICAgICAgICB7OSwgICAgMTd9LAotICAgICAgICB7MTEsICAgMzh9LAotICAgICAgICB7MTEsICAgMzl9LAotICAgICAgICB7MTIsICAgOTJ9LAotICAgICAgICB7MTIsICAgOTN9LAotICAgICAgICB7MTIsICAgOTR9LAotICAgICAgICB7MTIsICAgOTV9LCAgCi0gICAgICAgIHswLCAgICAgMH0KLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMExNQVhbMTVdID0gCi17Ci0gICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAotICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxCi19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFMTUFYWzIxXSA9IAotewotICAgIDgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMQotfTsKLQotLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJNQVhbMjddID0KLXsKLSAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKLSAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMAotfTsKLQotLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMVJNQVhbOF0gPQotewotICAgMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCi19OwotCi0vKiAKLSogIEZvciBJbnRlcgotKiAgbGFzdCA9IDAgCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUnVuSWR4WzEyXSA9IAoteyAKLSAgICAgMCwgIDEyLCAgMTgsICAyMiwgIDI1LCAgMjgsICAKLSAgICAzMSwgIDM0LCAgMzYsICAzOCwgIDQwLCAgNDIKLX07Ci0KLS8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCi0qICBmb3IgcnVuID0gMCB0byAyNgotKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCi0qLwotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wwWzU5XSA9IAotewotICAgICAgICB7MiwgICAgIDJ9LAotICAgICAgICB7NCwgICAgMTV9LAotICAgICAgICB7NiwgICAgMjF9LAotICAgICAgICB7NywgICAgMjN9LAotICAgICAgICB7OCwgICAgMzF9LAotICAgICAgICB7OSwgICAgMzd9LAotICAgICAgICB7OSwgICAgMzZ9LAotICAgICAgICB7MTAsICAgMzN9LAotICAgICAgICB7MTAsICAgMzJ9LAotICAgICAgICB7MTEsICAgIDd9LAotICAgICAgICB7MTEsICAgIDZ9LAotICAgICAgICB7MTEsICAgMzJ9LAotICAgICAgICB7MywgICAgIDZ9LAotICAgICAgICB7NiwgICAgMjB9LAotICAgICAgICB7OCwgICAgMzB9LAotICAgICAgICB7MTAsICAgMTV9LAotICAgICAgICB7MTEsICAgMzN9LAotICAgICAgICB7MTIsICAgODB9LAotICAgICAgICB7NCwgICAgMTR9LAotICAgICAgICB7OCwgICAgMjl9LAotICAgICAgICB7MTAsICAgMTR9LAotICAgICAgICB7MTIsICAgODF9LAotICAgICAgICB7NSwgICAgMTN9LAotICAgICAgICB7OSwgICAgMzV9LAotICAgICAgICB7MTAsICAgMTN9LAotICAgICAgICB7NSwgICAgMTJ9LAotICAgICAgICB7OSwgICAgMzR9LAotICAgICAgICB7MTIsICAgODJ9LAotICAgICAgICB7NSwgICAgMTF9LAotICAgICAgICB7MTAsICAgMTJ9LAotICAgICAgICB7MTIsICAgODN9LAotICAgICAgICB7NiwgICAgMTl9LAotICAgICAgICB7MTAsICAgMTF9LAotICAgICAgICB7MTIsICAgODR9LAotICAgICAgICB7NiwgICAgMTh9LAotICAgICAgICB7MTAsICAgMTB9LAotICAgICAgICB7NiwgICAgMTd9LAotICAgICAgICB7MTAsICAgIDl9LAotICAgICAgICB7NiwgICAgMTZ9LAotICAgICAgICB7MTAsICAgIDh9LAotICAgICAgICB7NywgICAgMjJ9LAotICAgICAgICB7MTIsICAgODV9LAotICAgICAgICB7NywgICAgMjF9LAotICAgICAgICB7NywgICAgMjB9LAotICAgICAgICB7OCwgICAgMjh9LAotICAgICAgICB7OCwgICAgMjd9LAotICAgICAgICB7OSwgICAgMzN9LAotICAgICAgICB7OSwgICAgMzJ9LAotICAgICAgICB7OSwgICAgMzF9LAotICAgICAgICB7OSwgICAgMzB9LAotICAgICAgICB7OSwgICAgMjl9LAotICAgICAgICB7OSwgICAgMjh9LAotICAgICAgICB7OSwgICAgMjd9LAotICAgICAgICB7OSwgICAgMjZ9LAotICAgICAgICB7MTEsICAgMzR9LAotICAgICAgICB7MTEsICAgMzV9LAotICAgICAgICB7MTIsICAgODZ9LAotICAgICAgICB7MTIsICAgODd9LAotICAgICAgICB7MCwgICAgIDB9Ci19OwotIAotCi0vKiAKLSogIEZvciBJbnRyYQotKiAgbGFzdCA9IDEgCi0qLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSdW5JZHhbM10gPSAKLXsKLSAgICAwLCAzLCA1Ci19OwotCi0vKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAotKiAgZm9yIHJ1biA9IDAgdG8gNDAKLSogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZwotKi8KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMVs0NV0gPSAKLXsKLSAgICAgICAgezQsICAgICA3fSwKLSAgICAgICAgezksICAgIDI1fSwKLSAgICAgICAgezExLCAgICA1fSwKLSAgICAgICAgezYsICAgIDE1fSwKLSAgICAgICAgezExLCAgICA0fSwKLSAgICAgICAgezYsICAgIDE0fSwKLSAgICAgICAgezYsICAgIDEzfSwKLSAgICAgICAgezYsICAgIDEyfSwKLSAgICAgICAgezcsICAgIDE5fSwKLSAgICAgICAgezcsICAgIDE4fSwKLSAgICAgICAgezcsICAgIDE3fSwKLSAgICAgICAgezcsICAgIDE2fSwKLSAgICAgICAgezgsICAgIDI2fSwKLSAgICAgICAgezgsICAgIDI1fSwKLSAgICAgICAgezgsICAgIDI0fSwKLSAgICAgICAgezgsICAgIDIzfSwKLSAgICAgICAgezgsICAgIDIyfSwKLSAgICAgICAgezgsICAgIDIxfSwKLSAgICAgICAgezgsICAgIDIwfSwKLSAgICAgICAgezgsICAgIDE5fSwKLSAgICAgICAgezksICAgIDI0fSwKLSAgICAgICAgezksICAgIDIzfSwKLSAgICAgICAgezksICAgIDIyfSwKLSAgICAgICAgezksICAgIDIxfSwKLSAgICAgICAgezksICAgIDIwfSwKLSAgICAgICAgezksICAgIDE5fSwKLSAgICAgICAgezksICAgIDE4fSwKLSAgICAgICAgezksICAgIDE3fSwKLSAgICAgICAgezEwLCAgICA3fSwKLSAgICAgICAgezEwLCAgICA2fSwKLSAgICAgICAgezEwLCAgICA1fSwKLSAgICAgICAgezEwLCAgICA0fSwKLSAgICAgICAgezExLCAgIDM2fSwKLSAgICAgICAgezExLCAgIDM3fSwKLSAgICAgICAgezExLCAgIDM4fSwKLSAgICAgICAgezExLCAgIDM5fSwKLSAgICAgICAgezEyLCAgIDg4fSwKLSAgICAgICAgezEyLCAgIDg5fSwKLSAgICAgICAgezEyLCAgIDkwfSwKLSAgICAgICAgezEyLCAgIDkxfSwKLSAgICAgICAgezEyLCAgIDkyfSwKLSAgICAgICAgezEyLCAgIDkzfSwKLSAgICAgICAgezEyLCAgIDk0fSwKLSAgICAgICAgezEyLCAgIDk1fSwKLSAgICAgICAgeyAwLCAgICAwfQotfTsKLQotLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkqLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTE1BWFsyN10gPSAKLXsKLSAgIDEyLCAgNiwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwgCi0gICAgMiwgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLAotfTsKLQotLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkqLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxTE1BWFs0MV0gPSAKLXsKLSAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIAotfTsKLQotLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJNQVhbMTJdID0gCi17Ci0gICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMAotfTsKLQotLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMVJNQVhbM10gPSAKLXsKLSAgIDQwLCAgMSwgIDAKLX07Ci0KLS8qIAotKiAgRm9yIEludHJhIC0gTHVtaW5hbmNlCi0qLwotCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4WzE0XSA9IAotewotICAgICAgICB7MywgICAgIDN9LAotICAgICAgICB7MiwgICAgIDN9LAotICAgICAgICB7MiwgICAgIDJ9LAotICAgICAgICB7MywgICAgIDJ9LAotICAgICAgICB7MywgICAgIDF9LAotICAgICAgICB7NCwgICAgIDF9LAotICAgICAgICB7NSwgICAgIDF9LAotICAgICAgICB7NiwgICAgIDF9LAotICAgICAgICB7NywgICAgIDF9LAotICAgICAgICB7OCwgICAgIDF9LAotICAgICAgICB7OSwgICAgIDF9LAotICAgICAgICB7MTAsICAgIDF9LAotICAgICAgICB7MTEsICAgIDF9LAotICAgICAgICB7MCwgICAgIDB9Ci19OwotCi0vKiAKLSogIEZvciBJbnRyYSAtIENocm9taW5hbmNlCi0qLwotIAotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzE0XSA9IAotewotICAgICAgICB7MiwgICAgIDN9LAotICAgICAgICB7MiwgICAgIDJ9LAotICAgICAgICB7MiwgICAgIDF9LAotICAgICAgICB7MywgICAgIDF9LAotICAgICAgICB7NCwgICAgIDF9LAotICAgICAgICB7NSwgICAgIDF9LAotICAgICAgICB7NiwgICAgIDF9LAotICAgICAgICB7NywgICAgIDF9LAotICAgICAgICB7OCwgICAgIDF9LAotICAgICAgICB7OSwgICAgIDF9LAotICAgICAgICB7MTAsICAgIDF9LAotICAgICAgICB7MTEsICAgIDF9LAotICAgICAgICB7MTIsICAgIDF9LAotICAgICAgICB7MCwgICAgIDB9Ci19OwotCi0vKiAKLSAqICBNb3Rpb24gdmVjdG9yIGRlY29kaW5nIHRhYmxlCi0gKi8KLSAKLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYVZsY01WRFs2Nl0gPQotewotICAgICAgICB7MTMsICAgICA1fSwKLSAgICAgICAgezEzLCAgICAgN30sCi0gICAgICAgIHsxMiwgICAgIDV9LAotICAgICAgICB7MTIsICAgICA3fSwKLSAgICAgICAgezEyLCAgICAgOX0sCi0gICAgICAgIHsxMiwgICAgMTF9LAotICAgICAgICB7MTIsICAgIDEzfSwKLSAgICAgICAgezEyLCAgICAxNX0sCi0gICAgICAgIHsxMSwgICAgIDl9LAotICAgICAgICB7MTEsICAgIDExfSwKLSAgICAgICAgezExLCAgICAxM30sCi0gICAgICAgIHsxMSwgICAgMTV9LAotICAgICAgICB7MTEsICAgIDE3fSwKLSAgICAgICAgezExLCAgICAxOX0sCi0gICAgICAgIHsxMSwgICAgMjF9LAotICAgICAgICB7MTEsICAgIDIzfSwKLSAgICAgICAgezExLCAgICAyNX0sCi0gICAgICAgIHsxMSwgICAgMjd9LAotICAgICAgICB7MTEsICAgIDI5fSwKLSAgICAgICAgezExLCAgICAzMX0sCi0gICAgICAgIHsxMSwgICAgMzN9LAotICAgICAgICB7MTEsICAgIDM1fSwKLSAgICAgICAgezEwLCAgICAxOX0sCi0gICAgICAgIHsxMCwgICAgMjF9LAotICAgICAgICB7MTAsICAgIDIzfSwKLSAgICAgICAgezgsICAgICAgN30sCi0gICAgICAgIHs4LCAgICAgIDl9LAotICAgICAgICB7OCwgICAgIDExfSwKLSAgICAgICAgezcsICAgICAgN30sCi0gICAgICAgIHs1LCAgICAgIDN9LAotICAgICAgICB7NCwgICAgICAzfSwKLSAgICAgICAgezMsICAgICAgM30sCi0gICAgICAgIHsxLCAgICAgIDF9LAotICAgICAgICB7MywgICAgICAyfSwKLSAgICAgICAgezQsICAgICAgMn0sCi0gICAgICAgIHs1LCAgICAgIDJ9LAotICAgICAgICB7NywgICAgICA2fSwKLSAgICAgICAgezgsICAgICAxMH0sCi0gICAgICAgIHs4LCAgICAgIDh9LAotICAgICAgICB7OCwgICAgICA2fSwKLSAgICAgICAgezEwLCAgICAyMn0sCi0gICAgICAgIHsxMCwgICAgMjB9LAotICAgICAgICB7MTAsICAgIDE4fSwKLSAgICAgICAgezExLCAgICAzNH0sCi0gICAgICAgIHsxMSwgICAgMzJ9LAotICAgICAgICB7MTEsICAgIDMwfSwKLSAgICAgICAgezExLCAgICAyOH0sCi0gICAgICAgIHsxMSwgICAgMjZ9LAotICAgICAgICB7MTEsICAgIDI0fSwKLSAgICAgICAgezExLCAgICAyMn0sCi0gICAgICAgIHsxMSwgICAgMjB9LAotICAgICAgICB7MTEsICAgIDE4fSwKLSAgICAgICAgezExLCAgICAxNn0sCi0gICAgICAgIHsxMSwgICAgMTR9LAotICAgICAgICB7MTEsICAgIDEyfSwKLSAgICAgICAgezExLCAgICAxMH0sCi0gICAgICAgIHsxMSwgICAgIDh9LAotICAgICAgICB7MTIsICAgIDE0fSwKLSAgICAgICAgezEyLCAgICAxMn0sCi0gICAgICAgIHsxMiwgICAgMTB9LAotICAgICAgICB7MTIsICAgICA4fSwKLSAgICAgICAgezEyLCAgICAgNn0sCi0gICAgICAgIHsxMiwgICAgIDR9LAotICAgICAgICB7MTMsICAgICA2fSwKLSAgICAgICAgezEzLCAgICAgNH0sCi0gICAgICAgIHsgMCwgICAgIDB9Ci19OwotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQ1NDk0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIHB1dCBiaXRzIHRvIGJpdHN0cmVhbSAKLSAqCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLQotIAotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCi0gKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSkKLXsKLQotICAgIE9NWF9VMzIgc3RvcmVSdW4gPSAwLCBydW4sIHN0b3JlUnVuUGx1czsKLSAgICBPTVhfVTggIGxhc3QgPSAwLCBmaXJzdCA9IDEsIGZNb2RlOwotICAgIE9NWF9TMTYgbGV2ZWwsIHN0b3JlTGV2ZWwgPSAwLCBzdG9yZUxldmVsUGx1czsKLSAgICBPTVhfSU5UIGk7Ci0gICAgCi0gICAgICAgIC8qIFJMRSBlbmNvZGluZyBhbmQgcGFja2luZyB0aGUgYml0cyBpbnRvIHRoZSBzdHJlYW1zICovCi0gICAgICAgIGZvciAoaSA9IHN0YXJ0LCBydW49MDsgaSA8IDY0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxldmVsICAgPSBwUURjdEJsa0NvZWZbcFppZ3phZ1RhYmxlW2ldXTsKLQotICAgICAgICAgICAgLyogQ291bnRpbmcgdGhlIHJ1biAqLwotICAgICAgICAgICAgaWYgKGxldmVsID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcnVuKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEZvdW5kIGEgbm9uLXplcm8gY29lZmYgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3QgPSAwOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgaW4gdGhlIFZMQyB0YWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cyA9IGFybVNpZ25DaGVjayhzdG9yZUxldmVsKSAqIAotICAgICAgICAgICAgICAgICAgICAgIChhcm1BYnMoc3RvcmVMZXZlbCkgLSBwTE1BWFRhYmxlTDBbc3RvcmVSdW5dKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW5QbHVzID0gc3RvcmVSdW4gLSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFJNQVhUYWJsZUwwW2FybUFicyhzdG9yZUxldmVsKSAtIDFdICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZk1vZGUgPSBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1blBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yZVJ1bkwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIAotCQkJCQkJCQkJICBzdG9yZVJ1blBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk1vZGUsCi0JCQkJCQkJCQkgIGxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZsY1RhYmxlTDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgICAgICAgICBzdG9yZVJ1biAgID0gcnVuOwotICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKLSAgICAgICAgICAgICAgICBydW4gPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gLyogZW5kIG9mIGZvciBsb29wIGZvciA2NCBlbGVtZW50cyAqLwotCi0gICAgICAgIC8qIHdyaXRpbmcgdGhlIGxhc3QgZWxlbWVudCAqLwotICAgICAgICBsYXN0ID0gMTsKLSAgICAgICAgCi0gICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IGluIHRoZSBWTEMgdGFibGUgKi8KLSAgICAgICAgc3RvcmVMZXZlbFBsdXMgPSBhcm1TaWduQ2hlY2soc3RvcmVMZXZlbCkgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgIChhcm1BYnMoc3RvcmVMZXZlbCkgLSBwTE1BWFRhYmxlTDFbcnVuXSk7Ci0gICAgICAgIHN0b3JlUnVuUGx1cyA9IHN0b3JlUnVuIC0gCi0gICAgICAgICAgICAgICAgICAgICAgKHBSTUFYVGFibGVMMVthcm1BYnMoc3RvcmVMZXZlbCkgLSAxXSArIDEpOwotICAgICAgICBmTW9kZSA9IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuUGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFN0b3JlUnVuTDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVuSW5kZXhUYWJsZUwxKTsKLSAgICAgICAgCi0gICAgICAgIGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwgCi0JCQkJCQkgIHN0b3JlUnVuUGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZNb2RlLAotCQkJCQkJICBsYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcFZsY1RhYmxlTDEpOwotCXJldHVybiBPTVhfU3RzX05vRXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi19Ci0KLS8qIEVuZCBvZiBGaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZDQ0ZDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfU2V0UHJlZERpci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCi0gKgotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQwotICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCi0gKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX0lOVCAqcHJlZERpciwKLSAgICAgT01YX0lOVCAqcHJlZFFQLAotICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgotKQotewotICAgIE9NWF9VOCAgYmxvY2tEQ0xlZnQ7Ci0gICAgT01YX1U4ICBibG9ja0RDVG9wOwotICAgIE9NWF9VOCAgYmxvY2tEQ1RvcExlZnQ7Ci0KLSAgICBpZiAoYmxvY2tJbmRleCA9PSAzKQotICAgIHsKLSAgICAgICAgYmxvY2tEQ1RvcCA9ICoocENvZWZCdWZDb2wgLSA4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYmxvY2tEQ1RvcCA9ICpwQ29lZkJ1ZlJvdzsKLSAgICB9Ci0gICAgYmxvY2tEQ0xlZnQgPSAqcENvZWZCdWZDb2w7Ci0gICAgYmxvY2tEQ1RvcExlZnQgPSAqKHBDb2VmQnVmUm93IC0gOCk7Ci0KLSAgICBpZiAoYXJtQWJzKGJsb2NrRENMZWZ0IC0gYmxvY2tEQ1RvcExlZnQpIDwgYXJtQWJzKGJsb2NrRENUb3BMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBibG9ja0RDVG9wKSkKLSAgICB7Ci0gICAgICAgICpwcmVkRGlyID0gT01YX1ZDX1ZFUlRJQ0FMOwotICAgICAgICAqcHJlZFFQID0gcFFwQnVmWzFdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcHJlZERpciA9IE9NWF9WQ19IT1JJWk9OVEFMOwotICAgICAgICAqcHJlZFFQID0gcFFwQnVmWzBdOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmYzBlZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSB6aWd6YWcgdGFibGVzCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFs2NF0gPSAKLXsKLSAgICAgMCwgIDEsICA4LCAxNiwgIDksICAyLCAgMywgMTAsCi0gICAgMTcsIDI0LCAzMiwgMjUsIDE4LCAxMSwgIDQsICA1LAotICAgIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwKLSAgICAyNywgMjAsIDEzLCAgNiwgIDcsIDE0LCAyMSwgMjgsIAotICAgIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKLSAgICAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCi0gICAgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAotICAgIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MwotfTsKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XSA9IAotewotICAgICAwLCAgMSwgIDIsICAzLCAgOCwgIDksIDE2LCAxNywKLSAgICAxMCwgMTEsICA0LCAgNSwgIDYsICA3LCAxNSwgMTQsCi0gICAgMTMsIDEyLCAxOSwgMTgsIDI0LCAyNSwgMzIsIDMzLAotICAgIDI2LCAyNywgMjAsIDIxLCAyMiwgMjMsIDI4LCAyOSwKLSAgICAzMCwgMzEsIDM0LCAzNSwgNDAsIDQxLCA0OCwgNDksCi0gICAgNDIsIDQzLCAzNiwgMzcsIDM4LCAzOSwgNDQsIDQ1LCAKLSAgICA0NiwgNDcsIDUwLCA1MSwgNTYsIDU3LCA1OCwgNTksCi0gICAgNTIsIDUzLCA1NCwgNTUsIDYwLCA2MSwgNjIsIDYzCi19OwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XSA9IAotewotICAgICAwLCAgOCwgMTYsIDI0LCAgMSwgIDksICAyLCAxMCwKLSAgICAgMTcsIDI1LCAzMiwgNDAsIDQ4LCA1NiwgNTcsIDQ5LAotICAgICA0MSwgMzMsIDI2LCAxOCwgIDMsIDExLCAgNCwgMTIsCi0gICAgIDE5LCAyNywgMzQsIDQyLCA1MCwgNTgsIDM1LCA0MywKLSAgICAgNTEsIDU5LCAyMCwgMjgsICA1LCAxMywgIDYsIDE0LAotICAgICAyMSwgMjksIDM2LCA0NCwgNTIsIDYwLCAzNywgNDUsIAotICAgICA1MywgNjEsIDIyLCAzMCwgIDcsIDE1LCAyMywgMzEsCi0gICAgIDM4LCA0NiwgNTQsIDYyLCAzOSwgNDcsIDU1LCA2MwotfTsKLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2M1MzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQotICogaXMgaW1wbGVtZW50ZWQKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRAotKQotewotCi0gICAgLyogRm9yIGEgYmxvY2tzaXplIG9mIDE2eDE2ICovCi0gICAgT01YX1U4IEJsb2NrU2l6ZSA9IDE2OwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCAgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAKLSAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOwotCi0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkYTc5Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQotICogaXMgaW1wbGVtZW50ZWQKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4KAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgIE9NWF9JTlQgcm5kVmFsLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0gICAgLyogRm9yIGEgYmxvY2tzaXplIG9mIDh4OCAqLwotICAgIE9NWF9VOCBCbG9ja1NpemUgPSA4OwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCAgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgIAotICAgIHJldHVybiAoYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdFNBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tTaXplKSk7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjQwMTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAoNi4yLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIAotICogaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBNQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuICBGb3IgZXhhbXBsZSwgaWYgcGFkZGluZyBleHRlbmRzIDQgcGl4ZWxzIGJleW9uZCAKLSAqICAgICAgICAgICAgZnJhbWUgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIGxlZnQgYm9yZGVyIGNvdWxkIGJlIHNldCB0byAKLSAqICAgICAgICAgICAgLTQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRAotKQotewotCi0gICBPTVhfVTggQmxvY2tTaXplID0gMTY7Ci0gICAKLSAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCi0gICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgCi0gICByZXR1cm4gKCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAotICAgICBwU3JjUmVmQnVmLAotICAgICByZWZXaWR0aCwKLSAgICAgcFJlZlJlY3QsCi0gICAgIHBTcmNDdXJyQnVmLAotICAgICBwQ3VyclBvaW50UG9zLAotICAgICBwU3JjUHJlTVYsCi0gICAgIHBTcmNQcmVTQUQsCi0gICAgIHBNRVNwZWMsCi0gICAgIHBEc3RNViwKLSAgICAgcERzdFNBRCwKLSAgICAgQmxvY2tTaXplKQotICAgICApOwotCi0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhOTliZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQotICogaXMgaW1wbGVtZW50ZWQKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLSAgIE9NWF9VOCBCbG9ja1NpemUgPSA4OwotICAgCi0gICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAotICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgCi0gICByZXR1cm4gKCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAotICAgICBwU3JjUmVmQnVmLAotICAgICByZWZXaWR0aCwKLSAgICAgcFJlZlJlY3QsCi0gICAgIHBTcmNDdXJyQnVmLAotICAgICBwQ3VyclBvaW50UG9zLAotICAgICBwU3JjUHJlTVYsCi0gICAgIHBTcmNQcmVTQUQsCi0gICAgIHBNRVNwZWMsCi0gICAgIHBEc3RNViwKLSAgICAgcERzdFNBRCwKLSAgICAgQmxvY2tTaXplKQotICAgICApOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzNlMjRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRENUOHg4YmxrLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIDh4OCBibG9jayBEQ1QKLSAqIAotICovCi0gCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0RDVF9UYWJsZS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCi0gKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoY29uc3QgT01YX1MxNiAqcFNyYywgT01YX1MxNiAqcERzdCkKLXsKLSAgICBPTVhfSU5UIHgsIHksIHUsIHY7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotCi0gICAgZm9yICh1ID0gMDsgdSA8IDg7IHUrKykKLSAgICB7Ci0gICAgICAgIGZvciAodiA9IDA7IHYgPCA4OyB2KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9GNjQgc3VtID0gMC4wOwotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VtICs9IHBTcmNbKHggKiA4KSArIHldICoKLSAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbeF1bdV0gKgotICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRHN0Wyh1ICogOCkgKyB2XT0gYXJtUm91bmRGbG9hdFRvUzE2IChzdW0pOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOWE3ZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi0gKiAKLSAqLwotIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAotICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCi0gKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKLSAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKLSAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAotICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBRUCA8PSAwLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCi0gICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCi0gICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0KLSAgICAvKiBWTEQgYW5kIHppZ3phZyAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wQnVmMSxzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBEZXF1YW50aXphdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludGVyX0koCi0gICAgIHBUZW1wQnVmMSwKLSAgICAgUVApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsocFRlbXBCdWYxLCBwRHN0KTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBkYTZjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICg2LjIuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgCi0gKiB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIAotICogcGVyZm9ybWVkIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IAotICogZnJhbWUvcGxhbmUgb24gYSBwaXhlbCBiYXNpcy4gIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiAKLSAqIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBvZiBjdXJyZW50IGJsb2NrIGV4aXN0cyBpbiB0aGUgYml0IAotICogc3RyZWFtLiBUaGUgREMgb25seSBjb25kaXRpb24gd2lsbCBiZSBoYW5kbGVkIGluIGFub3RoZXIgZnVuY3Rpb24uIAotICoKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBzdGVwIC0gd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgYmVsb25ncyB0byAKLSAqICAgcFFQQnVmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIgCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24gYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOCwgRmlndXJlIDYtNS4gCi0gKiAgIGludHJhRENWTEMgLSBhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4gVGhpcyBhbGxvd3MgYSAKLSAqICAgICAgICAgICAgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMgZm9yIGNvZGluZyBvZiBJbnRyYSBEQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGFzIHBlciBbSVNPMTQ0OTYtMl0sIFRhYmxlIDYtMjEuIAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nIGlmIAotICogICAgICAgICAgICB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uIGFyZSAKLSAqICAgICAgICAgICAgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkIG1hY3JvYmxvY2suIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgICAgIHVwZGF0ZSBwcm9jZWR1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4yLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIAotICogICAgICAgICBwUVBCdWYsIHBEc3QuIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddIAotICogICAgLSAgICBjdXJRUCBleGNlZWRzICgxLCAzMSkKLSAqICAgIC0gICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDVdCi0gKiAgICAtICAgIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4Ci0gKiAgICAtICAgIGEgcG9pbnRlciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgd2FzIHZpb2xhdGVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50cmEuICAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgT01YX1U4ICpwRHN0LAotICAgICBPTVhfSU5UIHN0ZXAsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX1U4IGN1clFQLAotICAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfSU5UIGludHJhRENWTEMsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0gKQotewotICAgIE9NWF9TMTYgdGVtcEJ1ZjFbNzldLCB0ZW1wQnVmMls3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxLCAqcFRlbXBCdWYyOwotICAgIE9NWF9JTlQgcHJlZERpciwgcHJlZEFDRGlyLCBpLCBqLCBjb3VudDsKLSAgICBPTVhfSU5UICBwcmVkUVA7Ci0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocENvZWZCdWZSb3cgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBDb2VmQnVmQ29sID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUVBCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoY3VyUVAgPD0gMCkgfHwgKGN1clFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGJsb2NrSW5kZXggPCAwKSB8fCAoYmxvY2tJbmRleCA+IDUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHN0ZXAgJSA4KSAhPSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0KLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKLSAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7Ci0gICAgCi0gICAgLyogU2V0dGluZyB0aGUgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gYW5kIHByZWRpY3Rpb24gZGlyZWN0aW9uICovCi0gICAgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgICAgIGJsb2NrSW5kZXgsCi0gICAgICAgIHBDb2VmQnVmUm93LAotICAgICAgICBwQ29lZkJ1ZkNvbCwKLSAgICAgICAgJnByZWREaXIsCi0gICAgICAgICZwcmVkUVAsCi0gICAgICAgIHBRUEJ1Zik7Ci0KLSAgICBwcmVkQUNEaXIgPSBwcmVkRGlyOwotCi0gICAgYXJtUmV0QXJnRXJySWYoKChwcmVkUVAgPD0gMCkgfHwgKHByZWRRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQotICAgIHsKLSAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7Ci0gICAgfQotCi0gICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCi0gICAgaWYgKGJsb2NrSW5kZXggPD0gMykKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKLSAgICB9Ci0gICAgCi0KLSAgICAvKiBWTEQgYW5kIHppZ3phZyAqLwotICAgIGlmIChpbnRyYURDVkxDID09IDEpCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgdmlkZW9Db21wKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKLSAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgICAgIHByZWRBQ0RpciwKLSAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICB9Ci0KLSAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKLSAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICBwQ29lZkJ1ZlJvdywKLSAgICAgICAgcENvZWZCdWZDb2wsCi0gICAgICAgIGN1clFQLAotICAgICAgICBwcmVkUVAsCi0gICAgICAgIHByZWREaXIsCi0gICAgICAgIEFDUHJlZEZsYWcsCi0gICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogRGVxdWFudGl6YXRpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAotICAgICBwVGVtcEJ1ZjEsCi0gICAgIGN1clFQLAotICAgICB2aWRlb0NvbXAsCi0gICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCi0gICAgICAgaXQgdG8gMCB0byAyNTUgKi8KLSAgICBmb3IgKGogPSAwLCBjb3VudCA9IDA7IGogPCA4OyBqKyspCi0gICAgewotICAgICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyssIGNvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbaV0gPSBhcm1DbGlwICgwLCAyNTUsIHBUZW1wQnVmMltjb3VudF0pOwotICAgICAgICB9Ci0gICAgICAgIHBEc3QgKz0gc3RlcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMmMyMjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlIGZvciBkZWNvZGluZyBNViBhbmQgcGFkZGluZyB0aGUgc2FtZQotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKLSAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKLSAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCi0gKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCi0gKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKLSAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAotICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKLSAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAotICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAotICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAotICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBzeW50YXggCi0gKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCi0gKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KLSAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCi0gKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WVXBwZXJSaWdodE1CLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBEc3RNVkN1ck1CLAotICAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0gKQotewotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNVjsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVlByZWRNRVsxMl07Ci0gICAgT01YX0lOVCBpQmxrLCBpLCBjb3VudCA9IDE7Ci0gICAgT01YX1MzMiBtdkhvclJlc2lkdWFsID0gMSwgbXZWZXJSZXNpZHVhbCA9IDEsIG12SG9yRGF0YSwgbXZWZXJEYXRhOwotICAgIE9NWF9TOCBzY2FsZUZhY3RvciwgaW5kZXg7Ci0gICAgT01YX1MxNiBoaWdoLCBsb3csIHJhbmdlOwotCi0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZDdXJNQiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoZmNvZGVGb3J3YXJkIDwgMSkgfHwgKGZjb2RlRm9yd2FyZCA+IDcpKSwgXAotICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3RNVkN1ck1CKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRSQSkgfHwKLSAgICAgICAgKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkFfUSkKLSAgICAgICApCi0gICAgewotICAgICAgICAvKiBBbGwgTVYncyBhcmUgemVybyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0TVZDdXJNQltpXS5keCA9IDA7Ci0gICAgICAgICAgICBwRHN0TVZDdXJNQltpXS5keSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLSAgICB9Ci0KLSAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0VikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0Vl9RKSkKLSAgICB7Ci0gICAgICAgIGNvdW50ID0gNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVIpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSX1EpKQotICAgIHsKLSAgICAgICAgY291bnQgPSAxOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0aW5nIHRoZSBzY2FsZSBmYWN0b3IgKi8KLSAgICBzY2FsZUZhY3RvciA9IDEgPDwgKGZjb2RlRm9yd2FyZCAtMSk7Ci0gICAgaGlnaCA9ICAoIDMyICogc2NhbGVGYWN0b3IpIC0gMTsKLSAgICBsb3cgPSAgICggKC0zMikgKiBzY2FsZUZhY3Rvcik7Ci0gICAgcmFuZ2UgPSAoIDY0ICogc2NhbGVGYWN0b3IpOwotCi0gICAgLyogSHVmZm1hbiBkZWNvZGluZyBhbmQgTVYgcmVjb25zdHJ1Y3Rpb24gKi8KLSAgICBmb3IgKGlCbGsgPSAwOyBpQmxrIDwgY291bnQ7IGlCbGsrKykKLSAgICB7Ci0KLSAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyB0byBnZXQgSG9yaXpvbnRhbCBkYXRhIGFuZCByZXNpZHVhbCAqLwotICAgICAgICBpbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZihpbmRleCA9PSAtMSwgT01YX1N0c19FcnIpOwotCi0gICAgICAgIG12SG9yRGF0YSA9IGluZGV4IC0gMzI7Ci0KLSAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAobXZIb3JEYXRhICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtdkhvclJlc2lkdWFsID0gKE9NWF9TMzIpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIChmY29kZUZvcndhcmQgLTEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEh1ZmZtYW4gZGVjb2RpbmcgdG8gZ2V0IFZlcnRpY2FsIGRhdGEgYW5kIHJlc2lkdWFsICovCi0gICAgICAgIGluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKGluZGV4ID09IC0xLCBPTVhfU3RzX0Vycik7Ci0KLSAgICAgICAgbXZWZXJEYXRhID0gaW5kZXggLSAzMjsKLQotICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChtdlZlckRhdGEgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoT01YX1MzMikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgKGZjb2RlRm9yd2FyZCAtMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGRpZmZlcnRpYWwgTVYgKi8KLSAgICAgICAgaWYgKCAoc2NhbGVGYWN0b3IgPT0gMSkgfHwgKG12SG9yRGF0YSA9PSAwKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpZmZNVi5keCA9IG12SG9yRGF0YTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpZmZNVi5keCA9ICgoYXJtQWJzKG12SG9yRGF0YSkgLSAxKSAqIGZjb2RlRm9yd2FyZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG12SG9yUmVzaWR1YWwgKyAxOwotICAgICAgICAgICAgaWYgKG12SG9yRGF0YSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlmZk1WLmR4ID0gLWRpZmZNVi5keDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKHNjYWxlRmFjdG9yID09IDEpIHx8IChtdlZlckRhdGEgPT0gMCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaWZmTVYuZHkgPSBtdlZlckRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkaWZmTVYuZHkgPSAoKGFybUFicyhtdlZlckRhdGEpIC0gMSkgKiBmY29kZUZvcndhcmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBtdlZlclJlc2lkdWFsICsgMTsKLSAgICAgICAgICAgIGlmIChtdlZlckRhdGEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpZmZNVi5keSA9IC1kaWZmTVYuZHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCi0gICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKLSAgICAgICAgICAgIHBEc3RNVkN1ck1CLAotICAgICAgICAgICAgcFNyY01WTGVmdE1CLAotICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKLSAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICAgICAgICAgICZwRHN0TVZDdXJNQltpQmxrXSwKLSAgICAgICAgICAgIGRzdE1WUHJlZE1FLAotICAgICAgICAgICAgaUJsayk7Ci0KLSAgICAgICAgLyogQWRkaW5nIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0ZWQgTVYgdG8gcmVjb25zdHJ1Y3QgTVYgKi8KLSAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHggKz0gZGlmZk1WLmR4OwotICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSArPSBkaWZmTVYuZHk7Ci0KLSAgICAgICAgLyogQ2hlY2tpbmcgdGhlIHJhbmdlIGFuZCBrZWVwaW5nIGl0IHdpdGhpbiB0aGUgbGltaXRzICovCi0gICAgICAgIGlmICggcERzdE1WQ3VyTUJbaUJsa10uZHggPCBsb3cgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCArPSByYW5nZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocERzdE1WQ3VyTUJbaUJsa10uZHggPiBoaWdoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCAtPSByYW5nZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcERzdE1WQ3VyTUJbaUJsa10uZHkgPCBsb3cgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSArPSByYW5nZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocERzdE1WQ3VyTUJbaUJsa10uZHkgPiBoaWdoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSAtPSByYW5nZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCi0gICAgewotICAgICAgICBwRHN0TVZDdXJNQlsxXSA9IHBEc3RNVkN1ck1CWzBdOwotICAgICAgICBwRHN0TVZDdXJNQlsyXSA9IHBEc3RNVkN1ck1CWzBdOwotICAgICAgICBwRHN0TVZDdXJNQlszXSA9IHBEc3RNVkN1ck1CWzBdOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzY2Y2ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLSAqIGZvciBpbnRlciBibG9jay4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKLSAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKLSAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcigKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIE9NWF9VOCAgbGFzdCxzdGFydCA9IDA7Ci0gICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfR2V0VkxDQml0cyAoCi0gICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotCQkJICBwRHN0LAotCQkJICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICBzdGFydCwKLQkJCSAgJmxhc3QsCi0JCQkgIDExLAotCQkJICA0MiwKLQkJCSAgIDIsCi0JCQkgICA1LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDAsCi0JCQkgIGFybVZDTTRQMl9JbnRlckwxUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMUxNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwUk1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFSTUFYLAotICAgICAgICAgICAgICBwWmlnemFnVGFibGUgKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICBpZiAobGFzdCA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE9NWF9TdHNfRXJyOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZGRhZjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotICogZm9yIGludHJhIGJsb2NrLgotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCi0gKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCi0gKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAotICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCi0gKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCi0gKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKLSAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAotICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi0KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICBPTVhfVTggc3RhcnQgPSAwOwotCi0gICAgcmV0dXJuIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIHBwQml0U3RyZWFtLAotICAgICBwQml0T2Zmc2V0LAotICAgICBwRHN0LAotICAgICBwcmVkRGlyLAotICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBzdGFydCk7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzc2ZWQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLSAqIGZvciBpbnRyYSBibG9jay4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAotICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKLSAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmOgotICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAotICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCi0gKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pCi17Ci0gICAgLyogRHVtbXkgaW5pdGlsYWl6YXRpb24gdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCi0gICAgT01YX1M4ICBEQ1ZhbHVlU2l6ZSA9IDA7Ci0gICAgT01YX1UxNiBwb3dPZlNpemUsIGZldGNoRENiaXRzOwotICAgIE9NWF9VOCBzdGFydCA9IDE7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyID4gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIEluc2VydCB0aGUgY29kZSBpbnRvIHRoZSBiaXRzdHJlYW0gKi8KLSAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCi0gICAgewotICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCi0gICAgewotICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4KTsKLSAgICB9Ci0gICAgYXJtUmV0RGF0YUVycklmKERDVmFsdWVTaXplID09IC0xLCBPTVhfU3RzX0Vycik7Ci0gICAgYXJtUmV0RGF0YUVycklmKERDVmFsdWVTaXplID4gMTIsIE9NWF9TdHNfRXJyKTsKLQotCi0gICAgaWYgKERDVmFsdWVTaXplID09IDApCi0gICAgewotICAgICAgICBwRHN0WzBdID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZmV0Y2hEQ2JpdHMgPSAoT01YX1UxNikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDVmFsdWVTaXplKTsKLQotICAgICAgICBpZiAoIChmZXRjaERDYml0cyA+PiAoRENWYWx1ZVNpemUgLSAxKSkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY2FsdWxhdGUgcG93ICovCi0gICAgICAgICAgICBwb3dPZlNpemUgPSAoMSA8PCBEQ1ZhbHVlU2l6ZSk7Ci0KLSAgICAgICAgICAgIHBEc3RbMF0gPSAgKE9NWF9TMTYpIChmZXRjaERDYml0cyBeIChwb3dPZlNpemUgLSAxKSk7Ci0gICAgICAgICAgICBwRHN0WzBdID0gLXBEc3RbMF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0WzBdID0gZmV0Y2hEQ2JpdHM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiA4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiByZWFkaW5nIGFuZCBjaGVja2luZyB0aGUgbWFya2VyIGJpdCovCi0gICAgICAgICAgICBhcm1SZXREYXRhRXJySWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpID09IDAsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19FcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgIHByZWREaXIsCi0gICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgICBzdGFydCk7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDRhMjM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9FbmNvZGVNVi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlIGZvciBwcmVkaWN0aW5nIE1WIG9mIE1CCi0gKgotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAotICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAotICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAotICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKLSAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKLSAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKLSAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKLSAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKLSAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNVigKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcE1WQ3VyTUIsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WTGVmdE1CLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyTUIsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WVXBwZXJSaWdodE1CLAotICAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pCi17Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVZQcmVkLCBkaWZmTVY7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVZQcmVkTUVbMTJdOwotICAgIC8qIEluaXRpYWxpemVkIHRvIHJlbW92ZSBjb21waWxhdGlvbiB3YXJuaW5nICovCi0gICAgT01YX0lOVCBpQmxrLCBpLCBjb3VudCA9IDE7Ci0gICAgT01YX1MzMiBtdkhvclJlc2lkdWFsLCBtdlZlclJlc2lkdWFsLCBtdkhvckRhdGEsIG12VmVyRGF0YTsKLSAgICBPTVhfVTggc2NhbGVGYWN0b3IsIGluZGV4OwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE1WQ3VyTUIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKGZjb2RlRm9yd2FyZCA8IDEpIHx8IChmY29kZUZvcndhcmQgPiA3KSksIFwKLSAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRSQSkgfHwKLSAgICAgICAgKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkFfUSkKLSAgICAgICApCi0gICAgewotICAgICAgICAvKiBObyBjYW5kaWRhdGUgdmVjdG9ycyBoZW5jZSBtYWtlIHRoZW0gemVybyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZHN0TVZQcmVkTUVbaV0uZHggPSAwOwotICAgICAgICAgICAgZHN0TVZQcmVkTUVbaV0uZHkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gICAgfQotCi0gICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSNFYpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSNFZfUSkpCi0gICAgewotICAgICAgICBjb3VudCA9IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUl9RKSkKLSAgICB7Ci0gICAgICAgIGNvdW50ID0gMTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGluZyB0aGUgc2NhbGUgZmFjdG9yICovCi0gICAgc2NhbGVGYWN0b3IgPSAxIDw8IChmY29kZUZvcndhcmQgLTEpOwotCi0gICAgZm9yIChpQmxrID0gMDsgaUJsayA8IGNvdW50OyBpQmxrKyspCi0gICAgewotCi0gICAgICAgIC8qIEZpbmQgdGhlIHByZWRpY3RlZCB2ZWN0b3IgKi8KLSAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgKAotICAgICAgICAgICAgcE1WQ3VyTUIsCi0gICAgICAgICAgICBwU3JjTVZMZWZ0TUIsCi0gICAgICAgICAgICBwU3JjTVZVcHBlck1CLAotICAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLAotICAgICAgICAgICAgJmRzdE1WUHJlZCwKLSAgICAgICAgICAgIGRzdE1WUHJlZE1FLAotICAgICAgICAgICAgaUJsayApOwotCi0gICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbnRpYWwgbW90aW9uIHZlY3RvciAoZGlmZk1WKSAqLwotICAgICAgICBkaWZmTVYuZHggPSBwTVZDdXJNQltpQmxrXS5keCAtIGRzdE1WUHJlZC5keDsKLSAgICAgICAgZGlmZk1WLmR5ID0gcE1WQ3VyTUJbaUJsa10uZHkgLSBkc3RNVlByZWQuZHk7Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIG12X2RhdGEgYW5kIG12X3Jlc2lkdWFsIGZvciBIb3JpemFudGFsIE1WICovCi0gICAgICAgIGlmIChkaWZmTVYuZHggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCA9IDA7Ci0gICAgICAgICAgICBtdkhvckRhdGEgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCA9ICggYXJtQWJzKGRpZmZNVi5keCkgLSAxKSAlIHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgbXZIb3JEYXRhID0gKGFybUFicyhkaWZmTVYuZHgpIC0gbXZIb3JSZXNpZHVhbCArIChzY2FsZUZhY3RvciAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgLyBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIGlmIChkaWZmTVYuZHggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG12SG9yRGF0YSA9IC1tdkhvckRhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgbXZfZGF0YSBhbmQgbXZfcmVzaWR1YWwgZm9yIFZlcnRpY2FsIE1WICovCi0gICAgICAgIGlmIChkaWZmTVYuZHkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCA9IDA7Ci0gICAgICAgICAgICBtdlZlckRhdGEgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCA9ICggYXJtQWJzKGRpZmZNVi5keSkgLSAxKSAlIHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgbXZWZXJEYXRhID0gKGFybUFicyhkaWZmTVYuZHkpIC0gbXZWZXJSZXNpZHVhbCArIChzY2FsZUZhY3RvciAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgLyBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIGlmIChkaWZmTVYuZHkgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG12VmVyRGF0YSA9IC1tdlZlckRhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIdWZmbWFuIGVuY29kaW5nICovCi0KLSAgICAgICAgLyogVGhlIGluZGV4IGlzIGFjdHVhbGx5IGNhbGN1bGF0ZSBhcwotICAgICAgICAgICBpbmRleCA9ICgoZmxvYXQpIChtdkhvckRhdGEvMikgKyAxNikgKiAyLAotICAgICAgICAgICBtZWFuaW5nIHRoZSBNViBkYXRhIGlzIGhhbGZlZCBhbmQgdGhlbiBub3JtYWxpemVkCi0gICAgICAgICAgIHRvIGJlZ2luIHdpdGggemVybyBhbmQgdGhlbiBkb3VibGVkIHRvIHRha2UgY2FyZSBvZiBpbmRleGluZwotICAgICAgICAgICB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluY2x1ZGVkICovCi0gICAgICAgIGluZGV4ID0gbXZIb3JEYXRhICsgMzI7Ci0gICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEW2luZGV4XSk7Ci0gICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKGRpZmZNVi5keCAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJtUGFja0JpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBtdkhvclJlc2lkdWFsLCAoZmNvZGVGb3J3YXJkIC0xKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUaGUgaW5kZXggaXMgYWN0dWFsbHkgY2FsY3VsYXRlIGFzCi0gICAgICAgICAgIGluZGV4ID0gKChmbG9hdCkgKG12VmVyRGF0YS8yKSArIDE2KSAqIDIsCi0gICAgICAgICAgIG1lYW5pbmcgdGhlIE1WIGRhdGEgaXMgaGFsZmVkIGFuZCB0aGVuIG5vcm1hbGl6ZWQKLSAgICAgICAgICAgdG8gYmVnaW4gd2l0aCB6ZXJvIGFuZCB0aGVuIGRvdWJsZWQgdG8gdGFrZSBjYXJlIG9mIGluZGV4aW5nCi0gICAgICAgICAgIHRoZSBmcmFjdGlvbmFsIHBhcnQgaW5jbHVkZWQgKi8KLSAgICAgICAgaW5kZXggPSBtdlZlckRhdGEgKyAzMjsKLSAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FWbGNNVkRbaW5kZXhdKTsKLSAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAoZGlmZk1WLmR5ICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcm1QYWNrQml0cyAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIG12VmVyUmVzaWR1YWwsIChmY29kZUZvcndhcmQgLTEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1OGY4OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKLSAqIGZvciBpbnRlciBibG9jay4KLSAqCi0gKi8gCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKLSAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyKAotICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHBhdHRlcm4sCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIE9NWF9VOCBzdGFydCA9IDA7Ci0gICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFFEY3RCbGtDb2VmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBpZiAocGF0dGVybikKLSAgICB7Ci0gICAgICAgIGFybVZDTTRQMl9QdXRWTENCaXRzICgKLSAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIHBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgc3RhcnQsCi0gICAgICAgICAgICAgIDI2LAotICAgICAgICAgICAgICA0MCwKLSAgICAgICAgICAgICAgMTAsCi0gICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMCwKLQkJCSAgYXJtVkNNNFAyX0ludGVyTDFSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wxLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMExNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMVJNQVgsCi0gICAgICAgICAgICAgIHBaaWd6YWdUYWJsZQotICAgICAgICApOwotICAgIH0gLyogUGF0dGVybiBjaGVjayBlbmRzKi8KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiNmQ5Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCi0gKiBmb3IgaW50cmEgYmxvY2suCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICBPTVhfVTggc3RhcnQgPSAwOwotCi0gICAgcmV0dXJuIGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIHBwQml0U3RyZWFtLAotICAgICBwQml0T2Zmc2V0LAotICAgICBwUURjdEJsa0NvZWYsCi0gICAgIHByZWREaXIsCi0gICAgIHBhdHRlcm4sCi0gICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIHN0YXJ0KTsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmRkYTE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKLSAqIGZvciBpbnRyYSBibG9jay4KLSAqCi0gKi8gCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAotICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX1U4IHBhdHRlcm4sCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pCi17Ci0gICAgT01YX1MxNiBkY1ZhbHVlLCBwb3dPZlNpemU7Ci0gICAgT01YX1U4ICBEQ1ZhbHVlU2l6ZSwgc3RhcnQgPSAxOwotICAgIE9NWF9VMTYgYWJzRENWYWx1ZTsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBRRGN0QmxrQ29lZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCh2aWRlb0NvbXAgIT0gT01YX1ZDX0xVTUlOQU5DRSkgJiYgKHZpZGVvQ29tcCAhPSBPTVhfVkNfQ0hST01JTkFOQ0UpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gT01YX1ZDX05PTkUpICYmIChwcmVkRGlyICE9IE9NWF9WQ19IT1JJWk9OVEFMKSAmJiAocHJlZERpciAhPSBPTVhfVkNfVkVSVElDQUwpICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGlmIChwYXR0ZXJuKQotICAgIHsKLSAgICAgICAgZGNWYWx1ZSA9IHBRRGN0QmxrQ29lZlswXTsKLSAgICAgICAgYWJzRENWYWx1ZSA9IGFybUFicyhkY1ZhbHVlKTsKLQotICAgICAgICAvKiBGaW5kIHRoZSBzaXplICovCi0gICAgICAgIERDVmFsdWVTaXplID0gYXJtTG9nU2l6ZSAoYWJzRENWYWx1ZSk7Ci0gICAgICAgIGFic0RDVmFsdWUgPSBhcm1BYnMoZGNWYWx1ZSk7Ci0KLSAgICAgICAgLyogSW5zZXJ0IHRoZSBjb2RlIGludG8gdGhlIGJpdHN0cmVhbSAqLwotICAgICAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4W0RDVmFsdWVTaXplXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKLSAgICAgICAgewotCi0gICAgICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFtEQ1ZhbHVlU2l6ZV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWRkaXRpb25hbCBjb2RlIGdlbmVyYXRpb24gaW4gY2FzZSBvZiBuZWdhdGl2ZQotICAgICAgICAgICBkYyB2YWx1ZSB0aGUgYWRkaXRpb25hbCAqLwotICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGNWYWx1ZSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2FsdWxhdGUgMiBwb3cgKi8KLSAgICAgICAgICAgICAgICBwb3dPZlNpemUgPSAoMSA8PCBEQ1ZhbHVlU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBhYnNEQ1ZhbHVlID0gIGFic0RDVmFsdWUgXiAocG93T2ZTaXplIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpYWJzRENWYWx1ZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgRENWYWx1ZVNpemUpOwotCi0gICAgICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxLCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAotICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICAgIHByZWREaXIsCi0gICAgICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICAgIHN0YXJ0KTsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0YjQ4Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9GaW5kTVZwcmVkLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGUgZm9yIHByZWRpY3RpbmcgTVYgb2YgTUIKLSAqCi0gKi8KLSAgCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCi0gKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAotICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCi0gKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKLSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAotICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKLSAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKLSAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKLSAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCi0gKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKLSAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKLSAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCi0gKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCi0gKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAotICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkKAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY01WQ3VyTUIsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMSwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYyLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwRHN0TVZQcmVkLAotICAgICBPTVhWQ01vdGlvblZlY3RvciogcERzdE1WUHJlZE1FLAotICAgICBPTVhfSU5UIGlCbGsKLSApCi17Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgQ2FuZE1WOwotCWNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwQ2FuZE1WMTsKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcENhbmRNVjI7Ci0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBDYW5kTVYzOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotCWFybVJldEFyZ0VycklmKGlCbGshPTAgJiYgcFNyY01WQ3VyTUIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxrIDwgMCkgfHwgKGlCbGsgPiAzKSwgT01YX1N0c19CYWRBcmdFcnIpOyAKLQotICAgIENhbmRNVi5keCA9IENhbmRNVi5keSA9IDA7Ci0JLyogQmFzZWQgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBibG9jayBleHRyYWN0IHRoZSBtb3Rpb24gdmVjdG9ycyBhbmQKLSAgICAgICB0aGUgdHJhbnBlcmFuY3kgc3RhdHVzICovCi0gICAKLSAgICAKLSAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlIHRvIGJlIHVzZWQgaWYgcFNyY0NhbmRNVlsxfDJ8M10gPT0gTlVMTCAqLwotICAgIHBDYW5kTVYxID0gcENhbmRNVjIgPSBwQ2FuZE1WMyA9ICZDYW5kTVY7Ci0KLSAgICAKLSAgICBzd2l0Y2ggKGlCbGspCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBTcmNDYW5kTVYxICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCQkgICAgcENhbmRNVjEgPSAmcFNyY0NhbmRNVjFbMV07Ci0JCQl9Ci0JCQlpZihwU3JjQ2FuZE1WMiAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJCXBDYW5kTVYyID0gJnBTcmNDYW5kTVYyWzJdOwotCQkJfQotCQkJaWYocFNyY0NhbmRNVjMgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJCQlwQ2FuZE1WMyA9ICZwU3JjQ2FuZE1WM1syXTsKLQkJCX0KLQkJCWlmICgocFNyY0NhbmRNVjEgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYyID09IE5VTEwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDYW5kTVYxID0gcENhbmRNVjIgPSBwQ2FuZE1WMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoKHBTcmNDYW5kTVYxID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMyA9PSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2FuZE1WMSA9IHBDYW5kTVYzID0gcENhbmRNVjI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKChwU3JjQ2FuZE1WMiA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENhbmRNVjIgPSBwQ2FuZE1WMyA9IHBDYW5kTVYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAxOgotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2FuZE1WMSA9ICZwU3JjTVZDdXJNQlswXTsKLQkJCWlmKHBTcmNDYW5kTVYyICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCQkJcENhbmRNVjIgPSAmcFNyY0NhbmRNVjJbM107Ci0JCQl9Ci0JCQlpZihwU3JjQ2FuZE1WMyAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJCXBDYW5kTVYzID0gJnBTcmNDYW5kTVYzWzJdOwotCQkJfQotCQkJaWYoKHBTcmNDYW5kTVYyID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMyA9PSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2FuZE1WMiA9IHBDYW5kTVYzID0gcENhbmRNVjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBTcmNDYW5kTVYxICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCQkJcENhbmRNVjEgPSAmcFNyY0NhbmRNVjFbM107Ci0JCQl9Ci0JCQlwQ2FuZE1WMiA9ICZwU3JjTVZDdXJNQlswXTsKLQkJCXBDYW5kTVYzID0gJnBTcmNNVkN1ck1CWzFdOwotCQkJYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2FuZE1WMSA9ICZwU3JjTVZDdXJNQlsyXTsKLQkJCXBDYW5kTVYyID0gJnBTcmNNVkN1ck1CWzBdOwotCQkJcENhbmRNVjMgPSAmcFNyY01WQ3VyTUJbMV07Ci0JCQlicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgdGhlIG1lZGlhbiBvZiB0aGUgMyBjYW5kaWRhdGUgTVYncyAqLwotICAgIHBEc3RNVlByZWQtPmR4ID0gYXJtTWVkaWFuT2YzIChwQ2FuZE1WMS0+ZHgsIHBDYW5kTVYyLT5keCwgcENhbmRNVjMtPmR4KTsKLSAgICBwRHN0TVZQcmVkLT5keSA9IGFybU1lZGlhbk9mMyAocENhbmRNVjEtPmR5LCBwQ2FuZE1WMi0+ZHksIHBDYW5kTVYzLT5keSk7Ci0gICAgICAgIAotICAgIGlmIChwRHN0TVZQcmVkTUUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIFN0b3JlIHRoZSBjYW5kaWRhdGUgTVYncyBpbnRvIHRoZSBwRHN0TVZQcmVkTUUsIHRoZXNlIGNhbiBiZSB1c2VkCi0gICAgICAgICAgIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAqLwotICAgICAgICBwRHN0TVZQcmVkTUVbMF0uZHggPSBwQ2FuZE1WMS0+ZHg7Ci0gICAgICAgIHBEc3RNVlByZWRNRVswXS5keSA9IHBDYW5kTVYxLT5keTsKLSAgICAgICAgcERzdE1WUHJlZE1FWzFdLmR4ID0gcENhbmRNVjItPmR4OwotICAgICAgICBwRHN0TVZQcmVkTUVbMV0uZHkgPSBwQ2FuZE1WMi0+ZHk7Ci0gICAgICAgIHBEc3RNVlByZWRNRVsyXS5keCA9IHBDYW5kTVYzLT5keDsKLSAgICAgICAgcERzdE1WUHJlZE1FWzJdLmR5ID0gcENhbmRNVjMtPmR5OwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxMjQ1OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9JRENUOHg4YmxrLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIDh4OCBibG9jayBJRENUCi0gKiAKLSAqLwotCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9EQ1RfVGFibGUuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoY29uc3QgT01YX1MxNiAqcFNyYywgT01YX1MxNiAqcERzdCkKLXsKLSAgICBPTVhfSU5UIHgsIHksIHUsIHY7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9GNjQgc3VtID0gMC4wOwotICAgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IDg7IHUrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKHYgPSAwOyB2IDwgODsgdisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VtICs9IHBTcmNbKHUgKiA4KSArIHZdICoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9wcmVDYWxjRENUQ29zW3hdW3VdICoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9wcmVDYWxjRENUQ29zW3ldW3ZdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEc3RbKHggKiA4KSArIHldID0gKE9NWF9TMTYpIGZsb29yKHN1bSArIDAuNSk7Ci0KLSAgICAgICAgICAgIC8qIFNhdHVyYXRlIHRvIFstMjU2LCAyNTVdICovCi0gICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSA9IGFybUNsaXAgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjU2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RbKHggKiA4KSArIHldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZjBjZjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2suYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBNUEVHNCBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKLSAqIGludGVycG9sYXRpb24KLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfSGFsZlBlbFZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaGFsZiBwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIHZlcnRpY2FsIAotICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLCBzdWJjbGF1c2UgNy42LjIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcwotICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCi0gKiAgICAgICAgICAgICAgICAgIG9mIDguCi0gKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgotICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBsaW5hZXIgOHg4IGRlc3RpbmF0aW9uIGJ1ZmZlcjsKLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9IYWxmUGVsVmVyKAotICAgICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgICAgT01YX0lOVCBzcmNTdGVwLCAKLSAgICAgIE9NWF9VOCAqcERzdCwKLSAgICAgIE9NWF9JTlQgcm5kVmFsKQotewotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMTsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzI7Ci0gIE9NWF9JTlQgeSwgeDsKLSAgCi0gIHBUZW1wU3JjMSA9IHBTcmM7ICAKLSAgcFRlbXBTcmMyID0gcFNyYyArIHNyY1N0ZXA7Ci0gIHNyY1N0ZXAgLT0gODsKLSAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKLSAgewotICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCi0gICAgewotICAgICAgKnBEc3QrKyA9ICgoKnBUZW1wU3JjMSsrICsgKnBUZW1wU3JjMisrKSArIDEgLSBybmRWYWwpID4+IDE7Ci0gICAgfQotICAgIHBUZW1wU3JjMSArPSBzcmNTdGVwOwotICAgIHBUZW1wU3JjMiArPSBzcmNTdGVwOwotICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9IYWxmUGVsSG9yCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBoYWxmIHBlbCBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgaG9yaXpvbnRhbCAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIElTTy9JRUMgMTQ0OTYtMiwgc3ViY2xhdXNlIDcuNi4yLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKLSAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQotICogICAgICAgICAgICAgICAgICBvZiA4LgotICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KLSAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgbGluYWVyIDh4OCBkZXN0aW5hdGlvbiBidWZmZXI7Ci0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfSGFsZlBlbEhvcigKLSAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgIE9NWF9JTlQgc3JjU3RlcCwgCi0gICAgICBPTVhfVTggKnBEc3QsCi0gICAgICBPTVhfSU5UIHJuZFZhbCkKLXsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzE7Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMyOwotICBPTVhfSU5UIHksIHg7Ci0gIAotICBwVGVtcFNyYzEgPSBwU3JjOwotICBwVGVtcFNyYzIgPSBwVGVtcFNyYzEgKyAxOwotCi0gIHNyY1N0ZXAgLT0gODsKLSAgZm9yICh5PTA7IHk8ODsgeSsrKQotICB7Ci0gICAgZm9yICh4PTA7IHg8ODsgeCsrKQotICAgIHsKLSAgICAgICpwRHN0KysgPSAoKCpwVGVtcFNyYzErKyArICpwVGVtcFNyYzIrKykgKyAxIC0gcm5kVmFsKSA+PiAxOwotICAgIH0KLSAgICBwVGVtcFNyYzEgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzIgKz0gc3JjU3RlcDsKLSAgfQotfQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9IYWxmUGVsVmVySG9yCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBoYWxmIHBlbCBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgYm90aCAKLSAqIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIElTTy9JRUMgMTQ0OTYtMiwKLSAqIHN1YmNsYXVzZSA3LjYuMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCi0gKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKLSAqICAgICAgICAgICAgICAgICAgb2YgOC4KLSAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCi0gKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGxpbmFlciA4eDggZGVzdGluYXRpb24gYnVmZmVyOwotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX0hhbGZQZWxWZXJIb3IoCi0gICAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgICBPTVhfSU5UIHNyY1N0ZXAsIAotICAgICAgT01YX1U4ICpwRHN0LAotICAgICAgT01YX0lOVCBybmRWYWwpCi17Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMxOwotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMjsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzM7Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmM0OwotICBPTVhfSU5UIHksIHg7Ci0KLSAgcFRlbXBTcmMxID0gcFNyYzsKLSAgcFRlbXBTcmMyID0gcFNyYyArIHNyY1N0ZXA7Ci0gIHBUZW1wU3JjMyA9IHBTcmMgKyAxOwotICBwVGVtcFNyYzQgPSBwU3JjICsgc3JjU3RlcCArIDE7Ci0KLSAgc3JjU3RlcCAtPSA4OwotICBmb3IgKHk9MDsgeTw4OyB5KyspCi0gIHsKLSAgICBmb3IgKHg9MDsgeDw4OyB4KyspCi0JewotCSAgKnBEc3QrKyA9ICgoKnBUZW1wU3JjMSsrICsgKnBUZW1wU3JjMisrICsgKnBUZW1wU3JjMysrICsgKnBUZW1wU3JjNCsrKSArIAotCSAgICAgICAgICAgICAgICAgIDIgLSBybmRWYWwpID4+IDI7Ci0JfQotICAgIHBUZW1wU3JjMSArPSBzcmNTdGVwOwotICAgIHBUZW1wU3JjMiArPSBzcmNTdGVwOwotICAgIHBUZW1wU3JjMyArPSBzcmNTdGVwOwotICAgIHBUZW1wU3JjNCArPSBzcmNTdGVwOwotICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfTm9SZXMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERvIG1vdGlvbiBjb21wZW5zYXRpb24gYW5kIGNvcHkgdGhlIHJlc3VsdCB0byB0aGUgY3VycmVudCBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCi0gKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKLSAqICAgICAgICAgICAgICAgICAgb2YgOC4KLSAqIFtpbl0gZHN0U3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguCi0gKiBbaW5dIHByZWRpY3RUeXBlIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4xLjIuCi0gKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgotICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcwotICogICAgICAgICAgICAgICAgICBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4KLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfTm9SZXMoCi0gICAgICBjb25zdCBPTVhfVTggKnBTcmMsIAotICAgICAgT01YX0lOVCBzcmNTdGVwLAotICAgICAgT01YX1U4ICpwRHN0LAotICAgICAgT01YX0lOVCBkc3RTdGVwKQotewotICAgIE9NWF9VOCB4LHksY291bnQsaW5kZXg7Ci0gICAgCi0gICAgLyogQ29weWluZyB0aGUgcmVmIDh4OCBibGsgdG8gdGhlIGN1cnIgYmxrICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDA7IHkgPCA4OyB5KyssaW5kZXggKz0gKHNyY1N0ZXAgLTgpLCBjb3VudCArPSAoZHN0U3RlcCAtIDgpKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKyxpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W2NvdW50XSA9IHBTcmNbaW5kZXhdOwotICAgICAgICB9ICAgICAgIAotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX01DUmVjb25CbG9ja19SZXMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0cyBJTlRFUiBibG9jayBieSBzdW1taW5nIHRoZSBtb3Rpb24gY29tcGVuc2F0aW9uIHJlc3VsdHMKLSAqIGFuZCB0aGUgcmVzdWx0cyBvZiB0aGUgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiAocHJlZGljdGlvbiByZXNpZHVhbHMpLgotICogT3V0cHV0IGludGVuc2l0aWVzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0gcFNyY1Jlc2lkdWUgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbgotICogICAgICAgICAgICAgICAgICByZXNpZHVhbHMuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsdGhlbiBubyBwcmVkaWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIGlzCi0gKiAgICAgICAgICAgICAgICAgIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4KLSAqIFtpbl0gZHN0U3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguCi0gKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KLSAqICAgICAgICAgICAgICAgICAgSWYgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzCi0gKiAgICAgICAgICAgICAgICAgIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLgotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX01DUmVjb25CbG9ja19SZXMoCi0gICAgICBjb25zdCBPTVhfVTggKnBTcmMsIAotICAgICAgY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCi0gICAgICBPTVhfVTggKnBEc3QsCi0gICAgICBPTVhfSU5UIGRzdFN0ZXApCi17Ci0gICAgICAKLSAgT01YX1U4IHgseTsKLSAgT01YX0lOVCB0ZW1wOwotICAKLSAgZm9yKHkgPSAwOyB5IDwgODsgeSsrKQotICB7Ci0gICAgZm9yKHggPSAwOyB4IDwgODsgeCsrKQotICAgIHsKLSAgICAgIHRlbXAgPSBwU3JjW3hdICsgcFNyY1Jlc2lkdWVbeF07ICAgICAgICAgCi0gICAgICBwRHN0W3hdID0gYXJtQ2xpcCgwLDI1NSx0ZW1wKTsKLSAgICB9Ci0gICAgcERzdCArPSBkc3RTdGVwOwotICAgIHBTcmMgKz0gODsKLSAgICBwU3JjUmVzaWR1ZSArPSA4OwotICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgKDYuMi41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAotICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgc3JjU3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcFNyY1Jlc2lkdWUgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uIAotICogICAgICAgICAgICByZXNpZHVhbHM7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGVuIAotICogICAgICAgICAgICBubyBwcmVkaWN0aW9uIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIAotICogICAgICAgICAgICBpcyBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uIAotICogICBwcmVkaWN0VHlwZSAtIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIAotICogICAgICAgICAgICA2LjIuMS4yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAgSWYgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcyBhcmUgCi0gKiAgICAgICAgICAgIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwU3JjUmVzaWR1ZSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIG9yIHBEc3QuIAotICogICAgLSAgICBlaXRoZXIgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBpbnZhbGlkIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIHByZWRpY3RUeXBlLiAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBybmRWYWwgaXMgbm90IGVxdWFsIGVpdGhlciB0byAwIG9yIDEuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NQ1JlY29uQmxvY2soCi0JCWNvbnN0IE9NWF9VOCAqcFNyYywKLQkJT01YX0lOVCBzcmNTdGVwLAotCQljb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKLQkJT01YX1U4ICpwRHN0LCAKLQkJT01YX0lOVCBkc3RTdGVwLAotCQlPTVhfSU5UIHByZWRpY3RUeXBlLAotCQlPTVhfSU5UIHJuZFZhbCkKLXsKLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLSAgICBPTVhfVTggcFRlbXBEc3RbNjRdOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1Jlc2lkdWUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChkc3RTdGVwICUgOCkgfHwgKHNyY1N0ZXAgJSA4KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKHByZWRpY3RUeXBlICE9IE9NWF9WQ19JTlRFR0VSX1BJWEVMKSAmJgotICAgICAgICAgICAgICAgICAgICAocHJlZGljdFR5cGUgIT0gT01YX1ZDX0hBTEZfUElYRUxfWCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHByZWRpY3RUeXBlICE9IE9NWF9WQ19IQUxGX1BJWEVMX1kpICYmCi0gICAgICAgICAgICAgICAgICAgIChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSEFMRl9QSVhFTF9YWSkKLSAgICAgICAgICAgICAgICAgICApLE9NWF9TdHNfQmFkQXJnRXJyKTsgCi0gICAgYXJtUmV0QXJnRXJySWYoKChybmRWYWwgIT0gMCkgJiYgKHJuZFZhbCAhPSAxKSksT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIHN3aXRjaChwcmVkaWN0VHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgT01YX1ZDX0lOVEVHRVJfUElYRUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfTm9SZXMocFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfVkNfSEFMRl9QSVhFTF9YOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSGFsZlBlbEhvcihwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1ZDX0hBTEZfUElYRUxfWToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0hhbGZQZWxWZXIocFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9WQ19IQUxGX1BJWEVMX1hZOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSGFsZlBlbFZlckhvcihwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIAotICAgIGlmKHBTcmNSZXNpZHVlID09IE5VTEwpCi0gICAgewotICAgICAgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcygmKHBUZW1wRHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCk7ICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYXJtVkNNNFAyX01DUmVjb25CbG9ja19SZXMoJihwVGVtcERzdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVzaWR1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwKTsgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE4NTJlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FTW9kZSwgCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywgCi0gICAgT01YX1UzMiAqcFNpemUKLSAgICkKLXsKLSAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBTaXplLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE1FUGFyYW1zLT5zZWFyY2hSYW5nZSA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0gpICYmCi0gICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgKnBTaXplID0gKE9NWF9JTlQpIHNpemVvZihBUk1WQ000UDJfTUVTcGVjKTsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljNTdjMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUVJbml0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemF0aW9uIG1vZHVsZXMgZm9yIHRoZSB2ZW5kb3Igc3BlY2lmaWMgTW90aW9uIEVzdGltYXRpb24gc3RydWN0dXJlLgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0KAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRU1vZGUsIAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsIAotICAgIHZvaWQgKnBNRVNwZWMKLSAgICkKLXsKLSAgICBBUk1WQ000UDJfTUVTcGVjICphcm1NRVNwZWMgPSAoQVJNVkNNNFAyX01FU3BlYyAqKSBwTUVTcGVjOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKCFwTUVQYXJhbXMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighcE1FU3BlYywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDJfRkFTVF9TRUFSQ0gpICYmIAotICAgICAgICAgICAgICAgICAgIChNRU1vZGUgIT0gT01YX1ZDX000UDJfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE1FUGFyYW1zLT5zZWFyY2hSYW5nZSA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hFbmFibGU4eDggICAgID0gcE1FUGFyYW1zLT5zZWFyY2hFbmFibGU4eDg7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5oYWxmUGVsU2VhcmNoRW5hYmxlID0gcE1FUGFyYW1zLT5oYWxmUGVsU2VhcmNoRW5hYmxlOwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2UgICAgICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U7ICAgICAgICAKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnJuZFZhbCAgICAgICAgICAgICAgPSBwTUVQYXJhbXMtPnJuZFZhbDsKLSAgICBhcm1NRVNwZWMtPk1FTW9kZSAgICAgICAgICAgICAgICAgICAgICAgPSBNRU1vZGU7Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWJiMjk3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgbW90aW9uIHNlYXJjaCAxNngxNiBtYWNyb2Jsb2NrCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogMTZ4MTYgYmxvY2sgbWF0Y2ggd3JhcHBlciBmdW5jdGlvbiwgY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi4KLSAqIElmIGhhbGYgcGVsIHNlYXJjaCBpcyBlbmFibGVkIGl0IGFsc28gY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkgIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KLSAqIFtpbl0Jc3JjUmVmU3RlcAkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4KLSAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwKLSAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00Ci0gKiBbaW5dCXBTcmNDdXJyQnVmCSAgcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksCi0gKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeS4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcyBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCi0gKiBbaW5dIHBTcmNQcmVNVgkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgotICogW2luXSBwU3JjUHJlU0FECSAgcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLgotICogW2luXSBwTUVTcGVjCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZwotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogW291dF0gcERzdE1WCSAgICAgIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XSBwRHN0U0FECSAgcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICogKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfMTZ4MTYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgY29uc3QgT01YX0lOVCBzcmNSZWZTdGVwLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRAotKQotewotICAgIE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMgPSAoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjOwotICAgIE9NWF9JTlQgcm5kVmFsOwotICAgIAotICAgIHJuZFZhbCA9IHBNRVBhcmFtcy0+cm5kVmFsOwotICAgIAotICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYoCi0gICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgIHBSZWZSZWN0LAotICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgcFNyY1ByZU1WLAotICAgICAgICBwU3JjUHJlU0FELAotICAgICAgICBwTUVQYXJhbXMsCi0gICAgICAgIHBEc3RNViwKLSAgICAgICAgcERzdFNBRCk7Ci0gICAgCi0gICAgaWYgKHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZSkKLSAgICB7Ci0gICAgICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYoCi0gICAgICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgICAgIHBSZWZSZWN0LAotICAgICAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgcm5kVmFsLAotICAgICAgICAgICAgcERzdE1WLAotICAgICAgICAgICAgcERzdFNBRCk7Ci0gICAgfQotIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOyAgICAgICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OAotICoKLSAqIERlc2NyaXB0aW9uOgotICogOHg4IGJsb2NrIG1hdGNoIHdyYXBwZXIgZnVuY3Rpb24sIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LgotICogSWYgaGFsZiBwZWwgc2VhcmNoIGlzIGVuYWJsZWQgaXQgYWxzbyBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkgIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KLSAqIFtpbl0Jc3JjUmVmU3RlcAkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4KLSAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwKLSAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00Ci0gKiBbaW5dCXBTcmNDdXJyQnVmCSAgcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksCi0gKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeS4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcyBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCi0gKiBbaW5dIHBTcmNQcmVNVgkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgotICogW2luXSBwU3JjUHJlU0FECSAgcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLgotICogW2luXSBwTUVTcGVjCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZwotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogW291dF0gcERzdE1WCSAgICAgIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XSBwRHN0U0FECSAgcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICogKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4KAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgc3JjUmVmU3RlcCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zID0gKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYzsKLSAgICBPTVhfSU5UIHJuZFZhbDsKLSAgICAKLSAgICBybmRWYWwgPSBwTUVQYXJhbXMtPnJuZFZhbDsKLSAgICAKLSAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCgKLSAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICBwU3JjUHJlTVYsCi0gICAgICAgIHBTcmNQcmVTQUQsCi0gICAgICAgIHBNRVBhcmFtcywKLSAgICAgICAgcFNyY0RzdE1WLAotICAgICAgICBwRHN0U0FEKTsKLSAgICAKLSAgICBpZiAocE1FUGFyYW1zLT5oYWxmUGVsU2VhcmNoRW5hYmxlKQotICAgIHsKLSAgICAgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgoCi0gICAgICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgICAgIHBSZWZSZWN0LAotICAgICAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgcm5kVmFsLAotICAgICAgICAgICAgcFNyY0RzdE1WLAotICAgICAgICAgICAgcERzdFNBRCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOyAgICAgICAgCi19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4yLjQuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIHNlYXJjaCBmb3IgYSAxNngxNiBtYWNyb2Jsb2NrLiAgU2VsZWN0cyBiZXN0IG1vdGlvbiBzZWFyY2ggCi0gKiBzdHJhdGVneSBmcm9tIGFtb25nIGludGVyLTFNViwgaW50ZXItNE1WLCBhbmQgaW50cmEgbW9kZXMuICBTdXBwb3J0cyAKLSAqIGludGVnZXIgYW5kIGhhbGYgcGl4ZWwgcmVzb2x1dGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgTUIgaW4gdGhlIAotICogICAgICAgICAgICBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3Qgc291cmNlIGRhdGEgb3V0c2lkZSB0aGUgcmVnaW9uIAotICogICAgICAgICAgICBib3VuZGVkIGJ5IHRoZSBNQiB0byBiZSBhdmFpbGFibGU7IGZvciBleGFtcGxlIGl0IGlzIG5vdCAKLSAqICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGd1YXJhbnRlZSB0aGUgYXZhaWxhYmlsaXR5IG9mIAotICogICAgICAgICAgICBwU3JjQ3VyckJ1ZlstU3JjQ3VyclN0ZXBdLCBpLmUuLCB0aGUgcm93IG9mIHBpeGVscyBhYm92ZSB0aGUgTUIgCi0gKiAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZC4gCi0gKiAgIHNyY0N1cnJTdGVwIC0gd2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGxhbmUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjUmVmU3RlcCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlLCBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gCi0gKiAgICAgICAgICAgIHRoZSBpbWFnZSBvcmlnaW4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZTsgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW5mbyAtIGFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgbmVhcmJ5IE1CczogCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzBdIC0gcG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1sxXSAtIHBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1syXSAtIHBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzNdIC0gcG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIHRvIE5VTEwgaWYgdGhlIAotICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIE1CIGRvZXNuJ3QgZXhpc3QuICBGb3IgZWFjaCBNQiwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgCi0gKiAgICAgICAgICAgIG1lbWJlcnMgYXJlIHVzZWQ6ICAgIAotICogICAgICAgICAgICAtICAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlLCBlaXRoZXIgT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYgCi0gKiAgICAgICAgICAgIC0gICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgIGluIDEvMiBwaXhlbCB1bml0cyAKLSAqICAgICAgICAgICAgLSAgIHNsaWNlSUQgLSBudW1iZXIgb2YgdGhlIHNsaWNlIHRvIHdoaWNoIHRoZSBNQiBiZWxvbmdzIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gIFRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2JweSBhbmQgY2JwYyBhcmUgCi0gKiAgICAgICAgICAgIGlnbm9yZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbjogICAKLSAqICAgICAgICAgICAgICAtICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0Vi4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WUHJlZFsyXVsyXSAtIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBjYnB5IGFuZCBjYnBjIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgZnVuY3Rpb24uIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgbWluaW11bSBTQUQgZm9yIElOVEVSMVYsIG9yIHN1bSBvZiBtaW5pbXVtIFNBRHMgCi0gKiAgICAgICAgICAgIGZvciBJTlRFUjRWIAotICogICBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFNBRCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgCi0gKiAgICAgICAgICAgIDh4OCBsdW1hIGJsb2NrcyBpbiB0aGUgTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNQkludGVyLCBwTUJJbnRyYSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyciwgb3IgcERzdFNBRC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgc3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9TMzIgc3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0KnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDJNQkluZm9QdHIgKnBNQkluZm8sCi0gICAgT01YVkNNNFAyTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9VMTYgKnBEc3RTQUQsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pCi17Ci0gCi0gICAgT01YX0lOVCBpbnRyYVNBRCwgYXZlcmFnZSwgY291bnQsIGluZGV4LCB4LCB5OwotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WMTZ4MTY7Ci0gICAgT01YX0lOVCAgICAgICAgICAgZHN0U0FEMTZ4MTY7Ci0gICAgT01YX0lOVCAgICAgICAgICAgZHN0U0FEOHg4OwotICAgIE9NWFZDTTRQMk1FUGFyYW1zICAqcE1FUGFyYW1zOyAKLQlPTVhWQ000UDJDb29yZGluYXRlIFRlbXBDdXJyUG9pbnRQb3M7IAotICAgIE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBUZW1wQ3VyclBvaW50UG9zOyAKLSAgICBPTVhfVTggYVRlbXBTcmNDdXJyQnVmWzI3MV07Ci0gICAgT01YX1U4ICpwVGVtcFNyY0N1cnJCdWY7Ci0gICAgT01YX1U4ICpwRHN0OwotICAgIE9NWF9VOCBhRHN0WzcxXTsKLSAgICBPTVhfUzMyIGRzdFN0ZXAgPSA4OwotICAgIE9NWF9JTlQgcHJlZGljdFR5cGU7Ci0JT01YX1MzMiBTYWQ7Ci0gICAgY29uc3QgT01YX1U4ICpwVGVtcFNyY1JlZkJ1ZjsKLSAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjFbNF07Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYyWzRdOwotICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WM1s0XTsKLSAgICAgICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZWZCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChzcmNDdXJyU3RlcCAlIDE2KSB8fCAoc3JjUmVmU3RlcCAlIDE2KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwQ3VyclBvaW50UG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TUJDdXJyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICAKLSAgICBwVGVtcEN1cnJQb2ludFBvcyA9ICYoVGVtcEN1cnJQb2ludFBvcyk7Ci0gICAgcFRlbXBTcmNDdXJyQnVmID0gYXJtQWxpZ25UbzE2Qnl0ZXMoYVRlbXBTcmNDdXJyQnVmKTsKLSAgICBwTUVQYXJhbXMgPSAoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjOwotICAgIHBUZW1wQ3VyclBvaW50UG9zLT54ID0gcEN1cnJQb2ludFBvcy0+eDsKLSAgICBwVGVtcEN1cnJQb2ludFBvcy0+eSA9IHBDdXJyUG9pbnRQb3MtPnk7Ci0gICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVEVSOwotICAgIAotICAgIC8qIFByZXBhcmluZyBhIGxpbmVhciBidWZmZXIgZm9yIGJsb2NrIG1hdGNoICovCi0gICAgZm9yICh5ID0gMCwgaW5kZXggPSBjb3VudCA9IDA7IHkgPCAxNjsgeSsrLCBpbmRleCArPSBzcmNDdXJyU3RlcCAtIDE2KQotICAgIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgMTY7IHgrKywgY291bnQrKywgaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmW2NvdW50XSA9IHBTcmNDdXJyQnVmW2luZGV4XTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IoeSA9IDAsIGluZGV4ID0gMDsgeSA8IDI7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvcih4ID0gMDsgeCA8IDI7IHgrKyxpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigocE1CSW5mb1swXSAhPSBOVUxMKSAmJiAocE1CSW5mb1swXS0+bWJUeXBlICE9IE9NWF9WQ19JTlRSQSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVtpbmRleF0gPSAmKHBNQkluZm9bMF0tPnBNVjBbeV1beF0pOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxW2luZGV4XSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigocE1CSW5mb1sxXSAhPSBOVUxMKSAmJiAocE1CSW5mb1sxXS0+bWJUeXBlICE9IE9NWF9WQ19JTlRSQSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwU3JjQ2FuZE1WMltpbmRleF0gPSAmKHBNQkluZm9bMV0tPnBNVjBbeV1beF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbaW5kZXhdID0gTlVMTDsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigocE1CSW5mb1szXSAhPSBOVUxMKSAmJiAocE1CSW5mb1szXS0+bWJUeXBlICE9IE9NWF9WQ19JTlRSQSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1tpbmRleF0gPSAmKHBNQkluZm9bM10tPnBNVjBbeV1beF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbaW5kZXhdID0gTlVMTDsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0JLyogQ2FsY3VsYXRpbmcgU0FEIGF0IE1WKDAsMCkgKi8KLQlhcm1WQ0NPTU1fU0FEKHBUZW1wU3JjQ3VyckJ1ZiwKLQkJCQkJICAxNiwKLQkJCQkJICBwU3JjUmVmQnVmLAotCQkJCQkgIHNyY1JlZlN0ZXAsCi0JCQkJCSAgJlNhZCwKLQkJCQkJICAxNiwKLQkJCQkJICAxNik7Ci0JKnBEc3RTQUQgPSBTYWQ7Ci0KLSAgICAvKiBNb2RlIGRlY2lzaW9uIGZvciBOT1RfQ09ERUQgTUIgKi8KLQlpZigqcERzdFNBRCA9PSAwKQotCXsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCA9IDA7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHkgPSAwOwotICAgICAgICAqcERzdFNBRCAgID0gMDsKLQkJcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0JfQotCi0gICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXSksCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzBdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlswXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbMF0sCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVswXSksCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAvKiBJbnRlciAxIE1WICovCi0gICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfMTZ4MTYoCi0gICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgIHBSZWZSZWN0LAotICAgICAgICBwVGVtcFNyY0N1cnJCdWYsCi0gICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVswXSksCi0gICAgICAgIE5VTEwsCi0gICAgICAgIHBNRVBhcmFtcywKLSAgICAgICAgJmRzdE1WMTZ4MTYsCi0gICAgICAgICZkc3RTQUQxNngxNik7Ci0gICAgCi0gICAgLyogSW5pdGlhbGl6ZSBhbGwgd2l0aCAxIE1WIHZhbHVlcyAqLwotICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggPSBkc3RNVjE2eDE2LmR4OwotICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHkgPSBkc3RNVjE2eDE2LmR5OwotICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0uZHggPSBkc3RNVjE2eDE2LmR4OwotICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0uZHkgPSBkc3RNVjE2eDE2LmR5OwotICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0uZHggPSBkc3RNVjE2eDE2LmR4OwotICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0uZHkgPSBkc3RNVjE2eDE2LmR5OwotICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHggPSBkc3RNVjE2eDE2LmR4OwotICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHkgPSBkc3RNVjE2eDE2LmR5OyAKLSAgICAKLSAgICAqcERzdFNBRCAgID0gZHN0U0FEMTZ4MTY7ICAgICAgIAotICAgIAotICAgIGlmIChwTUVQYXJhbXMtPnNlYXJjaEVuYWJsZTh4OCkKLSAgICB7Ci0gICAgICAgIC8qIEludGVyIDRNViAqLwotICAgICAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDggKHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWYsIHBUZW1wQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMF0pLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMsICYocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTQUQ4eDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgcERzdEJsb2NrU0FEWzBdID0gZHN0U0FEOHg4OwotICAgICAgICAqcERzdFNBRCA9IGRzdFNBRDh4ODsKLSAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggKz0gODsKLSAgICAgICAgcFNyY1JlZkJ1ZiArPSA4OwotICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCgKLSAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbMV0sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyWzFdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1sxXSwKLSAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgMSk7Ci0gICAgICAgIAotICAgICAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDggKHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWYsIHBUZW1wQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMV0pLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMsICYocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTQUQ4eDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgcERzdEJsb2NrU0FEWzFdID0gZHN0U0FEOHg4OwotICAgICAgICAqcERzdFNBRCArPSBkc3RTQUQ4eDg7Ci0gICAgICAgIHBUZW1wQ3VyclBvaW50UG9zLT54IC09IDg7Ci0gICAgICAgIHBUZW1wQ3VyclBvaW50UG9zLT55ICs9IDg7Ci0gICAgICAgIHBTcmNSZWZCdWYgKz0gKHNyY1JlZlN0ZXAgKiA4KSAtIDg7Ci0gICAgICAgIAotICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCgKLSAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbMl0sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyWzJdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1syXSwKLSAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgMik7Ci0gICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFsxXVswXSksIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBwRHN0QmxvY2tTQURbMl0gPSBkc3RTQUQ4eDg7Ci0gICAgICAgICpwRHN0U0FEICs9IGRzdFNBRDh4ODsKLSAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggKz0gODsKLSAgICAgICAgcFNyY1JlZkJ1ZiArPSA4OwotICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCgKLSAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbM10sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyWzNdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1szXSwKLSAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgMyk7Ci0gICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFsxXVsxXSksIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBwRHN0QmxvY2tTQURbM10gPSBkc3RTQUQ4eDg7Ci0gICAgICAgICpwRHN0U0FEICs9IGRzdFNBRDh4ODsgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvKiBDaGVja2luZyBpZiA0TVYgaXMgZXF1YWwgdG8gMU1WICovCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSAhPSBkc3RNVjE2eDE2LmR5KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0uZHkgIT0gZHN0TVYxNngxNi5keSkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keSAhPSBkc3RNVjE2eDE2LmR5KQotICAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHNlbGVjdCB0aGUgNCBNViAqLwotICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVEVSNFY7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLyogZmluZGluZyB0aGUgZXJyb3IgaW4gaW50cmEgbW9kZSAqLwotICAgIGZvciAoY291bnQgPSAwLCBhdmVyYWdlID0gMDsgY291bnQgPCAyNTYgOyBjb3VudCsrKQotICAgIHsKLSAgICAgICAgYXZlcmFnZSA9IGF2ZXJhZ2UgKyBwVGVtcFNyY0N1cnJCdWZbY291bnRdOwotICAgIH0KLSAgICBhdmVyYWdlID0gYXZlcmFnZS8yNTY7Ci0gICAgCi0JaW50cmFTQUQgPSAwOwotCi0gICAgLyogSW50cmEgU0FEIGNhbGN1bGF0aW9uICovCi0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjU2IDsgY291bnQrKykKLSAgICB7Ci0gICAgICAgIGludHJhU0FEICs9IGFybUFicyAoKHBUZW1wU3JjQ3VyckJ1Zltjb3VudF0pIC0gKGF2ZXJhZ2UpKTsKLSAgICB9Ci0gICAgCi0JLyogVXNpbmcgdGhlIE1QRUc0IFZNIGZvcm11bGEgZm9yIGludHJhL2ludGVyIG1vZGUgZGVjaXNpb24gCi0JICAgVmFyIDwgKFNBRCAtIDIqTkIpIHdoZXJlIE5CID0gTl4yIGlzIHRoZSBudW1iZXIgb2YgcGl4ZWxzCi0JICAgb2YgdGhlIG1hY3JvYmxvY2suKi8KLQotICAgIGlmIChpbnRyYVNBRCA8PSAoKnBEc3RTQUQgLSA1MTIpKQotICAgIHsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVFJBOwotICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ID0gMDsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IDA7Ci0gICAgICAgICpwRHN0U0FEICAgPSBpbnRyYVNBRDsKLSAgICAgICAgcERzdEJsb2NrU0FEWzBdID0gMHhGRkZGOwotICAgICAgICBwRHN0QmxvY2tTQURbMV0gPSAweEZGRkY7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IDB4RkZGRjsKLSAgICAgICAgcERzdEJsb2NrU0FEWzNdID0gMHhGRkZGOwotICAgIH0KLQotICAgIGlmKHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9PSBPTVhfVkNfSU5URVIpCi0gICAgewotICAgICAgcFRlbXBTcmNSZWZCdWYgPSBwU3JjUmVmQnVmICsgKHNyY1JlZlN0ZXAgKiBkc3RNVjE2eDE2LmR5KSArIGRzdE1WMTZ4MTYuZHg7Ci0gICAgCi0gICAgICBpZigoZHN0TVYxNngxNi5keCAmIDB4MSkgJiYgKGRzdE1WMTZ4MTYuZHkgJiAweDEpKQotICAgICAgewotICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19IQUxGX1BJWEVMX1hZOwotICAgICAgfQotICAgICAgZWxzZSBpZihkc3RNVjE2eDE2LmR4ICYgMHgxKQotICAgICAgewotICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19IQUxGX1BJWEVMX1g7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGRzdE1WMTZ4MTYuZHkgJiAweDEpCi0gICAgICB7Ci0gICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSU5URUdFUl9QSVhFTDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcERzdCA9IGFybUFsaWduVG84Qnl0ZXMoJihhRHN0WzBdKSk7Ci0gICAgICAvKiBDYWxjdWxhdGluZyBCbG9jayBTQUQgYXQgTVYoZHN0TVYxNngxNi5keCxkc3RNVjE2eDE2LmR5KSAqLwotCSAgLyogQmxvY2sgMCAqLwotICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMtPnJuZFZhbCk7Ci0gICAgCi0gICAgICBhcm1WQ0NPTU1fU0FEKHBUZW1wU3JjQ3VyckJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgpOwotICAgICAgcERzdEJsb2NrU0FEWzBdID0gU2FkOwotICAgCi0gICAgICAvKiBCbG9jayAxICovCi0gICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmICsgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMtPnJuZFZhbCk7CQkJCQkgIAotCi0gICAgICBhcm1WQ0NPTU1fU0FEKHBUZW1wU3JjQ3VyckJ1ZiArIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgIHBEc3RCbG9ja1NBRFsxXSA9IFNhZDsKLQkKLSAgICAgIC8qIEJsb2NrIDIgKi8KLSAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYgKyAoc3JjUmVmU3RlcCo4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMtPnJuZFZhbCk7Ci0KLSAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgKDE2KjgpLAotICAgICAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgOCk7Ci0gICAgICBwRHN0QmxvY2tTQURbMl0gPSBTYWQ7Ci0KLQkgIC8qIEJsb2NrIDMgKi8KLSAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYgKyAoc3JjUmVmU3RlcCo4KSArIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOwotCi0gICAgICBhcm1WQ0NPTU1fU0FEKHBUZW1wU3JjQ3VyckJ1ZiArICgxNio4KSArIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgIHBEc3RCbG9ja1NBRFszXSA9IFNhZDsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOTFmMzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9TMTYuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIG1vZHVsZXMgZm9yIEFDIERDIHByZWRpY3Rpb24KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAotICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCi0gKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKLSAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAotICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAotICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAotICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAotICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KLSAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAotICAgICBPTVhfSU5UIGN1clFQLAotICAgICBPTVhfSU5UIHByZWRRUCwKLSAgICAgT01YX0lOVCBwcmVkRGlyLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotICkKLXsKLSAgICBPTVhfVTggZmxhZzsKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGN1clFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGN1clFQID4gMzEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPiAzMSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IDEpICYmIChwcmVkRGlyICE9IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmUm93KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZkNvbCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGZsYWcgPSAwOwotICAgIHJldHVybiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCi0gICAgICAgIHBTcmNEc3QsCi0gICAgICAgIE5VTEwsCi0gICAgICAgIHBQcmVkQnVmUm93LAotICAgICAgICBwUHJlZEJ1ZkNvbCwKLSAgICAgICAgY3VyUVAsCi0gICAgICAgIHByZWRRUCwKLSAgICAgICAgcHJlZERpciwKLSAgICAgICAgQUNQcmVkRmxhZywKLSAgICAgICAgdmlkZW9Db21wLAotICAgICAgICBmbGFnLAotICAgICAgICBOVUxMKTsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNTViNjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludGVyX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgUXVhbnRpemF0aW9uCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JKAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1U4IFFQLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLQotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotICAgIE9NWF9JTlQgY29lZmZDb3VudDsKLSAgICBPTVhfSU5UIGZTaWduOwotICAgIE9NWF9JTlQgbWF4Q2xwQUMgPSAwLCBtaW5DbHBBQyA9IDA7Ci0gICAgT01YX0lOVCBtYXhDbHBEQyA9IDAsIG1pbkNscERDID0gMDsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAvKiBPbmUgYXJndW1lbnQgY2hlY2sgaXMgZGVsYXllZCB1bnRpbCB3ZSBoYXZlIGFzY2VydGFpbmVkIHRoYXQgICovCi0gICAvKiBwUU1hdHJpeCBpcyBub3QgTlVMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgCi0gICAgLyogU2V0IHRoZSBDbGlwIFJhbmdlIGJhc2VkIG9uIFNWSCBvbi9vZmYgKi8KLSAgICBpZihzaG9ydFZpZGVvSGVhZGVyID09IDEpCi0gICAgewotICAgICAgIG1heENscERDID0gMjU0OwotICAgICAgIG1pbkNscERDID0gMTsKLSAgICAgICBtYXhDbHBBQyA9IDEyNzsKLSAgICAgICBtaW5DbHBBQyA9IC0xMjc7ICAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWF4Q2xwREMgPSAyMDQ3OwotICAgICAgICBtaW5DbHBEQyA9IC0yMDQ3OwotICAgICAgICBtYXhDbHBBQyA9IDIwNDc7Ci0gICAgICAgIG1pbkNscEFDID0gLTIwNDc7ICAgCi0gICAgfQotICAgICAgICAgICAgICAgIAotICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KLSAgICBmb3IgKGNvZWZmQ291bnQgPSAwOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKLSAgICB7Ci0gICAgICAgIGZTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7ICAKLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IChhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChRUC8yKSkvKDIgKiBRUCk7Ci0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gZlNpZ247Ci0gICAgICAgIAotICAgICAgICAvKiBDbGlwICovCi0gICAgICAgIGlmIChjb2VmZkNvdW50ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9Ci0gICAgICAgICAgIChPTVhfUzE2KSBhcm1DbGlwIChtaW5DbHBEQywgbWF4Q2xwREMsIHBTcmNEc3RbY29lZmZDb3VudF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KLSAgICAgICAgICAgKE9NWF9TMTYpIGFybUNsaXAgKG1pbkNscEFDLCBtYXhDbHBBQywgcFNyY0RzdFtjb2VmZkNvdW50XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTViODAyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIFF1YW50aXphdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA2LjEuMy44LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50cmFfSSgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9VOCBRUCwKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSApCi17Ci0KLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLSAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gZXJyb3IgKi8KLSAgICBPTVhfSU5UIGRjU2NhbGVyID0gMCwgY29lZmZDb3VudCxmU2lnbjsKLSAgICBPTVhfSU5UIG1heENscEFDLCBtaW5DbHBBQzsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoYmxvY2tJbmRleCA8IDApIHx8IChibG9ja0luZGV4ID49IDEwKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAvKiBPbmUgYXJndW1lbnQgY2hlY2sgaXMgZGVsYXllZCB1bnRpbCB3ZSBoYXZlIGFzY2VydGFpbmVkIHRoYXQgICovCi0gICAvKiBwUU1hdHJpeCBpcyBub3QgTlVMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAKLSAgICAvKiBTZXQgdGhlIENsaXAgUmFuZ2UgYmFzZWQgb24gU1ZIIG9uL29mZiAqLwotICAgIGlmKHNob3J0VmlkZW9IZWFkZXIgPT0gMSkKLSAgICB7Ci0gICAgICAgIG1heENscEFDID0gMTI3OwotICAgICAgICBtaW5DbHBBQyA9IC0xMjc7Ci0gICAgICAgIGRjU2NhbGVyID0gODsKLSAgICAgICAgLyogRGVxdWFudCB0aGUgREMgdmFsdWUsIHRoaXMgYXBwbGllcyB0byBib3RoIHRoZSBtZXRob2RzICovCi0gICAgICAgIHBTcmNEc3RbMF0gPSBhcm1JbnREaXZBd2F5RnJvbVplcm8gKHBTcmNEc3RbMF0sIGRjU2NhbGVyKTsKLSAgICAKLSAgICAgICAgLyogQ2xpcCBiZXR3ZWVuIDEgYW5kIDI1NCAqLwotICAgICAgICBwU3JjRHN0WzBdID0gKE9NWF9TMTYpIGFybUNsaXAgKDEsIDI1NCwgcFNyY0RzdFswXSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1heENscEFDID0gMjA0NzsKLSAgICAgICAgbWluQ2xwQUMgPSAtMjA0NzsgICAKLSAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBEQyBzY2FsZXIgdmFsdWUgKi8KLSAgICAgICAgaWYgKChibG9ja0luZGV4ICA8IDQpIHx8IChibG9ja0luZGV4ICA+IDUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUVAgPj0gMSAmJiBRUCA8PSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDUgJiYgUVAgPD0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDIgKiBRUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDkgJiYgUVAgPD0gMjQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCArIDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAoMiAqIFFQKSAtIDE2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJsb2NrSW5kZXggPCA2KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUVAgPj0gMSAmJiBRUCA8PSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDUgJiYgUVAgPD0gMjQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAoUVAgKyAxMykvMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQIC0gNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogRGVxdWFudCB0aGUgREMgdmFsdWUsIHRoaXMgYXBwbGllcyB0byBib3RoIHRoZSBtZXRob2RzICovCi0gICAgICAgIHBTcmNEc3RbMF0gPSBhcm1JbnREaXZBd2F5RnJvbVplcm8gKHBTcmNEc3RbMF0sIGRjU2NhbGVyKTsKLSAgICB9Ci0gICAgCi0gICAgLyogU2Vjb25kIEludmVyc2UgcXVhbnRpc2F0aW9uIG1ldGhvZCAqLwotICAgIGZvciAoY29lZmZDb3VudCA9IDE7IGNvZWZmQ291bnQgPCA2NDsgY29lZmZDb3VudCsrKQotICAgIHsKLSAgICAgICAgZlNpZ24gPSAgYXJtU2lnbkNoZWNrIChwU3JjRHN0W2NvZWZmQ291bnRdKTsgIAotICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pLygyICogUVApOwotICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IGZTaWduOwotCi0gICAgICAgIC8qIENsaXAgKi8KLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9Ci0gICAgICAgIChPTVhfUzE2KSBhcm1DbGlwIChtaW5DbHBBQywgbWF4Q2xwQUMsIHBTcmNEc3RbY29lZmZDb3VudF0pOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OWUyNDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgaW52ZXJzZSBRdWFudGl6YXRpb24KLSAqIAotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0koCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfSU5UIFFQCi0JICkKLXsKLQotICAgIE9NWF9JTlQgY29lZmZDb3VudCwgU2lnbjsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCi0gICAgZm9yIChjb2VmZkNvdW50ID0gMDsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCi0gICAgewotICAgICAgICAvKiBjaGVjayBzaWduICovCi0gICAgICAgIFNpZ24gPSAgYXJtU2lnbkNoZWNrIChwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgIC8qIFF1YW50aXplIHRoZSBjb2VmZiAqLwotICAgICAgICBpZiAoUVAgJiAweDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoMiogYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pICsgMSkgKiBRUDsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gU2lnbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoMiogYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pICsgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFFQIC0gMTsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gU2lnbjsKLSAgICAgICAgfQotICAgICAgICAvKiBTYXR1cmF0ZSAqLwotICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbY29lZmZDb3VudF0pOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjI0Y2M3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIGludmVyc2UgUXVhbnRpemF0aW9uCi0gKiAKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0KLSAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gZXJyb3IgKi8KLSAgICBPTVhfSU5UIGRjU2NhbGVyID0gMCwgY29lZmZDb3VudCwgU2lnbjsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKHZpZGVvQ29tcCAhPSBPTVhfVkNfTFVNSU5BTkNFKSAmJiAodmlkZW9Db21wICE9IE9NWF9WQ19DSFJPTUlOQU5DRSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBEQyBzY2FsZXIgdmFsdWUgKi8KLSAgICAKLSAgICAvKiBsaW5lYXIgaW50cmEgREMgbW9kZSAqLwotICAgIGlmKHNob3J0VmlkZW9IZWFkZXIpCi0gICAgewotICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgfQotICAgIC8qIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAKLSAgICAgICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUVAgPj0gMSAmJiBRUCA8PSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDUgJiYgUVAgPD0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDIgKiBRUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDkgJiYgUVAgPD0gMjQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCArIDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAoMiAqIFFQKSAtIDE2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDI0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKFFQICsgMTMpLzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCAtIDY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogRGVxdWFudCB0aGUgREMgdmFsdWUsIHRoaXMgYXBwbGllcyB0byBib3RoIHRoZSBtZXRob2RzICovCi0gICAgcFNyY0RzdFswXSA9IHBTcmNEc3RbMF0gKiBkY1NjYWxlcjsKLQotICAgIC8qIFNhdHVyYXRlICovCi0gICAgcFNyY0RzdFswXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0WzBdKTsKLQotICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KLSAgICBmb3IgKGNvZWZmQ291bnQgPSAxOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKLSAgICB7Ci0gICAgICAgIC8qIGNoZWNrIHNpZ24gKi8KLSAgICAgICAgU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCi0KLSAgICAgICAgaWYgKFFQICYgMHgxKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVA7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVAgLSAxOwotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxNWE3Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBEQ1QtPnF1YW50IGFuZCByZWNvbnN0cnVjdGluZyB0aGUgaW50ZXIgdGV4dHVyZSBkYXRhCi0gKiAKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKLSAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCi0gKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKLSAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgICAgIC0gcFNyYyAKLSAqICAgICAgICAgICAgLSBwRHN0Ci0gKiAgICAgICAgICAgIC0gcFJlYwotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlcigKLSAgICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9TMTYgKiBwUmVjLAotICAgICBPTVhfVTggUVAsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQgCi0gICAgOCBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KLSAgICBPTVhfUzE2IHRlbXBCdWZmZXJbNzJdOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmZmVyOwotICAgIE9NWF9JTlQgaTsKLSAgICAgICAgCi0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZmZlciA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWZmZXIpOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFJlYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIG9teFZDTTRQMl9EQ1Q4eDhibGsgKHBTcmMsIHBEc3QpOwotICAgIG9teFZDTTRQMl9RdWFudEludGVyX0koCi0gICAgIHBEc3QsCi0gICAgIFFQLAotICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQotICAgIHsKLSAgICAgICAgcFRlbXBCdWZmZXJbaV0gPSBwRHN0W2ldOwotICAgIH0KLQotICAgIG9teFZDTTRQMl9RdWFudEludkludGVyX0koCi0gICAgIHBUZW1wQnVmZmVyLAotICAgICBRUCk7Ci0gICAgb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmZmVyLCBwUmVjKTsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTIzZTNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIERDVC0+cXVhbnQgYW5kIHJlY29uc3RydWN0aW5nIHRoZSBpbnRyYSB0ZXh0dXJlIGRhdGEKLSAqIAotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAoNi4yLjQuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzLCBpbXBsZW1lbnRzIGludHJhIGJsb2NrIEFDL0RDIGNvZWZmaWNpZW50IAotICogcHJlZGljdGlvbiwgYW5kIHJlY29uc3RydWN0cyB0aGUgY3VycmVudCBpbnRyYSBibG9jayB0ZXh0dXJlIGZvciBwcmVkaWN0aW9uIAotICogb24gdGhlIG5leHQgZnJhbWUuICBRdWFudGl6ZWQgcm93IGFuZCBjb2x1bW4gY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiAKLSAqIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGJ1ZmZlcnMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBwaXhlbHMgb2YgY3VycmVudCBpbnRyYSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgY29udGFpbmluZyAKLSAqICAgICAgICAgICAgKChudW1fbWJfcGVyX3JvdyAqIDIgKyAxKSAqIDgpIGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gCi0gKiAgICAgICAgICAgIENvZWZmaWNpZW50cyBhcmUgb3JnYW5pemVkIGludG8gYmxvY2tzIG9mIGVpZ2h0IGFzIGRlc2NyaWJlZCAKLSAqICAgICAgICAgICAgYmVsb3cgKEludGVybmFsIFByZWRpY3Rpb24gQ29lZmZpY2llbnQgVXBkYXRlIFByb2NlZHVyZXMpLiAgVGhlIAotICogICAgICAgICAgICBEQyBjb2VmZmljaWVudCBpcyBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgYnVmZmVyIGxvY2F0aW9ucyAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cy4gRWFjaCBncm91cCBvZiBlaWdodCByb3cgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBlbGVtZW50cyBjb21iaW5lZCB3aXRoIG9uZSBlbGVtZW50IGVpZ2h0IGVsZW1lbnRzIGFoZWFkIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgY29lZmZpY2llbnQgcHJlZGljdG9ycyBvZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgCi0gKiAgICAgICAgICAgIHRoYXQgaXMgc3BhdGlhbGx5IGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgdG8gCi0gKiAgICAgICAgICAgIGJlIGRlY29kZWQuIEEgbmVnYXRpdmUtdmFsdWVkIERDIGNvZWZmaWNpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgCi0gKiAgICAgICAgICAgIG5laWdoYm9yaW5nIGJsb2NrIGlzIG5vdCBJTlRSQS1jb2RlZCBvciBvdXQgb2YgYm91bmRzLCBhbmQgCi0gKiAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgaW52YWxpZC4gIFBvaW50ZXIgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgICAgICAgICAgY29udGFpbmluZyAxNiBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIENvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIG9yZ2FuaXplZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjIuMi41LiAgUG9pbnRlciBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IEFDIHByZWRpY3Rpb24gaXMgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkOyBBQyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgaWYgKnBTdW1FcnIgPj0wLCBidXQgdGhlIAotICogICAgICAgICAgICB2YWx1ZSBpcyBub3QgdXNlZCBmb3IgY29lZmZpY2llbnQgcHJlZGljdGlvbiwgaS5lLiwgdGhlIHN1bSBvZiAKLSAqICAgICAgICAgICAgYWJzb2x1dGUgZGlmZmVyZW5jZXMgc3RhcnRzIGZyb20gMCBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIEFDIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgaWYgKnBTdW1FcnIgPCAwIC4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjguIAotICogICBjdXJRcCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIGJlbG9uZ3MgCi0gKiAgIHBRcEJ1ZiAtIHBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXI7IHBRcEJ1ZlswXSAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggCi0gKiAgICAgICAgICAgIGJsb2NrIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYSksIGFuZCBwUXBCdWZbMV0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IGJsb2NrIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayAoUVBjKS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIAotICogICAgICAgICAgICBibG9jayBpcyBvdXRzaWRlIG9mIHRoZSBWT1AgYm91bmQsIHRoZSBRcCB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgCi0gKiAgICAgICAgICAgIHRoZSBpbnRyYSBwcmVkaWN0aW9uIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIAotICogICAgICAgICAgICBzdWItY2xhdXNlIDcuNC4zLjMsICBBZGFwdGl2ZSBBQyBDb2VmZmljaWVudCBQcmVkaWN0aW9uLiAgCi0gKiAgIHNyY1N0ZXAgLSB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gd2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCBidWZmZXI7IHBEc3RbMF0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgREMgY29lZmZpY2llbnQ7IHRoZSByZW1haW5pbmcgZW50cmllcyBjb250YWluIHRoZSAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cyAod2l0aG91dCBwcmVkaWN0aW9uKS4gIFRoZSBwb2ludGVyIAotICogICAgICAgICAgICBwRHN0bXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICBwUHJlQUNQcmVkaWN0IC0gaWYgcHJlZGljdGlvbiBpcyBlbmFibGVkLCB0aGUgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgCi0gKiAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgZGlmZmVyZW5jZXMgZm9yIAotICogICAgICAgICAgICBWTEMgZW5jb2RpbmcuIFRoZSBlbnRyeSBwUHJlQUNQcmVkaWN0WzBdaW5kaWNhdGVzIHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIGRpcmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICB2YWx1ZXM6IE9NWF9WQ19OT05FIChwcmVkaWN0aW9uIGRpc2FibGVkKSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwuICBUaGUgZW50cmllcyAKLSAqICAgICAgICAgICAgcFByZUFDUHJlZGljdFsxXS1wUHJlQUNQcmVkaWN0WzddY29udGFpbiBwcmVkaWN0ZWQgQUMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cy4gIElmIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgKCpwU3VtRXJyPDApIHRoZW4gdGhlIAotICogICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcmUgdW5kZWZpbmVkIHVwb24gcmV0dXJuIGZyb20gdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRlZCBBQyBjb2VmZmljaWVudCBlcnJvcnMsIAotICogICAgICAgICAgICBpLmUuLCBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGVkIGFuZCAKLSAqICAgICAgICAgICAgdW5wcmVkaWN0ZWQgQUMgY29lZmZpY2llbnRzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0LCBwUmVjLCAKLSAqICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUXBCdWYsIHBQcmVBQ1ByZWRpY3QsIHBTdW1FcnIuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwOyAKLSAqICAgIC0gICAgY3VyUVAgPD0gMCBvciBjdXJRUCA+PSAzMi4gCi0gKiAgICAtICAgIHNyY1N0ZXAsIG9yIGRzdFN0ZXAgPD0gMCBvciBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkOiAuIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgOC1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICBwU3JjLCBwUmVjLiAgCi0gKgotICogIE5vdGU6IFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgIHVwZGF0ZSBwcm9jZWR1cmVzIGRlZmluZWQgaW4gc2VjdGlvbiBpbiA2LjIuMi4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCAqIHBSZWMsCi0gICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCi0gICAgIE9NWF9JTlQgKnBTdW1FcnIsCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX1U4IGN1clFwLAotICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZiwKLSAgICAgT01YX0lOVCBzcmNTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQKLSAgICA4IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLwotICAgIE9NWF9TMTYgdGVtcEJ1ZjFbNzldLCB0ZW1wQnVmMls3OV07Ci0gICAgT01YX1MxNiB0ZW1wQnVmM1s3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxLCAqcFRlbXBCdWYyLCpwVGVtcEJ1ZjM7Ci0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wOwotICAgIE9NWF9VOCAgZmxhZzsKLSAgICBPTVhfSU5UIHgsIHksIGNvdW50LCBwcmVkRGlyOwotICAgIE9NWF9JTlQgcHJlZFFQLCBBQ1ByZWRGbGFnOwotICAgIAotCi0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7Ci0gICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOwotICAgIHBUZW1wQnVmMyA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYzKTsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwUmVjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVBQ1ByZWRpY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTdW1FcnIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBRcEJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHNyY1N0ZXAgPD0gMCkgfHwgKGRzdFN0ZXAgPD0gMCkgfHwKLSAgICAgICAgICAgICAgICAoZHN0U3RlcCAmIDcpIHx8IChzcmNTdGVwICYgNykKLSAgICAgICAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYmxvY2tJbmRleCA8IDApIHx8IChibG9ja0luZGV4ID4gOSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGFybVJldEFyZ0VycklmKChjdXJRcCA8PSAwKSB8fCAoY3VyUXAgPj0zMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotCi0gICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KLSAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQotICAgIHsKLSAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOwotICAgIH0KLSAgICAvKiBDb252ZXJ0aW5nIGZyb20gMi1kIHRvIDEtZCBidWZmZXIgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDA7IHkgPCA4OyB5KyspCi0gICAgewotICAgICAgICBmb3IoeD0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFRlbXBCdWYxW2NvdW50XSA9IHBTcmNbKHkqc3JjU3RlcCkgKyB4XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG9teFZDTTRQMl9EQ1Q4eDhibGsgIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMik7Ci0gICAgb214VkNNNFAyX1F1YW50SW50cmFfSSgKLSAgICAgICAgcFRlbXBCdWYyLAotICAgICAgICBjdXJRcCwKLSAgICAgICAgYmxvY2tJbmRleCwKLSAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0KLSAgICAvKiBDb252ZXJ0aW5nIGZyb20gMS1EIHRvIDItRCBidWZmZXIgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDA7IHkgPCA4OyB5KyspCi0gICAgewotICAgICAgICBmb3IoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHN0b3JpbmcgdGVtcGJ1ZjIgdG8gdGVtcGJ1ZjEgKi8KLSAgICAgICAgICAgIHBUZW1wQnVmMVtjb3VudF0gPSBwVGVtcEJ1ZjJbY291bnRdOwotICAgICAgICAgICAgcERzdFsoeSpkc3RTdGVwKSArIHhdID0gcFRlbXBCdWYyW2NvdW50XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFDIGFuZCBEQyBwcmVkaWN0aW9uICovCi0gICAgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgICAgIGJsb2NrSW5kZXgsCi0gICAgICAgIHBQcmVkQnVmUm93LAotICAgICAgICBwUHJlZEJ1ZkNvbCwKLSAgICAgICAgJnByZWREaXIsCi0gICAgICAgICZwcmVkUVAsCi0gICAgICAgIHBRcEJ1Zik7Ci0KLSAgICBhcm1SZXREYXRhRXJySWYoKChwcmVkUVAgPD0gMCkgfHwgKHByZWRRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBmbGFnID0gMTsKLSAgICBpZiAoKnBTdW1FcnIgPCAwKQotICAgIHsKLSAgICAgICAgQUNQcmVkRmxhZyA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEFDUHJlZEZsYWcgPSAxOwotICAgIH0KLQotICAgIGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKLSAgICAgICAgcFRlbXBCdWYyLAotICAgICAgICBwUHJlQUNQcmVkaWN0LAotICAgICAgICBwUHJlZEJ1ZlJvdywKLSAgICAgICAgcFByZWRCdWZDb2wsCi0gICAgICAgIGN1clFwLAotICAgICAgICBwcmVkUVAsCi0gICAgICAgIHByZWREaXIsCi0gICAgICAgIEFDUHJlZEZsYWcsCi0gICAgICAgIHZpZGVvQ29tcCwKLSAgICAgICAgZmxhZywKLSAgICAgICAgcFN1bUVycik7Ci0KLSAgICAvKiBSZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSBkYXRhICovCi0gICAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKLSAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICBjdXJRcCwKLSAgICAgICAgdmlkZW9Db21wLAotICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjMpOwotICAgIGZvcihjb3VudCA9IDA7IGNvdW50IDwgNjQ7IGNvdW50KyspCi0gICAgewotICAgICAgICBwUmVjW2NvdW50XSA9IGFybU1heCgwLHBUZW1wQnVmM1tjb3VudF0pOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvc3JjL2FybVZDX1ZlcnNpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MzY4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU1fVmVyc2lvbi5oIgotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLWNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb24gPSAiQVJNIE9wZW5NQVggREwgdiIgQVJNX1ZFUlNJT05fU1RSSU5HICIgICBSZWw9IiBPTVhfQVJNX1JFTEVBU0VfVEFHICIgICBBcmNoPSIgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIiAgIFRvb2xzPSIgIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOIDsKLSNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9EZWNUZXN0QmVuY2guYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzAwNjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9EZWNUZXN0QmVuY2guYworKysgL2Rldi9udWxsCkBAIC0xLDc2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIENIRUNLX01FTU9SWV9VU0FHRSBwcmludHMgYW5kIHN1bXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgaW4gY2FsbHMgdG8KLSAqIEgyNjRTd0RlY01hbGxvYygpICovCi0vKiAjZGVmaW5lIENIRUNLX01FTU9SWV9VU0FHRSAqLwotCi0vKiBfTk9fT1VUIGRpc2FibGVzIG91dHB1dCBmaWxlIHdyaXRpbmcgKi8KLS8qICNkZWZpbmUgX05PX09VVCAqLwotCi0vKiBEZWJ1ZyBwcmludHMgKi8KLSNkZWZpbmUgREVCVUcoYXJndikgcHJpbnRmIGFyZ3YKLQotLyogQ1ZTIHRhZyBuYW1lIGZvciBpZGVudGlmaWNhdGlvbiAqLwotY29uc3QgY2hhciB0YWdOYW1lWzI1Nl0gPSAiJE5hbWU6IEZJUlNUX0FORFJPSURfQ09QWVJJR0hUICQiOwotCi12b2lkIFdyaXRlT3V0cHV0KGNoYXIgKmZpbGVuYW1lLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOwotdTMyIE5leHRQYWNrZXQodTggKipwU3RybSk7Ci11MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAotICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpOwotCi0vKiBHbG9iYWwgdmFyaWFibGVzIGZvciBzdHJlYW0gaGFuZGxpbmcgKi8KLXU4ICpzdHJlYW1TdG9wID0gTlVMTDsKLXUzMiBwYWNrZXRpemUgPSAwOwotdTMyIG5hbFVuaXRTdHJlYW0gPSAwOwotRklMRSAqZm91dHB1dCA9IE5VTEw7Ci0KLSNpZmRlZiBTT0NfREVTSUdORVIKLQotLy8gSW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZGVmaW5lZCBpbiBJbml0Q2FjaGUucwotZXh0ZXJuIHZvaWQgY2FjaGVfaW5pdCh2b2lkKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICAkU3ViJCRtYWluCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBDIGxpYnJhcnkgaW5pdGlhbGlzYXRpb24gYW5kCi0gICAgICAgIGJlZm9yZSBtYWluLiBJdHMgcHVycG9zZSBpcyB0byBkbyBhbnkgZnVydGhlciBpbml0aWFsaXNhdGlvbiBiZWZvcmUgdGhlCi0gICAgICAgIGFwcGxpY2F0aW9uIHN0YXJ0LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50ICRTdWIkJG1haW4oY2hhciBhcmdjLCBjaGFyICogYXJndltdKQotewotICBjYWNoZV9pbml0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIHNvbWUgZXh0cmEgc2V0dXAgd29yayBzZXR0aW5nIHVwIGNhY2hlcwotICByZXR1cm4gJFN1cGVyJCRtYWluKGFyZ2MsIGFyZ3YpOyAvLyBjYWxscyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24KLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIG1haW4KLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIG1haW4gZnVuY3Rpb24gb2YgZGVjb2RlciB0ZXN0YmVuY2guIFByb3ZpZGVzIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UKLSAgICAgICAgd2l0aCBmaWxlIEkvTyBmb3IgSC4yNjQgZGVjb2Rlci4gUHJpbnRzIG91dCB0aGUgdXNhZ2UgaW5mb3JtYXRpb24KLSAgICAgICAgd2hlbiBleGVjdXRlZCB3aXRob3V0IGFyZ3VtZW50cy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCi0gICAgdTMyIGksIHRtcDsKLSAgICB1MzIgbWF4TnVtUGljcyA9IDA7Ci0gICAgdTggKmJ5dGVTdHJtU3RhcnQ7Ci0gICAgdTggKmltYWdlRGF0YTsKLSAgICB1OCAqdG1wSW1hZ2UgPSBOVUxMOwotICAgIHUzMiBzdHJtTGVuOwotICAgIHUzMiBwaWNTaXplOwotICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKLSAgICBIMjY0U3dEZWNSZXQgcmV0OwotICAgIEgyNjRTd0RlY0lucHV0IGRlY0lucHV0OwotICAgIEgyNjRTd0RlY091dHB1dCBkZWNPdXRwdXQ7Ci0gICAgSDI2NFN3RGVjUGljdHVyZSBkZWNQaWN0dXJlOwotICAgIEgyNjRTd0RlY0luZm8gZGVjSW5mbzsKLSAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIGRlY1ZlcjsKLSAgICB1MzIgcGljRGVjb2RlTnVtYmVyOwotICAgIHUzMiBwaWNEaXNwbGF5TnVtYmVyOwotICAgIHUzMiBudW1FcnJvcnMgPSAwOwotICAgIHUzMiBjcm9wRGlzcGxheSA9IDA7Ci0gICAgdTMyIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMDsKLQotICAgIEZJTEUgKmZpbnB1dDsKLQotICAgIGNoYXIgb3V0RmlsZU5hbWVbMjU2XSA9ICIiOwotCi0gICAgLyogUHJpbnQgQVBJIHZlcnNpb24gbnVtYmVyICovCi0gICAgZGVjVmVyID0gSDI2NFN3RGVjR2V0QVBJVmVyc2lvbigpOwotICAgIERFQlVHKCgiSC4yNjQgRGVjb2RlciBBUEkgdiVkLiVkXG4iLCBkZWNWZXIubWFqb3IsIGRlY1Zlci5taW5vcikpOwotCi0gICAgLyogUHJpbnQgdGFnIG5hbWUgaWYgJy1UJyBhcmd1bWVudCBwcmVzZW50ICovCi0gICAgaWYgKCBhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi1UIikgPT0gMCApCi0gICAgewotICAgICAgICBERUJVRygoIiVzXG4iLCB0YWdOYW1lKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoYXQgZW5vdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZ2l2ZW4sIGlmIG5vdCAtPiBwcmludCB1c2FnZQotICAgICAqIGluZm9ybWF0aW9uIG91dCAqLwotICAgIGlmIChhcmdjIDwgMikKLSAgICB7Ci0gICAgICAgIERFQlVHKCgKLSAgICAgICAgICAgICJVc2FnZTogJXMgWy1Obl0gWy1Pb3V0ZmlsZV0gWy1QXSBbLVVdIFstQ10gWy1SXSBbLVRdIGZpbGUuaDI2NFxuIiwKLSAgICAgICAgICAgIGFyZ3ZbMF0pKTsKLSAgICAgICAgREVCVUcoKCJcdC1ObiBmb3JjZXMgZGVjb2RpbmcgdG8gc3RvcCBhZnRlciBuIHBpY3R1cmVzXG4iKSk7Ci0jaWYgZGVmaW5lZChfTk9fT1VUKQotICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIG91dHB1dCB3cml0aW5nIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOwotI2Vsc2UKLSAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSB3cml0ZSBvdXRwdXQgdG8gXCJvdXRmaWxlXCIgKGRlZmF1bHQgb3V0X3d4eHhoeXl5Lnl1dilcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1Pbm9uZSBkb2VzIG5vdCB3cml0ZSBvdXRwdXRcbiIpKTsKLSNlbmRpZgotICAgICAgICBERUJVRygoIlx0LVAgcGFja2V0LWJ5LXBhY2tldCBtb2RlXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtVSBOQUwgdW5pdCBzdHJlYW0gbW9kZVxuIikpOwotICAgICAgICBERUJVRygoIlx0LUMgZGlzcGxheSBjcm9wcGVkIGltYWdlIChkZWZhdWx0IGRlY29kZWQgaW1hZ2UpXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtUiBkaXNhYmxlIERQQiBvdXRwdXQgcmVvcmRlcmluZ1xuIikpOwotICAgICAgICBERUJVRygoIlx0LVQgdG8gcHJpbnQgdGFnIG5hbWUgYW5kIGV4aXRcbiIpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCi0gICAgZm9yIChpID0gMTsgaSA8ICh1MzIpKGFyZ2MtMSk7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU4iLCAyKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4TnVtUGljcyA9ICh1MzIpYXRvaShhcmd2W2ldKzIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTyIsIDIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJjcHkob3V0RmlsZU5hbWUsIGFyZ3ZbaV0rMik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVAiKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcGFja2V0aXplID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItVSIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuYWxVbml0U3RyZWFtID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItQyIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcm9wRGlzcGxheSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVIiKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nLCBmaWxlIG5hbWUgZ2l2ZW4gYnkgdXNlci4gSWYgZmlsZSBvcGVuCi0gICAgICogZmFpbHMgLT4gZXhpdCAqLwotICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy0xXSwicmIiKTsKLSAgICBpZiAoZmlucHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBPUEVOIElOUFVUIEZJTEVcbiIpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHNpemUgb2YgdGhlIGlucHV0IGZpbGUgLT4gbGVuZ3RoIG9mIHRoZSBzdHJlYW0gaW4gYnl0ZXMgKi8KLSAgICBmc2VlayhmaW5wdXQsMEwsU0VFS19FTkQpOwotICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7Ci0gICAgcmV3aW5kKGZpbnB1dCk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmVhbSBidWZmZXIuIGlmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCi0gICAgYnl0ZVN0cm1TdGFydCA9ICh1OCAqKW1hbGxvYyhzaXplb2YodTgpKnN0cm1MZW4pOwotICAgIGlmIChieXRlU3RybVN0YXJ0ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBBTExPQ0FURSBNRU1PUllcbiIpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIGZyb20gZmlsZSB0byBidWZmZXIgYW5kIGNsb3NlIGlucHV0IGZpbGUgKi8KLSAgICBmcmVhZChieXRlU3RybVN0YXJ0LCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOwotICAgIGZjbG9zZShmaW5wdXQpOwotCi0gICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVyLiBJZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLwotICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJmRlY0luc3QsIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nKTsKLSAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiREVDT0RFUiBJTklUSUFMSVpBVElPTiBGQUlMRURcbiIpKTsKLSAgICAgICAgZnJlZShieXRlU3RybVN0YXJ0KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlICovCi0gICAgc3RyZWFtU3RvcCA9IGJ5dGVTdHJtU3RhcnQgKyBzdHJtTGVuOwotICAgIGRlY0lucHV0LnBTdHJlYW0gPSBieXRlU3RybVN0YXJ0OwotICAgIGRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOwotICAgIGRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOwotCi0gICAgLyogZ2V0IHBvaW50ZXIgdG8gbmV4dCBwYWNrZXQgYW5kIHRoZSBzaXplIG9mIHBhY2tldAotICAgICAqIChmb3IgcGFja2V0aXplIG9yIG5hbFVuaXRTdHJlYW0gbW9kZXMpICovCi0gICAgaWYgKCAodG1wID0gTmV4dFBhY2tldCgmZGVjSW5wdXQucFN0cmVhbSkpICE9IDAgKQotICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gdG1wOwotCi0gICAgcGljRGVjb2RlTnVtYmVyID0gcGljRGlzcGxheU51bWJlciA9IDE7Ci0gICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIFBpY3R1cmUgSUQgaXMgdGhlIHBpY3R1cmUgbnVtYmVyIGluIGRlY29kaW5nIG9yZGVyICovCi0gICAgICAgIGRlY0lucHV0LnBpY0lkID0gcGljRGVjb2RlTnVtYmVyOwotCi0gICAgICAgIC8qIGNhbGwgQVBJIGZ1bmN0aW9uIHRvIHBlcmZvcm0gZGVjb2RpbmcgKi8KLSAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY0luc3QsICZkZWNJbnB1dCwgJmRlY091dHB1dCk7Ci0KLSAgICAgICAgc3dpdGNoKHJldCkKLSAgICAgICAgewotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKLSAgICAgICAgICAgICAgICAvKiBTdHJlYW0gaGVhZGVycyB3ZXJlIHN1Y2Nlc3NmdWxseSBkZWNvZGVkCi0gICAgICAgICAgICAgICAgICogLT4gc3RyZWFtIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgcXVlcnkgbm93ICovCi0KLSAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY0luc3QsICZkZWNJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICAgICAgREVCVUcoKCJQcm9maWxlICVkXG4iLCBkZWNJbmZvLnByb2ZpbGUpKTsKLQotICAgICAgICAgICAgICAgIERFQlVHKCgiV2lkdGggJWQgSGVpZ2h0ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJDcm9wcGluZyBwYXJhbXM6ICglZCwgJWQpICVkeCVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBDcm9wcGVkIGZyYW1lIHNpemUgaW4gcGxhbmFyIFlVViA0OjI6MCAqLwotICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKLSAgICAgICAgICAgICAgICAgICAgdG1wSW1hZ2UgPSBtYWxsb2MocGljU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXBJbWFnZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBEZWNvZGVyIG91dHB1dCBmcmFtZSBzaXplIGluIHBsYW5hciBZVVYgNDoyOjAgKi8KLSAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8ucGljV2lkdGggKiBkZWNJbmZvLnBpY0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBERUJVRygoInZpZGVvUmFuZ2UgJWQsIG1hdHJpeENvZWZmaWNpZW50cyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgZGVjSW5mby52aWRlb1JhbmdlLCBkZWNJbmZvLm1hdHJpeENvZWZmaWNpZW50cykpOwotCi0gICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09Ci0gICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKLQotICAgICAgICAgICAgICAgIC8qIElmIC1PIG9wdGlvbiBub3QgdXNlZCwgZ2VuZXJhdGUgZGVmYXVsdCBmaWxlIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBpZiAob3V0RmlsZU5hbWVbMF0gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihvdXRGaWxlTmFtZSwgIm91dF93JWRoJWQueXV2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk6Ci0gICAgICAgICAgICAgICAgLyogUGljdHVyZSBpcyByZWFkeSBhbmQgbW9yZSBkYXRhIHJlbWFpbnMgaW4gaW5wdXQgYnVmZmVyCi0gICAgICAgICAgICAgICAgICogLT4gdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09Ci0gICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKLSAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKLQotICAgICAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wSW1hZ2UscGljU2l6ZSkgdmFyaWFibGUgaW5pdGlhbGl6ZWQgYXQKLSAgICAgICAgICAgICAgICAgKiBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkgY2FzZSAqLwotCi0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfUElDX1JEWSkKLSAgICAgICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IE5leHRQYWNrZXQoJmRlY0lucHV0LnBTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLyogSWYgZW5vdWdoIHBpY3R1cmVzIGRlY29kZWQgLT4gZm9yY2UgZGVjb2RpbmcgdG8gZW5kCi0gICAgICAgICAgICAgICAgICogYnkgc2V0dGluZyB0aGF0IG5vIG1vcmUgc3RyZWFtIGlzIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgICAgIGlmIChtYXhOdW1QaWNzICYmIHBpY0RlY29kZU51bWJlciA9PSBtYXhOdW1QaWNzKQotICAgICAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBkZWNvZGluZyBudW1iZXIgZm9yIGV2ZXJ5IGRlY29kZWQgcGljdHVyZSAqLwotICAgICAgICAgICAgICAgIHBpY0RlY29kZU51bWJlcisrOwotCi0gICAgICAgICAgICAgICAgLyogdXNlIGZ1bmN0aW9uIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZQotICAgICAgICAgICAgICAgICAqIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcwotICAgICAgICAgICAgICAgICAqIGFyZSByZWFkeSBmb3IgZGlzcGxheSAqLwotICAgICAgICAgICAgICAgIHdoaWxlICggSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDApID09Ci0gICAgICAgICAgICAgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBERUJVRygoIlBJQyAlZCwgdHlwZSAlcyIsIHBpY0Rpc3BsYXlOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaWNEaXNwbGF5TnVtYmVyICE9IGRlY1BpY3R1cmUucGljSWQpCi0gICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIiwgZGVjb2RlZCBwaWMgJWQiLCBkZWNQaWN0dXJlLnBpY0lkKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWNQaWN0dXJlLm5ick9mRXJyTUJzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIiwgY29uY2VhbGVkICVkXG4iLCBkZWNQaWN0dXJlLm5ick9mRXJyTUJzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzICs9IGRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IGRpc3BsYXkgbnVtYmVyIGZvciBldmVyeSBkaXNwbGF5ZWQgcGljdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICBwaWNEaXNwbGF5TnVtYmVyKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCxkZWNJbmZvKSBhbHdheXMgaW5pdGlhbGl6ZWQgaWYgcGljdHVyZXMKLSAgICAgICAgICAgICAgICAgICAgICogYXZhaWxhYmxlIGZvciBkaXNwbGF5ICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgb3V0cHV0IHBpY3R1cmUgdG8gZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLmNyb3BwaW5nRmxhZykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gQ3JvcFBpY3R1cmUodG1wSW1hZ2UsIGltYWdlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjSW5mby5jcm9wUGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIHRtcEltYWdlLCBwaWNTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCBpbWFnZURhdGEsIHBpY1NpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOgotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9FUlI6Ci0gICAgICAgICAgICAgICAgLyogSW5wdXQgc3RyZWFtIHdhcyBkZWNvZGVkIGJ1dCBubyBwaWN0dXJlIGlzIHJlYWR5Ci0gICAgICAgICAgICAgICAgICogLT4gR2V0IG1vcmUgZGF0YSAqLwotICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSBOZXh0UGFja2V0KCZkZWNJbnB1dC5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBERUJVRygoIkZBVEFMIEVSUk9SXG4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIH0KLSAgICAvKiBrZWVwIGRlY29kaW5nIHVudGlsIGFsbCBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIGJ1ZmZlciBjb25zdW1lZCAqLwotICAgIH0gd2hpbGUgKGRlY0lucHV0LmRhdGFMZW4gPiAwKTsKLQotICAgIC8qIGlmIG91dHB1dCBpbiBkaXNwbGF5IG9yZGVyIGlzIHByZWZlcnJlZCwgdGhlIGRlY29kZXIgc2hhbGwgYmUgZm9yY2VkCi0gICAgICogdG8gb3V0cHV0IHBpY3R1cmVzIHJlbWFpbmluZyBpbiBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLiBVc2UgZnVuY3Rpb24KLSAgICAgKiBIMjY0U3dEZWNOZXh0UGljdHVyZSgpIHRvIG9idGFpbiBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24KLSAgICAgKiBpcyBjYWxsZWQgdW50aWwgbm8gbW9yZSBpbWFnZXMgYXJlIHJlYWR5IGZvciBkaXNwbGF5LiBTZWNvbmQgcGFyYW1ldGVyCi0gICAgICogZm9yIHRoZSBmdW5jdGlvbiBpcyBzZXQgdG8gJzEnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBlbmQgb2YgdGhlCi0gICAgICogc3RyZWFtIGFuZCBhbGwgcGljdHVyZXMgc2hhbGwgYmUgb3V0cHV0ICovCi0gICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAxKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiUElDICVkLCB0eXBlICVzIiwgcGljRGlzcGxheU51bWJlciwKLSAgICAgICAgICAgIGRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlID8gIklEUiIgOiAiTk9OLUlEUiIpKTsKLSAgICAgICAgaWYgKHBpY0Rpc3BsYXlOdW1iZXIgIT0gZGVjUGljdHVyZS5waWNJZCkKLSAgICAgICAgICAgIERFQlVHKCgiLCBkZWNvZGVkIHBpYyAlZCIsIGRlY1BpY3R1cmUucGljSWQpKTsKLSAgICAgICAgaWYgKGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiLCBjb25jZWFsZWQgJWRcbiIsIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBERUJVRygoIlxuIikpOwotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICBudW1FcnJvcnMgKz0gZGVjUGljdHVyZS5uYnJPZkVyck1CczsKLQotICAgICAgICAvKiBJbmNyZW1lbnQgZGlzcGxheSBudW1iZXIgZm9yIGV2ZXJ5IGRpc3BsYXllZCBwaWN0dXJlICovCi0gICAgICAgIHBpY0Rpc3BsYXlOdW1iZXIrKzsKLQotICAgICAgICAvKiBXcml0ZSBvdXRwdXQgcGljdHVyZSB0byBmaWxlICovCi0gICAgICAgIGltYWdlRGF0YSA9ICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZTsKLSAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAotICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0LAotICAgICAgICAgICAgICAgICZkZWNJbmZvLmNyb3BQYXJhbXMpOwotICAgICAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgdG1wSW1hZ2UsIHBpY1NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIGltYWdlRGF0YSwgcGljU2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZWxlYXNlIGRlY29kZXIgaW5zdGFuY2UgKi8KLSAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY0luc3QpOwotCi0gICAgaWYgKGZvdXRwdXQpCi0gICAgICAgIGZjbG9zZShmb3V0cHV0KTsKLQotICAgIC8qIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KLSAgICBmcmVlKGJ5dGVTdHJtU3RhcnQpOwotICAgIGZyZWUodG1wSW1hZ2UpOwotCi0gICAgREVCVUcoKCJPdXRwdXQgZmlsZTogJXNcbiIsIG91dEZpbGVOYW1lKSk7Ci0KLSAgICBERUJVRygoIkRFQ09ESU5HIERPTkVcbiIpKTsKLSAgICBpZiAobnVtRXJyb3JzIHx8IHBpY0RlY29kZU51bWJlciA9PSAxKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJFUlJPUlMgRk9VTkRcbiIpKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgV3JpdGVPdXRwdXQKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIFdyaXRlIHBpY3R1cmUgcG9pbnRlZCBieSBkYXRhIHRvIGZpbGUuIFNpemUgb2YgdGhlCi0gICAgICAgIHBpY3R1cmUgaW4gcGl4ZWxzIGlzIGluZGljYXRlZCBieSBwaWNTaXplLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBXcml0ZU91dHB1dChjaGFyICpmaWxlbmFtZSwgdTggKmRhdGEsIHUzMiBwaWNTaXplKQotewotCi0gICAgLyogZm91dHB1dCBpcyBnbG9iYWwgZmlsZSBwb2ludGVyICovCi0gICAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcsIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGRlZmluZS4KLSAgICAgICAgICogSWYgZmlsZSBvcGVuIGZhaWxzIC0+IGV4aXQgKi8KLSAgICAgICAgaWYgKHN0cmNtcChmaWxlbmFtZSwgIm5vbmUiKSAhPSAwKQotICAgICAgICB7Ci0jaWYgIWRlZmluZWQoX05PX09VVCkKLSAgICAgICAgICAgIGZvdXRwdXQgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7Ci0gICAgICAgICAgICBpZiAoZm91dHB1dCA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHKCgiVU5BQkxFIFRPIE9QRU4gT1VUUFVUIEZJTEVcbiIpKTsKLSAgICAgICAgICAgICAgICBleGl0KDEwMCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmb3V0cHV0ICYmIGRhdGEpCi0gICAgICAgIGZ3cml0ZShkYXRhLCAxLCBwaWNTaXplLCBmb3V0cHV0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IE5leHRQYWNrZXQKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEdldCB0aGUgcG9pbnRlciB0byBzdGFydCBvZiBuZXh0IHBhY2tldCBpbiBpbnB1dCBzdHJlYW0uIFVzZXMKLSAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyAncGFja2V0aXplJyBhbmQgJ25hbFVuaXRTdHJlYW0nIHRvIGRldGVybWluZSB0aGUKLSAgICAgICAgZGVjb2RlciBpbnB1dCBzdHJlYW0gbW9kZSBhbmQgJ3N0cmVhbVN0b3AnIHRvIGRldGVybWluZSB0aGUgZW5kCi0gICAgICAgIG9mIHN0cmVhbS4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0cmVhbSBtb2RlczoKLSAgICAgICAgICAgIGRlZmF1bHQgLSB0aGUgd2hvbGUgc3RyZWFtIGF0IG9uY2UKLSAgICAgICAgICAgIHBhY2tldGl6ZSAtIGEgc2luZ2xlIE5BTC11bml0IHdpdGggc3RhcnQgY29kZSBwcmVmaXgKLSAgICAgICAgICAgIG5hbFVuaXRTdHJlYW0gLSBhIHNpbmdsZSBOQUwtdW5pdCB3aXRob3V0IHN0YXJ0IGNvZGUgcHJlZml4Ci0KLSAgICAgICAgcFN0cm0gc3RvcmVzIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHByZXZpb3VzIGRlY29kZXIgaW5wdXQgYW5kIGlzCi0gICAgICAgIHJlcGxhY2VkIHdpdGggcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGVjb2RlciBpbnB1dC4KLQotICAgICAgICBSZXR1cm5zIHRoZSBwYWNrZXQgc2l6ZSBpbiBieXRlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIE5leHRQYWNrZXQodTggKipwU3RybSkKLXsKLQotICAgIHUzMiBpbmRleDsKLSAgICB1MzIgbWF4SW5kZXg7Ci0gICAgdTMyIHplcm9Db3VudDsKLSAgICB1OCAqc3RyZWFtOwotICAgIHU4IGJ5dGU7Ci0gICAgc3RhdGljIHUzMiBwcmV2SW5kZXg9MDsKLQotICAgIC8qIEZvciBkZWZhdWx0IHN0cmVhbSBtb2RlIGFsbCB0aGUgc3RyZWFtIGlzIGluIGZpcnN0IHBhY2tldCAqLwotICAgIGlmICghcGFja2V0aXplICYmICFuYWxVbml0U3RyZWFtKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGluZGV4ID0gMDsKLSAgICBzdHJlYW0gPSAqcFN0cm0gKyBwcmV2SW5kZXg7Ci0gICAgbWF4SW5kZXggPSAodTMyKShzdHJlYW1TdG9wIC0gc3RyZWFtKTsKLQotICAgIGlmIChtYXhJbmRleCA9PSAwKQotICAgICAgICByZXR1cm4oMCk7Ci0KLSAgICAvKiBsZWFkaW5nIHplcm9zIG9mIGZpcnN0IE5BTCB1bml0ICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIGJ5dGUgPSBzdHJlYW1baW5kZXgrK107Ci0gICAgfSB3aGlsZSAoYnl0ZSAhPSAxICYmIGluZGV4IDwgbWF4SW5kZXgpOwotCi0gICAgLyogaW52YWxpZCBzdGFydCBjb2RlIHByZWZpeCAqLwotICAgIGlmIChpbmRleCA9PSBtYXhJbmRleCB8fCBpbmRleCA8IDMpCi0gICAgewotICAgICAgICBERUJVRygoIklOVkFMSUQgQllURSBTVFJFQU1cbiIpKTsKLSAgICAgICAgZXhpdCgxMDApOwotICAgIH0KLQotICAgIC8qIG5hbFVuaXRTdHJlYW0gaXMgd2l0aG91dCBzdGFydCBjb2RlIHByZWZpeCAqLwotICAgIGlmIChuYWxVbml0U3RyZWFtKQotICAgIHsKLSAgICAgICAgc3RyZWFtICs9IGluZGV4OwotICAgICAgICBtYXhJbmRleCAtPSBpbmRleDsKLSAgICAgICAgaW5kZXggPSAwOwotICAgIH0KLQotICAgIHplcm9Db3VudCA9IDA7Ci0KLSAgICAvKiBTZWFyY2ggc3RyZWFtIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4ICovCi0gICAgLypsaW50IC1lKDcxNikgd2hpbGUoMSkgdXNlZCBjb25zY2lvdXNseSAqLwotICAgIHdoaWxlICgxKQotICAgIHsKLSAgICAgICAgYnl0ZSA9IHN0cmVhbVtpbmRleCsrXTsKLSAgICAgICAgaWYgKCFieXRlKQotICAgICAgICAgICAgemVyb0NvdW50Kys7Ci0KLSAgICAgICAgaWYgKCAoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU3RhcnQgY29kZSBwcmVmaXggaGFzIHR3byB6ZXJvcwotICAgICAgICAgICAgICogVGhpcmQgemVybyBpcyBhc3N1bWVkIHRvIGJlIGxlYWRpbmcgemVybyBvZiBuZXh0IHBhY2tldAotICAgICAgICAgICAgICogRm91cnRoIGFuZCBtb3JlIHplcm9zIGFyZSBhc3N1bWVkIHRvIGJlIHRyYWlsaW5nIHplcm9zIG9mIHRoaXMKLSAgICAgICAgICAgICAqIHBhY2tldCAqLwotICAgICAgICAgICAgaWYgKHplcm9Db3VudCA+IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5kZXggLT0gNDsKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQgLT0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCAtPSB6ZXJvQ291bnQrMTsKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYnl0ZSkKLSAgICAgICAgICAgIHplcm9Db3VudCA9IDA7Ci0KLSAgICAgICAgaWYgKGluZGV4ID09IG1heEluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyogU3RvcmUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KLSAgICAqcFN0cm0gPSBzdHJlYW07Ci0gICAgcHJldkluZGV4ID0gaW5kZXg7Ci0KLSAgICAvKiBuYWxVbml0U3RyZWFtIGlzIHdpdGhvdXQgdHJhaWxpbmcgemVyb3MgKi8KLSAgICBpZiAobmFsVW5pdFN0cmVhbSkKLSAgICAgICAgaW5kZXggLT0gemVyb0NvdW50OwotCi0gICAgcmV0dXJuKGluZGV4KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogQ3JvcFBpY3R1cmUKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIFBlcmZvcm0gY3JvcHBpbmcgZm9yIHBpY3R1cmUuIElucHV0IHBpY3R1cmUgcEluSW1hZ2Ugd2l0aCBkaW1lbnNpb25zCi0gICAgICAgIHBpY1dpZHRoIHggcGljSGVpZ2h0IGlzIGNyb3BwZWQgd2l0aCBwQ3JvcFBhcmFtcyBhbmQgdGhlIHJlc3VsdGluZwotICAgICAgICBwaWN0dXJlIGlzIHN0b3JlZCBpbiBwT3V0SW1hZ2UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAotICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpCi17Ci0KLSAgICB1MzIgaSwgajsKLSAgICB1MzIgb3V0V2lkdGgsIG91dEhlaWdodDsKLSAgICB1OCAqcE91dCwgKnBJbjsKLQotICAgIGlmIChwT3V0SW1hZ2UgPT0gTlVMTCB8fCBwSW5JbWFnZSA9PSBOVUxMIHx8IHBDcm9wUGFyYW1zID09IE5VTEwgfHwKLSAgICAgICAgIXBpY1dpZHRoIHx8ICFwaWNIZWlnaHQpCi0gICAgewotICAgICAgICAvKiBqdXN0IHRvIHByZXZlbnQgbGludCB3YXJuaW5nLCByZXR1cm5pbmcgbm9uLXplcm8gd2lsbCByZXN1bHQgaW4KLSAgICAgICAgICogcmV0dXJuIHdpdGhvdXQgZnJlZWluZyB0aGUgbWVtb3J5ICovCi0gICAgICAgIGZyZWUocE91dEltYWdlKTsKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIH0KLQotICAgIGlmICggKChwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoKSA+Ci0gICAgICAgICAgIHBpY1dpZHRoICkgfHwKLSAgICAgICAgICgocENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodCkgPgotICAgICAgICAgICBwaWNIZWlnaHQgKSApCi0gICAgewotICAgICAgICAvKiBqdXN0IHRvIHByZXZlbnQgbGludCB3YXJuaW5nLCByZXR1cm5pbmcgbm9uLXplcm8gd2lsbCByZXN1bHQgaW4KLSAgICAgICAgICogcmV0dXJuIHdpdGhvdXQgZnJlZWluZyB0aGUgbWVtb3J5ICovCi0gICAgICAgIGZyZWUocE91dEltYWdlKTsKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIH0KLQotICAgIG91dFdpZHRoID0gcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aDsKLSAgICBvdXRIZWlnaHQgPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodDsKLQotICAgIC8qIENhbGN1bGF0ZSBzdGFydGluZyBwb2ludGVyIGZvciBsdW1hICovCi0gICAgcEluID0gcEluSW1hZ2UgKyBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldDsKLSAgICBwT3V0ID0gcE91dEltYWdlOwotCi0gICAgLyogQ29weSBsdW1hIHBpeGVsIHZhbHVlcyAqLwotICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKLSAgICAgICAgfQotICAgICAgICBwSW4gKz0gcGljV2lkdGggLSBvdXRXaWR0aDsKLSAgICB9Ci0KLSAgICBvdXRXaWR0aCA+Pj0gMTsKLSAgICBvdXRIZWlnaHQgPj49IDE7Ci0KLSAgICAvKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9pbnRlciBmb3IgY2IgKi8KLSAgICBwSW4gPSBwSW5JbWFnZSArIHBpY1dpZHRoKnBpY0hlaWdodCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKLQotICAgIC8qIENvcHkgY2IgcGl4ZWwgdmFsdWVzICovCi0gICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOwotICAgICAgICB9Ci0gICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHBvaW50ZXIgZm9yIGNyICovCi0gICAgcEluID0gcEluSW1hZ2UgKyA1KnBpY1dpZHRoKnBpY0hlaWdodC80ICsKLSAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOwotCi0gICAgLyogQ29weSBjciBwaXhlbCB2YWx1ZXMgKi8KLSAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7Ci0gICAgICAgIH0KLSAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDApOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY1RyYWNlCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY1RyYWNlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhcHBlbmRzCi0gICAgICAgIHRyYWNlIG1lc3NhZ2VzIHRvIGZpbGUgbmFtZWQgJ2RlY19hcGkudHJjJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKQotewotICAgIEZJTEUgKmZwOwotCi0gICAgZnAgPSBmb3BlbigiZGVjX2FwaS50cmMiLCAiYXQiKTsKLQotICAgIGlmICghZnApCi0gICAgICAgIHJldHVybjsKLQotICAgIGZ3cml0ZShzdHJpbmcsIDEsIHN0cmxlbihzdHJpbmcpLCBmcCk7Ci0gICAgZndyaXRlKCJcbiIsIDEsMSwgZnApOwotCi0gICAgZmNsb3NlKGZwKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNYWxsb2MKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWFsbG9jIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi0gICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWFsbG9jIGZvciBhbGxvY2F0aW9uIG9mIG1lbW9yeS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSwgdTMyIG51bSkKLXsKLSAgICBpZiAoc2l6ZSA+IFVJTlQzMl9NQVggLyBudW0pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChDSEVDS19NRU1PUllfVVNBR0UpCi0gICAgLyogTm90ZSB0aGF0IGlmIHRoZSBkZWNvZGVyIGhhcyB0byBmcmVlIGFuZCByZWFsbG9jYXRlIHNvbWUgb2YgdGhlIGJ1ZmZlcnMKLSAgICAgKiB0aGUgdG90YWwgdmFsdWUgd2lsbCBiZSBpbnZhbGlkICovCi0gICAgc3RhdGljIHUzMiBudW1CeXRlcyA9IDA7Ci0gICAgbnVtQnl0ZXMgKz0gc2l6ZSAqIG51bTsKLSAgICBERUJVRygoIkFsbG9jYXRlZCAlZCBieXRlcywgdG90YWwgJWRcbiIsIHNpemUsIG51bUJ5dGVzKSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBtYWxsb2Moc2l6ZSAqIG51bSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNGcmVlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi0gICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gZnJlZSBmb3IgZnJlZWluZyBvZiBtZW1vcnkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKQotewotICAgIGZyZWUocHRyKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1jcHkKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtY3B5IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi0gICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtY3B5IHRvIGNvcHkgc3JjIHRvIGRlc3QuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKLXsKLSAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbXNldCBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbXNldCB0byBzZXQgY29udGVudCBvZiBtZW1vcnkgYXJlYSBwb2ludGVkIGJ5IHB0ci4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpCi17Ci0gICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0V2YWx1YXRpb25UZXN0QmVuY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1NmExZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0V2YWx1YXRpb25UZXN0QmVuY2guYworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLXZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIG1haW4KLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIG1haW4gZnVuY3Rpb24uIEFzc3VtaW5nIHRoYXQgZXhlY3V0YWJsZSBpcyBuYW1lZCAnZGVjb2RlcicgdGhlIHVzYWdlCi0gICAgICAgIGlzIGFzIGZvbGxvd3MKLQotICAgICAgICAgICAgZGVjb2RlciBpbnB1dEZpbGVOYW1lCi0KLSAgICAgICAgLCB3aGVyZSBpbnB1dEZpbGVOYW1lIHNoYWxsIGJlIG5hbWUgb2YgZmlsZSBjb250YWluaW5nIGgyNjQgc3RyZWFtCi0gICAgICAgIGRhdGEuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0KLSAgICB1OCAqYnl0ZVN0cm1TdGFydDsKLSAgICB1OCAqYnl0ZVN0cm07Ci0gICAgdTMyIHN0cm1MZW47Ci0gICAgdTMyIHBpY1NpemU7Ci0gICAgSDI2NFN3RGVjSW5zdCBkZWNJbnN0OwotICAgIEgyNjRTd0RlY1JldCByZXQ7Ci0gICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7Ci0gICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKLSAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7Ci0gICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOwotICAgIHUzMiBwaWNOdW1iZXI7Ci0KLSAgICBGSUxFICpmaW5wdXQ7Ci0gICAgRklMRSAqZm91dHB1dDsKLQotICAgIC8qIENoZWNrIHRoYXQgZW5vdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZ2l2ZW4sIGlmIG5vdCAtPiBwcmludCB1c2FnZQotICAgICAqIGluZm9ybWF0aW9uIG91dCAqLwotICAgIGlmIChhcmdjIDwgMikKLSAgICB7Ci0gICAgICAgIHByaW50ZiggIlVzYWdlOiAlcyBmaWxlLmgyNjRcbiIsIGFyZ3ZbMF0pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogb3BlbiBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZywgb3V0cHV0IGZpbGUgbmFtZWQgb3V0Lnl1di4gSWYgZmlsZSBvcGVuCi0gICAgICogZmFpbHMgLT4gZXhpdCAqLwotICAgIGZvdXRwdXQgPSBmb3Blbigib3V0Lnl1diIsICJ3YiIpOwotICAgIGlmIChmb3V0cHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBPUEVOIE9VVFBVVCBGSUxFXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIG9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZywgZmlsZSBuYW1lIGdpdmVuIGJ5IHVzZXIuIElmIGZpbGUgb3BlbgotICAgICAqIGZhaWxzIC0+IGV4aXQgKi8KLSAgICBmaW5wdXQgPSBmb3Blbihhcmd2W2FyZ2MtMV0sICJyYiIpOwotICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiVU5BQkxFIFRPIE9QRU4gSU5QVVQgRklMRVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBzaXplIG9mIHRoZSBpbnB1dCBmaWxlIC0+IGxlbmd0aCBvZiB0aGUgc3RyZWFtIGluIGJ5dGVzICovCi0gICAgZnNlZWsoZmlucHV0LCAwTCwgU0VFS19FTkQpOwotICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7Ci0gICAgcmV3aW5kKGZpbnB1dCk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmVhbSBidWZmZXIsIGV4aXQgaWYgdW5zdWNjZXNzZnVsICovCi0gICAgYnl0ZVN0cm0gPSBieXRlU3RybVN0YXJ0ID0gKHU4ICopSDI2NFN3RGVjTWFsbG9jKHNpemVvZih1OCksIHN0cm1MZW4pOwotICAgIGlmIChieXRlU3RybSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJVTkFCTEUgVE8gQUxMT0NBVEUgTUVNT1JZXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIGZyb20gZmlsZSB0byBidWZmZXIgYW5kIGNsb3NlIGlucHV0IGZpbGUgKi8KLSAgICBmcmVhZChieXRlU3RybSwgc2l6ZW9mKHU4KSwgc3RybUxlbiwgZmlucHV0KTsKLSAgICBmY2xvc2UoZmlucHV0KTsKLQotICAgIC8qIGluaXRpYWxpemUgZGVjb2Rlci4gSWYgdW5zdWNjZXNzZnVsIC0+IGV4aXQgKi8KLSAgICByZXQgPSBIMjY0U3dEZWNJbml0KCZkZWNJbnN0LCAwKTsKLSAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICB7Ci0gICAgICAgIHByaW50ZigiREVDT0RFUiBJTklUSUFMSVpBVElPTiBGQUlMRURcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUgKi8KLSAgICBkZWNJbnB1dC5wU3RyZWFtID0gYnl0ZVN0cm1TdGFydDsKLSAgICBkZWNJbnB1dC5kYXRhTGVuID0gc3RybUxlbjsKLSAgICBkZWNJbnB1dC5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMDsKLQotICAgIHBpY051bWJlciA9IDA7Ci0KLSAgICAvKiBGb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLCByZWFkIHRoZSBzdGFydCB0aW1lIChpbiBzZWNvbmRzKSBoZXJlLgotICAgICAqIFRoZSBkZWNvZGluZyB0aW1lIHNob3VsZCBiZSBtZWFzdXJlZCBvdmVyIHNldmVyYWwgZnJhbWVzIGFuZCBhZnRlcgotICAgICAqIHRoYXQgYXZlcmFnZSBmcHMgKGZyYW1lcy9zZWNvbmQpIGNhbiBiZSBjYWxjdWxhdGVkLgotICAgICAqCi0gICAgICogc3RhcnRUaW1lID0gR2V0VGltZSgpOwotICAgICAqCi0gICAgICogVG8gcHJldmVudCBjYWxjdWxhdGluZyBmaWxlIEkvTyBsYXRlbnNpZXMgYXMgYSBkZWNvZGluZyB0aW1lLAotICAgICAqIGNvbW1lbnQgb3V0IFdyaXRlT3V0cHV0IGZ1bmN0aW9uIGNhbGwuIEFsc28gcHJpbnRzIHRvIHN0ZG91dCBtaWdodAotICAgICAqIGNvbnN1bWUgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBjeWNsZXMgZHVyaW5nIG1lYXN1cmVtZW50ICovCi0KLSAgICAvKiBtYWluIGRlY29kaW5nIGxvb3AgKi8KLSAgICBkbwotICAgIHsKLSAgICAgICAgLyogY2FsbCBBUEkgZnVuY3Rpb24gdG8gcGVyZm9ybSBkZWNvZGluZyAqLwotICAgICAgICByZXQgPSBIMjY0U3dEZWNEZWNvZGUoZGVjSW5zdCwgJmRlY0lucHV0LCAmZGVjT3V0cHV0KTsKLQotICAgICAgICBzd2l0Y2gocmV0KQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZOgotCi0gICAgICAgICAgICAgICAgLyogcGljdHVyZSBkaW1lbnNpb25zIGFyZSBhdmFpbGFibGUgZm9yIHF1ZXJ5IG5vdyAqLwotICAgICAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0dldEluZm8oZGVjSW5zdCwgJmRlY0luZm8pOwotICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIHNpemUgaW4gcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8ucGljV2lkdGggKiBkZWNJbmZvLnBpY0hlaWdodDsKLSAgICAgICAgICAgICAgICAvKiBtZW1vcnkgbmVlZGVkIGZvciBZQ2JDciA0OjI6MCBwaWN0dXJlIGluIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKLSAgICAgICAgICAgICAgICAvKiBtZW1vcnkgbmVlZGVkIGZvciAxNi1iaXQgUkdCIHBpY3R1cmUgaW4gYnl0ZXMKLSAgICAgICAgICAgICAgICAgKiBwaWNTaXplID0gKGRlY0luZm8ucGljV2lkdGggKiBkZWNJbmZvLnBpY0hlaWdodCkgKiAyOyAqLwotCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJXaWR0aCAlZCBIZWlnaHQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUsIG51bWJlciBvZiBieXRlcwotICAgICAgICAgICAgICAgICAqICJjb25zdW1lZCIgaXMgY29tcHV0ZWQgYXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAgICAgICogcG9pbnRlciBhbmQgb2xkIHN0cmVhbSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0gZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgZGVjSW5wdXQucFN0cmVhbSA9IGRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk6Ci0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZOgotCi0gICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09Ci0gICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKLQotICAgICAgICAgICAgICAgIC8qIHVzZSBmdW5jdGlvbiBIMjY0U3dEZWNOZXh0UGljdHVyZSgpIHRvIG9idGFpbiBuZXh0IHBpY3R1cmUKLSAgICAgICAgICAgICAgICAgKiBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbiBpcyBjYWxsZWQgdW50aWwgbm8gbW9yZSBpbWFnZXMKLSAgICAgICAgICAgICAgICAgKiBhcmUgcmVhZHkgZm9yIGRpc3BsYXkgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDApID09Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZKSB7IHBpY051bWJlcisrOwotCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiUElDICVkLCB0eXBlICVzLCBjb25jZWFsZWQgJWRcbiIsIHBpY051bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlID8gIklEUiIgOiAiTk9OLUlEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNQaWN0dXJlLm5ick9mRXJyTUJzKTsKLSAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogRG8gY29sb3IgY29udmVyc2lvbiBpZiBuZWVkZWQgdG8gZ2V0IGRpc3BsYXkgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgICogaW4gUkdCLWZvcm1hdAotICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgKiBZdXZUb1JnYiggZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwgcFJnYlBpY3R1cmUgKTsgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBuZXh0IGRpc3BsYXkgaW1hZ2UgdG8gb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgV3JpdGVPdXRwdXQoZm91dHB1dCwgKHU4KilkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX0VWQUxVQVRJT05fTElNSVRfRVhDRUVERUQ6Ci0gICAgICAgICAgICAgICAgLyogZXZhbHVhdGlvbiB2ZXJzaW9uIG9mIHRoZSBkZWNvZGVyIGhhcyBsaW1pdGVkIGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICogY2FwYWJpbGl0aWVzICovCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJFVkFMVUFUSU9OIExJTUlUIFJFQUNIRURcbiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHByaW50ZigiVU5SRUNPVkVSQUJMRSBFUlJPUlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgLyoga2VlcCBkZWNvZGluZyB1bnRpbCBhbGwgZGF0YSBmcm9tIGlucHV0IHN0cmVhbSBidWZmZXIgY29uc3VtZWQgKi8KLSAgICB9IHdoaWxlIChkZWNJbnB1dC5kYXRhTGVuID4gMCk7Ci0KLWVuZDoKLQotICAgIC8qIGlmIG91dHB1dCBpbiBkaXNwbGF5IG9yZGVyIGlzIHByZWZlcnJlZCwgdGhlIGRlY29kZXIgc2hhbGwgYmUgZm9yY2VkCi0gICAgICogdG8gb3V0cHV0IHBpY3R1cmVzIHJlbWFpbmluZyBpbiBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLiBVc2UgZnVuY3Rpb24KLSAgICAgKiBIMjY0U3dEZWNOZXh0UGljdHVyZSgpIHRvIG9idGFpbiBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24KLSAgICAgKiBpcyBjYWxsZWQgdW50aWwgbm8gbW9yZSBpbWFnZXMgYXJlIHJlYWR5IGZvciBkaXNwbGF5LiBTZWNvbmQgcGFyYW1ldGVyCi0gICAgICogZm9yIHRoZSBmdW5jdGlvbiBpcyBzZXQgdG8gJzEnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBlbmQgb2YgdGhlCi0gICAgICogc3RyZWFtIGFuZCBhbGwgcGljdHVyZXMgc2hhbGwgYmUgb3V0cHV0ICovCi0gICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAxKSA9PQotICAgICAgICBIMjY0U1dERUNfUElDX1JEWSkgewotCi0gICAgICAgIHBpY051bWJlcisrOwotCi0gICAgICAgIHByaW50ZigiUElDICVkLCB0eXBlICVzLCBjb25jZWFsZWQgJWRcbiIsIHBpY051bWJlciwKLSAgICAgICAgICAgIGRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlID8gIklEUiIgOiAiTk9OLUlEUiIsCi0gICAgICAgICAgICBkZWNQaWN0dXJlLm5ick9mRXJyTUJzKTsKLSAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgLyogRG8gY29sb3IgY29udmVyc2lvbiBpZiBuZWVkZWQgdG8gZ2V0IGRpc3BsYXkgaW1hZ2UKLSAgICAgICAgICogaW4gUkdCLWZvcm1hdAotICAgICAgICAgKgotICAgICAgICAgKiBZdXZUb1JnYiggZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwgcFJnYlBpY3R1cmUgKTsgKi8KLQotICAgICAgICAvKiB3cml0ZSBuZXh0IGRpc3BsYXkgaW1hZ2UgdG8gb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgV3JpdGVPdXRwdXQoZm91dHB1dCwgKHU4KilkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwaWNTaXplKTsKLSAgICB9Ci0KLSAgICAvKiBGb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLCByZWFkIHRoZSBlbmQgdGltZSAoaW4gc2Vjb25kcykgaGVyZS4KLSAgICAgKgotICAgICAqIGVuZFRpbWUgPSBHZXRUaW1lKCk7Ci0gICAgICoKLSAgICAgKiBOb3cgdGhlIHBlcmZvcm1hbmNlIGNhbiBiZSBjYWxjdWxhdGVkIGFzIGZyYW1lcyBwZXIgc2Vjb25kOgotICAgICAqIGZwcyA9IHBpY051bWJlciAvIChlbmRUaW1lIC0gc3RhcnRUaW1lKTsgKi8KLQotCi0gICAgLyogcmVsZWFzZSBkZWNvZGVyIGluc3RhbmNlICovCi0gICAgSDI2NFN3RGVjUmVsZWFzZShkZWNJbnN0KTsKLQotICAgIC8qIGNsb3NlIG91dHB1dCBmaWxlICovCi0gICAgZmNsb3NlKGZvdXRwdXQpOwotCi0gICAgLyogZnJlZSBieXRlIHN0cmVhbSBidWZmZXIgKi8KLSAgICBmcmVlKGJ5dGVTdHJtU3RhcnQpOwotCi0gICAgcmV0dXJuIDA7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBXcml0ZU91dHB1dAotCi0gICAgUHVycG9zZToKLSAgICAgICAgV3JpdGUgcGljdHVyZSBwb2ludGVkIGJ5IGRhdGEgdG8gZmlsZSBwb2ludGVkIGJ5IGZpZC4gU2l6ZSBvZiB0aGUKLSAgICAgICAgcGljdHVyZSBpbiBwaXhlbHMgaXMgaW5kaWNhdGVkIGJ5IHBpY1NpemUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKQotewotICAgIGZ3cml0ZShkYXRhLCAxLCBwaWNTaXplLCBmaWQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY1RyYWNlCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY1RyYWNlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhcHBlbmRzCi0gICAgICAgIHRyYWNlIG1lc3NhZ2VzIHRvIGZpbGUgbmFtZWQgJ2RlY19hcGkudHJjJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKQotewotICAgIEZJTEUgKmZwOwotCi0gICAgZnAgPSBmb3BlbigiZGVjX2FwaS50cmMiLCAiYXQiKTsKLQotICAgIGlmICghZnApCi0gICAgICAgIHJldHVybjsKLQotICAgIGZ3cml0ZShzdHJpbmcsIDEsIHN0cmxlbihzdHJpbmcpLCBmcCk7Ci0gICAgZndyaXRlKCJcbiIsIDEsMSwgZnApOwotCi0gICAgZmNsb3NlKGZwKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNtYWxsb2MKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWFsbG9jIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi0gICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWFsbG9jIGZvciBhbGxvY2F0aW9uIG9mIG1lbW9yeS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSwgdTMyIG51bSkKLXsKLSAgICBpZiAoc2l6ZSA+IFVJTlQzMl9NQVggLyBudW0pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtYWxsb2Moc2l6ZSAqIG51bSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNGcmVlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi0gICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gZnJlZSBmb3IgZnJlZWluZyBvZiBtZW1vcnkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKQotewotICAgIGZyZWUocHRyKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1jcHkKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtY3B5IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi0gICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtY3B5IHRvIGNvcHkgc3JjIHRvIGRlc3QuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKLXsKLSAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbXNldCBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbXNldCB0byBzZXQgY29udGVudCBvZiBtZW1vcnkgYXJlYSBwb2ludGVkIGJ5IHB0ci4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpCi17Ci0gICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjM4ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDU4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgSDI2NFN3RGVjSW5pdAotICAgICAgICAgIEgyNjRTd0RlY0dldEluZm8KLSAgICAgICAgICBIMjY0U3dEZWNSZWxlYXNlCi0gICAgICAgICAgSDI2NFN3RGVjRGVjb2RlCi0gICAgICAgICAgSDI2NFN3RGVjR2V0QVBJVmVyc2lvbgotICAgICAgICAgIEgyNjRTd0RlY05leHRQaWN0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfY29udGFpbmVyLmgiCi0jaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kZWNvZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgIFZlcnNpb24gSW5mb3JtYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgSDI2NFNXREVDX01BSk9SX1ZFUlNJT04gMgotI2RlZmluZSBIMjY0U1dERUNfTUlOT1JfVkVSU0lPTiAzCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUgyNjRERUNfVFJBQ0UgICAgICAgICAgIFRyYWNlIEgyNjQgRGVjb2RlciBBUEkgZnVuY3Rpb24gY2FsbHMuCi1IMjY0REVDX0VWQUxVQVRJT04gICAgICBDb21waWxlIGV2YWx1YXRpb24gdmVyc2lvbiwgcmVzdHJpY3RzIG51bWJlciBvZiBmcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIGRlY29kZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBERUNfQVBJX1RSQyhzdHIpICAgIEgyNjRTd0RlY1RyYWNlKHN0cikKLSNlbHNlCi0jZGVmaW5lIERFQ19BUElfVFJDKHN0cikKLSNlbmRpZgotCi0jaWZkZWYgSDI2NERFQ19FVkFMVUFUSU9OCi0jZGVmaW5lIEgyNjRERUNfRVZBTFVBVElPTl9MSU1JVCAgIDUwMAotI2VuZGlmCi0KLXZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKSB7Ci0gICAgVU5VU0VEKHN0cmluZyk7Ci19Ci0KLXZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSwgdTMyIG51bSkgewotICAgIGlmIChzaXplID4gVUlOVDMyX01BWCAvIG51bSkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgYWxsb2NhdGUgJXUgKiAldSBieXRlcyIsIHNpemUsIG51bSk7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4NTU0MTkiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtYWxsb2Moc2l6ZSAqIG51bSk7Ci19Ci0KLXZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpIHsKLSAgICBmcmVlKHB0cik7Ci19Ci0KLXZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KSB7Ci0gICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOwotfQotCi12b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KSB7Ci0gICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEgyNjRTd0RlY0luaXQoKQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBJbml0aWFsaXplIGRlY29kZXIgc29mdHdhcmUuIEZ1bmN0aW9uIHJlc2VydmVzIG1lbW9yeSBmb3IgdGhlCi0gICAgICAgICAgICBkZWNvZGVyIGluc3RhbmNlIGFuZCBjYWxscyBoMjY0YnNkSW5pdCB0byBpbml0aWFsaXplIHRoZQotICAgICAgICAgICAgaW5zdGFuY2UgZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcgIGZsYWcgdG8gaW5kaWNhdGUgZGVjb2RlciB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cnkgdG8gcHJvdmlkZSBvdXRwdXQgcGljdHVyZXMgaW4gZGlzcGxheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciwgc2F2ZXMgbWVtb3J5Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRlY0luc3QgICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBpbnN0YW5jZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIMjY0U1dERUNfT0sgICAgICAgIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB0aGUgaW5zdGFuY2UKLSAgICAgICAgICAgIEgyNjRTV0RFQ19JTklURkFJTCAgaW5pdGlhbGl6YXRpb24gZmFpbGVkCi0gICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSIGludmFsaWQgcGFyYW1ldGVycwotICAgICAgICAgICAgSDI2NFNXREVDX01FTV9GQUlMICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0luaXQoSDI2NFN3RGVjSW5zdCAqZGVjSW5zdCwgdTMyIG5vT3V0cHV0UmVvcmRlcmluZykKLXsKLSAgICB1MzIgcnYgPSAwOwotCi0gICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OwotCi0gICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIik7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHJpZ2h0IHNoaWZ0IG9uIG5lZ2F0aXZlIG51bWJlcnMgaXMgcGVyZm9ybWVkIHNpZ25lZCAqLwotICAgIC8qbGludCAtc2F2ZSAtZSogZm9sbG93aW5nIGNoZWNrIGNhdXNlcyBtdWx0aXBsZSBsaW50IG1lc3NhZ2VzICovCi0gICAgaWYgKCAoKC0xKT4+MSkgIT0gKC0xKSApCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMgRVJST1I6IFJpZ2h0IHNoaWZ0IGlzIG5vdCBzaWduZWQiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19JTklURkFJTCk7Ci0gICAgfQotICAgIC8qbGludCAtcmVzdG9yZSAqLwotCi0gICAgaWYgKGRlY0luc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyBFUlJPUjogZGVjSW5zdCA9PSBOVUxMIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKLSAgICB9Ci0KLSAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCAqKUgyNjRTd0RlY01hbGxvYyhzaXplb2YoZGVjQ29udGFpbmVyX3QpLCAxKTsKLQotICAgIGlmIChwRGVjQ29udCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIEVSUk9SOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19NRU1GQUlMKTsKLSAgICB9Ci0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjSW5pdCMgZGVjSW5zdCAlcCBub091dHB1dFJlb3JkZXJpbmcgJWQiLAotICAgICAgICAgICAgKHZvaWQqKWRlY0luc3QsIG5vT3V0cHV0UmVvcmRlcmluZyk7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgIHJ2ID0gaDI2NGJzZEluaXQoJnBEZWNDb250LT5zdG9yYWdlLCBub091dHB1dFJlb3JkZXJpbmcpOwotICAgIGlmIChydiAhPSBIQU5UUk9fT0spCi0gICAgewotICAgICAgICBIMjY0U3dEZWNSZWxlYXNlKHBEZWNDb250KTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19NRU1GQUlMKTsKLSAgICB9Ci0KLSAgICBwRGVjQ29udC0+ZGVjU3RhdCAgPSBJTklUSUFMSVpFRDsKLSAgICBwRGVjQ29udC0+cGljTnVtYmVyID0gMDsKLQotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNJbml0IyBPSzogcmV0dXJuICVwIiwgKHZvaWQqKXBEZWNDb250KTsKLSAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKLSNlbmRpZgotCi0gICAgKmRlY0luc3QgPSAoZGVjQ29udGFpbmVyX3QgKilwRGVjQ29udDsKLQotICAgIHJldHVybihIMjY0U1dERUNfT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSDI2NFN3RGVjR2V0SW5mbygpCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgcmVhZCBhY2Nlc3MgdG8gZGVjb2RlciBpbmZvcm1hdGlvbi4gVGhpcwotICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgYmVmb3JlIEgyNjRTd0RlY0RlY29kZSBmdW5jdGlvbiBoYXMKLSAgICAgICAgICAgIGluZGljYXRlZCB0aGF0IGhlYWRlcnMgYXJlIHJlYWR5LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcERlY0luZm8gICAgcG9pbnRlciB0byBpbmZvIHN0cnVjdCB3aGVyZSBkYXRhIGlzIHdyaXR0ZW4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSDI2NFNXREVDX09LICAgICAgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBIMjY0U1dERUNfSERSU19OT1RfUkRZICBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHlldAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1IMjY0U3dEZWNSZXQgSDI2NFN3RGVjR2V0SW5mbyhIMjY0U3dEZWNJbnN0IGRlY0luc3QsIEgyNjRTd0RlY0luZm8gKnBEZWNJbmZvKQotewotCi0gICAgc3RvcmFnZV90ICpwU3RvcmFnZTsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyIpOwotCi0gICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwRGVjSW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIEVSUk9SOiBkZWNJbnN0IG9yIHBEZWNJbmZvIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOwotICAgIH0KLQotICAgIHBTdG9yYWdlID0gJigoKGRlY0NvbnRhaW5lcl90ICopZGVjSW5zdCktPnN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgPT0gTlVMTCB8fCBwU3RvcmFnZS0+YWN0aXZlUHBzID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMgRVJST1I6IEhlYWRlcnMgbm90IGRlY29kZWQgeWV0Iik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfSERSU19OT1RfUkRZKTsKLSAgICB9Ci0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZigoKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0KS0+c3RyLAotICAgICAgICAiSDI2NFN3RGVjR2V0SW5mbyMgZGVjSW5zdCAlcCAgcERlY0luZm8gJXAiLCBkZWNJbnN0LCAodm9pZCopcERlY0luZm8pOwotICAgIERFQ19BUElfVFJDKCgoZGVjQ29udGFpbmVyX3QqKWRlY0luc3QpLT5zdHIpOwotI2VuZGlmCi0KLSAgICAvKiBoMjY0YnNkUGljV2lkdGggYW5kIC1IZWlnaHQgcmV0dXJuIGRpbWVuc2lvbnMgaW4gbWFjcm9ibG9jayB1bml0cywKLSAgICAgKiBwaWNXaWR0aCBhbmQgLUhlaWdodCBpbiBwaXhlbHMgKi8KLSAgICBwRGVjSW5mby0+cGljV2lkdGggICAgICAgID0gaDI2NGJzZFBpY1dpZHRoKHBTdG9yYWdlKSA8PCA0OwotICAgIHBEZWNJbmZvLT5waWNIZWlnaHQgICAgICAgPSBoMjY0YnNkUGljSGVpZ2h0KHBTdG9yYWdlKSA8PCA0OwotICAgIHBEZWNJbmZvLT52aWRlb1JhbmdlICAgICAgPSBoMjY0YnNkVmlkZW9SYW5nZShwU3RvcmFnZSk7Ci0gICAgcERlY0luZm8tPm1hdHJpeENvZWZmaWNpZW50cyA9IGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMocFN0b3JhZ2UpOwotCi0gICAgaDI2NGJzZENyb3BwaW5nUGFyYW1zKHBTdG9yYWdlLAotICAgICAgICAmcERlY0luZm8tPmNyb3BwaW5nRmxhZywKLSAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAotICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAotICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKLSAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpOwotCi0gICAgLyogc2FtcGxlIGFzcGVjdCByYXRpbyAqLwotICAgIGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbyhwU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEZWNJbmZvLT5wYXJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEZWNJbmZvLT5wYXJIZWlnaHQpOwotCi0gICAgLyogcHJvZmlsZSAqLwotICAgIHBEZWNJbmZvLT5wcm9maWxlID0gaDI2NGJzZFByb2ZpbGUocFN0b3JhZ2UpOwotCi0gICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIE9LIik7Ci0KLSAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEgyNjRTd0RlY1JlbGVhc2UoKQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBSZWxlYXNlIHRoZSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBjYWxscyBoMjY0YnNkU2h1dERvd24gdG8KLSAgICAgICAgICAgIHJlbGVhc2UgaW5zdGFuY2UgZGF0YSBhbmQgZnJlZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZQotICAgICAgICAgICAgaW5zdGFuY2UuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGVjSW5zdCAgICAgRGVjb2RlciBpbnN0YW5jZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBIMjY0U3dEZWNSZWxlYXNlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCkKLXsKLQotICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNSZWxlYXNlIyIpOwotCi0gICAgaWYgKGRlY0luc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNSZWxlYXNlIyBFUlJPUjogZGVjSW5zdCA9PSBOVUxMIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCopZGVjSW5zdDsKLQotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNSZWxlYXNlIyBkZWNJbnN0ICVwIixkZWNJbnN0KTsKLSAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKLSNlbmRpZgotCi0gICAgaDI2NGJzZFNodXRkb3duKCZwRGVjQ29udC0+c3RvcmFnZSk7Ci0KLSAgICBIMjY0U3dEZWNGcmVlKHBEZWNDb250KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEgyNjRTd0RlY0RlY29kZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgc3RyZWFtIGRhdGEuIENhbGxzIGgyNjRic2REZWNvZGUgdG8gZG8gdGhlIGFjdHVhbCBkZWNvZGluZy4KLQotICAgICAgICBJbnB1dDoKLSAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UKLSAgICAgICAgICAgIHBJbnB1dCAgICAgIHBvaW50ZXIgdG8gaW5wdXQgc3RydWN0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBPdXRwdXQgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHN0cnVjdAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEICAgZGVjb2RlciBpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQgeWV0Ci0gICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSICAgICAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCi0KLSAgICAgICAgICAgIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRCAgICBzdHJlYW0gYnVmZmVyIGRlY29kZWQKLSAgICAgICAgICAgIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSAgIGhlYWRlcnMgZGVjb2RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgbm90IGZpbmlzaGVkCi0gICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSAgICAgICAgICAgICAgICAgICBkZWNvZGluZyBvZiBhIHBpY3R1cmUgZmluaXNoZWQKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgbm90IGZpbmlzaGVkCi0gICAgICAgICAgICBIMjY0U1dERUNfU1RSTV9FUlIgICAgICAgICAgICAgICAgICBzZXJpb3VzIGVycm9yIGluIGRlY29kaW5nLCBubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgcGFyYW1ldGVyIHNldHMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZWNvZGUgcGljdHVyZSBkYXRhCi0gICAgICAgICAgICBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCB0aGlzIGNhbiBvbmx5IG9jY3VyIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gdmVyc2lvbiBpcyB1c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IG51bWJlciBvZiBmcmFtZXMgcmVhY2hlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1IMjY0U3dEZWNSZXQgSDI2NFN3RGVjRGVjb2RlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwgSDI2NFN3RGVjSW5wdXQgKnBJbnB1dCwKLSAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY091dHB1dCAqcE91dHB1dCkKLXsKLQotICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKLSAgICB1MzIgc3RybUxlbjsKLSAgICB1MzIgbnVtUmVhZEJ5dGVzOwotICAgIHU4ICp0bXBTdHJlYW07Ci0gICAgdTMyIGRlY1Jlc3VsdCA9IDA7Ci0gICAgSDI2NFN3RGVjUmV0IHJldHVyblZhbHVlID0gSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOwotCi0gICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMiKTsKLQotICAgIC8qIENoZWNrIHRoYXQgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycyBhcmUgdmFsaWQgKi8KLSAgICBpZiAocElucHV0ID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IHBJbnB1dCBvciBwT3V0cHV0IGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOwotICAgIH0KLQotICAgIGlmICgocElucHV0LT5wU3RyZWFtID09IE5VTEwpIHx8IChwSW5wdXQtPmRhdGFMZW4gPT0gMCkpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyBFUlJPUjogSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKLSAgICB9Ci0KLSAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCAqKWRlY0luc3Q7Ci0KLSAgICAvKiBDaGVjayBpZiBkZWNvZGVyIGlzIGluIGFuIGluY29ycmVjdCBtb2RlICovCi0gICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwRGVjQ29udC0+ZGVjU3RhdCA9PSBVTklOSVRJQUxJWkVEKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IERlY29kZXIgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEKTsKLSAgICB9Ci0KLSNpZmRlZiBIMjY0REVDX0VWQUxVQVRJT04KLSAgICBpZiAocERlY0NvbnQtPnBpY051bWJlciA+PSBIMjY0REVDX0VWQUxVQVRJT05fTElNSVQpCi0gICAgICAgIHJldHVybihIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCk7Ci0jZW5kaWYKLQotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNEZWNvZGUjIGRlY0luc3QgJXAgIHBJbnB1dCAlcCAgcE91dHB1dCAlcCIsCi0gICAgICAgICAgICBkZWNJbnN0LCAodm9pZCopcElucHV0LCAodm9pZCopcE91dHB1dCk7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgIHBPdXRwdXQtPnBTdHJtQ3VyclBvcyAgID0gTlVMTDsKLQotICAgIG51bVJlYWRCeXRlcyA9IDA7Ci0gICAgc3RybUxlbiA9IHBJbnB1dC0+ZGF0YUxlbjsKLSAgICB0bXBTdHJlYW0gPSBwSW5wdXQtPnBTdHJlYW07Ci0gICAgcERlY0NvbnQtPnN0b3JhZ2UuaW50cmFDb25jZWFsbWVudEZsYWcgPSBwSW5wdXQtPmludHJhQ29uY2VhbG1lbnRNZXRob2Q7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgLyogUmV0dXJuIEhEUlNfUkRZIGFmdGVyIERQQiBmbHVzaCBjYXVzZWQgYnkgbmV3IFNQUyAqLwotICAgICAgICBpZiAocERlY0NvbnQtPmRlY1N0YXQgPT0gTkVXX0hFQURFUlMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY1Jlc3VsdCA9IEgyNjRCU0RfSERSU19SRFk7Ci0gICAgICAgICAgICBwRGVjQ29udC0+ZGVjU3RhdCA9IElOSVRJQUxJWkVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogQ29udGludWUgZGVjb2Rpbmcgbm9ybWFsbHkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZGVjUmVzdWx0ID0gaDI2NGJzZERlY29kZSgmcERlY0NvbnQtPnN0b3JhZ2UsIHRtcFN0cmVhbSwgc3RybUxlbiwKLSAgICAgICAgICAgICAgICBwSW5wdXQtPnBpY0lkLCAmbnVtUmVhZEJ5dGVzKTsKLSAgICAgICAgfQotICAgICAgICB0bXBTdHJlYW0gKz0gbnVtUmVhZEJ5dGVzOwotICAgICAgICAvKiBjaGVjayBpZiB0b28gbWFueSBieXRlcyBhcmUgcmVhZCBmcm9tIHN0cmVhbSAqLwotICAgICAgICBpZiAoIChpMzIpKHN0cm1MZW4gLSBudW1SZWFkQnl0ZXMpID49IDAgKQotICAgICAgICAgICAgc3RybUxlbiAtPSBudW1SZWFkQnl0ZXM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cm1MZW4gPSAwOwotCi0gICAgICAgIHBPdXRwdXQtPnBTdHJtQ3VyclBvcyA9IHRtcFN0cmVhbTsKLQotICAgICAgICBzd2l0Y2ggKGRlY1Jlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBIMjY0QlNEX0hEUlNfUkRZOgotCi0gICAgICAgICAgICAgICAgaWYocERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5mbHVzaGVkICYmCi0gICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5udW1PdXQgIT0KLSAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPm91dEluZGV4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IGZpcnN0IGFsbCBEUEIgc3RvcmVkIHBpY3R1cmVzCi0gICAgICAgICAgICAgICAgICAgICAqIERQQiBmbHVzaCBjYXVzZWQgYnkgbmV3IFNQUyAqLwotICAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPmZsdXNoZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+ZGVjU3RhdCA9IE5FV19IRUFERVJTOwotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOwotICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBIMjY0QlNEX1BJQ19SRFk6Ci0gICAgICAgICAgICAgICAgcERlY0NvbnQtPnBpY051bWJlcisrOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0cm1MZW4gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfUElDX1JEWTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk7Ci0KLSAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUjoKLSAgICAgICAgICAgICAgICBpZiAoICFoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cygmcERlY0NvbnQtPnN0b3JhZ2UpICYmCi0gICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfU1RSTV9FUlI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIMjY0QlNEX01FTUFMTE9DX0VSUk9SOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfTUVNRkFJTDsKLSAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgfSB3aGlsZSAoc3RybUxlbik7Ci0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjRGVjb2RlIyBPSzogRGVjUmVzdWx0ICVkIiwKLSAgICAgICAgICAgIHJldHVyblZhbHVlKTsKLSAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuKHJldHVyblZhbHVlKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEgyNjRTd0RlY0dldEFQSVZlcnNpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUmV0dXJuIHZlcnNpb24gaW5mb3JtYXRpb24gb2YgdGhlIEFQSQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBBUEkgdmVyc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1IMjY0U3dEZWNBcGlWZXJzaW9uIEgyNjRTd0RlY0dldEFQSVZlcnNpb24oKQotewotICAgIEgyNjRTd0RlY0FwaVZlcnNpb24gdmVyOwotCi0gICAgdmVyLm1ham9yID0gSDI2NFNXREVDX01BSk9SX1ZFUlNJT047Ci0gICAgdmVyLm1pbm9yID0gSDI2NFNXREVDX01JTk9SX1ZFUlNJT047Ci0KLSAgICByZXR1cm4odmVyKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNOZXh0UGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIgaWYgYW55IGF2YWlsYWJsZS4KLQotICAgICAgICBJbnB1dDoKLSAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UuCi0gICAgICAgICAgICBmbHVzaEJ1ZmZlciBmb3JjZSBvdXRwdXQgb2YgYWxsIGJ1ZmZlcmVkIHBpY3R1cmVzCi0KLSAgICAgICAgT3V0cHV0OgotICAgICAgICAgICAgcE91dHB1dCAgICAgcG9pbnRlciB0byBvdXRwdXQgc3RydWN0dXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEgyNjRTV0RFQ19PSyAgICAgICAgICAgIG5vIHBpY3R1cmVzIGF2YWlsYWJsZSBmb3IgZGlzcGxheQotICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgICAgICAgcGljdHVyZSBhdmFpbGFibGUgZm9yIGRpc3BsYXkKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgICAgIGludmFsaWQgcGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1IMjY0U3dEZWNSZXQgSDI2NFN3RGVjTmV4dFBpY3R1cmUoSDI2NFN3RGVjSW5zdCBkZWNJbnN0LAotICAgIEgyNjRTd0RlY1BpY3R1cmUgKnBPdXRwdXQsIHUzMiBmbHVzaEJ1ZmZlcikKLXsKLQotICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKLSAgICB1MzIgbnVtRXJyTWJzLCBpc0lkclBpYywgcGljSWQ7Ci0gICAgdTMyICpwT3V0UGljOwotCi0gICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyIpOwotCi0gICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIEVSUk9SOiBkZWNJbnN0IG9yIHBPdXRwdXQgaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7Ci0gICAgfQotCi0gICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QqKWRlY0luc3Q7Ci0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIGRlY0luc3QgJXAgcE91dHB1dCAlcCAlcyAlZCIsCi0gICAgICAgICAgICBkZWNJbnN0LCAodm9pZCopcE91dHB1dCwgImZsdXNoQnVmZmVyIiwgZmx1c2hCdWZmZXIpOwotICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOwotI2VuZGlmCi0KLSAgICBpZiAoZmx1c2hCdWZmZXIpCi0gICAgICAgIGgyNjRic2RGbHVzaEJ1ZmZlcigmcERlY0NvbnQtPnN0b3JhZ2UpOwotCi0gICAgcE91dFBpYyA9ICh1MzIqKWgyNjRic2ROZXh0T3V0cHV0UGljdHVyZSgmcERlY0NvbnQtPnN0b3JhZ2UsICZwaWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0lkclBpYywgJm51bUVyck1icyk7Ci0KLSAgICBpZiAocE91dFBpYyA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBPSzogcmV0dXJuIEgyNjRTV0RFQ19PSyIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcE91dHB1dC0+cE91dHB1dFBpY3R1cmUgPSBwT3V0UGljOwotICAgICAgICBwT3V0cHV0LT5waWNJZCAgICAgICAgICA9IHBpY0lkOwotICAgICAgICBwT3V0cHV0LT5pc0lkclBpY3R1cmUgICA9IGlzSWRyUGljOwotICAgICAgICBwT3V0cHV0LT5uYnJPZkVyck1CcyAgICA9IG51bUVyck1iczsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBPSzogcmV0dXJuIEgyNjRTV0RFQ19QSUNfUkRZIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfUElDX1JEWSk7Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzODZiYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyogQ1ZTIHRhZyBuYW1lIGZvciBpZGVudGlmaWNhdGlvbiAqLwotY29uc3QgY2hhciB0YWdOYW1lWzI1Nl0gPSAiJE5hbWU6IEZJUlNUX0FORFJPSURfQ09QWVJJR0hUICQiOwotCi0jaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBERUJVRyhhcmd2KSBwcmludGYgYXJndgotCi0vKiBfTk9fT1VUIGRpc2FibGVzIG91dHB1dCBmaWxlIHdyaXRpbmcgKi8KLSNpZmRlZiBfX2FybQotI2RlZmluZSBfTk9fT1VUCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOwotCi11MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAotICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpOwotCi12b2lkIENyb3BXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICppbWFnZURhdGEsIHUzMiBjcm9wRGlzcGxheSwKLSAgICAgICAgSDI2NFN3RGVjSW5mbyAqZGVjSW5mbyk7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgSDI2NFN3RGVjSW5zdCBkZWNJbnN0OwotICAgIEgyNjRTd0RlY0lucHV0IGRlY0lucHV0OwotICAgIEgyNjRTd0RlY091dHB1dCBkZWNPdXRwdXQ7Ci0gICAgSDI2NFN3RGVjUGljdHVyZSBkZWNQaWN0dXJlOwotICAgIEgyNjRTd0RlY0luZm8gZGVjSW5mbzsKLSAgICBGSUxFICpmb3V0cHV0OwotICAgIGNoYXIgb3V0RmlsZU5hbWVbMjU2XTsKLSAgICB1OCAqYnl0ZVN0cm1TdGFydDsKLSAgICB1MzIgcGljTnVtYmVyOwotfSBEZWNvZGVyOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0KLSAgICBpMzIgaW5zdENvdW50LCBpbnN0UnVubmluZzsKLSAgICBpMzIgaTsKLSAgICB1MzIgbWF4TnVtUGljczsKLSAgICB1MzIgc3RybUxlbjsKLSAgICBIMjY0U3dEZWNSZXQgcmV0OwotICAgIHUzMiBudW1FcnJvcnMgPSAwOwotICAgIHUzMiBjcm9wRGlzcGxheSA9IDA7Ci0gICAgdTMyIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMDsKLSAgICBGSUxFICpmaW5wdXQ7Ci0gICAgRGVjb2RlciAqKmRlY29kZXI7Ci0gICAgY2hhciBvdXRGaWxlTmFtZVsyNTZdID0gIm91dC55dXYiOwotCi0KLSAgICBpZiAoIGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLVQiKSA9PSAwICkKLSAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHRhZ05hbWUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoYXJnYyA8IDIpCi0gICAgewotICAgICAgICBERUJVRygoCi0gICAgICAgICAgICAiVXNhZ2U6ICVzIFstTm5dIFstT291dGZpbGVdIFstUF0gWy1VXSBbLUNdIFstUl0gWy1UXSBmaWxlMS4yNjQgW2ZpbGUyLjI2NF0gLi4gW2ZpbGVOLjI2NF1cbiIsCi0gICAgICAgICAgICBhcmd2WzBdKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtTm4gZm9yY2VzIGRlY29kaW5nIHRvIHN0b3AgYWZ0ZXIgbiBwaWN0dXJlc1xuIikpOwotI2lmIGRlZmluZWQoX05PX09VVCkKLSAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSBvdXRwdXQgd3JpdGluZyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWVcbiIpKTsKLSNlbHNlCi0gICAgICAgIERFQlVHKCgiXHQtT291dGZpbGUgd3JpdGUgb3V0cHV0IHRvIFwib3V0ZmlsZVwiIChkZWZhdWx0IG91dC55dXYpXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtT25vbmUgZG9lcyBub3Qgd3JpdGUgb3V0cHV0XG4iKSk7Ci0jZW5kaWYKLSAgICAgICAgREVCVUcoKCJcdC1DIGRpc3BsYXkgY3JvcHBlZCBpbWFnZSAoZGVmYXVsdCBkZWNvZGVkIGltYWdlKVxuIikpOwotICAgICAgICBERUJVRygoIlx0LVIgZGlzYWJsZSBEUEIgb3V0cHV0IHJlb3JkZXJpbmdcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1UIHRvIHByaW50IHRhZyBuYW1lIGFuZCBleGl0XG4iKSk7Ci0gICAgICAgIGV4aXQoMTAwKTsKLSAgICB9Ci0KLSAgICBpbnN0Q291bnQgPSBhcmdjIC0gMTsKLQotICAgIC8qIHJlYWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLwotICAgIG1heE51bVBpY3MgPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPCAoYXJnYy0xKTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTiIsIDIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhOdW1QaWNzID0gKHUzMilhdG9pKGFyZ3ZbaV0rMik7Ci0gICAgICAgICAgICBpbnN0Q291bnQtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU8iLCAyKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyY3B5KG91dEZpbGVOYW1lLCBhcmd2W2ldKzIpOwotICAgICAgICAgICAgaW5zdENvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLUMiKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgY3JvcERpc3BsYXkgPSAxOwotICAgICAgICAgICAgaW5zdENvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVIiKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAxOwotICAgICAgICAgICAgaW5zdENvdW50LS07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW5zdENvdW50IDwgMSkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiTm8gaW5wdXQgZmlsZXNcbiIpKTsKLSAgICAgICAgZXhpdCgxMDApOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgbXVsdGlwbGUgZGVjb2RlciBpbnN0YW5jZXMKLSAgICAgKiBvbmUgaW5zdGFuY2UgZm9yIGV2ZXJ5IHN0cmVhbSBmaWxlICovCi0gICAgZGVjb2RlciA9IChEZWNvZGVyICoqKW1hbGxvYyhzaXplb2YoRGVjb2RlciopKih1MzIpaW5zdENvdW50KTsKLSAgICBpZiAoZGVjb2RlciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKSk7Ci0gICAgICAgIGV4aXQoMTAwKTsKLSAgICB9Ci0KLSAgICAvKiBwcmVwYXJlIGVhY2ggZGVjb2RlciBpbnN0YW5jZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBpbnN0Q291bnQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGRlY29kZXJbaV0gPSAoRGVjb2RlciAqKWNhbGxvYygxLCBzaXplb2YoRGVjb2RlcikpOwotCi0gICAgICAgIC8qIG9wZW4gaW5wdXQgZmlsZSAqLwotICAgICAgICBmaW5wdXQgPSBmb3Blbihhcmd2W2FyZ2MtaW5zdENvdW50K2ldLCJyYiIpOwotICAgICAgICBpZiAoZmlucHV0ID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiVW5hYmxlIHRvIG9wZW4gaW5wdXQgZmlsZSA8JXM+XG4iLCBhcmd2W2FyZ2MtaW5zdENvdW50K2ldKSk7Ci0gICAgICAgICAgICBleGl0KDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBERUJVRygoIlJlYWRpbmcgaW5wdXQgZmlsZVslZF0gJXNcbiIsIGksIGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0pKTsKLQotICAgICAgICAvKiByZWFkIGlucHV0IHN0cmVhbSB0byBidWZmZXIgKi8KLSAgICAgICAgZnNlZWsoZmlucHV0LDBMLFNFRUtfRU5EKTsKLSAgICAgICAgc3RybUxlbiA9ICh1MzIpZnRlbGwoZmlucHV0KTsKLSAgICAgICAgcmV3aW5kKGZpbnB1dCk7Ci0gICAgICAgIGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQgPSAodTggKiltYWxsb2Moc2l6ZW9mKHU4KSpzdHJtTGVuKTsKLSAgICAgICAgaWYgKGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKSk7Ci0gICAgICAgICAgICBleGl0KDEwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlYWQoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCwgc2l6ZW9mKHU4KSwgc3RybUxlbiwgZmlucHV0KTsKLSAgICAgICAgZmNsb3NlKGZpbnB1dCk7Ci0KLSAgICAgICAgLyogb3BlbiBvdXRwdXQgZmlsZSAqLwotICAgICAgICBpZiAoc3RyY21wKG91dEZpbGVOYW1lLCAibm9uZSIpICE9IDApCi0gICAgICAgIHsKLSNpZiBkZWZpbmVkKF9OT19PVVQpCi0gICAgICAgICAgICBkZWNvZGVyW2ldLT5mb3V0cHV0ID0gTlVMTDsKLSNlbHNlCi0gICAgICAgICAgICBzcHJpbnRmKGRlY29kZXJbaV0tPm91dEZpbGVOYW1lLCAiJXMlaSIsIG91dEZpbGVOYW1lLCBpKTsKLSAgICAgICAgICAgIGRlY29kZXJbaV0tPmZvdXRwdXQgPSBmb3BlbihkZWNvZGVyW2ldLT5vdXRGaWxlTmFtZSwgIndiIik7Ci0gICAgICAgICAgICBpZiAoZGVjb2RlcltpXS0+Zm91dHB1dCA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHKCgiVW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGVcbiIpKTsKLSAgICAgICAgICAgICAgICBleGl0KDEwMCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJihkZWNvZGVyW2ldLT5kZWNJbnN0KSwgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcpOwotCi0gICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIkluaXQgZmFpbGVkICVkXG4iLCByZXQpKTsKLSAgICAgICAgICAgIGV4aXQoMTAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0gPSBkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0OwotICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gc3RybUxlbjsKLSAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDA7Ci0KLSAgICB9Ci0KLSAgICAvKiBtYWluIGRlY29kaW5nIGxvb3AgKi8KLSAgICBkbwotICAgIHsKLSAgICAgICAgLyogZGVjb2RlIG9uY2UgdXNpbmcgZWFjaCBpbnN0YW5jZSAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShkZWNvZGVyW2ldLT5kZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY0lucHV0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNPdXRwdXQpKTsKLQotICAgICAgICAgICAgc3dpdGNoKHJldCkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZOgotCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0dldEluZm8oZGVjb2RlcltpXS0+ZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BwaW5nRmxhZykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBDcm9wcGluZyBwYXJhbXM6ICglZCwgJWQpICVkeCVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcFBhcmFtcy5jcm9wVG9wT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gV2lkdGggJWQgSGVpZ2h0ICVkXG4iLCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5waWNXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8ucGljSGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSB2aWRlb1JhbmdlICVkLCBtYXRyaWNDb2VmZmljaWVudHMgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpLCBkZWNvZGVyW2ldLT5kZWNJbmZvLnZpZGVvUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLm1hdHJpeENvZWZmaWNpZW50cykpOwotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWToKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zOwotICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZOgotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19QSUNfUkRZKQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNvZGVyW2ldLT5kZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5mbykpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY29kZXJbaV0tPmRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNQaWN0dXJlKSwgMCkgPT0gSDI2NFNXREVDX1BJQ19SRFkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPnBpY051bWJlcisrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1FcnJvcnMgKz0gZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5uYnJPZkVyck1CczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkZWNvZGVyW2ldLT5waWNOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5pc0lkclBpY3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiSURSIiA6ICJOT04tSURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLm5ick9mRXJyTUJzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQ3JvcFdyaXRlT3V0cHV0KGRlY29kZXJbaV0tPmZvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OCopZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcERpc3BsYXksICYoZGVjb2RlcltpXS0+ZGVjSW5mbykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1heE51bVBpY3MgJiYgZGVjb2RlcltpXS0+cGljTnVtYmVyID09IG1heE51bVBpY3MpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRDoKLSAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19TVFJNX0VSUjoKLSAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QQVJBTV9FUlI6Ci0gICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gRkFUQUwgRVJST1JcbiIsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdCgxMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjaGVjayBpZiBhbnkgb2YgdGhlIGluc3RhbmNlcyBpcyBzdGlsbCBydW5uaW5nICg9aGFzIG1vcmUgZGF0YSkgKi8KLSAgICAgICAgaW5zdFJ1bm5pbmcgPSBpbnN0Q291bnQ7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnN0Q291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPT0gMCkKLSAgICAgICAgICAgICAgICBpbnN0UnVubmluZy0tOwotICAgICAgICB9Ci0KLSAgICB9IHdoaWxlIChpbnN0UnVubmluZyk7Ci0KLQotICAgIC8qIGdldCBsYXN0IGZyYW1lcyBhbmQgY2xvc2UgZWFjaCBpbnN0YW5jZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBpbnN0Q291bnQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNvZGVyW2ldLT5kZWNJbnN0LAotICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjUGljdHVyZSksIDEpID09IEgyNjRTV0RFQ19QSUNfUkRZKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNvZGVyW2ldLT5waWNOdW1iZXIrKzsKLQotICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICBpLCBkZWNvZGVyW2ldLT5waWNOdW1iZXIsCi0gICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5pc0lkclBpY3R1cmUKLSAgICAgICAgICAgICAgICAgICAgPyAiSURSIiA6ICJOT04tSURSIiwKLSAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLm5ick9mRXJyTUJzKSk7Ci0gICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICAgICAgQ3JvcFdyaXRlT3V0cHV0KGRlY29kZXJbaV0tPmZvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICh1OCopZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgY3JvcERpc3BsYXksICYoZGVjb2RlcltpXS0+ZGVjSW5mbykpOwotICAgICAgICB9Ci0KLSAgICAgICAgSDI2NFN3RGVjUmVsZWFzZShkZWNvZGVyW2ldLT5kZWNJbnN0KTsKLQotICAgICAgICBpZiAoZGVjb2RlcltpXS0+Zm91dHB1dCkKLSAgICAgICAgICAgIGZjbG9zZShkZWNvZGVyW2ldLT5mb3V0cHV0KTsKLQotICAgICAgICBmcmVlKGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQpOwotCi0gICAgICAgIGZyZWUoZGVjb2RlcltpXSk7Ci0gICAgfQotCi0gICAgZnJlZShkZWNvZGVyKTsKLQotICAgIGlmIChudW1FcnJvcnMpCi0gICAgICAgIHJldHVybiAxOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQ3JvcFdyaXRlT3V0cHV0KEZJTEUgKmZvdXRwdXQsIHU4ICppbWFnZURhdGEsIHUzMiBjcm9wRGlzcGxheSwKLSAgICAgICAgSDI2NFN3RGVjSW5mbyAqZGVjSW5mbykKLXsKLSAgICB1OCAqdG1wSW1hZ2UgPSBOVUxMOwotICAgIHUzMiB0bXAsIHBpY1NpemU7Ci0KLSAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjSW5mby0+Y3JvcHBpbmdGbGFnKQotICAgIHsKLSAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8tPmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoICoKLSAgICAgICAgICAgICAgICAgIGRlY0luZm8tPmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodDsKLSAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKLSAgICAgICAgdG1wSW1hZ2UgPSBtYWxsb2MocGljU2l6ZSk7Ci0gICAgICAgIGlmICh0bXBJbWFnZSA9PSBOVUxMKQotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgdG1wID0gQ3JvcFBpY3R1cmUodG1wSW1hZ2UsIGltYWdlRGF0YSwKLSAgICAgICAgICAgIGRlY0luZm8tPnBpY1dpZHRoLCBkZWNJbmZvLT5waWNIZWlnaHQsCi0gICAgICAgICAgICAmKGRlY0luZm8tPmNyb3BQYXJhbXMpKTsKLSAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsIHRtcEltYWdlLCBwaWNTaXplKTsKLSAgICAgICAgZnJlZSh0bXBJbWFnZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLT5waWNXaWR0aCAqIGRlY0luZm8tPnBpY0hlaWdodDsKLSAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKLSAgICAgICAgV3JpdGVPdXRwdXQoZm91dHB1dCwgaW1hZ2VEYXRhLCBwaWNTaXplKTsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpCi17Ci0gICAgaWYgKGZpZCkKLSAgICAgICAgZndyaXRlKGRhdGEsIDEsIHBpY1NpemUsIGZpZCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjVHJhY2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKQotewotICAgIEZJTEUgKmZwOwotCi0gICAgZnAgPSBmb3BlbigiZGVjX2FwaS50cmMiLCAiYXQiKTsKLQotICAgIGlmICghZnApCi0gICAgICAgIHJldHVybjsKLQotICAgIGZ3cml0ZShzdHJpbmcsIDEsIHN0cmxlbihzdHJpbmcpLCBmcCk7Ci0gICAgZndyaXRlKCJcbiIsIDEsMSwgZnApOwotCi0gICAgZmNsb3NlKGZwKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNtYWxsb2MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSwgdTMyIG51bSkKLXsKLSAgICBpZiAoc2l6ZSA+IFVJTlQzMl9NQVggLyBudW0pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtYWxsb2Moc2l6ZSAqIG51bSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKLXsKLSAgICBmcmVlKHB0cik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKLXsKLSAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQotewotICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBDcm9wUGljdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKLSAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKQotewotCi0gICAgdTMyIGksIGo7Ci0gICAgdTMyIG91dFdpZHRoLCBvdXRIZWlnaHQ7Ci0gICAgdTggKnBPdXQsICpwSW47Ci0KLSAgICBpZiAocE91dEltYWdlID09IE5VTEwgfHwgcEluSW1hZ2UgPT0gTlVMTCB8fCBwQ3JvcFBhcmFtcyA9PSBOVUxMIHx8Ci0gICAgICAgICFwaWNXaWR0aCB8fCAhcGljSGVpZ2h0KQotICAgIHsKLSAgICAgICAgLyogZHVlIHRvIGxpbnQgd2FybmluZyAqLwotICAgICAgICBmcmVlKHBPdXRJbWFnZSk7Ci0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0KLSAgICBpZiAoICgocENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aCkgPgotICAgICAgICAgICBwaWNXaWR0aCApIHx8Ci0gICAgICAgICAoKHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQpID4KLSAgICAgICAgICAgcGljSGVpZ2h0ICkgKQotICAgIHsKLSAgICAgICAgLyogZHVlIHRvIGxpbnQgd2FybmluZyAqLwotICAgICAgICBmcmVlKHBPdXRJbWFnZSk7Ci0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0KLSAgICBvdXRXaWR0aCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGg7Ci0gICAgb3V0SGVpZ2h0ID0gcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQ7Ci0KLSAgICBwSW4gPSBwSW5JbWFnZSArIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoICsKLSAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0OwotICAgIHBPdXQgPSBwT3V0SW1hZ2U7Ci0KLSAgICAvKiBsdW1hICovCi0gICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOwotICAgICAgICB9Ci0gICAgICAgIHBJbiArPSBwaWNXaWR0aCAtIG91dFdpZHRoOwotICAgIH0KLQotICAgIG91dFdpZHRoID4+PSAxOwotICAgIG91dEhlaWdodCA+Pj0gMTsKLQotICAgIHBJbiA9IHBJbkltYWdlICsgcGljV2lkdGgqcGljSGVpZ2h0ICsKLSAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOwotCi0gICAgLyogY2IgKi8KLSAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7Ci0gICAgICAgIH0KLSAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKLSAgICB9Ci0KLSAgICBwSW4gPSBwSW5JbWFnZSArIDUqcGljV2lkdGgqcGljSGVpZ2h0LzQgKwotICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7Ci0KLSAgICAvKiBjciAqLwotICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKLSAgICAgICAgfQotICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOwotICAgIH0KLQotICAgIHJldHVybiAoMCk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0YTQ4NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi1wdHJBICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1ibG9jayAgIFJOIDEKLQoteDAgICAgICBSTiAyCi1jb3VudCAgIFJOIDIKLQoteTAgICAgICBSTiAzCi12YWxYICAgIFJOIDMKLQotd2lkdGggICBSTiA0Ci0KLWhlaWdodCAgUk4gNQotdG1wNyAgICBSTiA1Ci0KLWNoclBXICAgUk4gNgotdG1wOCAgICBSTiA2Ci0KLXRtcDEgICAgUk4gNwotY2hyUEggICBSTiA3Ci0KLXRtcDIgICAgUk4gOAotCi10bXAzICAgIFJOIDkKLQotdG1wNCAgICBSTiAxMAotCi10bXA1ICAgIFJOIDExCi0KLXRtcDYgICAgUk4gMTIKLQotYzMyICAgICBSTiAxNAoteEZyYWMgICBSTiAxNAotCi07Ly8gRnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcgotCi07Ly8gIEZ1bmN0aW9uIGFyZ3VtZW50cwotOy8vCi07Ly8gIHU4ICpyZWYsICAgICAgICAgICAgICAgICAgIDogMHhjNAotOy8vICB1OCAqcHJlZFBhcnRDaHJvbWEsICAgICAgICA6IDB4YzgKLTsvLyAgaTMyIHgwLCAgICAgICAgICAgICAgICAgICAgOiAweGNjCi07Ly8gIGkzMiB5MCwgICAgICAgICAgICAgICAgICAgIDogMHhkMAotOy8vICB1MzIgd2lkdGgsICAgICAgICAgICAgICAgICA6IDB4ZjgKLTsvLyAgdTMyIGhlaWdodCwgICAgICAgICAgICAgICAgOiAweGZjCi07Ly8gIHUzMiB4RnJhYywgICAgICAgICAgICAgICAgIDogMHgxMDAKLTsvLyAgdTMyIGNocm9tYVBhcnRXaWR0aCwgICAgICAgOiAweDEwNAotOy8vICB1MzIgY2hyb21hUGFydEhlaWdodCAgICAgICA6IDB4MTA4Ci0KLWgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHhjNAotCi0gICAgTERSICAgICBjaHJQVywgW3NwLCAjMHgxMDRdICAgICA7Ly8gY2hyb21hUGFydFdpZHRoCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbAotCi0gICAgQUREICAgICB0bXA2LCB4MCwgY2hyUFcgICAgICAgICA7Ly8gdG1wNiA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDYsIHRtcDYsICMxICAgICAgICAgIDsvLyB0bXA2ID0geDAgKyBjaHJvbWFQYXJ0V2lkdGggKyAxCi0gICAgQ01QICAgICB0bXA2LCB3aWR0aCAgICAgICAgICAgICA7Ly8geDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXA2LCB5MCwgY2hyUEggICAgICAgICA7Ly8gdG1wNiA9IHkwICsgY2hyb21hUGFydEhlaWdodAotICAgIENNUCAgICAgdG1wNiwgaGVpZ2h0Ci0gICAgQkxTICAgICBza2lwX2ZpbGwKLQotZG9fZmlsbAotICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDgsIGNoclBXLCAjMSAgICAgICAgIDsvLyB0bXA4ID0gY2hyb21hUGFydFdpZHRoKzEKLSAgICBNT1YgICAgIHRtcDIsIHRtcDggICAgICAgICAgICAgIDsvLyB0bXAyID0gY2hyb21hUGFydFdpZHRoKzEKLSAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wOCxjaHJQSCx0bXAyfQotICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBMRFIgICAgIHgwLCBbc3AsICMweGNjXQotICAgIExEUiAgICAgeTAsIFtzcCwgIzB4ZDBdCi0gICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCi0gICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LHRtcDgsY2hyUEgsdG1wMn0KLSAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jawotICAgIE1MQSAgICAgcmVmLCBoZWlnaHQsIHdpZHRoLCByZWYgOy8vIHJlZiArPSB3aWR0aCAqIGhlaWdodDsgCi0gICAgTUxBICAgICBibG9jaywgY2hyUEgsIHRtcDgsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBIKSooY2hyb21hUFcrMSkKLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwICAgICAgICAgICAgICAgICAgOy8vIHgwID0gMAotICAgIE1PViAgICAgeTAsICMwICAgICAgICAgICAgICAgICAgOy8vIHkwID0gMAotICAgIFNUUiAgICAgeDAsIFtzcCwgIzB4Y2NdCi0gICAgU1RSICAgICB5MCwgW3NwLCAjMHhkMF0KLSAgICBBREQgICAgIHJlZiwgc3AsICMweDFjICAgICAgICAgIDsvLyByZWYgPSBibG9jawotICAgIFNUUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgotCi0gICAgU1RSICAgICBjaHJQSCwgW3NwLCAjMHhmY10gICAgICA7Ly8gaGVpZ2h0Ci0gICAgU1RSICAgICB0bXA4LCBbc3AsICMweGY4XSAgICAgICA7Ly8gd2lkdGgKLSAgICBNT1YgICAgIHdpZHRoLCB0bXA4Ci0gICAgU1VCICAgICBjaHJQVywgY2hyUFcsICMxCi0KLXNraXBfZmlsbAotICAgIE1MQSAgICAgdG1wMywgeTAsIHdpZHRoLCB4MCAgICAgOy8vIHRtcDMgPSB5MCp3aWR0aCt4MAotICAgIExEUiAgICAgeEZyYWMsIFtzcCwgIzB4MTAwXSAgICAgOy8vIHhGcmFjCi0gICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMgICAgICAgICA7Ly8gcHRyQSA9IHJlZiArIHkwKndpZHRoK3gwCi0gICAgUlNCICAgICB2YWxYLCB4RnJhYywgIzggICAgICAgICA7Ly8gdmFsWCA9IDgteEZyYWMKLQotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCi0KLQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAoY2hyb21hUGFydFdpZHRoLTEpCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChjaHJvbWFQYXJ0SGVpZ2h0LTEpCi0gICAgOy8vIFsyMzoyMF0gY2hyb21hUGFydFdpZHRoLTEKLSAgICA7Ly8gWzE5OjE2XSBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICA7Ly8gWzE1OjAwXSBub3RoaW5nCi0KLSAgICBTVUIgICAgIHRtcDIsIGNoclBILCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydEhlaWdodC0xCi0gICAgU1VCICAgICB0bXAxLCBjaHJQVywgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzI0IDsvLyBsb29wX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMyMCA7Ly8gY2hyb21hUGFydFdpZHRoLTEKLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gbG9vcF94Ci0gICAgUEtIQlQgICB2YWxYLCB2YWxYLCB4RnJhYywgTFNMICMxNiAgOy8vIHx4RnJhY3x2YWxYIHwKLSAgICBNT1YgICAgIHZhbFgsIHZhbFgsIExTTCAjMyAgICAgICAgICA7Ly8gbXVsdGlwbHkgYnkgOCBpbiBhZHZhbmNlCi0gICAgTU9WICAgICBjMzIsICMzMgotCi0KLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgOy8vIENiCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbgotCi1sb29wMV95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAotICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQotCi1sb29wMV94Ci0gICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA0LCBbcHRyQV0sICMxCi0KLSAgICBQS0hCVCAgIHRtcDUsIHRtcDEsIHRtcDMsIExTTCAjMTYKLSAgICBQS0hCVCAgIHRtcDYsIHRtcDIsIHRtcDQsIExTTCAjMTYKLQotICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQotCi0gICAgU01MQUQgICB0bXA1LCB0bXA1LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA2LCB0bXA2LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0KLSAgICBQS0hCVCAgIHRtcDcsIHRtcDMsIHRtcDEsIExTTCAjMTYKLSAgICBQS0hCVCAgIHRtcDgsIHRtcDQsIHRtcDIsIExTTCAjMTYKLQotICAgIFNNTEFEICAgdG1wNywgdG1wNywgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wOCwgdG1wOCwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKLQotICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA2LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCi0KLSAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgotCi0gICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDgsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKLSAgICBCQ1MgICAgIGxvb3AxX3gKLQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICBBRERTICAgIG1iLCBtYiwgIzE2Ci0gICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKLSAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKLSAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKLSAgICBTVUIgICAgIHB0ckEsIHB0ckEsICMxCi0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAotICAgIEJHRSAgICAgbG9vcDFfeQotCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIDsvLyBDcgotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweGZjXSAgICAgICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICAgICAgOy8vIHJlZgotICAgIExEUiAgICAgdG1wMSwgW3NwLCAjMHhkMF0gICAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHhjY10gICAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0gICAgQUREICAgICB0bXAxLCBoZWlnaHQsIHRtcDEKLSAgICBNTEEgICAgIHRtcDMsIHRtcDEsIHdpZHRoLCB0bXAyCi0gICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMKLSAgICBBREQgICAgIG1iLCBtYiwgIzY0Ci0KLSAgICBBTkQgICAgIGNvdW50LCBjb3VudCwgIzB4MDBGRkZGRkYKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMAotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzgKLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbgotbG9vcDJfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBXSwgIzEKLQotbG9vcDJfeAotICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNCwgW3B0ckFdLCAjMQotCi0gICAgUEtIQlQgICB0bXA1LCB0bXAxLCB0bXAzLCBMU0wgIzE2Ci0gICAgUEtIQlQgICB0bXA2LCB0bXAyLCB0bXA0LCBMU0wgIzE2Ci0KLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBXSwgIzEKLQotICAgIFNNTEFEICAgdG1wNSwgdG1wNSwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wNiwgdG1wNiwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotCi0gICAgUEtIQlQgICB0bXA3LCB0bXAzLCB0bXAxLCBMU0wgIzE2Ci0gICAgUEtIQlQgICB0bXA4LCB0bXA0LCB0bXAyLCBMU0wgIzE2Ci0KLSAgICBTTUxBRCAgIHRtcDcsIHRtcDcsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDgsIHRtcDgsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCi0KLSAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQotCi0gICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKLQotICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA4LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAyCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4Ci0gICAgQkNTICAgICBsb29wMl94Ci0KLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgQUREUyAgICBtYiwgbWIsICMxNgotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCi0gICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCi0gICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCi0gICAgU1VCICAgICBwdHJBLCBwdHJBLCAjMQotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AyX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4ZDQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSxwY30KLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yX3Zlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yX3Zlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDIwYWQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucworKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIgCi07LS0gICAgICAgICAgICBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBJRiAgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLXB0ckEgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJsb2NrICAgUk4gMQotCi14MCAgICAgIFJOIDIKLWNvdW50ICAgUk4gMgotCi15MCAgICAgIFJOIDMKLXZhbFkgICAgUk4gMwotCi13aWR0aCAgIFJOIDQKLQotdG1wNCAgICBSTiA1Ci1oZWlnaHQgIFJOIDUKLQotdG1wMSAgICBSTiA2Ci0KLXRtcDIgICAgUk4gNwotCi10bXAzICAgIFJOIDgKLQotdmFsWCAgICBSTiA5Ci0KLXRtcDUgICAgUk4gMTAKLWNoclBXICAgUk4gMTAKLQotdG1wNiAgICBSTiAxMQotY2hyUEggICBSTiAxMQotCi14RnJhYyAgIFJOIDEyCi0KLWMzMiAgICAgUk4gMTQKLXlGcmFjICAgUk4gMTQKLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKLQotOy8vICBGdW5jdGlvbiBhcmd1bWVudHMKLTsvLwotOy8vICB1OCAqcmVmLCAgICAgICAgICAgICAgICAgICA6IDB4YzQKLTsvLyAgdTggKnByZWRQYXJ0Q2hyb21hLCAgICAgICAgOiAweGM4Ci07Ly8gIGkzMiB4MCwgICAgICAgICAgICAgICAgICAgIDogMHhjYwotOy8vICBpMzIgeTAsICAgICAgICAgICAgICAgICAgICA6IDB4ZDAKLTsvLyAgdTMyIHdpZHRoLCAgICAgICAgICAgICAgICAgOiAweGY4Ci07Ly8gIHUzMiBoZWlnaHQsICAgICAgICAgICAgICAgIDogMHhmYwotOy8vICB1MzIgeEZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTAwCi07Ly8gIHUzMiB5RnJhYywgICAgICAgICAgICAgICAgIDogMHgxMDQKLTsvLyAgdTMyIGNocm9tYVBhcnRXaWR0aCwgICAgICAgOiAweDEwOAotOy8vICB1MzIgY2hyb21hUGFydEhlaWdodCAgICAgICA6IDB4MTBjCi0KLWgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHhjNAotCi0gICAgTERSICAgICBjaHJQVywgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydFdpZHRoCi0gICAgTERSICAgICB4RnJhYywgW3NwLCAjMHgxMDBdICAgICA7Ly8geEZyYWMKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsCi0KLSAgICBBREQgICAgIHRtcDEsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB4MCsgY2hyb21hUGFydFdpZHRoKzEKLSAgICBDTVAgICAgIHRtcDEsIHdpZHRoICAgICAgICAgICAgIDsvLyB4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsCi0KLSAgICBDTVAgICAgIHkwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbAotICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTBjXSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDEsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXAxLCB0bXAxLCAjMSAgICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodCArIDEKLSAgICBDTVAgICAgIHRtcDEsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwY10gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXAzLCBjaHJQVywgIzEgICAgICAgICA7Ly8gdG1wMyA9IGNocm9tYVBhcnRXaWR0aCsxCi0gICAgQUREICAgICB0bXAxLCBjaHJQVywgIzEgICAgICAgICA7Ly8gdG1wMSA9IGNocm9tYVBhcnRXaWR0aCsxCi0gICAgQUREICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICA7Ly8gdG1wMiA9IGNocm9tYVBhcnRIZWlnaHQrMQotICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXAxLHRtcDIsdG1wM30KLSAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jawotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTERSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBMRFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgotICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXAxLHRtcDIsdG1wM30KLSAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jawotICAgIE1MQSAgICAgcmVmLCBoZWlnaHQsIHdpZHRoLCByZWYgOy8vIHJlZiArPSB3aWR0aCAqIGhlaWdodDsgCi0gICAgTUxBICAgICBibG9jaywgdG1wMiwgdG1wMSwgYmxvY2s7Ly8gYmxvY2sgKyAoY2hyb21hUFcrMSkqKGNocm9tYVBIKzEpCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBNT1YgICAgIHkwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBTVFIgICAgIHgwLCBbc3AsICMweGNjXQotICAgIFNUUiAgICAgeTAsIFtzcCwgIzB4ZDBdCi0gICAgQUREICAgICByZWYsIHNwLCAjMHgxYyAgICAgICAgICA7Ly8gcmVmID0gYmxvY2sKLSAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLQotICAgIFNUUiAgICAgdG1wMiwgW3NwLCAjMHhmY10gICAgICAgOy8vIGhlaWdodAotICAgIFNUUiAgICAgdG1wMSwgW3NwLCAjMHhmOF0gICAgICAgOy8vIHdpZHRoCi0gICAgTU9WICAgICB3aWR0aCwgdG1wMQotCi1za2lwX2ZpbGwKLSAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKLSAgICBMRFIgICAgIHlGcmFjLCBbc3AsICMweDEwNF0gICAgIDsvLyB5RnJhYwotICAgIExEUiAgICAgeEZyYWMsIFtzcCwgIzB4MTAwXQotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAotICAgIFJTQiAgICAgdmFsWCwgeEZyYWMsICM4ICAgICAgICAgOy8vIHZhbFggPSA4LXhGcmFjCi0gICAgUlNCICAgICB2YWxZLCB5RnJhYywgIzggICAgICAgICA7Ly8gdmFsWSA9IDgteUZyYWMKLQotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCi0KLQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAoY2hyb21hUGFydFdpZHRoLTEpCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChjaHJvbWFQYXJ0SGVpZ2h0LTEpCi0gICAgOy8vIFsyMzoyMF0gY2hyb21hUGFydFdpZHRoLTEKLSAgICA7Ly8gWzE5OjE2XSBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICA7Ly8gWzE1OjAwXSBub3RoaW5nCi0KLSAgICBTVUIgICAgIHRtcDIsIGNoclBILCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydEhlaWdodC0xCi0gICAgU1VCICAgICB0bXAxLCBjaHJQVywgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzI0IDsvLyBsb29wX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMyMCA7Ly8gY2hyb21hUGFydFdpZHRoLTEKLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gbG9vcF94Ci0gICAgUEtIQlQgICB2YWxZLCB2YWxZLCB5RnJhYywgTFNMICMxNiAgOy8vIHx5RnJhY3x2YWxZIHwKLSAgICBNT1YgICAgIGMzMiwgIzMyCi0KLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ2IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uCi0KLWxvb3AxX3kKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBXQotICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCi0KLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAotICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8Ci0KLSAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKLSAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKLQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLWxvb3AxX3gKLSAgICA7Ly8gZmlyc3QKLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBLCAjMV0hCi0gICAgTERSQiAgICB0bXA0LCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA2LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMxNiAgIDsvLyB8dDR8dDJ8Ci0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHx0Nnx0NHwKLQotICAgIFNNVUFEICAgdG1wMiwgdG1wMiwgdmFsWSAgICAgICAgICAgIDsvLyB0Mj0odDIqdmFsWSArIHQ0KnlGcmFjKQotICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgdmFsWCwgYzMyICAgICAgIDsvLyB0NT10MSp2YWxYKzMyCi0gICAgTUxBICAgICB0bXA1LCB0bXAyLCB4RnJhYywgdG1wNSAgICAgOy8vIHQ1PXQyKnhGcmFjK3Q1Ci0KLSAgICBTTVVBRCAgIHRtcDQsIHRtcDQsIHZhbFkgICAgICAgICAgICA7Ly8gdDQ9KHQ0KnZhbFkgKyB0Nip5RnJhYykKLSAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDM9dDMqdmFsWCszMgotICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgeEZyYWMsIHRtcDYgICAgIDsvLyB0Nj10NCp4RnJhYyt0NgotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotCi0gICAgOy8vIHNlY29uZAotICAgIExEUkIgICAgdG1wMSwgW3B0ckEsICMxXSEKLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQotCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKLSAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAotCi0gICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCi0gICAgTUxBICAgICB0bXA1LCB0bXAxLCB4RnJhYywgYzMyICAgICAgOy8vIHQxPXQxKnhGcmFjKzMyCi0gICAgTUxBICAgICB0bXA1LCB0bXAyLCB2YWxYLCB0bXA1ICAgICAgOy8vIHQ1PXQyKnZhbFgrdDUKLQotICAgIFNNVUFEICAgdG1wMywgdG1wMywgdmFsWSAgICAgICAgICAgIDsvLyB0Mz0odDMqdmFsWSArIHQ1KnlGcmFjKQotICAgIE1MQSAgICAgdG1wNiwgdG1wMywgeEZyYWMsIGMzMiAgICAgIDsvLyB0Mz10Myp4RnJhYyszMgotICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgdmFsWCwgdG1wNiAgICAgIDsvLyB0Nj10NCp2YWxYK3Q2Ci0KLSAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNiwgW21iLCAjOF0gICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWJdLCAjMSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4Ci0gICAgQkNTICAgICBsb29wMV94Ci0KLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgQUREUyAgICBtYiwgbWIsICMxNgotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCi0gICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCi0gICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCi0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAotICAgIEJHRSAgICAgbG9vcDFfeQotCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIDsvLyBDcgotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweGZjXSAgICAgICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICAgICAgOy8vIHJlZgotICAgIExEUiAgICAgdG1wMSwgW3NwLCAjMHhkMF0gICAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHhjY10gICAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0gICAgQUREICAgICB0bXAxLCBoZWlnaHQsIHRtcDEKLSAgICBNTEEgICAgIHRtcDMsIHRtcDEsIHdpZHRoLCB0bXAyCi0gICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMKLSAgICBBREQgICAgIG1iLCBtYiwgIzY0Ci0KLSAgICBBTkQgICAgIGNvdW50LCBjb3VudCwgIzB4MDBGRkZGRkYKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMAotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzgKLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbgotbG9vcDJfeQotICAgIExEUkIgICAgdG1wMSwgW3B0ckFdCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8Ci0gICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKLQotICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQotICAgIFNNVUFEICAgdG1wMywgdG1wMywgdmFsWSAgICAgICAgICAgIDsvLyB0Mz0odDMqdmFsWSArIHQ1KnlGcmFjKQotCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAotbG9vcDJfeAotICAgIDsvLyBmaXJzdAotICAgIExEUkIgICAgdG1wMiwgW3B0ckEsICMxXSEKLSAgICBMRFJCICAgIHRtcDQsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDYsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQotCi0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIzE2ICAgOy8vIHx0NHx0MnwKLSAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjMTYgICA7Ly8gfHQ2fHQ0fAotCi0gICAgU01VQUQgICB0bXAyLCB0bXAyLCB2YWxZICAgICAgICAgICAgOy8vIHQyPSh0Mip2YWxZICsgdDQqeUZyYWMpCi0gICAgTUxBICAgICB0bXA1LCB0bXAxLCB2YWxYLCBjMzIgICAgICAgOy8vIHQ1PXQxKnZhbFgrMzIKLSAgICBNTEEgICAgIHRtcDUsIHRtcDIsIHhGcmFjLCB0bXA1ICAgICA7Ly8gdDU9dDIqeEZyYWMrdDUKLQotICAgIFNNVUFEICAgdG1wNCwgdG1wNCwgdmFsWSAgICAgICAgICAgIDsvLyB0ND0odDQqdmFsWSArIHQ2KnlGcmFjKQotICAgIE1MQSAgICAgdG1wNiwgdG1wMywgdmFsWCwgYzMyICAgICAgIDsvLyB0Mz10Myp2YWxYKzMyCi0gICAgTUxBICAgICB0bXA2LCB0bXA0LCB4RnJhYywgdG1wNiAgICAgOy8vIHQ2PXQ0KnhGcmFjK3Q2Ci0KLSAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNiwgW21iLCAjOF0gICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWJdLCAjMSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0KLSAgICA7Ly8gc2Vjb25kIAotICAgIExEUkIgICAgdG1wMSwgW3B0ckEsICMxXSEKLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQotCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKLSAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAotCi0gICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCi0gICAgTUxBICAgICB0bXA1LCB0bXAxLCB4RnJhYywgYzMyICAgICAgOy8vIHQxPXQxKnhGcmFjKzMyCi0gICAgTUxBICAgICB0bXA1LCB0bXAyLCB2YWxYLCB0bXA1ICAgICAgOy8vIHQ1PXQyKnZhbFgrdDUKLQotICAgIFNNVUFEICAgdG1wMywgdG1wMywgdmFsWSAgICAgICAgICAgIDsvLyB0Mz0odDMqdmFsWSArIHQ1KnlGcmFjKQotICAgIE1MQSAgICAgdG1wNiwgdG1wMywgeEZyYWMsIGMzMiAgICAgIDsvLyB0Mz10Myp4RnJhYyszMgotICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgdmFsWCwgdG1wNiAgICAgIDsvLyB0Nj10NCp2YWxYK3Q2Ci0KLSAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNiwgW21iLCAjOF0gICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWJdLCAjMSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4Ci0gICAgQkNTICAgICBsb29wMl94Ci0KLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgQUREUyAgICBtYiwgbWIsICMxNgotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCi0gICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCi0gICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCi0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAotICAgIEJHRSAgICAgbG9vcDJfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHhkNAotICAgIExETUZEICAgc3AhLHtyNC1yMTEscGN9Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfdmVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOWRmMWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfdmVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlciByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotcHRyQSAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYmxvY2sgICBSTiAxCi0KLXgwICAgICAgUk4gMgotY291bnQgICBSTiAyCi0KLXkwICAgICAgUk4gMwotdmFsWSAgICBSTiAzCi0KLXdpZHRoICAgUk4gNAotCi1oZWlnaHQgIFJOIDUKLXRtcDcgICAgUk4gNQotCi1jaHJQVyAgIFJOIDYKLXRtcDggICAgUk4gNgotCi10bXAxICAgIFJOIDcKLQotdG1wMiAgICBSTiA4Ci0KLXRtcDMgICAgUk4gOQotCi10bXA0ICAgIFJOIDEwCi0KLXRtcDUgICAgUk4gMTEKLWNoclBIICAgUk4gMTEKLQotdG1wNiAgICBSTiAxMgotCi1jMzIgICAgIFJOIDE0Ci15RnJhYyAgIFJOIDE0Ci0KLTsvLyBGdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCi0KLTsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCi07Ly8KLTsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Ci07Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAotOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKLTsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCi07Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAotOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKLTsvLyAgdTMyIHlGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAotOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA0Ci07Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMDgKLQotaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweGM0Ci0KLSAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwNF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsCi0KLSAgICBBREQgICAgIHRtcDEsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aAotICAgIENNUCAgICAgdG1wMSwgd2lkdGggICAgICAgICAgICAgOy8vIHgwK2Nocm9tYVBhcnRXaWR0aCA+IHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsCi0KLSAgICBDTVAgICAgIHkwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbAotICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDEsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXAxLCB0bXAxLCAjMSAgICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodCArIDEKLSAgICBDTVAgICAgIHRtcDEsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXAxLCBjaHJQSCwgIzEgICAgICAgICA7Ly8gdG1wMSA9IGNocm9tYVBhcnRIZWlnaHQrMQotICAgIE1PViAgICAgdG1wMiwgY2hyUFcgICAgICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0V2lkdGgKLSAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsY2hyUFcsdG1wMSx0bXAyfQotICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBMRFIgICAgIHgwLCBbc3AsICMweGNjXQotICAgIExEUiAgICAgeTAsIFtzcCwgIzB4ZDBdCi0gICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCi0gICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LGNoclBXLHRtcDEsdG1wMn0KLSAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jawotICAgIE1MQSAgICAgcmVmLCBoZWlnaHQsIHdpZHRoLCByZWYgOy8vIHJlZiArPSB3aWR0aCAqIGhlaWdodDsgCi0gICAgTUxBICAgICBibG9jaywgY2hyUFcsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKSooY2hyb21hUEgrMSkKLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwICAgICAgICAgICAgICAgICAgOy8vIHgwID0gMAotICAgIE1PViAgICAgeTAsICMwICAgICAgICAgICAgICAgICAgOy8vIHkwID0gMAotICAgIFNUUiAgICAgeDAsIFtzcCwgIzB4Y2NdCi0gICAgU1RSICAgICB5MCwgW3NwLCAjMHhkMF0KLSAgICBBREQgICAgIHJlZiwgc3AsICMweDFjICAgICAgICAgIDsvLyByZWYgPSBibG9jawotICAgIFNUUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgotCi0gICAgU1RSICAgICB0bXAxLCBbc3AsICMweGZjXSAgICAgICA7Ly8gaGVpZ2h0Ci0gICAgU1RSICAgICBjaHJQVywgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKLSAgICBNT1YgICAgIHdpZHRoLCBjaHJQVwotCi1za2lwX2ZpbGwKLSAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKLSAgICBMRFIgICAgIHlGcmFjLCBbc3AsICMweDEwMF0gICAgIDsvLyB5RnJhYwotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAotICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCi0KLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQotICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCi0gICAgOy8vIFsxNTowMF0gbm90aGluZwotCi0gICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAotICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8Ci0gICAgTU9WICAgICB2YWxZLCB2YWxZLCBMU0wgIzMgICAgICAgICAgOy8vIG11bHRpcGx5IGJ5IDggaW4gYWR2YW5jZQotICAgIE1PViAgICAgYzMyLCAjMzIKLQotCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIDsvLyBDYgotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KLQotbG9vcDFfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLWxvb3AxX3gKLSAgICA7Ly8gUHJvY2VzcyAyeDIgYmxvY2sKLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDEgY29sCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAxIGNvbAotICAgIExEUkIgICAgdG1wMSwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMSBjb2wKLQotICAgIExEUkIgICAgdG1wNSwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMiBjb2wKLSAgICBMRFJCICAgIHRtcDYsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDIgY29sCi0gICAgTERSQiAgICB0bXA0LCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAyIGNvbAotCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICAgOy8vIHxCfEF8Ci0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHxDfEJ8Ci0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzE2ICAgOy8vIHxCfEF8Ci0KLSAgICBTTUxBRCAgIHRtcDcsIHRtcDIsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcDYsIExTTCAjMTYgICA7Ly8gfEN8QnwKLSAgICBTTUxBRCAgIHRtcDIsIHRtcDEsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDgsIHRtcDUsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDUsIHRtcDQsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDIsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKLQotICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA4LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKLQotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDFfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AxX3kgCi0KLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgOy8vIENyCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCi0gICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCi0KLSAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQotICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKLSAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMwotICAgIEFERCAgICAgbWIsIG1iLCAjNjQKLQotICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi1sb29wMl95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAotbG9vcDJfeAotICAgIDsvLyBQcm9jZXNzIDJ4MiBibG9jawotICAgIExEUkIgICAgdG1wMiwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMSBjb2wKLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDEgY29sCi0gICAgTERSQiAgICB0bXAxLCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAxIGNvbAotCi0gICAgTERSQiAgICB0bXA1LCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAyIGNvbAotICAgIExEUkIgICAgdG1wNiwgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMiBjb2wKLSAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDIgY29sCi0KLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjMTYgICA7Ly8gfEJ8QXwKLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDMsIExTTCAjMTYgICA7Ly8gfEN8QnwKLSAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjMTYgICA7Ly8gfEJ8QXwKLQotICAgIFNNTEFEICAgdG1wNywgdG1wMiwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wNiwgTFNMICMxNiAgIDsvLyB8Q3xCfAotICAgIFNNTEFEICAgdG1wMiwgdG1wMSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wOCwgdG1wNSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wNSwgdG1wNCwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotCi0gICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKLSAgICBNT1YgICAgIHRtcDIsIHRtcDIsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wMiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQotCi0gICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDgsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgotCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4Ci0gICAgQkNTICAgICBsb29wMl94Ci0KLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgQUREUyAgICBtYiwgbWIsICMxNgotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCi0gICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCi0gICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCi0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAotICAgIEJHRSAgICAgbG9vcDJfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHhkNAotICAgIExETUZEICAgc3AhLCB7cjQtcjExLHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTY4YjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZiByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJ1ZmYgICAgUk4gMQotCi1jb3VudCAgIFJOIDIKLXgwICAgICAgUk4gMgotCi15MCAgICAgIFJOIDMKLXhfMl8wICAgUk4gMwotCi13aWR0aCAgIFJOIDQKLXhfM18xICAgUk4gNAotCi1oZWlnaHQgIFJOIDUKLXhfNl80ICAgUk4gNQotCi1wYXJ0VyAgIFJOIDYKLXhfN181ICAgUk4gNgotCi1wYXJ0SCAgIFJOIDcKLXRtcDEgICAgUk4gNwotCi10bXAyICAgIFJOIDgKLQotdG1wMyAgICBSTiA5Ci0KLXRtcDQgICAgUk4gMTAKLQotbXVsdF8yMF8wMSAgUk4gMTEKLW11bHRfMjBfbTUgIFJOIDEyCi0KLXBsdXMxNiAgUk4gMTQKLQotCi07Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYKLQotOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoCi07Ly8KLTsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMKLTsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLgotOy8vCi07Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzAKLTsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLgotOy8vIHlfMCA9ICAgMjAgIDEgICAgIDIwIC01ICAgICAgICAtNSAgICAgICAgIDEKLTsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01Ci07Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMAotOy8vIHlfMyA9ICAgICAgICAgICAgICAxICAgICAgICAyMCAtNSAgICAgLTUgMjAgICAgICAgICAxCi0KLQotaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0Ci0KLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCi0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgQUREICAgICB0bXA0LCB4MCwgcGFydFcgICAgICAgICA7Ly8gKHgwK3BhcnRXaWR0aCkKLSAgICBBREQgICAgIHRtcDQsIHRtcDQsICM1ICAgICAgICAgIDsvLyAoeTArcGFydFcrNSkKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIENNUCAgICAgdG1wNCwgd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCi0KLSAgICBDTVAgICAgIHkwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIEFERCAgICAgdG1wMiwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIENNUCAgICAgdG1wMiwgaGVpZ2h0Ci0gICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCi0KLQotZG9fZmlsbAotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDQsIHBhcnRXLCAjNSAgICAgICAgIDsvLyB0bXA0ID0gcGFydFcgKyA1OwotICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHRtcDR9ICAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgrNQotICAgIFNUUiAgICAgcGFydEgsIFtzcCwjMHhjXSAgICAgICAgOy8vIHNwK2MgPSBwYXJ0SGVpZ2h0Ci0gICAgU1RSICAgICB0bXA0LCBbc3AsIzB4MTBdICAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgrNQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgU1RSICAgICB3aWR0aCwgW3NwLCMwXSAgICAgICAgICA7Ly8gc3ArMCA9IHdpZHRoCi0gICAgQUREICAgICBidWZmLCBzcCwgIzB4MjggICAgICAgICA7Ly8gYnVmZiA9IHAxWzIxKjIxLzQrMV0KLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWVjXSAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWYwXSAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgQUREICAgICByZWYsc3AsIzB4MjggICAgICAgICAgICA7Ly8gcmVmID0gcDEKLSAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgyMThdICAgICAgIDsvLyB3aWR0aCA9IHBhcnRXaWR0aCs1Ci0KLQotc2tpcF9maWxsCi0gICAgTERSICAgICB4MCAsW3NwLCMweDFlY10gICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIHkwICxbc3AsIzB4MWYwXSAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgTUxBICAgICB0bXAyLCB3aWR0aCwgeTAsIHgwICAgICA7Ly8geTAqd2lkdGgreDAKLSAgICBBREQgICAgIHJlZiwgcmVmLCB0bXAyICAgICAgICAgIDsvLyByZWYgKz0geTAqd2lkdGgreDAKLSAgICBBREQgICAgIHJlZiwgcmVmLCAjOCAgICAgICAgICAgIDsvLyByZWYgPSByZWYrOAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCi0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKHBhcnRXaWR0aC0xKQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAocGFydEhlaWdodC0xKQotICAgIDsvLyBbMjM6MjBdIHBhcnRXaWR0aC0xCi0gICAgOy8vIFsxOToxNl0gcGFydEhlaWdodC0xCi0gICAgOy8vIFsxNTowMF0gd2lkdGgKLSAgICBNT1YgICAgIGNvdW50LCB3aWR0aAotICAgIFNVQiAgICAgcGFydFcsIHBhcnRXLCAjMTsKLSAgICBTVUIgICAgIHBhcnRILCBwYXJ0SCwgIzE7Ci0gICAgQUREICAgICB0bXAyLCBwYXJ0SCwgcGFydFcsIExTTCAjNAotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2Ci0KLQotICAgIExEUiAgICAgbXVsdF8yMF8wMSwgPSAweDAwMTQwMDAxCi0gICAgTERSICAgICBtdWx0XzIwX201LCA9IDB4MDAxNEZGRkIKLSAgICBNT1YgICAgIHBsdXMxNiwgIzE2Ci0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRIZWlnaHQtMQotICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzgKLWxvb3BfeQotICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0KLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMywgTFNMICM4Ci0gICAgTERSICAgICB4XzdfNSwgW3JlZiwgIy00XQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAotICAgIFVYVEIxNiAgeF82XzQsIHhfN181Ci0KLWxvb3BfeAotICAgIFVYVEIxNiAgeF83XzUsIHhfN181LCBST1IgIzgKLQotICAgIFNNTEFEICAgdG1wMSwgeF8yXzAsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wMywgeF8yXzAsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wMiwgeF8yXzAsIG11bHRfMjBfbTUsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNCwgeF8zXzEsIG11bHRfMjBfMDEsIHBsdXMxNgotCi0gICAgU01MQUQgICB0bXAxLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMQotICAgIFNNTEFUQiAgdG1wMywgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDMKLSAgICBTTUxBRCAgIHRtcDIsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAyCi0gICAgTERSICAgICB4XzNfMSwgW3JlZl0sICM0Ci0gICAgU01MQUQgICB0bXA0LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNAotCi0gICAgU01MQUJCICB0bXAxLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMQotICAgIFNNTEFEWCAgdG1wMywgeF82XzQsIG11bHRfMjBfbTUsIHRtcDMKLSAgICBTTUxBRFggIHRtcDIsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXAyCi0gICAgU01MQURYICB0bXA0LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNAotCi0gICAgU01MQUJCICB0bXAxLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xCi0gICAgU01MQUJCICB0bXAyLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMgotICAgIFNNTEFEWCAgdG1wMywgeF83XzUsIG11bHRfMjBfMDEsIHRtcDMKLSAgICBTTUxBQkIgIHRtcDQsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXA0Ci0KLSAgICBNT1YgICAgIHRtcDIsIHRtcDIsIEFTUiAjNQotICAgIE1PViAgICAgdG1wMSwgdG1wMSwgQVNSICM1Ci0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIygxNi01KQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMoMTYtNSkKLSAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCi0gICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAotICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4Ci0gICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNAotICAgIEJDQyAgICAgbmV4dF95Ci0KLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDMsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKLQotICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMgotICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAotICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMgotICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDEKLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQotICAgIFNNTEFCQiAgdG1wMiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDIKLSAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzCi0gICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNAotCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKLSAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCi0gICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgotICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKLSAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKLSAgICBCQ1MgICAgIGxvb3BfeAotCi1uZXh0X3kKLSAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiA7Ly8gK3dpZHRoCi0gICAgQUREUyAgICBtYiwgbWIsICMxNiAgICAgICAgICAgICAgICAgOy8vICsxNiwgQ2Fycnk9MAotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAzLCBMU1IgIzIwICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgU0JDICAgICByZWYsIHJlZiwgdG1wMywgTFNSICMyMCAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIygxPDwyOCktKDE8PDI0KQotICAgIEJHRSAgICAgbG9vcF95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweDFmNAotICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30KLQotICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9xdWFydGVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9xdWFydGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjQzZDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlciByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJ1ZmYgICAgUk4gMQotCi1jb3VudCAgIFJOIDIKLXgwICAgICAgUk4gMgotCi15MCAgICAgIFJOIDMKLXhfMl8wICAgUk4gMwotCi13aWR0aCAgIFJOIDQKLXhfM18xICAgUk4gNAotCi1oZWlnaHQgIFJOIDUKLXhfNl80ICAgUk4gNQotCi1wYXJ0VyAgIFJOIDYKLXhfN181ICAgUk4gNgotCi1wYXJ0SCAgIFJOIDcKLXRtcDEgICAgUk4gNwotCi10bXAyICAgIFJOIDgKLQotdG1wMyAgICBSTiA5Ci0KLXRtcDQgICAgUk4gMTAKLQotbXVsdF8yMF8wMSAgUk4gMTEKLQotbXVsdF8yMF9tNSAgUk4gMTIKLQotcGx1czE2ICBSTiAxNAotCi0KLTsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcgotCi0KLTsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaAotOy8vCi07Ly8gQmFzaWMgaWRlYSBpbiBob3Jpem9udGFsIGZpbHRlcmluZyBpcyB0byBhZGp1c3QgY29lZmZpY2llbnRzCi07Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4KLTsvLwotOy8vIFJlZyAgICAgeF8yXzAgICAgIHhfM18xICAgICB4XzZfNCAgICAgeF83XzUgICAgIHhfMl8wCi07Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4KLTsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxCi07Ly8geV8xID0gICAtNSAgICAgICAgMjAgIDEgICAgICAxIDIwICAgICAgICAtNQotOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjAKLTsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQotCi0KLWgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweDFlNAotCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNCwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCi0gICAgQUREICAgICB0bXA0LCB0bXA0LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRXKzUpCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHRtcDQsIHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDIsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBDTVAgICAgIHRtcDIsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAotCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgQUREICAgICB0bXA0LCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wNCA9IHBhcnRXICsgNTsKLSAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCB0bXA0fSAgICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoKzUKLSAgICBTVFIgICAgIHBhcnRILCBbc3AsIzB4Y10gICAgICAgIDsvLyBzcCtjID0gcGFydEhlaWdodAotICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAotICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAotICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCi0gICAgU1RSICAgICB0bXA0LCBbc3AsIzB4MjE4XSAgICAgICA7Ly8gd2lkdGggPSBwYXJ0V2lkdGgrNQotCi0KLXNraXBfZmlsbAotICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIE1MQSAgICAgdG1wMiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgIzggICAgICAgICAgICA7Ly8gcmVmID0gcmVmKzgKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgotCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKLSAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQotICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQotICAgIDsvLyBbMTU6MDBdIHdpZHRoCi0gICAgTU9WICAgICBjb3VudCwgd2lkdGgKLSAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7Ci0gICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOwotICAgIEFERCAgICAgdG1wMiwgcGFydEgsIHBhcnRXLCBMU0wgIzQKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNgotCi0KLSAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMQotICAgIExEUiAgICAgbXVsdF8yMF9tNSwgPSAweDAwMTRGRkZCCi0gICAgTU9WICAgICBwbHVzMTYsICMxNgotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKLSAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Ci1sb29wX3kKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmLCAjLThdCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjOAotICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQotCi1sb29wX3gKLSAgICBVWFRCMTYgIHhfN181LCB4XzdfNSwgUk9SICM4Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDMsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201LCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxLCBwbHVzMTYKLQotICAgIFNNTEFEICAgdG1wMSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBVEIgIHRtcDMsIHhfM18xLCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQUQgICB0bXAyLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMgotICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNAotICAgIFNNTEFEICAgdG1wNCwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBRFggIHRtcDMsIHhfNl80LCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQURYICB0bXAyLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wMgotICAgIFNNTEFEWCAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDEKLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQotICAgIFNNTEFCQiAgdG1wMiwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDIKLSAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzCi0gICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNAotCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKLSAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCi0gICAgTERSICAgICB0bXA0LCBbc3AsICMweDIyOF0KLSAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCi0gICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQotICAgIFNVQiAgICAgdG1wNCwgdG1wNCwgIzEwCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgTERSICAgICB0bXAzLCBbcmVmLCB0bXA0XQotICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4Ci0KLTsvLyBxdWFydGVyIHBlbCBwb3NpdGlvbgotICAgIExEUiAgICAgdG1wMiwgPSAweDgwODA4MDgwCi0gICAgTVZOICAgICB0bXAzLCB0bXAzCi0gICAgVUhTVUI4ICB0bXAxLCB0bXAxLCB0bXAzCi0gICAgRU9SICAgICB0bXAxLCB0bXAxLCB0bXAyCi0gICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNAotCi0gICAgQkNDICAgICBuZXh0X3kKLQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKLQotICAgIFNNTEFEICAgdG1wMSwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDEsIHBsdXMxNgotCi0gICAgU01MQUQgICB0bXAxLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMQotICAgIFNNTEFUQiAgdG1wMywgeF83XzUsIG11bHRfMjBfbTUsIHRtcDMKLSAgICBTTUxBRCAgIHRtcDIsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAyCi0gICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0Ci0gICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNAotCi0gICAgU01MQUJCICB0bXAxLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMQotICAgIFNNTEFEWCAgdG1wMywgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDMKLSAgICBTTUxBRFggIHRtcDIsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXAyCi0gICAgU01MQURYICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNAotCi0gICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQotICAgIFVYVEIxNiAgeF82XzQsIHhfN181Ci0gICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMgotICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMKLSAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA0Ci0KLSAgICBNT1YgICAgIHRtcDIsIHRtcDIsIEFTUiAjNQotICAgIE1PViAgICAgdG1wMSwgdG1wMSwgQVNSICM1Ci0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIygxNi01KQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMoMTYtNSkKLSAgICBMRFIgICAgIHRtcDQsIFtzcCwgIzB4MjI4XQotICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKLSAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCi0gICAgU1VCICAgICB0bXA0LCB0bXA0LCAjMTAKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKLSAgICBMRFIgICAgIHRtcDMsIFtyZWYsIHRtcDRdCi0gICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKLQotOy8vIHF1YXJ0ZXIgcGVsCi0gICAgTERSICAgICB0bXAyLCA9IDB4ODA4MDgwODAKLSAgICBNVk4gICAgIHRtcDMsIHRtcDMKLSAgICBVSFNVQjggIHRtcDEsIHRtcDEsIHRtcDMKLSAgICBFT1IgICAgIHRtcDEsIHRtcDEsIHRtcDIKLQotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKLSAgICBCQ1MgICAgIGxvb3BfeAotCi1uZXh0X3kKLSAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiA7Ly8gK3dpZHRoCi0gICAgQUREUyAgICBtYiwgbWIsICMxNiAgICAgICAgICAgICAgICAgOy8vICsxNiwgQ2Fycnk9MAotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAzLCBMU1IgIzIwICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgU0JDICAgICByZWYsIHJlZiwgdG1wMywgTFNSICMyMCAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIygxPDwyOCktKDE8PDI0KQotICAgIEJHRSAgICAgbG9vcF95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweDFmNAotICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30KLQotICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl92ZXJfcXVhcnRlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3OWIzOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl92ZXJfcXVhcnRlci5zCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIgCi07LS0gICAgICAgICAgICBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYnVmZiAgICBSTiAxCi0KLWNvdW50ICAgUk4gMgoteDAgICAgICBSTiAyCi0KLXkwICAgICAgUk4gMwoteF8yXzAgICBSTiAzCi1yZXMgICAgIFJOIDMKLQoteF8zXzEgICBSTiA0Ci10bXAxICAgIFJOIDQKLQotaGVpZ2h0ICBSTiA1Ci14XzZfNCAgIFJOIDUKLXRtcDIgICAgUk4gNQotCi1wYXJ0VyAgIFJOIDYKLXhfN181ICAgUk4gNgotdG1wMyAgICBSTiA2Ci0KLXBhcnRIICAgUk4gNwotdG1wNCAgICBSTiA3Ci0KLXRtcDUgICAgUk4gOAotCi10bXA2ICAgIFJOIDkKLQotdG1wYSAgICBSTiAxMAotCi1tdWx0XzIwXzAxICBSTiAxMQotdG1wYiAgICAgICAgUk4gMTEKLQotbXVsdF8yMF9tNSAgUk4gMTIKLXdpZHRoICAgICAgIFJOIDEyCi0KLXBsdXMxNiAgUk4gMTQKLQotCi07Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIKLQotOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoCi07Ly8KLTsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMKLTsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLgotOy8vCi07Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzAKLTsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLgotOy8vIHlfMCA9ICAgMjAgIDEgICAgIDIwIC01ICAgICAgICAtNSAgICAgICAgIDEKLTsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01Ci07Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMAotOy8vIHlfMyA9ICAgICAgICAgICAgICAxICAgICAgICAyMCAtNSAgICAgLTUgMjAgICAgICAgICAxCi0KLQotaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0Ci0KLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCi0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBBREQgICAgIHRtcGEsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgIzUgICAgICAgICAgOy8vICh4MCtwYXJ0Vys1KQotICAgIENNUCAgICAgdG1wYSwgd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCi0KLSAgICBDTVAgICAgIHkwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wNSwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQotICAgIEFERCAgICAgdG1wNSwgdG1wNSwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0SCs1KQotICAgIENNUCAgICAgdG1wNSwgaGVpZ2h0Ci0gICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCi0KLQotZG9fZmlsbAotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDUsIHBhcnRILCAjNSAgICAgICAgIDsvLyB0bXA1ID0gcGFydEggKyA1Ci0gICAgQUREICAgICB0bXBhLCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wYSA9IHBhcnRXICsgNQotICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHRtcGF9ICAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgrNQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgU1RSICAgICB0bXA1LCBbc3AsIzB4Y10gICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQrNQotICAgIFNUUiAgICAgdG1wYSwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKLSAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKLSAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQotICAgIFNUUiAgICAgdG1wYSwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKLQotCi1za2lwX2ZpbGwKLSAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBMRFIgICAgIHRtcDYsIFtzcCwjMHgyMjhdICAgICAgIDsvLyBob3JWZXJPZmZzZXQKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgotICAgIE1MQSAgICAgdG1wNSwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgdG1wNSAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCi0gICAgU1RSICAgICByZWYsIFtzcCwgIzB4MWU0XSAgICAgICA7Ly8gc3RvcmUgInJlZiIgZm9yIHZlcnRpY2FsIGZpbHRlcmluZwotICAgIEFORCAgICAgdG1wNiwgdG1wNiwgIzIgICAgICAgICAgOy8vIGNhbGN1bGF0ZSByZWYgZm9yIGhvcml6b250YWwgZmlsdGVyCi0gICAgTU9WICAgICB0bXBhLCAjMgotICAgIEFERCAgICAgdG1wNiwgdG1wYSwgdG1wNiwgTFNSICMxCi0gICAgTUxBICAgICByZWYsIHRtcDYsIHdpZHRoLCByZWYKLSAgICBBREQgICAgIHJlZiwgcmVmLCAjOCAgICAgICAgICAgIDsvLyByZWYgPSByZWYrOAotCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKLSAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQotICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQotICAgIDsvLyBbMTU6MDBdIHdpZHRoCi0gICAgTU9WICAgICBjb3VudCwgd2lkdGgKLSAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7Ci0gICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOwotICAgIEFERCAgICAgdG1wNSwgcGFydEgsIHBhcnRXLCBMU0wgIzQKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNSwgTFNMICMxNgotCi0KLSAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMSAgICA7Ly8gY29uc3RhbnQgbXVsdGlwbGllcnMKLSAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQiAgICA7Ly8gY29uc3RhbnQgbXVsdGlwbGllcnMKLSAgICBNT1YgICAgIHBsdXMxNiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gY29uc3RhbnQgZm9yIGFkZAotICAgIEFORCAgICAgdG1wNCwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKLSAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNCwgTFNMICM4ICA7Ly8gcGFydEgtMSB0byBsb3dlciBwYXJ0IG9mIHRvcCBieXRlCi0KLTsvLyBIT1JJWk9OVEFMIFBBUlQKLQotbG9vcF95X2hvcgotICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0KLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNiwgTFNMICM4ICAgOy8vIHBhcnRXLTEgdG8gdXBwZXIgcGFydCBvZiB0b3AgYnl0ZQotICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQotCi1sb29wX3hfaG9yCi0gICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA2LCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA1LCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXBhLCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0Ci0gICAgU01MQVRCICB0bXA2LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNgotICAgIFNNTEFEICAgdG1wNSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDUKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcGEsIHhfNl80LCBtdWx0XzIwX201LCB0bXBhCi0KLSAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0Ci0gICAgU01MQURYICB0bXA2LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNgotICAgIFNNTEFEWCAgdG1wNSwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDUKLSAgICBTTUxBRFggIHRtcGEsIHhfN181LCBtdWx0XzIwX201LCB0bXBhCi0KLSAgICBTTUxBQkIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCB0bXA0Ci0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBTTUxBQkIgIHRtcDUsIHhfN181LCBtdWx0XzIwX201LCB0bXA1Ci0gICAgU01MQURYICB0bXA2LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNgotICAgIFNNTEFCQiAgdG1wYSwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcGEKLQotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgQVNSICM1Ci0gICAgTU9WICAgICB0bXA0LCB0bXA0LCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcGEsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIygxNi01KQotICAgIFVTQVQxNiAgdG1wNSwgIzgsIHRtcDUKLSAgICBVU0FUMTYgIHRtcDQsICM4LCB0bXA0Ci0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgT1JSICAgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzgKLSAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0Ci0gICAgQkNDICAgICBuZXh0X3lfaG9yCi0KLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0KLSAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDYsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDUsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcGEsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKLQotICAgIFNNTEFEICAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKLSAgICBTTUxBVEIgIHRtcDYsIHhfN181LCBtdWx0XzIwX201LCB0bXA2Ci0gICAgU01MQUQgICB0bXA1LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNQotICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAotICAgIFNNTEFEICAgdG1wYSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcGEKLQotICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKLSAgICBTTUxBRFggIHRtcDYsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA2Ci0gICAgU01MQURYICB0bXA1LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNQotICAgIFNNTEFEWCAgdG1wYSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcGEKLQotICAgIFNNTEFCQiAgdG1wNCwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDQKLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQotICAgIFNNTEFCQiAgdG1wNSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDUKLSAgICBTTUxBRFggIHRtcDYsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXA2Ci0gICAgU01MQUJCICB0bXBhLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wYQotCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBBU1IgIzUKLSAgICBNT1YgICAgIHRtcDQsIHRtcDQsIEFTUiAjNQotICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wYSwgTFNMICMoMTYtNSkKLSAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjKDE2LTUpCi0gICAgVVNBVDE2ICB0bXA1LCAjOCwgdG1wNQotICAgIFVTQVQxNiAgdG1wNCwgIzgsIHRtcDQKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKLSAgICBPUlIgICAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjOAotICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQKLSAgICBCQ1MgICAgIGxvb3BfeF9ob3IKLQotbmV4dF95X2hvcgotICAgIEFORCAgICAgdG1wNiwgY291bnQsICMweDAwRjAwMDAwICAgICAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiAgICAgOy8vICt3aWR0aAotICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCi0gICAgU0JDICAgICBtYiwgbWIsIHRtcDYsIExTUiAjMjAgICAgICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgU0JDICAgICByZWYsIHJlZiwgdG1wNiwgTFNSICMyMCAgICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkgIDsvLyBkZWNyZW1lbnQgY291bnRlciAocGFydFcpCi0gICAgQkdFICAgICBsb29wX3lfaG9yCi0KLQotCi07Ly8gVkVSVElDQUwgUEFSVAotOy8vCi07Ly8gQXBwcm9hY2ggdG8gdmVydGljYWwgaW50ZXJwb2xhdGlvbgotOy8vCi07Ly8gSW50ZXJwb2xhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzCi07Ly8gYW5kIGJ5IHVzaW5nIDE2IGJpdCBhcml0aG1ldGljLiA0eDQgYmxvY2sgaXMgcHJvY2Vzc2VkCi07Ly8gaW4gZWFjaCByb3VuZC4KLTsvLwotOy8vIHxhXzExfGFfMTF8YV8xMXxhXzExfC4uLnxhXzFufGFfMW58YV8xbnxhXzFufAotOy8vIHxiXzExfGJfMTF8Yl8xMXxiXzExfC4uLnxiXzFufGJfMW58Yl8xbnxiXzFufAotOy8vIHxjXzExfGNfMTF8Y18xMXxjXzExfC4uLnxjXzFufGNfMW58Y18xbnxjXzFufAotOy8vIHxkXzExfGRfMTF8ZF8xMXxkXzExfC4uLnxkXzFufGRfMW58ZF8xbnxkXzFufAotOy8vICAgICAgICAgICAuLgotOy8vICAgICAgICAgICAuLgotOy8vIHxhX20xfGFfbTF8YV9tMXxhX20xfC4uLgotOy8vIHxiX20xfGJfbTF8Yl9tMXxiX20xfC4uLgotOy8vIHxjX20xfGNfbTF8Y19tMXxjX20xfC4uLgotOy8vIHxkX20xfGRfbTF8ZF9tMXxkX20xfC4uLgotCi07Ly8gQXBwcm9hY2ggdG8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0byBxdWFydGVyIHBlbCBwb3NpdGlvbi4KLTsvLyA0IGJ5dGVzIGFyZSBwcm9jZXNzZWQgcGFyYWxsZWwKLTsvLwotOy8vIGFsZ29yaXRobSAoYStiKzEpLzIuIFJvdWRpbmcgdXB3YXJkcyArMSBjYW4gYmUgYWNoaWV2ZWQgYnkgCi07Ly8gbmVnYXRpbmcgc2Vjb25kIG9wZXJhbmQgdG8gZ2V0IG9uZSdzIGNvbXBsZW1lbnQgKGluc3RlYWQgb2YgMidzKQotOy8vIGFuZCB1c2luZyBzdWJ0cmFjdGlvbiwgRU9SIGlzIHVzZWQgdG8gY29ycmVjdCBzaWduLgotOy8vCi07Ly8gTVZOICAgICBiLCBiCi07Ly8gVUhTVUI4ICBhLCBhLCBiCi07Ly8gRU9SICAgICBhLCBhLCAweDgwODA4MDgwCi0KLQotICAgIExEUiAgICAgcmVmLCBbc3AsICMweDFlNF0gICAgICAgICAgIDsvLyByZWYKLSAgICBMRFIgICAgIHRtcGEsIFtzcCwgIzB4MjI4XSAgICAgICAgICA7Ly8gaG9yVmVyT2Zmc2V0Ci0gICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICAgICAgOy8vIG1iCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHgyMThdICAgICAgICAgOy8vIHdpZHRoCi0gICAgQUREICAgICByZWYsIHJlZiwgIzIgICAgICAgICAgICAgICAgOy8vIGNhbGN1bGF0ZSBjb3JyZWN0IHBvc2l0aW9uCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCAjMQotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcGEKLSAgICBMRFIgICAgIHBsdXMxNiwgPSAweDAwMTAwMDEwICAgICAgICA7Ly8gKzE2IHRvIGxvd2VyIGFuZCB1cHBlcmYgaGFsZndvcmRzCi0gICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGICAgOy8vIHBhcnRXaWR0aC0xCi0KLSAgICBBTkQgICAgIHRtcGEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcGEsIExTTCAjOAotCi1sb29wX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNiwgTFNMICM4ICA7Ly8gcGFydFdpZHRoLTEKLQotbG9vcF94Ci0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8Ci0gICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8Ci0gICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8Ci0gICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8Ci0gICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMgCi0gICAgVVhUQjE2ICB0bXBhLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wMiAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wMiwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wMSwgW21iXQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZOICAgICB0bXAxLCB0bXAxCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLQotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdyAobWIpCi0KLQotICAgIDsvLyB0bXAyID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXAzID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA0ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXA1ID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXA2ID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAxID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIHNlY29uZCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXAyLCBbbWJdCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLSAgICBNVk4gICAgIHRtcDIsIHRtcDIKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAyICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93Ci0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdwotCi0gICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXAzLCBbbWJdCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLSAgICBNVk4gICAgIHRtcDMsIHRtcDMKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAzICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIExEUiAgICAgdG1wMywgW3JlZl0gICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93Ci0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdwotCi0gICAgOy8vIHRtcDQgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDUgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDYgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDEgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDIgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDMgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gZm91cnRoIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA2LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDUsIFttYl0KLSAgICBMRFIgICAgIHRtcDQsID0gMHhGRjAwRkYwMAotICAgIE1WTiAgICAgdG1wNSwgdG1wNQotCi0gICAgQU5EICAgICB0bXBhLCB0bXA0LCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDUgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0KLSAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOCAgICAgICAgOy8vIGRlY3JlbWVudCB4IGxvb3AgY291bnRlcgotCi0gICAgOy8vIGNhbGN1bGF0ZSAicmVmIiBhZGRyZXNzIGZvciBuZXh0IHJvdW5kCi0gICAgU1VCICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMyAgICAgOy8vIHJlZiAtPSA4KndpZHRoOwotICAgIEFERCAgICAgcmVmLCByZWYsICM0ICAgICAgICAgICAgICAgIDsvLyBuZXh0IGNvbHVtbiAoNCBwaXhlbHMpCi0KLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0gICAgU1RSICAgICByZXMsIFttYl0sICMtNDQKLQotICAgIEJDUyAgICAgbG9vcF94Ci0KLSAgICBBRERTICAgIG1iLCBtYiwgIzY0ICAgICAgICAgICAgICAgICA7Ly8gc2V0IENhcnJ5PTAKLSAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKLSAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXA2LCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIFNCQyAgICAgbWIsIG1iLCB0bXA2LCBMU1IgIzIwICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4QyA8PCAyNCAgICA7Ly8gZGVjcmVtZW50IHkgbG9vcCBjb3VudGVyCi0gICAgQkdFICAgICBsb29wX3kKLQotICAgIEFERCAgICAgc3AsIHNwLCAjMHgxZjQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWFlZDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLTsNCi07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotOw0KLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi07DQotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLTstLQ0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIGhvcml6b250YWwgcGFydCBvZiANCi07LS0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWQgZnVuY3Rpb25zDQotOy0tDQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0NCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00NCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20NCi0gICAgRUxTRQ0KLSAgICAgICAgUkVRVUlSRTgNCi0gICAgICAgIFBSRVNFUlZFOA0KLSAgICBFTkRJRg0KLQ0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUNCi0NCi0NCi07Ly8gUmVnaXN0ZXIgYWxsb2NhdGlvbg0KLQ0KLXJlZiAgICAgUk4gMCAgICA7Ly8gcG9pbnRlciB0byBjdXJyZW50IHBvc2l0aW9uIGluIHJlZmVyZW5jZSBpbWFnZQ0KLW1iICAgICAgUk4gMSAgICA7Ly8gcG9pbnRlciB0byBjdXJyZW50IHBvc2l0aW9uIGluIGludGVycG9sYXRlZCBtYg0KLWNvdW50ICAgUk4gMiAgICA7Ly8gYml0LXBhY2tlZCB3aWR0aCBhbmQgY291bnQgdmFsdWVzDQotDQoteF8yXzAgICBSTiA0DQoteF8zXzEgICBSTiA1DQoteF82XzQgICBSTiA2DQoteF83XzUgICBSTiA3DQotDQotdG1wMSAgICBSTiA4DQotdG1wMiAgICBSTiA5DQotdG1wMyAgICBSTiAxMA0KLXRtcDQgICAgUk4gMTENCi0NCi1tdWx0XzIwXzAxICBSTiAxMiAgIDsvLyBbMjAsICAxXQ0KLW11bHRfMjBfbTUgIFJOIDE0ICAgOy8vIFsyMCwgLTVdDQotDQotDQotICAgICAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclBhcnQNCi0NCi07Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gNCi07Ly8NCi07Ly8gQmFzaWMgaWRlYSBpbiBob3Jpem9udGFsIGZpbHRlcmluZyBpcyB0byBhZGp1c3QgY29lZmZpY2llbnRzDQotOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuDQotOy8vDQotOy8vIFJlZyAgICAgeF8yXzAgICAgIHhfM18xICAgICB4XzZfNCAgICAgeF83XzUgICAgIHhfMl8wDQotOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uDQotOy8vIHlfMCA9ICAgMjAgIDEgICAgIDIwIC01ICAgICAgICAtNSAgICAgICAgIDENCi07Ly8geV8xID0gICAtNSAgICAgICAgMjAgIDEgICAgICAxIDIwICAgICAgICAtNQ0KLTsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwDQotOy8vIHlfMyA9ICAgICAgICAgICAgICAxICAgICAgICAyMCAtNSAgICAgLTUgMjAgICAgICAgICAxDQotDQotDQotaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUGFydA0KLSAgICBTVE1GRCAgIHNwISwge3I0LXIxMSwgbHJ9DQotDQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3Rlcg0KLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKHBhcnRXaWR0aC0xKQ0KLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkNCi0gICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTENCi0gICAgOy8vIFsxOToxNl0gcGFydEhlaWdodC0xDQotICAgIDsvLyBbMTU6MDBdIHdpZHRoDQotDQotDQotICAgIExEUiAgICAgbXVsdF8yMF8wMSwgPSAweDAwMTQwMDAxDQotICAgIExEUiAgICAgbXVsdF8yMF9tNSwgPSAweDAwMTRGRkZCDQotICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQ0KLWxvb3BfeQ0KLSAgICBMRFIgICAgIHhfM18xLCBbcmVmLCAjLThdDQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzEyDQotICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0NCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzENCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOA0KLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQ0KLQ0KLWxvb3BfeA0KLSAgICBVWFRCMTYgIHhfN181LCB4XzdfNSwgUk9SICM4DQotDQotICAgIFNNVUFEICAgdG1wMSwgeF8yXzAsIG11bHRfMjBfMDENCi0gICAgU01VTFRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNQ0KLSAgICBTTVVMVEIgIHRtcDMsIHhfMl8wLCBtdWx0XzIwXzAxDQotICAgIFNNVUxUQiAgdG1wNCwgeF8zXzEsIG11bHRfMjBfMDENCi0NCi0gICAgU01MQUQgICB0bXAxLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMQ0KLSAgICBTTUxBRCAgIHRtcDIsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAyDQotICAgIFNNTEFUQiAgdG1wMywgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDMNCi0gICAgTERSICAgICB4XzNfMSwgW3JlZl0sICM0DQotICAgIFNNTEFEICAgdG1wNCwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDQNCi0NCi0gICAgU01MQUJCICB0bXAxLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMQ0KLSAgICBTTUxBRFggIHRtcDIsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXAyDQotICAgIFNNTEFEWCAgdG1wMywgeF82XzQsIG11bHRfMjBfbTUsIHRtcDMNCi0gICAgU01MQURYICB0bXA0LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNA0KLQ0KLSAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxDQotICAgIFNNTEFCQiAgdG1wMiwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDINCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzENCi0gICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMw0KLSAgICBTTUxBQkIgIHRtcDQsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXA0DQotDQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgNCi0gICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNA0KLSAgICBTVFIgICAgIHRtcDIsIFttYl0sICM0DQotICAgIFNUUiAgICAgdG1wMywgW21iXSwgIzQNCi0gICAgU1RSICAgICB0bXA0LCBbbWJdLCAjNA0KLSAgICBCQ0MgICAgIG5leHRfeQ0KLQ0KLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4DQotDQotICAgIFNNVUFEICAgdG1wMSwgeF82XzQsIG11bHRfMjBfMDENCi0gICAgU01VTFRCICB0bXAyLCB4XzZfNCwgbXVsdF8yMF9tNQ0KLSAgICBTTVVMVEIgIHRtcDMsIHhfNl80LCBtdWx0XzIwXzAxDQotICAgIFNNVUxUQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDENCi0NCi0gICAgU01MQUQgICB0bXAxLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMQ0KLSAgICBTTUxBRCAgIHRtcDIsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAyDQotICAgIFNNTEFUQiAgdG1wMywgeF83XzUsIG11bHRfMjBfbTUsIHRtcDMNCi0gICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0DQotICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQNCi0NCi0gICAgU01MQUJCICB0bXAxLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMQ0KLSAgICBTTUxBRFggIHRtcDIsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXAyDQotICAgIFNNTEFEWCAgdG1wMywgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDMNCi0gICAgU01MQURYICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNA0KLQ0KLSAgICBTTUxBQkIgIHRtcDEsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAxDQotICAgIFNNTEFCQiAgdG1wMiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDINCi0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUNCi0gICAgU01MQURYICB0bXAzLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMw0KLSAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA0DQotDQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgNCi0gICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNA0KLSAgICBTVFIgICAgIHRtcDIsIFttYl0sICM0DQotICAgIFNUUiAgICAgdG1wMywgW21iXSwgIzQNCi0gICAgU1RSICAgICB0bXA0LCBbbWJdLCAjNA0KLSAgICBCQ1MgICAgIGxvb3BfeA0KLQ0KLW5leHRfeQ0KLSAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydFdpZHRoLTENCi0gICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgICA7Ly8gK3dpZHRoDQotICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMTYgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQ0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIygxPDwyOCktKDE8PDIwKQ0KLSAgICBCR0UgICAgIGxvb3BfeQ0KLQ0KLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9DQotDQotICAgIEVORA0KLQ0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX2hhbGYucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX2hhbGYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0ZmM2Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZiBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYnVmZiAgICBSTiAxCi0KLWNvdW50ICAgUk4gMgoteDAgICAgICBSTiAyCi0KLXJlcyAgICAgUk4gMwoteTAgICAgICBSTiAzCi0KLXRtcDEgICAgUk4gNAotCi10bXAyICAgIFJOIDUKLWhlaWdodCAgUk4gNQotCi10bXAzICAgIFJOIDYKLXBhcnRXICAgUk4gNgotCi10bXA0ICAgIFJOIDcKLXBhcnRIICAgUk4gNwotCi10bXA1ICAgIFJOIDgKLXRtcDYgICAgUk4gOQotCi10bXBhICAgIFJOIDEwCi10bXBiICAgIFJOIDExCi13aWR0aCAgIFJOIDEyCi0KLXBsdXMxNiAgUk4gMTQKLQotCi07Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKLQotOy8vIEFwcHJvYWNoIHRvIHZlcnRpY2FsIGludGVycG9sYXRpb24KLTsvLwotOy8vIEludGVycG9sYXRpb24gaXMgZG9uZSBieSB1c2luZyAzMi1iaXQgbG9hZHMgYW5kIHN0b3JlcwotOy8vIGFuZCBieSB1c2luZyAxNiBiaXQgYXJpdGhtZXRpYy4gNHg0IGJsb2NrIGlzIHByb2Nlc3NlZAotOy8vIGluIGVhY2ggcm91bmQuCi07Ly8KLTsvLyB8YV8xMXxhXzExfGFfMTF8YV8xMXwuLi58YV8xbnxhXzFufGFfMW58YV8xbnwKLTsvLyB8Yl8xMXxiXzExfGJfMTF8Yl8xMXwuLi58Yl8xbnxiXzFufGJfMW58Yl8xbnwKLTsvLyB8Y18xMXxjXzExfGNfMTF8Y18xMXwuLi58Y18xbnxjXzFufGNfMW58Y18xbnwKLTsvLyB8ZF8xMXxkXzExfGRfMTF8ZF8xMXwuLi58ZF8xbnxkXzFufGRfMW58ZF8xbnwKLTsvLyAgICAgICAgICAgLi4KLTsvLyAgICAgICAgICAgLi4KLTsvLyB8YV9tMXxhX20xfGFfbTF8YV9tMXwuLi4KLTsvLyB8Yl9tMXxiX20xfGJfbTF8Yl9tMXwuLi4KLTsvLyB8Y19tMXxjX20xfGNfbTF8Y19tMXwuLi4KLTsvLyB8ZF9tMXxkX20xfGRfbTF8ZF9tMXwuLi4KLQotaDI2NGJzZEludGVycG9sYXRlVmVySGFsZgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0Ci0KLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCi0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgQUREICAgICB0bXA1LCB4MCwgcGFydFcgICAgICAgICA7Ly8gKHgwK3BhcnRXaWR0aCkKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIENNUCAgICAgdG1wNSwgd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCi0KLSAgICBDTVAgICAgIHkwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIEFERCAgICAgdG1wNiwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQotICAgIEFERCAgICAgdG1wNiwgdG1wNiwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0SCs1KQotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIENNUCAgICAgdG1wNiwgaGVpZ2h0Ci0gICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCi0KLQotZG9fZmlsbAotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDUsIHBhcnRILCAjNSAgICAgICAgIDsvLyByMiA9IHBhcnRIICsgNTsKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCBwYXJ0V30gICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoCi0gICAgU1RSICAgICB0bXA1LCBbc3AsIzB4Y10gICAgICAgICA7Ly8gc3ArYyBwYXJ0SGVpZ2h0KzUKLSAgICBTVFIgICAgIHBhcnRXLCBbc3AsIzB4MTBdICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgU1RSICAgICB3aWR0aCwgW3NwLCMwXSAgICAgICAgICA7Ly8gc3ArMCA9IHdpZHRoCi0gICAgQUREICAgICBidWZmLCBzcCwgIzB4MjggICAgICAgICA7Ly8gYnVmZiA9IHAxWzIxKjIxLzQrMV0KLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWVjXSAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWYwXSAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgQUREICAgICByZWYsc3AsIzB4MjggICAgICAgICAgICA7Ly8gcmVmID0gcDEKLSAgICBTVFIgICAgIHBhcnRXLCBbc3AsIzB4MjE4XQotCi0KLXNraXBfZmlsbAotICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIE1MQSAgICAgdG1wNiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgdG1wNiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKLQotICAgIEFERCAgICAgY291bnQsIHBhcnRXLCBwYXJ0SCwgTFNMICMxNiAgICA7Ly8gfHBhcnRIfHBhcnRXfAotICAgIExEUiAgICAgdG1wNSwgPSAweDAwMDEwMDAxCi0gICAgU1NVQjE2ICBjb3VudCwgY291bnQsIHRtcDU7ICAgICA7Ly8gfHBhcnRILTF8cGFydFctMXwKLSAgICBMRFIgICAgIHBsdXMxNiwgPSAweDAwMTAwMDEwCi0KLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwMDBGRiA7Ly8gcGFydFdpZHRoCi0KLQotbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjQgIDsvLyBwYXJ0V2lkdGgtMSB0byB0b3AgYnl0ZQotCi1sb29wX3gKLSAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxhNHxhM3xhMnxhMXwKLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxjNHxjM3xjMnxjMXwKLSAgICBMRFIgICAgIHRtcDMsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxnNHxnM3xnMnxnMXwKLSAgICBMRFIgICAgIHRtcDQsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxtNHxtM3xtMnxtMXwKLSAgICBMRFIgICAgIHRtcDUsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxyNHxyM3xyMnxyMXwKLSAgICBMRFIgICAgIHRtcDYsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBmaXJzdCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDIgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDIsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aAotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2ZWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdyAobWIpCi0KLSAgICA7Ly8gdG1wMiA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wMyA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNCA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wNSA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wNiA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMSA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBzZWNvbmQgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93Ci0KLSAgICA7Ly8gdG1wMyA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wNCA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNSA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wNiA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wMSA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMiA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyB0aGlyZCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDMsIFtyZWZdCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLQotICAgIDsvLyBkZWNyZW1lbnQgbG9vcF94IGNvdW50ZXIKLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI0ICAgICAgICA7Ly8gKHBhcnRXaWR0aC0xKSAtPSA0OwotCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXA0ID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA1ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA2ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXAxID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAyID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAzID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIGZvdXJ0aCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNiwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXA0LCA9IDB4RkYwMEZGMDAKLQotICAgIDsvLyBjYWxjdWxhdGUgInJlZiIgYWRkcmVzcyBmb3IgbmV4dCByb3VuZAotICAgIFNVQiAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzMgICAgIDsvLyByZWYgLT0gOCp3aWR0aDsKLSAgICBBREQgICAgIHJlZiwgcmVmLCAjNDsgICAgICAgICAgICAgICA7Ly8gbmV4dCBjb2x1bW4gKDQgcGl4ZWxzKQotICAgIEFORCAgICAgdG1wYSwgdG1wNCwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgU1RSICAgICByZXMsIFttYl0sICMtNDQKLQotICAgIEJDUyAgICAgbG9vcF94Ci0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzI1Mjw8MTYgICAgICA7Ly8gKHBhcnRIZWlnaHQtMSkgLT0gNDsKLSAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwMDBGRiAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBBREQgICAgIHRtcDIsIHRtcDEsICMxICAgICAgICAgICAgICA7Ly8gcGFydFdpZHRoCi0gICAgU1VCICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICAgICAgOy8vIHJlZiAtPSBwYXJ0V2lkdGgKLSAgICBBREQgICAgIG1iLCBtYiwgIzY0OwotICAgIFNVQiAgICAgbWIsIG1iLCB0bXAyOyAgICAgICAgICAgICAgIDsvLyBtYiAtPSBwYXJ0V2lkdGgKLSAgICBCR0UgICAgIGxvb3BfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHgxZjQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2NmM4NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlciBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlciByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJ1ZmYgICAgUk4gMQotCi1jb3VudCAgIFJOIDIKLXgwICAgICAgUk4gMgotCi1yZXMgICAgIFJOIDMKLXkwICAgICAgUk4gMwotCi10bXAxICAgIFJOIDQKLQotdG1wMiAgICBSTiA1Ci1oZWlnaHQgIFJOIDUKLQotdG1wMyAgICBSTiA2Ci1wYXJ0VyAgIFJOIDYKLQotdG1wNCAgICBSTiA3Ci1wYXJ0SCAgIFJOIDcKLQotdG1wNSAgICBSTiA4Ci10bXA2ICAgIFJOIDkKLQotdG1wYSAgICBSTiAxMAotdG1wYiAgICBSTiAxMQotd2lkdGggICBSTiAxMgotCi1wbHVzMTYgIFJOIDE0Ci0KLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyCi0KLTsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi07Ly8KLTsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKLTsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKLTsvLyBpbiBlYWNoIHJvdW5kLgotOy8vCi07Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Ci07Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Ci07Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Ci07Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Ci07Ly8gICAgICAgICAgIC4uCi07Ly8gICAgICAgICAgIC4uCi07Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCi07Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCi07Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCi07Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCi0KLWgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweDFlNAotCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHRtcDUsIHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKLSAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBDTVAgICAgIHRtcDYsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAotCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAotICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1Ci0gICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAotICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAotICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCi0gICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KLQotCi1za2lwX2ZpbGwKLSAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCi0KLSAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjOCAgICA7Ly8gfHh4fHh4fHBhcnRIfHBhcnRXfAotICAgIExEUiAgICAgdG1wNSwgPSAweDAwMDEwMTAwCi0gICAgUlNCICAgICBjb3VudCwgdG1wNSwgY291bnQsIExTTCAjOCAgICAgIDsvLyB8eHh8cGFydEgtMXxwYXJ0Vy0xfHh4fAotICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHgyMjhdICAgICAgOy8vIHZlck9mZnNldAotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyICAgICAgOy8vIHx4eHxwYXJ0SC0xfHBhcnRXLTF8dmVyT2Zmc2V0fAotICAgIExEUiAgICAgcGx1czE2LCA9IDB4MDAxMDAwMTAKLQotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMDBGRjAwIDsvLyBwYXJ0V2lkdGgKLQotCi1sb29wX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMxNiAgOy8vIHBhcnRXaWR0aC0xIHRvIHRvcCBieXRlCi0KLWxvb3BfeAotICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGE0fGEzfGEyfGExfAotICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGM0fGMzfGMyfGMxfAotICAgIExEUiAgICAgdG1wMywgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGc0fGczfGcyfGcxfAotICAgIExEUiAgICAgdG1wNCwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfG00fG0zfG0yfG0xfAotICAgIExEUiAgICAgdG1wNSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHI0fHIzfHIyfHIxfAotICAgIExEUiAgICAgdG1wNiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIGZpcnN0IGZvdXIgcGl4ZWxzIAotICAgIFVYVEIxNiAgdG1wYSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDIgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDIsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBNT1ZTICAgIHRtcDEsIGNvdW50LCBMU0wgIzMxICAgICAgICA7Ly8gdXBkYXRlIGZsYWdzICh2ZXJPZmZzZXQpCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLSAgICBNVk5FUSAgIHRtcDEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCi0gICAgTVZOTkUgICB0bXAxLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZlZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0KLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDEgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQotCi0KLSAgICA7Ly8gdG1wMiA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wMyA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNCA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wNSA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wNiA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMSA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBzZWNvbmQgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZORVEgICB0bXAyLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAotICAgIE1WTk5FICAgdG1wMiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAyICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93Ci0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdwotCi0gICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLSAgICBNVk5FUSAgIHRtcDMsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCi0gICAgTVZOTkUgICB0bXAzLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQotCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDMgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgTERSICAgICB0bXAzLCBbcmVmXSAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93Ci0KLSAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCi0gICAgTVZORVEgICB0bXA1LCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAotICAgIE1WTk5FICAgdG1wNSwgdG1wMSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKLQotICAgIEFORCAgICAgdG1wYSwgdG1wNCwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXA1ICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotCi0gICAgOy8vIGRlY3JlbWVudCBsb29wX3ggY291bnRlcgotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjQgICAgICAgIDsvLyAocGFydFdpZHRoLTEpIC09IDQ7Ci0KLSAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKLSAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7Ci0gICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKLQotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIy00NAotIAotICAgIEJDUyAgICAgbG9vcF94Ci0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzI1Mjw8MTYgICAgICA7Ly8gKHBhcnRIZWlnaHQtMSkgLT0gNDsKLSAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwRkYwMCAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBNT1YgICAgIHRtcDIsICMxCi0gICAgQUREICAgICB0bXAyLCB0bXAyLCB0bXAxLCBMU1IgIzggICAgOy8vIHBhcnRXaWR0aAotICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCi0gICAgQUREICAgICBtYiwgbWIsICM2NDsKLSAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCi0gICAgQkdFICAgICBsb29wX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4MWY0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL3dpbl9hc20uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjhkODhjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL3dpbl9hc20uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotZWNobyBvZmYKLXNldCBBU01GTEFHUz0gLWNoZWNrcmVnbGlzdCAtQ1BVIEFSTTExMzYgLVByZURlZmluZSAiSDI2NERFQ19XSU5BU00gU0VUTCB7VFJVRX0iCi1zZXQgQVNNPSJEOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDhcVkNcY2VcYmluXHg4Nl9hcm1cYXJtYXNtIgotZWNobyBvbgotCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvci5zCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucwotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2hvcl9xdWFydGVyLnMKLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucwotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMKLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfcXVhcnRlci5zCi0KLXJlbSAlQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucwotcmVtICVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDbGVhck1iTGF5ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDbGVhck1iTGF5ZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxMTY1NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi07Ci07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOwotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0gICAgRVhQT1JUIGgyNjRic2RDbGVhck1iTGF5ZXIKLQotOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKLXBNYkxheWVyICAgIFJOICAwCi1zaXplICAgICAgICBSTiAgMQotcFRtcCAgICAgICAgUk4gIDIKLXN0ZXAgICAgICAgIFJOICAzCi0KLTsgLS0gTkVPTiByZWdpc3RlcnMgLS0KLQotcVplcm8gICBRTiAgUTAuVTgKLQotOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07ICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2xlYXJNYkxheWVyCi07Ci07ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotOwotOyAgICAgICAgSW5wdXRzOgotOwotOyAgICAgICAgT3V0cHV0czoKLTsKLTsgICAgICAgIFJldHVybnM6Ci07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaDI2NGJzZENsZWFyTWJMYXllcgotCi0gICAgVk1PViAgICBxWmVybywgIzAKLSAgICBBREQgICAgIHBUbXAsIHBNYkxheWVyLCAjMTYKLSAgICBNT1YgICAgIHN0ZXAsICMzMgotICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0Ci0KLWxvb3AKLSAgICBWU1QxICAgIHFaZXJvLCBbcE1iTGF5ZXJdLCBzdGVwCi0gICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKLSAgICBWU1QxICAgIHFaZXJvLCBbcFRtcF0sIHN0ZXAKLSAgICBWU1QxICAgIHFaZXJvLCBbcE1iTGF5ZXJdLCBzdGVwCi0gICAgVlNUMSAgICBxWmVybywgW3BUbXBdLCBzdGVwCi0gICAgQkNTICAgICBsb29wCi0KLSAgICBCWCAgICAgIGxyCi0gICAgRU5ECi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiZDczZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTsKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ci0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLSAgICBFWFBPUlQgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCi0KLTsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCi12YWx1ZSAgICBSTiAgMAotCi07IC0tIE5FT04gcmVnaXN0ZXJzIC0tCi0KLTsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyAgICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCi07Ci07ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotOwotOyAgICAgICAgSW5wdXRzOgotOwotOyAgICAgICAgT3V0cHV0czoKLTsKLTsgICAgICAgIFJldHVybnM6Ci07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCi0KLSAgICBDTFogICAgIHZhbHVlLCB2YWx1ZQotICAgIEJYICAgICAgbHIKLSAgICBFTkQKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGaWxsUm93Ny5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmZhYzkyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGaWxsUm93Ny5zCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTsKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ci0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLSAgICBFWFBPUlQgaDI2NGJzZEZpbGxSb3c3Ci0KLTsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCi0KLXJlZiAgICAgUk4gMAotZmlsbCAgICBSTiAxCi1sZWZ0ICAgIFJOIDIKLXRtcDIgICAgUk4gMgotY2VudGVyICBSTiAzCi1yaWdodCAgIFJOIDQKLXRtcDEgICAgUk4gNQotCi07IC0tIE5FT04gcmVnaXN0ZXJzIC0tCi0KLXFUbXAwICAgUU4gIFEwLlU4Ci1xVG1wMSAgIFFOICBRMS5VOAotZFRtcDAgICBETiAgRDAuVTgKLWRUbXAxICAgRE4gIEQxLlU4Ci1kVG1wMiAgIEROICBEMi5VOAotZFRtcDMgICBETiAgRDMuVTgKLQotCi07LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgICAgRnVuY3Rpb246IGgyNjRic2RGaWxsUm93NwotOwotOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLTsKLTsgICAgICAgIElucHV0czoKLTsKLTsgICAgICAgIE91dHB1dHM6Ci07Ci07ICAgICAgICBSZXR1cm5zOgotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWgyNjRic2RGaWxsUm93NwotICAgICAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgICAgIENNUCAgICAgIGxlZnQsICMwCi0gICAgICAgIExEUiAgICAgIHJpZ2h0LCBbc3AsIzB4MTBdCi0gICAgICAgIEJFUSAgICAgIHN3aXRjaF9jZW50ZXIKLSAgICAgICAgTERSQiAgICAgdG1wMSwgW3JlZiwjMF0KLQotbG9vcF9sZWZ0Ci0gICAgICAgIFNVQlMgICAgIGxlZnQsIGxlZnQsICMxCi0gICAgICAgIFNUUkIgICAgIHRtcDEsIFtmaWxsXSwgIzEKLSAgICAgICAgQk5FICAgICAgbG9vcF9sZWZ0Ci0KLXN3aXRjaF9jZW50ZXIKLSAgICAgICAgQVNSICAgICAgdG1wMixjZW50ZXIsIzIKLSAgICAgICAgQ01QICAgICAgdG1wMiwjOQotICAgICAgICBBRERDQyAgICBwYyxwYyx0bXAyLExTTCAjMgotICAgICAgICBCICAgICAgICBsb29wX2NlbnRlcgotICAgICAgICBCICAgICAgICBsb29wX2NlbnRlcgotICAgICAgICBCICAgICAgICBjYXNlXzEKLSAgICAgICAgQiAgICAgICAgY2FzZV8yCi0gICAgICAgIEIgICAgICAgIGNhc2VfMwotICAgICAgICBCICAgICAgICBjYXNlXzQKLSAgICAgICAgQiAgICAgICAgY2FzZV81Ci0gICAgICAgIEIgICAgICAgIGNhc2VfNgotICAgICAgICBCICAgICAgICBjYXNlXzcKLSAgICAgICAgQiAgICAgICAgY2FzZV84Ci07Y2FzZV84Ci07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotO2Nhc2VfNwotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLTtjYXNlXzYKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sIzQKLTtjYXNlXzUKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sIzQKLTtjYXNlXzQKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLTtjYXNlXzMKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLTtjYXNlXzIKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLTtjYXNlXzEKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLQotY2FzZV84Ci0gICAgICAgIFZMRDEgICAge3FUbXAwLCBxVG1wMX0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMzIKLSAgICAgICAgVlNUMSAgICBxVG1wMCwgW2ZpbGxdIQotICAgICAgICBWU1QxICAgIHFUbXAxLCBbZmlsbF0hCi0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNwotICAgICAgICBWTEQxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjgKLSAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKLSAgICAgICAgVlNUMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNgotICAgICAgICBWTEQxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjQKLSAgICAgICAgVlNUMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbZmlsbF0hCi0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNQotICAgICAgICBWTEQxICAgIHFUbXAwLCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzIwCi0gICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0Ci0gICAgICAgIFZTVDEgICAgcVRtcDAsIFtmaWxsXSEKLSAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV80Ci0gICAgICAgIFZMRDEgICAgcVRtcDAsIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTYKLSAgICAgICAgVlNUMSAgICBxVG1wMCwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzMKLSAgICAgICAgVkxEMSAgICBkVG1wMCwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxMgotICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAotICAgICAgICBWU1QxICAgIGRUbXAwLCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfMgotICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLSAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotY2FzZV8xCi0gICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0Ci0gICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci0KLWxvb3BfY2VudGVyCi0gICAgICAgIENNUCAgICAgIGNlbnRlciwgIzAKLSAgICAgICAgTERSQk5FICAgdG1wMiwgW3JlZl0sICMxCi0gICAgICAgIFNVQk5FICAgIGNlbnRlciwgY2VudGVyLCAjMQotICAgICAgICBTVFJCTkUgICB0bXAyLCBbZmlsbF0sICMxCi0gICAgICAgIEJORSAgICAgIGxvb3BfY2VudGVyCi0gICAgICAgIENNUCAgICAgIHJpZ2h0LCMwCi0gICAgICAgIFBPUEVRICAgIHtyNC1yNixwY30KLSAgICAgICAgTERSQiAgICAgdG1wMiwgW3JlZiwjLTFdCi0KLWxvb3BfcmlnaHQKLSAgICAgICAgU1RSQiAgICAgdG1wMiwgW2ZpbGxdLCAjMQotICAgICAgICBTVUJTICAgICByaWdodCwgcmlnaHQsICMxCi0gICAgICAgIEJORSAgICAgIGxvb3BfcmlnaHQKLQotICAgICAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmx1c2hCaXRzLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmx1c2hCaXRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzM1YjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotOwotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsKLQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotICAgIEVYUE9SVCBoMjY0YnNkRmx1c2hCaXRzCi0KLTsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCi1wU3RybURhdGEgICAgICAgUk4gIDAKLW51bUJpdHMgICAgICAgICBSTiAgMQotcmVhZEJpdHMgICAgICAgIFJOICAyCi1zdHJtQnVmZlNpemUgICAgUk4gIDMKLXBTdHJtQnVmZlN0YXJ0ICBSTiAgMQotcFN0cm1DdXJyUG9zICAgIFJOICAyCi1iaXRQb3NJbldvcmQgICAgUk4gIDEKLQotOyAtLSBORU9OIHJlZ2lzdGVycyAtLQotCi0KLQotOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07ICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCaXRzCi07Ci07ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotOwotOyAgICAgICAgSW5wdXRzOgotOwotOyAgICAgICAgT3V0cHV0czoKLTsKLTsgICAgICAgIFJldHVybnM6Ci07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaDI2NGJzZEZsdXNoQml0cwotOy8vICAgIFBVU0ggICAgIHtyNC1yNixscn0KLQotICAgIExEUiByZWFkQml0cywgW3BTdHJtRGF0YSwgIzB4MTBdCi0gICAgTERSIHN0cm1CdWZmU2l6ZSwgW3BTdHJtRGF0YSwgIzB4Q10KLQotICAgIEFERCByZWFkQml0cywgcmVhZEJpdHMsIG51bUJpdHMKLSAgICBBTkQgYml0UG9zSW5Xb3JkLCByZWFkQml0cywgIzcKLQotICAgIFNUUiByZWFkQml0cywgW3BTdHJtRGF0YSwgIzB4MTBdCi0gICAgU1RSIGJpdFBvc0luV29yZCwgW3BTdHJtRGF0YSwgIzB4OF0KLQotICAgIExEUiBwU3RybUJ1ZmZTdGFydCwgW3BTdHJtRGF0YSwgIzB4MF0KLQotICAgIENNUCByZWFkQml0cywgc3RybUJ1ZmZTaXplLCBMU0wgIzMKLQotICAgIEJISSBlbmRfb2Zfc3RyZWFtCi0KLSAgICBBREQgcFN0cm1DdXJyUG9zLCBwU3RybUJ1ZmZTdGFydCwgcmVhZEJpdHMsIExTUiAjMwotICAgIFNUUiBwU3RybUN1cnJQb3MsIFtwU3RybURhdGEsICMweDRdCi0gICAgTU9WIHIwLCAjMAotICAgIEJYICBscgotOy8vICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotZW5kX29mX3N0cmVhbQotICAgIE1WTiByMCwgIzAKLSAgICBCWCAgbHIKLTsvLyAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICBFTkQKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTA3ODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLTsKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ci0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLSAgICBFWFBPUlQgaDI2NGJzZFdyaXRlTWFjcm9ibG9jawotCi07IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycwotaW1hZ2UgICBSTiAgMAotZGF0YSAgICBSTiAgMQotd2lkdGggICBSTiAgMgotbHVtYSAgICBSTiAgMwotY2IgICAgICBSTiAgNAotY3IgICAgICBSTiAgNQotY3dpZHRoICBSTiAgNgotCi07IC0tIE5FT04gcmVnaXN0ZXJzIC0tCi0KLXFSb3cwICAgUU4gIFEwLlU4Ci1xUm93MSAgIFFOICBRMS5VOAotcVJvdzIgICBRTiAgUTIuVTgKLXFSb3czICAgUU4gIFEzLlU4Ci1xUm93NCAgIFFOICBRNC5VOAotcVJvdzUgICBRTiAgUTUuVTgKLXFSb3c2ICAgUU4gIFE2LlU4Ci1xUm93NyAgIFFOICBRNy5VOAotcVJvdzggICBRTiAgUTguVTgKLXFSb3c5ICAgUU4gIFE5LlU4Ci1xUm93MTAgIFFOICBRMTAuVTgKLXFSb3cxMSAgUU4gIFExMS5VOAotcVJvdzEyICBRTiAgUTEyLlU4Ci1xUm93MTMgIFFOICBRMTMuVTgKLXFSb3cxNCAgUU4gIFExNC5VOAotcVJvdzE1ICBRTiAgUTE1LlU4Ci0KLWRSb3cwICAgRE4gIEQwLlU4Ci1kUm93MSAgIEROICBEMS5VOAotZFJvdzIgICBETiAgRDIuVTgKLWRSb3czICAgRE4gIEQzLlU4Ci1kUm93NCAgIEROICBENC5VOAotZFJvdzUgICBETiAgRDUuVTgKLWRSb3c2ICAgRE4gIEQ2LlU4Ci1kUm93NyAgIEROICBENy5VOAotZFJvdzggICBETiAgRDguVTgKLWRSb3c5ICAgRE4gIEQ5LlU4Ci1kUm93MTAgIEROICBEMTAuVTgKLWRSb3cxMSAgRE4gIEQxMS5VOAotZFJvdzEyICBETiAgRDEyLlU4Ci1kUm93MTMgIEROICBEMTMuVTgKLWRSb3cxNCAgRE4gIEQxNC5VOAotZFJvdzE1ICBETiAgRDE1LlU4Ci0KLTsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jawotOwotOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLTsgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKLTsgICAgICAgICAgICBjb21wb25lbnRzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lLgotOwotOyAgICAgICAgSW5wdXRzOgotOyAgICAgICAgICAgIGRhdGEgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgdG8gYmUgd3JpdHRlbiwgMjU2IHZhbHVlcyBmb3IKLTsgICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCi07Ci07ICAgICAgICBPdXRwdXRzOgotOyAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCi07Ci07ICAgICAgICBSZXR1cm5zOgotOyAgICAgICAgICAgIG5vbmUKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCi0gICAgUFVTSCAgICB7cjQtcjYsbHJ9Ci0gICAgVlBVU0ggICB7cTQtcTd9Ci0KLSAgICBMRFIgICAgIHdpZHRoLCBbaW1hZ2UsICM0XQotICAgIExEUiAgICAgbHVtYSwgW2ltYWdlLCAjMHhDXQotICAgIExEUiAgICAgY2IsIFtpbWFnZSwgIzB4MTBdCi0gICAgTERSICAgICBjciwgW2ltYWdlLCAjMHgxNF0KLQotCi07ICAgV3JpdGUgbHVtYQotICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEKLSAgICBMU0wgICAgIHdpZHRoLCB3aWR0aCwgIzQKLSAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hCi0gICAgTFNSICAgICBjd2lkdGgsIHdpZHRoLCAjMQotICAgIFZTVDEgICAge3FSb3cwfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hCi0gICAgVlNUMSAgICB7cVJvdzF9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEKLSAgICBWU1QxICAgIHtxUm93Mn0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzgsIHFSb3c5fSwgW2RhdGFdIQotICAgIFZTVDEgICAge3FSb3czfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93MTAsIHFSb3cxMX0sIFtkYXRhXSEKLSAgICBWU1QxICAgIHtxUm93NH0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzEyLCBxUm93MTN9LCBbZGF0YV0hCi0gICAgVlNUMSAgICB7cVJvdzV9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3cxNCwgcVJvdzE1fSwgW2RhdGFdIQotICAgIFZTVDEgICAge3FSb3c2fSwgW2x1bWFAMTI4XSwgd2lkdGgKLQotICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEgO2NiIHJvd3MgMCwxLDIsMwotICAgIFZTVDEgICAge3FSb3c3fSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hIDtjYiByb3dzIDQsNSw2LDcKLSAgICBWU1QxICAgIHtxUm93OH0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdISA7Y3Igcm93cyAwLDEsMiwzCi0gICAgVlNUMSAgICB7cVJvdzl9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEgO2NyIHJvd3MgNCw1LDYsNwotICAgIFZTVDEgICAge3FSb3cxMH0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzB9LCBbY2JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93OH0sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge3FSb3cxMX0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzF9LCBbY2JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93OX0sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge3FSb3cxMn0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzJ9LCBbY2JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93MTB9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtxUm93MTN9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZTVDEgICAge2RSb3czfSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzExfSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7cVJvdzE0fSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWU1QxICAgIHtkUm93NH0sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3cxMn0sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge3FSb3cxNX0sIFtsdW1hXQotICAgIFZTVDEgICAge2RSb3c1fSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzEzfSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzZ9LCBbY2JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93MTR9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93N30sIFtjYkA2NF0KLSAgICBWU1QxICAgIHtkUm93MTV9LCBbY3JANjRdCi0KLSAgICBWUE9QICAgIHtxNC1xN30KLSAgICBQT1AgICAgIHtyNC1yNixwY30KLSAgICBFTkQKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvYXNtX2NvbW1vbi5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5YTc1Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvYXNtX2NvbW1vbi5TCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotQAotQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotQAotQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAKLUAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAKLUAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAKLQotCi0KLQotICAgIC5tYWNybyBSRVFVSVJFOAotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lbmRtCi0KLSAgICAubWFjcm8gUFJFU0VSVkU4Ci0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0gICAgLmVuZG0KLQotCi0gICAgLm1hY3JvIGZ1bmN0aW9uIG5hbWUsIGV4cG9ydD0wCi0uaWYgXGV4cG9ydAotICAgIC5nbG9iYWwgXG5hbWUKLS5lbmRpZgotICAgIC50eXBlICAgXG5hbWUsICVmdW5jdGlvbgotXG5hbWU6Ci0gICAgLmVuZG0KLQotICAgIC5tYWNybyBlbmRmdW5jdGlvbgotICAgIC5lbmRtCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI3NTJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotCi0jaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgotCi0gICAgUFJFU0VSVkU4Ci0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0vKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgcE1iTGF5ZXIgICAgcjAKLSNkZWZpbmUgc2l6ZSAgICAgICAgcjEKLSNkZWZpbmUgcFRtcCAgICAgICAgcjIKLSNkZWZpbmUgc3RlcCAgICAgICAgcjMKLQotLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KLQotI2RlZmluZSBxWmVybyAgIFEwCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENsZWFyTWJMYXllcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0KLSAgICAgICAgSW5wdXRzOgotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZnVuY3Rpb24gaDI2NGJzZENsZWFyTWJMYXllciwgZXhwb3J0PTEKLQotICAgIFZNT1YuSTggcVplcm8sICMwCi0gICAgQUREICAgICBwVG1wLCBwTWJMYXllciwgIzE2Ci0gICAgTU9WICAgICBzdGVwLCAjMzIKLSAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAotCi1sb29wOgotICAgIFZTVDEuOCAge3FaZXJvfSwgW3BNYkxheWVyXSwgc3RlcAotICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0Ci0gICAgVlNUMS44ICB7cVplcm99LCBbcFRtcF0sIHN0ZXAKLSAgICBWU1QxLjggIHtxWmVyb30sIFtwTWJMYXllcl0sIHN0ZXAKLSAgICBWU1QxLjggIHtxWmVyb30sIFtwVG1wXSwgc3RlcAotICAgIEJDUyAgICAgbG9vcAotCi0gICAgQlggICAgICBscgotCi1lbmRmdW5jdGlvbgotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWM5ZjYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLUAKLUAgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUAKLUAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1ACi1AICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1ACi1AIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1ACi0jaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgotCi0gICAgUFJFU0VSVkU4Ci0gICAgLmFybQotICAgIC50ZXh0Ci0KLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIHZhbHVlICAgIHIwCi0KLS8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLQotICAgICAgICBJbnB1dHM6Ci0KLSAgICAgICAgT3V0cHV0czoKLQotICAgICAgICBSZXR1cm5zOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1mdW5jdGlvbiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MsIGV4cG9ydD0xCi0KLSAgICBDTFogICAgIHZhbHVlLCB2YWx1ZQotICAgIEJYICAgICAgbHIKLQotZW5kZnVuY3Rpb24KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQ2MjI3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmlsbFJvdzcuUworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotCi0jaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgotCi0gICAgUFJFU0VSVkU4Ci0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0vKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KLQotI2RlZmluZSByZWYgICAgIHIwCi0jZGVmaW5lIGZpbGwgICAgcjEKLSNkZWZpbmUgbGVmdCAgICByMgotI2RlZmluZSB0bXAyICAgIHIyCi0jZGVmaW5lIGNlbnRlciAgcjMKLSNkZWZpbmUgcmlnaHQgICByNAotI2RlZmluZSB0bXAxICAgIHI1Ci0KLS8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCi0KLSNkZWZpbmUgcVRtcDAgICAgIFEwCi0jZGVmaW5lIHFUbXAxICAgICBRMQotI2RlZmluZSBkVG1wMCAgICAgRDAKLSNkZWZpbmUgZFRtcDEgICAgIEQxCi0jZGVmaW5lIGRUbXAyICAgICBEMgotI2RlZmluZSBkVG1wMyAgICAgRDMKLQotLyoKLXZvaWQgaDI2NGJzZEZpbGxSb3c3KGNvbnN0IHU4ICogcmVmLCB1OCAqIGZpbGwsIGkzMiBsZWZ0LCBpMzIgY2VudGVyLAotICAgICAgICAgICAgICAgICAgICAgaTMyIHJpZ2h0KTsKLSovCi0KLWZ1bmN0aW9uIGgyNjRic2RGaWxsUm93NywgZXhwb3J0PTEKLQotICAgICAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgICAgIENNUCAgICAgIGxlZnQsICMwCi0gICAgICAgIExEUiAgICAgIHJpZ2h0LCBbc3AsIzB4MTBdCi0gICAgICAgIEJFUSAgICAgIHN3aXRjaF9jZW50ZXIKLSAgICAgICAgTERSQiAgICAgdG1wMSwgW3JlZiwjMF0KLQotbG9vcF9sZWZ0OgotICAgICAgICBTVUJTICAgICBsZWZ0LCBsZWZ0LCAjMQotICAgICAgICBTVFJCICAgICB0bXAxLCBbZmlsbF0sICMxCi0gICAgICAgIEJORSAgICAgIGxvb3BfbGVmdAotCi1zd2l0Y2hfY2VudGVyOgotICAgICAgICBBU1IgICAgICB0bXAyLGNlbnRlciwjMgotICAgICAgICBDTVAgICAgICB0bXAyLCM5Ci0gICAgICAgIEFERENDICAgIHBjLHBjLHRtcDIsTFNMICMyCi0gICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCi0gICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCi0gICAgICAgIEIgICAgICAgIGNhc2VfMQotICAgICAgICBCICAgICAgICBjYXNlXzIKLSAgICAgICAgQiAgICAgICAgY2FzZV8zCi0gICAgICAgIEIgICAgICAgIGNhc2VfNAotICAgICAgICBCICAgICAgICBjYXNlXzUKLSAgICAgICAgQiAgICAgICAgY2FzZV82Ci0gICAgICAgIEIgICAgICAgIGNhc2VfNwotICAgICAgICBCICAgICAgICBjYXNlXzgKLQotY2FzZV84OgotICAgICAgICBWTEQxLjggIHtxVG1wMCwgcVRtcDF9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzMyCi0gICAgICAgIFZTVDEuOCAge3FUbXAwfSwgW2ZpbGxdIQotICAgICAgICBWU1QxLjggIHtxVG1wMX0sIFtmaWxsXSEKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV83OgotICAgICAgICBWTEQxLjggIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjgKLSAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKLSAgICAgICAgVlNUMS44ICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNjoKLSAgICAgICAgVkxEMS44ICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI0Ci0gICAgICAgIFZTVDEuOCAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzU6Ci0gICAgICAgIFZMRDEuOCAge3FUbXAwfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyMAotICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAotICAgICAgICBWU1QxLjggIHtxVG1wMH0sIFtmaWxsXSEKLSAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV80OgotICAgICAgICBWTEQxLjggIHtxVG1wMH0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTYKLSAgICAgICAgVlNUMS44ICB7cVRtcDB9LCBbZmlsbF0hCi0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfMzoKLSAgICAgICAgVkxEMS44ICB7ZFRtcDB9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzEyCi0gICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0Ci0gICAgICAgIFZTVDEuOCAgZFRtcDAsIFtmaWxsXSEKLSAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV8yOgotICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLSAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotY2FzZV8xOgotICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLSAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotCi1sb29wX2NlbnRlcjoKLSAgICAgICAgQ01QICAgICAgY2VudGVyLCAjMAotICAgICAgICBCRVEgICAgICBqdW1wCi0gICAgICAgIExEUkIgICAgIHRtcDIsIFtyZWZdLCAjMQotICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzEKLSAgICAgICAgU1RSQiAgICAgdG1wMiwgW2ZpbGxdLCAjMQotICAgICAgICBCTkUgICAgICBsb29wX2NlbnRlcgotanVtcDoKLSAgICAgICAgQ01QICAgICAgcmlnaHQsIzAKLSAgICAgICAgUE9QRVEgICAge3I0LXI2LHBjfQotICAgICAgICBMRFJCICAgICB0bXAyLCBbcmVmLCMtMV0KLQotbG9vcF9yaWdodDoKLSAgICAgICAgU1RSQiAgICAgdG1wMiwgW2ZpbGxdLCAjMQotICAgICAgICBTVUJTICAgICByaWdodCwgcmlnaHQsICMxCi0gICAgICAgIEJORSAgICAgIGxvb3BfcmlnaHQKLQotICAgICAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLWVuZGZ1bmN0aW9uCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmx1c2hCaXRzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODg0NzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLUAKLUAgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUAKLUAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1ACi1AICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1ACi1AIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1ACi0KLSNpbmNsdWRlICJhc21fY29tbW9uLlMiCi0KLSAgICBQUkVTRVJWRTgKLQotICAgIC5hcm0KLSAgICAudGV4dAotCi0vKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgcFN0cm1EYXRhICAgICAgIHIwCi0jZGVmaW5lIG51bUJpdHMgICAgICAgICByMQotI2RlZmluZSByZWFkQml0cyAgICAgICAgcjIKLSNkZWZpbmUgc3RybUJ1ZmZTaXplICAgIHIzCi0jZGVmaW5lIHBTdHJtQnVmZlN0YXJ0ICByMQotI2RlZmluZSBwU3RybUN1cnJQb3MgICAgcjIKLSNkZWZpbmUgYml0UG9zSW5Xb3JkICAgIHIxCi0KLS8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLwotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCaXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLQotICAgICAgICBJbnB1dHM6Ci0KLSAgICAgICAgT3V0cHV0czoKLQotICAgICAgICBSZXR1cm5zOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZnVuY3Rpb24gaDI2NGJzZEZsdXNoQml0cywgZXhwb3J0PTEKLQotICAgIExEUiByZWFkQml0cywgW3BTdHJtRGF0YSwgIzB4MTBdCi0gICAgTERSIHN0cm1CdWZmU2l6ZSwgW3BTdHJtRGF0YSwgIzB4Q10KLQotICAgIEFERCByZWFkQml0cywgcmVhZEJpdHMsIG51bUJpdHMKLSAgICBBTkQgYml0UG9zSW5Xb3JkLCByZWFkQml0cywgIzcKLQotICAgIFNUUiByZWFkQml0cywgW3BTdHJtRGF0YSwgIzB4MTBdCi0gICAgU1RSIGJpdFBvc0luV29yZCwgW3BTdHJtRGF0YSwgIzB4OF0KLQotICAgIExEUiBwU3RybUJ1ZmZTdGFydCwgW3BTdHJtRGF0YSwgIzB4MF0KLQotICAgIENNUCByZWFkQml0cywgc3RybUJ1ZmZTaXplLCBMU0wgIzMKLQotICAgIEJISSBlbmRfb2Zfc3RyZWFtCi0KLSAgICBBREQgcFN0cm1DdXJyUG9zLCBwU3RybUJ1ZmZTdGFydCwgcmVhZEJpdHMsIExTUiAjMwotICAgIFNUUiBwU3RybUN1cnJQb3MsIFtwU3RybURhdGEsICMweDRdCi0gICAgTU9WIHIwLCAjMAotICAgIEJYICBscgotCi1lbmRfb2Zfc3RyZWFtOgotICAgIE1WTiByMCwgIzAKLSAgICBCWCAgbHIKLQotZW5kZnVuY3Rpb24KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5M2I5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5TCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLUAKLUAgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUAKLUAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1ACi1AICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1ACi1AIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1ACi0KLSNpbmNsdWRlICJhc21fY29tbW9uLlMiCi0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLS8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBpbWFnZSAgIHIwCi0jZGVmaW5lIGRhdGEgICAgcjEKLSNkZWZpbmUgd2lkdGggICByMgotI2RlZmluZSBsdW1hICAgIHIzCi0jZGVmaW5lIGNiICAgICAgcjQKLSNkZWZpbmUgY3IgICAgICByNQotI2RlZmluZSBjd2lkdGggIHI2Ci0KLS8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCi0KLSNkZWZpbmUgcVJvdzAgICAgIFEwCi0jZGVmaW5lIHFSb3cxICAgICBRMQotI2RlZmluZSBxUm93MiAgICAgUTIKLSNkZWZpbmUgcVJvdzMgICAgIFEzCi0jZGVmaW5lIHFSb3c0ICAgICBRNAotI2RlZmluZSBxUm93NSAgICAgUTUKLSNkZWZpbmUgcVJvdzYgICAgIFE2Ci0jZGVmaW5lIHFSb3c3ICAgICBRNwotI2RlZmluZSBxUm93OCAgICAgUTgKLSNkZWZpbmUgcVJvdzkgICAgIFE5Ci0jZGVmaW5lIHFSb3cxMCAgICBRMTAKLSNkZWZpbmUgcVJvdzExICAgIFExMQotI2RlZmluZSBxUm93MTIgICAgUTEyCi0jZGVmaW5lIHFSb3cxMyAgICBRMTMKLSNkZWZpbmUgcVJvdzE0ICAgIFExNAotI2RlZmluZSBxUm93MTUgICAgUTE1Ci0KLSNkZWZpbmUgZFJvdzAgICAgIEQwCi0jZGVmaW5lIGRSb3cxICAgICBEMQotI2RlZmluZSBkUm93MiAgICAgRDIKLSNkZWZpbmUgZFJvdzMgICAgIEQzCi0jZGVmaW5lIGRSb3c0ICAgICBENAotI2RlZmluZSBkUm93NSAgICAgRDUKLSNkZWZpbmUgZFJvdzYgICAgIEQ2Ci0jZGVmaW5lIGRSb3c3ICAgICBENwotI2RlZmluZSBkUm93OCAgICAgRDgKLSNkZWZpbmUgZFJvdzkgICAgIEQ5Ci0jZGVmaW5lIGRSb3cxMCAgICBEMTAKLSNkZWZpbmUgZFJvdzExICAgIEQxMQotI2RlZmluZSBkUm93MTIgICAgRDEyCi0jZGVmaW5lIGRSb3cxMyAgICBEMTMKLSNkZWZpbmUgZFJvdzE0ICAgIEQxNAotI2RlZmluZSBkUm93MTUgICAgRDE1Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jawotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKLSAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgotICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWZ1bmN0aW9uIGgyNjRic2RXcml0ZU1hY3JvYmxvY2ssIGV4cG9ydD0xCi0gICAgUFVTSCAgICB7cjQtcjYsbHJ9Ci0gICAgVlBVU0ggICB7cTQtcTd9Ci0KLSAgICBMRFIgICAgIHdpZHRoLCBbaW1hZ2UsICM0XQotICAgIExEUiAgICAgbHVtYSwgW2ltYWdlLCAjMHhDXQotICAgIExEUiAgICAgY2IsIFtpbWFnZSwgIzB4MTBdCi0gICAgTERSICAgICBjciwgW2ltYWdlLCAjMHgxNF0KLQotCi1AICAgV3JpdGUgbHVtYQotICAgIFZMRDEuOCAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEKLSAgICBMU0wgICAgIHdpZHRoLCB3aWR0aCwgIzQKLSAgICBWTEQxLjggIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hCi0gICAgTFNSICAgICBjd2lkdGgsIHdpZHRoLCAjMQotICAgIFZTVDEuOCAge3FSb3cwfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdIQotICAgIFZTVDEuOCAge3FSb3cxfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdIQotICAgIFZTVDEuOCAge3FSb3cyfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzgsIHFSb3c5fSwgW2RhdGFdIQotICAgIFZTVDEuOCAge3FSb3czfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzEwLCBxUm93MTF9LCBbZGF0YV0hCi0gICAgVlNUMS44ICB7cVJvdzR9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93MTIsIHFSb3cxM30sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93NX0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3cxNCwgcVJvdzE1fSwgW2RhdGFdIQotICAgIFZTVDEuOCAge3FSb3c2fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0KLSAgICBWTEQxLjggIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hIDsvL2NiIHJvd3MgMCwxLDIsMwotICAgIFZTVDEuOCAge3FSb3c3fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdISA7Ly9jYiByb3dzIDQsNSw2LDcKLSAgICBWU1QxLjggIHtxUm93OH0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEgOy8vY3Igcm93cyAwLDEsMiwzCi0gICAgVlNUMS44ICB7cVJvdzl9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hIDsvL2NyIHJvd3MgNCw1LDYsNwotICAgIFZTVDEuOCAge3FSb3cxMH0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZTVDEuOCAge2RSb3cwfSwgW2NiLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3c4fSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge3FSb3cxMX0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZTVDEuOCAge2RSb3cxfSwgW2NiLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3c5fSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge3FSb3cxMn0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZTVDEuOCAge2RSb3cyfSwgW2NiLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3cxMH0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtxUm93MTN9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWU1QxLjggIHtkUm93M30sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MTF9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7cVJvdzE0fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzR9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzEyfSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge3FSb3cxNX0sIFtsdW1hXQotICAgIFZTVDEuOCAge2RSb3c1fSwgW2NiLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3cxM30sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93Nn0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MTR9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzd9LCBbY2IsOjY0XQotICAgIFZTVDEuOCAge2RSb3cxNX0sIFtjciw6NjRdCi0KLSAgICBWUE9QICAgIHtxNC1xN30KLSAgICBQT1AgICAgIHtyNC1yNixwY30KLUAgICAgQlggICAgICBscgotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc3ZjhjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBFeHRyYWN0TmFsVW5pdAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfYnl0ZV9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBCWVRFX1NUUkVBTV9FUlJPUiAgMHhGRkZGRkZGRgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBFeHRyYWN0TmFsVW5pdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBFeHRyYWN0cyBvbmUgTkFMIHVuaXQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0gYnVmZmVyLiBSZW1vdmVzCi0gICAgICAgICAgICBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlcyBpZiBwcmVzZW50LiBUaGUgb3JpZ2luYWwgc3RyZWFtIGJ1ZmZlcgotICAgICAgICAgICAgaXMgdXNlZCBkaXJlY3RseSBhbmQgaXMgdGhlcmVmb3JlIG1vZGlmaWVkIGlmIGVtdWxhdGlvbiBwcmV2ZW50aW9uCi0gICAgICAgICAgICBieXRlcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RyZWFtLgotCi0gICAgICAgICAgICBTdHJlYW0gYnVmZmVyIGlzIGFzc3VtZWQgdG8gY29udGFpbiBlaXRoZXIgZXhhY3RseSBvbmUgTkFMIHVuaXQKLSAgICAgICAgICAgIGFuZCBub3RoaW5nIGVsc2UsIG9yIG9uZSBvciBtb3JlIE5BTCB1bml0cyBlbWJlZGRlZCBpbiBieXRlCi0gICAgICAgICAgICBzdHJlYW0gZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgQW5uZXggQiBvZiB0aGUgc3RhbmRhcmQuIEZ1bmN0aW9uCi0gICAgICAgICAgICBkZXRlY3RzIHdoaWNoIG9uZSBpcyB1c2VkIGJhc2VkIG9uIHRoZSBmaXJzdCBieXRlcyBpbiB0aGUgYnVmZmVyLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBCeXRlU3RyZWFtICAgICBwb2ludGVyIHRvIGJ5dGUgc3RyZWFtIGJ1ZmZlcgotICAgICAgICAgICAgbGVuICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgc3RyZWFtIGJ1ZmZlciAoaW4gYnl0ZXMpCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBzdHJlYW0gaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKLSAgICAgICAgICAgIHJlYWRCeXRlcyAgICAgICBudW1iZXIgb2YgYnl0ZXMgImNvbnN1bWVkIiBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZXJyb3IgaW4gYnl0ZSBzdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RFeHRyYWN0TmFsVW5pdCh1OCAqcEJ5dGVTdHJlYW0sIHUzMiBsZW4sIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICB1MzIgKnJlYWRCeXRlcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgdG1wOwotICAgIHUzMiBieXRlQ291bnQsaW5pdEJ5dGVDb3VudDsKLSAgICB1MzIgemVyb0NvdW50OwotICAgIHU4ICBieXRlOwotICAgIHUzMiBoYXNFbXVsYXRpb24gPSBIQU5UUk9fRkFMU0U7Ci0gICAgdTMyIGludmFsaWRTdHJlYW0gPSBIQU5UUk9fRkFMU0U7Ci0gICAgdTggKnJlYWRQdHIsICp3cml0ZVB0cjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBCeXRlU3RyZWFtKTsKLSAgICBBU1NFUlQobGVuKTsKLSAgICBBU1NFUlQobGVuIDwgQllURV9TVFJFQU1fRVJST1IpOwotICAgIEFTU0VSVChwU3RybURhdGEpOwotCi0gICAgLyogYnl0ZSBzdHJlYW0gZm9ybWF0IGlmIHN0YXJ0cyB3aXRoIDB4MDAwMDAxIG9yIDB4MDAwMDAwICovCi0gICAgaWYgKGxlbiA+IDMgJiYgcEJ5dGVTdHJlYW1bMF0gPT0gMHgwMCAmJiBwQnl0ZVN0cmVhbVsxXSA9PSAweDAwICYmCi0gICAgICAgIChwQnl0ZVN0cmVhbVsyXSYweEZFKSA9PSAweDAwKQotICAgIHsKLSAgICAgICAgLyogc2VhcmNoIGZvciBOQUwgdW5pdCBzdGFydCBwb2ludCwgaS5lLiBwb2ludCBhZnRlciBmaXJzdCBzdGFydCBjb2RlCi0gICAgICAgICAqIHByZWZpeCBpbiB0aGUgc3RyZWFtICovCi0gICAgICAgIHplcm9Db3VudCA9IGJ5dGVDb3VudCA9IDI7Ci0gICAgICAgIHJlYWRQdHIgPSBwQnl0ZVN0cmVhbSArIDI7Ci0gICAgICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KLSAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGUgPSAqcmVhZFB0cisrOwotICAgICAgICAgICAgYnl0ZUNvdW50Kys7Ci0KLSAgICAgICAgICAgIGlmIChieXRlQ291bnQgPT0gbGVuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIG5vIHN0YXJ0IGNvZGUgcHJlZml4IGZvdW5kIC0+IGVycm9yICovCi0gICAgICAgICAgICAgICAgKnJlYWRCeXRlcyA9IGxlbjsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYnl0ZSkKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKLSAgICAgICAgICAgIGVsc2UgaWYgKChieXRlID09IDB4MDEpICYmICh6ZXJvQ291bnQgPj0gMikpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGluaXRCeXRlQ291bnQgPSBieXRlQ291bnQ7Ci0KLSAgICAgICAgLyogZGV0ZXJtaW5lIHNpemUgb2YgdGhlIE5BTCB1bml0LiBTZWFyY2ggZm9yIG5leHQgc3RhcnQgY29kZSBwcmVmaXgKLSAgICAgICAgICogb3IgZW5kIG9mIHN0cmVhbSBhbmQgaWdub3JlIHBvc3NpYmxlIHRyYWlsaW5nIHplcm8gYnl0ZXMgKi8KLSAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgLypsaW50IC1lKDcxNikgd2hpbGUoMSkgdXNlZCBjb25zY2lvdXNseSAqLwotICAgICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZSA9ICpyZWFkUHRyKys7Ci0gICAgICAgICAgICBieXRlQ291bnQrKzsKLSAgICAgICAgICAgIGlmICghYnl0ZSkKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKLQotICAgICAgICAgICAgaWYgKCAoYnl0ZSA9PSAweDAzKSAmJiAoemVyb0NvdW50ID09IDIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYXNFbXVsYXRpb24gPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCAoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUgPQotICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgLSBpbml0Qnl0ZUNvdW50IC0gemVyb0NvdW50IC0gMTsKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQgLT0gTUlOKHplcm9Db3VudCwgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChieXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh6ZXJvQ291bnQgPj0gMykKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZFN0cmVhbSA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChieXRlQ291bnQgPT0gbGVuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0gYnl0ZUNvdW50IC0gaW5pdEJ5dGVDb3VudCAtIHplcm9Db3VudDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotICAgIC8qIHNlcGFyYXRlIE5BTCB1bml0cyBhcyBpbnB1dCAtPiBqdXN0IHNldCBzdHJlYW0gcGFyYW1zICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW5pdEJ5dGVDb3VudCA9IDA7Ci0gICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0gbGVuOwotICAgICAgICBoYXNFbXVsYXRpb24gPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0KLSAgICBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0ICAgID0gcEJ5dGVTdHJlYW0gKyBpbml0Qnl0ZUNvdW50OwotICAgIHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zICAgICAgPSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0OwotICAgIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkICAgICAgPSAwOwotICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAgPSAwOwotCi0gICAgLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyAiY29uc3VtZWQiICovCi0gICAgKnJlYWRCeXRlcyA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplICsgaW5pdEJ5dGVDb3VudCArIHplcm9Db3VudDsKLQotICAgIGlmIChpbnZhbGlkU3RyZWFtKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIHJlbW92ZSBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlcyBiZWZvcmUgcmJzcCBwcm9jZXNzaW5nICovCi0gICAgaWYgKGhhc0VtdWxhdGlvbikKLSAgICB7Ci0gICAgICAgIHRtcCA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplOwotICAgICAgICByZWFkUHRyID0gd3JpdGVQdHIgPSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0OwotICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICBmb3IgKGkgPSB0bXA7IGktLTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoemVyb0NvdW50ID09IDIpICYmICgqcmVhZFB0ciA9PSAweDAzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlIHNoYWxsIGJlIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgKiBmb2xsb3dpbmcgYnl0ZXM6IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMuIFRoaXMgaW1wbGllcyB0aGF0Ci0gICAgICAgICAgICAgICAgICogZW11bGF0aW9uIHByZXZlbnRpb24gMHgwMyBieXRlIHNoYWxsIG5vdCBiZSB0aGUgbGFzdCBieXRlCi0gICAgICAgICAgICAgICAgICogb2YgdGhlIHN0cmVhbS4gKi8KLSAgICAgICAgICAgICAgICBpZiAoIChpID09IDApIHx8ICgqKHJlYWRQdHIrMSkgPiAweDAzKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAgICAgICAgIC8qIGRvIG5vdCB3cml0ZSBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlICovCi0gICAgICAgICAgICAgICAgcmVhZFB0cisrOwotICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTkFMIHVuaXQgc2hhbGwgbm90IGNvbnRhaW4gYnl0ZSBzZXF1ZW5jZXMgMHgwMDAwMDAsCi0gICAgICAgICAgICAgICAgICogMHgwMDAwMDEgb3IgMHgwMDAwMDIgKi8KLSAgICAgICAgICAgICAgICBpZiAoICh6ZXJvQ291bnQgPT0gMikgJiYgKCpyZWFkUHRyIDw9IDB4MDIpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgICAgICAgICAgaWYgKCpyZWFkUHRyID09IDApCi0gICAgICAgICAgICAgICAgICAgIHplcm9Db3VudCsrOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKLQotICAgICAgICAgICAgICAgICp3cml0ZVB0cisrID0gKnJlYWRQdHIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIChyZWFkUHRyIC0gd3JpdGVQdHIpIGluZGljYXRlcyBudW1iZXIgb2YgInJlbW92ZWQiIGVtdWxhdGlvbgotICAgICAgICAgKiBwcmV2ZW50aW9uIGJ5dGVzIC0+IHN1YnRyYWN0IGZyb20gc3RyZWFtIGJ1ZmZlciBzaXplICovCi0gICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplIC09ICh1MzIpKHJlYWRQdHIgLSB3cml0ZVB0cik7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhZWM3Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfQllURV9TVFJFQU1fSAotI2RlZmluZSBIMjY0U1dERUNfQllURV9TVFJFQU1fSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgdTMyICpyZWFkQnl0ZXMpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19CWVRFX1NUUkVBTV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMmQ3YmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIERlY29kZUNvZWZmVG9rZW4KLSAgICAgICAgICBEZWNvZGVMZXZlbFByZWZpeAotICAgICAgICAgIERlY29kZVRvdGFsWmVyb3MKLSAgICAgICAgICBEZWNvZGVSdW5CZWZvcmUKLSAgICAgICAgICBEZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2NhdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEZvbGxvd2luZyBkZXNjcmlwdGlvbnMgdXNlIHRlcm0gImluZm9ybWF0aW9uIGZpZWxkIiB0byByZXByZXNlbnQgY29tYmluYXRpb24KLSAqIG9mIGNlcnRhaW4gZGVjb2RlZCBzeW1ib2wgdmFsdWUgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUKLSAqIGxlbmd0aCBjb2RlIHdvcmQuIEZvciBleGFtcGxlLCB0b3RhbF96ZXJvcyBpbmZvcm1hdGlvbiBmaWVsZCBjb25zaXN0cyBvZgotICogNCBiaXRzIHN5bWJvbCB2YWx1ZSAoYml0cyBbNCw3XSkgYWxvbmcgd2l0aCBmb3VyIGJpdHMgdG8gcmVwcmVzZW50IGxlbmd0aAotICogb2YgdGhlIFZMQyBjb2RlIHdvcmQgKGJpdHMgWzAsM10pICovCi0KLS8qIG1hY3JvIHRvIG9idGFpbiBsZW5ndGggb2YgdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIGZpZWxkLCBiaXRzIFswLDRdICAqLwotI2RlZmluZSBMRU5HVEhfVEModmxjKSAoKHZsYykgJiAweDFGKQotLyogbWFjcm8gdG8gb2J0YWluIGxlbmd0aCBvZiB0aGUgb3RoZXIgaW5mb3JtYXRpb24gZmllbGRzLCBiaXRzIFswLDNdICovCi0jZGVmaW5lIExFTkdUSCh2bGMpICgodmxjKSAmIDB4RikKLS8qIG1hY3JvIHRvIG9idGFpbiBjb2RlIHdvcmQgZnJvbSB0aGUgaW5mb3JtYXRpb24gZmllbGRzLCBiaXRzIFs0LDddICovCi0jZGVmaW5lIElORk8odmxjKSAoKCh2bGMpID4+IDQpICYgMHhGKSAgLyogNCBNU0IgYml0cyBjb250YWluIGluZm9ybWF0aW9uICovCi0vKiBtYWNybyB0byBvYnRhaW4gdHJhaWxpbmcgb25lcyBmcm9tIHRoZSBjb2VmZiB0b2tlbiBpbmZvcm1hdGlvbiB3b3JkLAotICogYml0cyBbNSwxMF0gKi8KLSNkZWZpbmUgVFJBSUxJTkdfT05FUyhjb2VmZlRva2VuKSAoKChjb2VmZlRva2VuKT4+NSkgJiAweDNGKQotLyogbWFjcm8gdG8gb2J0YWluIHRvdGFsIGNvZWZmIGZyb20gdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIHdvcmQsCi0gKiBiaXRzIFsxMSwxNV0gKi8KLSNkZWZpbmUgVE9UQUxfQ09FRkYoY29lZmZUb2tlbikgKCgoY29lZmZUb2tlbikgPj4gMTEpICYgMHgxRikKLQotI2RlZmluZSBWTENfTk9UX0ZPVU5EIDB4RkZGRkZGRkVVCi0KLS8qIFZMQyB0YWJsZXMgZm9yIGNvZWZmX3Rva2VuLiBCZWNhdXNlIG9mIGxvbmcgY29kZXMgKG1heC4gMTYgYml0cykgc29tZSBvZiB0aGUKLSAqIHRhYmxlcyBoYXZlIGJlZW4gc3BsaXR0ZWQgaW50byBtdWx0aXBsZSBzZXBhcmF0ZSB0YWJsZXMuIEVhY2ggYXJyYXkvdGFibGUKLSAqIGVsZW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICogWzUgYml0cyBmb3IgdG90LmNvZWZmLl0gWzYgYml0cyBmb3IgdHIub25lc10gWzUgYml0cyBmb3IgVkxDIGxlbmd0aF0KLSAqIElmIHRoZXJlIGlzIGEgMHgwMDAwIHZhbHVlLCBpdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vdCBjb3JyZXNwb25kaW5nIFZMQwotICogY29kZXdvcmQgZm9yIHRoYXQgaW5kZXguICovCi0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgMCA8PSBuQyA8IDIgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMFszMl0gPSB7Ci0gICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgyMDY2LDB4MTAyNiwweDA4MDYsMHgxODY1LDB4MTg2NSwKLSAgICAweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLAotICAgIDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsCi0gICAgMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMn07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDEwIGJpdHMsIDAgPD0gbkMgPCAyICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzFbNDhdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDQwNmEsMHgzMDRhLDB4MjgyYSwweDIwMGEsCi0gICAgMHgzODY5LDB4Mzg2OSwweDI4NDksMHgyODQ5LDB4MjAyOSwweDIwMjksMHgxODA5LDB4MTgwOSwKLSAgICAweDMwNjgsMHgzMDY4LDB4MzA2OCwweDMwNjgsMHgyMDQ4LDB4MjA0OCwweDIwNDgsMHgyMDQ4LAotICAgIDB4MTgyOCwweDE4MjgsMHgxODI4LDB4MTgyOCwweDEwMDgsMHgxMDA4LDB4MTAwOCwweDEwMDgsCi0gICAgMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywKLSAgICAweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3fTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gMTQgYml0cywgMCA8PSBuQyA8IDIgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMls1Nl0gPSB7Ci0gICAgMHg2MDZlLDB4NTg0ZSwweDUwMmUsMHg1MDBlLDB4NTg2ZSwweDUwNGUsMHg0ODJlLDB4NDgwZSwKLSAgICAweDQwMGQsMHg0MDBkLDB4NDg0ZCwweDQ4NGQsMHg0MDJkLDB4NDAyZCwweDM4MGQsMHgzODBkLAotICAgIDB4NTA2ZCwweDUwNmQsMHg0MDRkLDB4NDA0ZCwweDM4MmQsMHgzODJkLDB4MzAwZCwweDMwMGQsCi0gICAgMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwKLSAgICAweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLAotICAgIDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsCi0gICAgMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYn07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDE2IGJpdHMsIDAgPD0gbkMgPCAyICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzNbMzJdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHg2ODJmLDB4NjgyZiwweDgwMTAsMHg4MDUwLDB4ODAzMCwweDc4MTAsCi0gICAgMHg4MDcwLDB4Nzg1MCwweDc4MzAsMHg3MDEwLDB4Nzg3MCwweDcwNTAsMHg3MDMwLDB4NjgxMCwKLSAgICAweDcwNmYsMHg3MDZmLDB4Njg0ZiwweDY4NGYsMHg2MDJmLDB4NjAyZiwweDYwMGYsMHg2MDBmLAotICAgIDB4Njg2ZiwweDY4NmYsMHg2MDRmLDB4NjA0ZiwweDU4MmYsMHg1ODJmLDB4NTgwZiwweDU4MGZ9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA2IGJpdHMsIDIgPD0gbkMgPCA0ICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzBbMzJdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDM4NjYsMHgyMDQ2LDB4MjAyNiwweDEwMDYsCi0gICAgMHgzMDY2LDB4MTg0NiwweDE4MjYsMHgwODA2LDB4Mjg2NSwweDI4NjUsMHgxMDI1LDB4MTAyNSwKLSAgICAweDIwNjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxODY0LAotICAgIDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDN9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA5IGJpdHMsIDIgPD0gbkMgPCA0ICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzFbMzJdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDQ4NjksMHgzODQ5LDB4MzgyOSwweDMwMDksCi0gICAgMHgyODA4LDB4MjgwOCwweDMwNDgsMHgzMDQ4LDB4MzAyOCwweDMwMjgsMHgyMDA4LDB4MjAwOCwKLSAgICAweDQwNjcsMHg0MDY3LDB4NDA2NywweDQwNjcsMHgyODQ3LDB4Mjg0NywweDI4NDcsMHgyODQ3LAotICAgIDB4MjgyNywweDI4MjcsMHgyODI3LDB4MjgyNywweDE4MDcsMHgxODA3LDB4MTgwNywweDE4MDd9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byAxNCBiaXRzLCAyIDw9IG5DIDwgNCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMl8yWzEyOF0gPSB7Ci0gICAgMHgwMDAwLDB4MDAwMCwweDc4NmQsMHg3ODZkLDB4ODA2ZSwweDgwNGUsMHg4MDJlLDB4ODAwZSwKLSAgICAweDc4MmUsMHg3ODBlLDB4Nzg0ZSwweDcwMmUsMHg3MDRkLDB4NzA0ZCwweDcwMGQsMHg3MDBkLAotICAgIDB4NzA2ZCwweDcwNmQsMHg2ODRkLDB4Njg0ZCwweDY4MmQsMHg2ODJkLDB4NjgwZCwweDY4MGQsCi0gICAgMHg2ODZkLDB4Njg2ZCwweDYwNGQsMHg2MDRkLDB4NjAyZCwweDYwMmQsMHg2MDBkLDB4NjAwZCwKLSAgICAweDU4MGMsMHg1ODBjLDB4NTgwYywweDU4MGMsMHg1ODRjLDB4NTg0YywweDU4NGMsMHg1ODRjLAotICAgIDB4NTgyYywweDU4MmMsMHg1ODJjLDB4NTgyYywweDUwMGMsMHg1MDBjLDB4NTAwYywweDUwMGMsCi0gICAgMHg2MDZjLDB4NjA2YywweDYwNmMsMHg2MDZjLDB4NTA0YywweDUwNGMsMHg1MDRjLDB4NTA0YywKLSAgICAweDUwMmMsMHg1MDJjLDB4NTAyYywweDUwMmMsMHg0ODBjLDB4NDgwYywweDQ4MGMsMHg0ODBjLAotICAgIDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsCi0gICAgMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwKLSAgICAweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLAotICAgIDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsCi0gICAgMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwKLSAgICAweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLAotICAgIDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsCi0gICAgMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYn07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgNCA8PSBuQyA8IDggKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjRfMFs2NF0gPSB7Ci0gICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwKLSAgICAweDE4MDYsMHgzODQ2LDB4MzgyNiwweDEwMDYsMHg0ODY2LDB4MzA0NiwweDMwMjYsMHgwODA2LAotICAgIDB4MjgyNSwweDI4MjUsMHgyODQ1LDB4Mjg0NSwweDIwMjUsMHgyMDI1LDB4MjA0NSwweDIwNDUsCi0gICAgMHgxODI1LDB4MTgyNSwweDQwNjUsMHg0MDY1LDB4MTg0NSwweDE4NDUsMHgxMDI1LDB4MTAyNSwKLSAgICAweDM4NjQsMHgzODY0LDB4Mzg2NCwweDM4NjQsMHgzMDY0LDB4MzA2NCwweDMwNjQsMHgzMDY0LAotICAgIDB4Mjg2NCwweDI4NjQsMHgyODY0LDB4Mjg2NCwweDIwNjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsCi0gICAgMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxODY0LDB4MTA0NCwweDEwNDQsMHgxMDQ0LDB4MTA0NCwKLSAgICAweDA4MjQsMHgwODI0LDB4MDgyNCwweDA4MjQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0fTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gMTAgYml0cywgNCA8PSBuQyA8IDggKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjRfMVsxMjhdID0gewotICAgIDB4MDAwMCwweDgwMGEsMHg4MDZhLDB4ODA0YSwweDgwMmEsMHg3ODBhLDB4Nzg2YSwweDc4NGEsCi0gICAgMHg3ODJhLDB4NzAwYSwweDcwNmEsMHg3MDRhLDB4NzAyYSwweDY4MGEsMHg2ODI5LDB4NjgyOSwKLSAgICAweDYwMDksMHg2MDA5LDB4Njg0OSwweDY4NDksMHg2MDI5LDB4NjAyOSwweDU4MDksMHg1ODA5LAotICAgIDB4Njg2OSwweDY4NjksMHg2MDQ5LDB4NjA0OSwweDU4MjksMHg1ODI5LDB4NTAwOSwweDUwMDksCi0gICAgMHg2MDY4LDB4NjA2OCwweDYwNjgsMHg2MDY4LDB4NTg0OCwweDU4NDgsMHg1ODQ4LDB4NTg0OCwKLSAgICAweDUwMjgsMHg1MDI4LDB4NTAyOCwweDUwMjgsMHg0ODA4LDB4NDgwOCwweDQ4MDgsMHg0ODA4LAotICAgIDB4NTg2OCwweDU4NjgsMHg1ODY4LDB4NTg2OCwweDUwNDgsMHg1MDQ4LDB4NTA0OCwweDUwNDgsCi0gICAgMHg0ODI4LDB4NDgyOCwweDQ4MjgsMHg0ODI4LDB4NDAwOCwweDQwMDgsMHg0MDA4LDB4NDAwOCwKLSAgICAweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LAotICAgIDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsCi0gICAgMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywKLSAgICAweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LAotICAgIDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsCi0gICAgMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywKLSAgICAweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LAotICAgIDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDd9OwotCi0vKiBmaXhlZCA2IGJpdCBsZW5ndGggVkxDLCBuQyA8PSA4ICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW44WzY0XSA9IHsKLSAgICAweDA4MDYsMHgwODI2LDB4MDAwMCwweDAwMDYsMHgxMDA2LDB4MTAyNiwweDEwNDYsMHgwMDAwLAotICAgIDB4MTgwNiwweDE4MjYsMHgxODQ2LDB4MTg2NiwweDIwMDYsMHgyMDI2LDB4MjA0NiwweDIwNjYsCi0gICAgMHgyODA2LDB4MjgyNiwweDI4NDYsMHgyODY2LDB4MzAwNiwweDMwMjYsMHgzMDQ2LDB4MzA2NiwKLSAgICAweDM4MDYsMHgzODI2LDB4Mzg0NiwweDM4NjYsMHg0MDA2LDB4NDAyNiwweDQwNDYsMHg0MDY2LAotICAgIDB4NDgwNiwweDQ4MjYsMHg0ODQ2LDB4NDg2NiwweDUwMDYsMHg1MDI2LDB4NTA0NiwweDUwNjYsCi0gICAgMHg1ODA2LDB4NTgyNiwweDU4NDYsMHg1ODY2LDB4NjAwNiwweDYwMjYsMHg2MDQ2LDB4NjA2NiwKLSAgICAweDY4MDYsMHg2ODI2LDB4Njg0NiwweDY4NjYsMHg3MDA2LDB4NzAyNiwweDcwNDYsMHg3MDY2LAotICAgIDB4NzgwNiwweDc4MjYsMHg3ODQ2LDB4Nzg2NiwweDgwMDYsMHg4MDI2LDB4ODA0NiwweDgwNjZ9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byAzIGJpdHMsIG5DID09IC0xICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW5NaW51czFfMFs4XSA9IHsKLSAgICAweDAwMDAsMHgxMDQzLDB4MDAwMiwweDAwMDIsMHgwODIxLDB4MDgyMSwweDA4MjEsMHgwODIxfTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gOCBiaXRzLCBuQyA9PSAtMSAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuTWludXMxXzFbMzJdID0gewotICAgIDB4MjA2NywweDIwNjcsMHgyMDQ4LDB4MjAyOCwweDE4NDcsMHgxODQ3LDB4MTgyNywweDE4MjcsCi0gICAgMHgyMDA2LDB4MjAwNiwweDIwMDYsMHgyMDA2LDB4MTgwNiwweDE4MDYsMHgxODA2LDB4MTgwNiwKLSAgICAweDEwMDYsMHgxMDA2LDB4MTAwNiwweDEwMDYsMHgxODY2LDB4MTg2NiwweDE4NjYsMHgxODY2LAotICAgIDB4MTAyNiwweDEwMjYsMHgxMDI2LDB4MTAyNiwweDA4MDYsMHgwODA2LDB4MDgwNiwweDA4MDZ9OwotCi0vKiBWTEMgdGFibGVzIGZvciB0b3RhbF96ZXJvcy4gT25lIHRhYmxlIGNvbnRhaW5pbmcgbG9uZ2VyIGNvZGUsIHRvdGFsWmVyb3NfMSwKLSAqIGhhcyBiZWVuIGJyb2tlbiBpbnRvIHR3byBzZXBhcmF0ZSB0YWJsZXMuIFRhYmxlIGVsZW1lbnRzIGhhdmUgdGhlCi0gKiBmb2xsb3dpbmcgc3RydWN0dXJlOgotICogWzQgYml0cyBmb3IgaW5mb10gWzQgYml0cyBmb3IgVkxDIGxlbmd0aF0gKi8KLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gNSBiaXRzICovCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xXzBbMzJdID0gewotICAgIDB4MDAsMHgwMCwweDY1LDB4NTUsMHg0NCwweDQ0LDB4MzQsMHgzNCwKLSAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MTMsMHgxMywweDEzLDB4MTMsCi0gICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAotICAgIDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMX07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDkgYml0cyAqLwotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMV8xWzMyXSA9IHsKLSAgICAweDAwLDB4ZjksMHhlOSwweGQ5LDB4YzgsMHhjOCwweGI4LDB4YjgsCi0gICAgMHhhNywweGE3LDB4YTcsMHhhNywweDk3LDB4OTcsMHg5NywweDk3LAotICAgIDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwKLSAgICAweDc2LDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2LDB4NzZ9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18yWzY0XSA9IHsKLSAgICAweGU2LDB4ZDYsMHhjNiwweGI2LDB4YTUsMHhhNSwweDk1LDB4OTUsCi0gICAgMHg4NCwweDg0LDB4ODQsMHg4NCwweDc0LDB4NzQsMHg3NCwweDc0LAotICAgIDB4NjQsMHg2NCwweDY0LDB4NjQsMHg1NCwweDU0LDB4NTQsMHg1NCwKLSAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCi0gICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAotICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKLSAgICAweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsCi0gICAgMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfM1s2NF0gPSB7Ci0gICAgMHhkNiwweGI2LDB4YzUsMHhjNSwweGE1LDB4YTUsMHg5NSwweDk1LAotICAgIDB4ODQsMHg4NCwweDg0LDB4ODQsMHg1NCwweDU0LDB4NTQsMHg1NCwKLSAgICAweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDQsMHgwNCwweDA0LDB4MDQsCi0gICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAotICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKLSAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCi0gICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLAotICAgIDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxM307Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzRbMzJdID0gewotICAgIDB4YzUsMHhiNSwweGE1LDB4MDUsMHg5NCwweDk0LDB4NzQsMHg3NCwKLSAgICAweDM0LDB4MzQsMHgyNCwweDI0LDB4ODMsMHg4MywweDgzLDB4ODMsCi0gICAgMHg2MywweDYzLDB4NjMsMHg2MywweDUzLDB4NTMsMHg1MywweDUzLAotICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHgxMywweDEzLDB4MTMsMHgxM307Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzVbMzJdID0gewotICAgIDB4YjUsMHg5NSwweGE0LDB4YTQsMHg4NCwweDg0LDB4MjQsMHgyNCwKLSAgICAweDE0LDB4MTQsMHgwNCwweDA0LDB4NzMsMHg3MywweDczLDB4NzMsCi0gICAgMHg2MywweDYzLDB4NjMsMHg2MywweDUzLDB4NTMsMHg1MywweDUzLAotICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHgzMywweDMzLDB4MzMsMHgzM307Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzZbNjRdID0gewotICAgIDB4YTYsMHgwNiwweDE1LDB4MTUsMHg4NCwweDg0LDB4ODQsMHg4NCwKLSAgICAweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsCi0gICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAotICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKLSAgICAweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsCi0gICAgMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLAotICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKLSAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjN9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc183WzY0XSA9IHsKLSAgICAweDk2LDB4MDYsMHgxNSwweDE1LDB4NzQsMHg3NCwweDc0LDB4NzQsCi0gICAgMHg4MywweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywweDgzLAotICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKLSAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCi0gICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAotICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKLSAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCi0gICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfOFs2NF0gPSB7Ci0gICAgMHg4NiwweDA2LDB4MjUsMHgyNSwweDE0LDB4MTQsMHgxNCwweDE0LAotICAgIDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCi0gICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAotICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKLSAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCi0gICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAotICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0Mn07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzlbNjRdID0gewotICAgIDB4MTYsMHgwNiwweDc1LDB4NzUsMHgyNCwweDI0LDB4MjQsMHgyNCwKLSAgICAweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsCi0gICAgMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLAotICAgIDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwKLSAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCi0gICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAotICAgIDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwKLSAgICAweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzJ9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMFszMl0gPSB7Ci0gICAgMHgxNSwweDA1LDB4NjQsMHg2NCwweDIzLDB4MjMsMHgyMywweDIzLAotICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKLSAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCi0gICAgMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTFbMTZdID0gewotICAgIDB4MDQsMHgxNCwweDIzLDB4MjMsMHgzMywweDMzLDB4NTMsMHg1MywKLSAgICAweDQxLDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxLDB4NDF9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMlsxNl0gPSB7Ci0gICAgMHgwNCwweDE0LDB4NDMsMHg0MywweDIyLDB4MjIsMHgyMiwweDIyLAotICAgIDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMX07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzEzWzhdID0gezB4MDMsMHgxMywweDMyLDB4MzIsMHgyMSwweDIxLDB4MjEsMHgyMX07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzE0WzRdID0gezB4MDIsMHgxMiwweDIxLDB4MjF9OwotCi0vKiBWTEMgdGFibGVzIGZvciBydW5fYmVmb3JlLiBUYWJsZSBlbGVtZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICogWzQgYml0cyBmb3IgaW5mb10gWzRiaXRzIGZvciBWTEMgbGVuZ3RoXQotICovCi0KLXN0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfNls4XSA9IHsweDEzLDB4MjMsMHg0MywweDMzLDB4NjMsMHg1MywweDAyLDB4MDJ9OwotCi1zdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzVbOF0gPSB7MHg1MywweDQzLDB4MzMsMHgyMywweDEyLDB4MTIsMHgwMiwweDAyfTsKLQotc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV80WzhdID0gezB4NDMsMHgzMywweDIyLDB4MjIsMHgxMiwweDEyLDB4MDIsMHgwMn07Ci0KLXN0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfM1s0XSA9IHsweDMyLDB4MjIsMHgxMiwweDAyfTsKLQotc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV8yWzRdID0gezB4MjIsMHgxMiwweDAxLDB4MDF9OwotCi1zdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzFbMl0gPSB7MHgxMSwweDAxfTsKLQotLyogZm9sbG93aW5nIGZvdXIgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBzdHJlYW0gYnVmZmVyICJjYWNoZSIgaW4gdGhlIENBVkxDCi0gKiBkZWNvZGluZyBmdW5jdGlvbiAqLwotCi0vKiBtYWNybyB0byBpbml0aWFsaXplIHN0cmVhbSBidWZmZXIgY2FjaGUsIGZpbGxzIHRoZSBidWZmZXIgKDMyIGJpdHMpICovCi0jZGVmaW5lIEJVRkZFUl9JTklUKHZhbHVlLCBiaXRzKSBcCi17IFwKLSAgICAoYml0cykgPSAzMjsgXAotICAgICh2YWx1ZSkgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOyBcCi19Ci0KLS8qIG1hY3JvIHRvIHJlYWQgbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciwgYml0cyB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAqIG91dFZhbC4gUmVmaWxscyB0aGUgYnVmZmVyIGlmIG5vdCBlbm91Z2ggYml0cyBsZWZ0ICovCi0jZGVmaW5lIEJVRkZFUl9TSE9XKHZhbHVlLCBiaXRzLCBvdXRWYWwsIG51bUJpdHMpIFwKLXsgXAotICAgIGlmICgoYml0cykgPCAobnVtQml0cykpIFwKLSAgICB7IFwKLSAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItKGJpdHMpKSA9PSBFTkRfT0ZfU1RSRUFNKSBcCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7IFwKLSAgICAgICAgKHZhbHVlKSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7IFwKLSAgICAgICAgKGJpdHMpID0gMzI7IFwKLSAgICB9IFwKLSAgICAob3V0VmFsKSA9ICh2YWx1ZSkgPj4gKDMyIC0gKG51bUJpdHMpKTsgXAotfQotCi0vKiBtYWNybyB0byBmbHVzaCBudW1CaXRzIGJpdHMgZnJvbSB0aGUgYnVmZmVyICovCi0jZGVmaW5lIEJVRkZFUl9GTFVTSCh2YWx1ZSwgYml0cywgbnVtQml0cykgXAoteyBcCi0gICAgKHZhbHVlKSA8PD0gKG51bUJpdHMpOyBcCi0gICAgKGJpdHMpIC09IChudW1CaXRzKTsgXAotfQotCi0vKiBtYWNybyB0byByZWFkIGFuZCBmbHVzaCAgbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciwgYml0cyB3aWxsIGJlIHdyaXR0ZW4KLSAqIHRvIG91dFZhbC4gUmVmaWxscyB0aGUgYnVmZmVyIGlmIG5vdCBlbm91Z2ggYml0cyBsZWZ0ICovCi0jZGVmaW5lIEJVRkZFUl9HRVQodmFsdWUsIGJpdHMsIG91dFZhbCwgbnVtQml0cykgXAoteyBcCi0gICAgaWYgKChiaXRzKSA8IChudW1CaXRzKSkgXAotICAgIHsgXAotICAgICAgICBpZihoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMi0oYml0cykpID09IEVORF9PRl9TVFJFQU0pIFwKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsgXAotICAgICAgICAodmFsdWUpID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAotICAgICAgICAoYml0cykgPSAzMjsgXAotICAgIH0gXAotICAgIChvdXRWYWwpID0gKHZhbHVlKSA+PiAoMzIgLSAobnVtQml0cykpOyBcCi0gICAgKHZhbHVlKSA8PD0gKG51bUJpdHMpOyBcCi0gICAgKGJpdHMpIC09IChudW1CaXRzKTsgXAotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlQ29lZmZUb2tlbih1MzIgYml0cywgdTMyIG5jKTsKLQotc3RhdGljIHUzMiBEZWNvZGVMZXZlbFByZWZpeCh1MzIgYml0cyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlVG90YWxaZXJvcyh1MzIgYml0cywgdTMyIHRvdGFsQ29lZmYsIHUzMiBpc0Nocm9tYURDKTsKLQotc3RhdGljIHUzMiBEZWNvZGVSdW5CZWZvcmUodTMyIGJpdHMsdTMyIHplcm9zTGVmdCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlQ29lZmZUb2tlbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGNvZWZmX3Rva2VuIGluZm9ybWF0aW9uIGZpZWxkIGZyb20gdGhlIHN0cmVhbS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDE2IHN0cmVhbSBiaXRzCi0gICAgICAgICAgdTMyIG5jICAgICAgICAgICAgICAgICAgICBuQywgc2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICB1MzIgIGluZm9ybWF0aW9uIGZpZWxkICgxMSBiaXRzIGZvciB2YWx1ZSwgNSBiaXRzIGZvciBsZW5ndGgpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVDb2VmZlRva2VuKHUzMiBiaXRzLCB1MzIgbmMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHZhbHVlOwotCi0vKiBDb2RlICovCi0KLSAgICAvKiBzdGFuZGFyZCBkZWZpbmVzIHRoYXQgbmMgZm9yIGRlY29kaW5nIG9mIGNocm9tYSBkYyBjb2VmZmljaWVudHMgaXMgLTEsCi0gICAgICogcmVwcmVzZW50ZWQgYnkgdTMyIGhlcmUgLT4gLTEgbWFwcyB0byAyXjMyIC0gMSAqLwotICAgIEFTU0VSVChuYyA8PSAxNiB8fCBuYyA9PSAodTMyKSgtMSkpOwotCi0gICAgaWYgKG5jIDwgMikKLSAgICB7Ci0gICAgICAgIGlmIChiaXRzID49IDB4ODAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWUgPSAweDAwMDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDBDMDApCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4wXzBbYml0cyA+PiAxMF07Ci0gICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMTAwKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8xW2JpdHMgPj4gNl07Ci0gICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDIwKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8yWyhiaXRzPj4yKS04XTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8zW2JpdHNdOwotICAgIH0KLSAgICBlbHNlIGlmIChuYyA8IDQpCi0gICAgewotICAgICAgICBpZiAoYml0cyA+PSAweDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gYml0cyAmIDB4NDAwMCA/IDB4MDAwMiA6IDB4MDgyMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMCkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjJfMFtiaXRzID4+IDEwXTsKLSAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDAyMDApCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4yXzFbYml0cyA+PiA3XTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMl8yW2JpdHM+PjJdOwotICAgIH0KLSAgICBlbHNlIGlmIChuYyA8IDgpCi0gICAgewotICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW40XzBbYml0cyA+PiAxMF07Ci0gICAgICAgIGlmICghdmFsdWUpCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW40XzFbYml0cz4+Nl07Ci0gICAgfQotICAgIGVsc2UgaWYgKG5jIDw9IDE2KQotICAgIHsKLSAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuOFtiaXRzPj4xMF07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gY29lZmZUb2tlbk1pbnVzMV8wW2JpdHMgPj4gMTNdOwotICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuTWludXMxXzFbYml0cz4+OF07Ci0gICAgfQotCi0gICAgcmV0dXJuKHZhbHVlKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUxldmVsUHJlZml4Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgbGV2ZWxfcHJlZml4IGluZm9ybWF0aW9uIGZpZWxkIGZyb20gdGhlIHN0cmVhbQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICB1MzIgYml0cyAgICAgIG5leHQgMTYgc3RyZWFtIGJpdHMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHUzMiAgbGV2ZWxfcHJlZml4IGluZm9ybWF0aW9uIGZpZWxkIG9yIFZMQ19OT1RfRk9VTkQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZUxldmVsUHJlZml4KHUzMiBiaXRzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBudW1aZXJvczsKLQotLyogQ29kZSAqLwotCi0gICAgaWYgKGJpdHMgPj0gMHg4MDAwKQotICAgICAgICBudW1aZXJvcyA9IDA7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDQwMDApCi0gICAgICAgIG51bVplcm9zID0gMTsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MjAwMCkKLSAgICAgICAgbnVtWmVyb3MgPSAyOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgxMDAwKQotICAgICAgICBudW1aZXJvcyA9IDM7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDA4MDApCi0gICAgICAgIG51bVplcm9zID0gNDsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDQwMCkKLSAgICAgICAgbnVtWmVyb3MgPSA1OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMjAwKQotICAgICAgICBudW1aZXJvcyA9IDY7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAxMDApCi0gICAgICAgIG51bVplcm9zID0gNzsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDA4MCkKLSAgICAgICAgbnVtWmVyb3MgPSA4OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDQwKQotICAgICAgICBudW1aZXJvcyA9IDk7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMjApCi0gICAgICAgIG51bVplcm9zID0gMTA7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMTApCi0gICAgICAgIG51bVplcm9zID0gMTE7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMDgpCi0gICAgICAgIG51bVplcm9zID0gMTI7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMDQpCi0gICAgICAgIG51bVplcm9zID0gMTM7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMDIpCi0gICAgICAgIG51bVplcm9zID0gMTQ7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMDEpCi0gICAgICAgIG51bVplcm9zID0gMTU7Ci0gICAgZWxzZSAvKiBtb3JlIHRoYW4gMTUgemVyb3MgZW5jb3VudGVyZWQgd2hpY2ggaXMgYW4gZXJyb3IgKi8KLSAgICAgICAgcmV0dXJuKFZMQ19OT1RfRk9VTkQpOwotCi0gICAgcmV0dXJuKG51bVplcm9zKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVRvdGFsWmVyb3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSB0b3RhbF96ZXJvcyBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDkgc3RyZWFtIGJpdHMKLSAgICAgICAgICB1MzIgdG90YWxDb2VmZiAgICAgICAgICAgIHRvdGFsIG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIHRoZSBibG9jawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgZGVjb2RlZAotICAgICAgICAgIHUzMiBpc0Nocm9tYURDICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIGNocm9tYSBEQyBibG9jawotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoNCBiaXRzIHZhbHVlLCA0IGJpdHMgbGVuZ3RoKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlVG90YWxaZXJvcyh1MzIgYml0cywgdTMyIHRvdGFsQ29lZmYsIHUzMiBpc0Nocm9tYURDKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB2YWx1ZSA9IDB4MDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHRvdGFsQ29lZmYpOwotCi0gICAgaWYgKCFpc0Nocm9tYURDKQotICAgIHsKLSAgICAgICAgQVNTRVJUKHRvdGFsQ29lZmYgPCAxNik7Ci0gICAgICAgIHN3aXRjaCAodG90YWxDb2VmZikKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xXzBbYml0cyA+PiA0XTsKLSAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMV8xW2JpdHNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzJbYml0cyA+PiAzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18zW2JpdHMgPj4gM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfNFtiaXRzID4+IDRdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzVbYml0cyA+PiA0XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc182W2JpdHMgPj4gM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfN1tiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzhbYml0cyA+PiAzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc185W2JpdHMgPj4gM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzEwW2JpdHMgPj4gNF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzExW2JpdHMgPj4gNV07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzEyW2JpdHMgPj4gNV07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzEzW2JpdHMgPj4gNl07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzE0W2JpdHMgPj4gN107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMTUgKi8KLSAgICAgICAgICAgICAgICB2YWx1ZSA9IChiaXRzID4+IDgpID8gMHgxMSA6IDB4MDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQVNTRVJUKHRvdGFsQ29lZmYgPCA0KTsKLSAgICAgICAgYml0cyA+Pj0gNjsKLSAgICAgICAgaWYgKGJpdHMgPiAzKQotICAgICAgICAgICAgdmFsdWUgPSAweDAxOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0b3RhbENvZWZmID09IDMpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDExOwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodG90YWxDb2VmZiA9PSAyKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHgyMjsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDIzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHgzMzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybih2YWx1ZSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVSdW5CZWZvcmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBydW5fYmVmb3JlIGluZm9ybWF0aW9uIGZpZWxkIGZyb20gdGhlIHN0cmVhbQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICB1MzIgYml0cyAgICAgICAgICAgICAgICAgIG5leHQgMTEgc3RyZWFtIGJpdHMKLSAgICAgICAgICB1MzIgemVyb3NMZWZ0ICAgICAgICAgICAgIG51bWJlciBvZiB6ZXJvcyBsZWZ0IGZvciB0aGUgY3VycmVudCBibG9jawotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoNCBiaXRzIHZhbHVlLCA0IGJpdHMgbGVuZ3RoKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlUnVuQmVmb3JlKHUzMiBiaXRzLCB1MzIgemVyb3NMZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB2YWx1ZSA9IDB4MDsKLQotLyogQ29kZSAqLwotCi0gICAgc3dpdGNoICh6ZXJvc0xlZnQpCi0gICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8xW2JpdHM+PjEwXTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzJbYml0cz4+OV07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8zW2JpdHM+PjldOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfNFtiaXRzPj44XTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzVbYml0cz4+OF07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV82W2JpdHM+PjhdOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChiaXRzID49IDB4MTAwKQotICAgICAgICAgICAgICAgIHZhbHVlID0gKCg3LShiaXRzPj44KSk8PDQpKzB4MzsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg4MCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4NzQ7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4NDApCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDg1OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDIwKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHg5NjsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgxMCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4YTc7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4OCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4Yjg7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4NCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4Yzk7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MikKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4ZEE7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHhlQjsKLSAgICAgICAgICAgIGlmIChJTkZPKHZhbHVlKSA+IHplcm9zTGVmdCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4odmFsdWUpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgb25lIENBVkxDIGNvZGVkIGJsb2NrLiBUaGlzIGNvcnJlc3BvbmRzIHRvCi0gICAgICAgICAgc3ludGF4IGVsZW1lbnRzIHJlc2lkdWFsX2Jsb2NrX2NhdmxjKCkgaW4gdGhlIHN0YW5kYXJkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwU3RybURhdGEgICAgICAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICBuYyAgICAgICAgICAgICAgICAgICAgbkMgdmFsdWUKLSAgICAgICAgICBtYXhOdW1Db2VmZiAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgcmVzaWR1YWwgY29lZmZpY2llbnRzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBjb2VmZkxldmVsICAgICAgICAgICAgc3RvcmVzIGRlY29kZWQgY29lZmZpY2llbnQgbGV2ZWxzCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBudW1Db2VmZnMgICAgICAgICAgICAgb24gYml0cyBbNCwxMV0gaWYgc3VjY2Vzc2Z1bAotICAgICAgICAgIGNvZWZmTWFwICAgICAgICAgICAgICBvbiBiaXRzIFsxNiwzMV0gaWYgc3VjY2Vzc2Z1bCwgdGhpcyBpcyBiaXQgbWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGVhY2ggYml0IGluZGljYXRlcyBpZiB0aGUgY29ycmVzcG9uZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudCB3YXMgemVybyAoMCkgb3Igbm9uLXplcm8gKDEpCi0gICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgICAgIGVuZCBvZiBzdHJlYW0gb3IgZXJyb3IgaW4gc3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIGkzMiAqY29lZmZMZXZlbCwKLSAgaTMyIG5jLAotICB1MzIgbWF4TnVtQ29lZmYpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcCwgdG90YWxDb2VmZiwgdHJhaWxpbmdPbmVzLCBzdWZmaXhMZW5ndGgsIGxldmVsUHJlZml4OwotICAgIHUzMiBsZXZlbFN1ZmZpeCwgemVyb3NMZWZ0LCBiaXQ7Ci0gICAgaTMyIGxldmVsWzE2XTsKLSAgICB1MzIgcnVuWzE2XTsKLSAgICAvKiBzdHJlYW0gImNhY2hlIiAqLwotICAgIHUzMiBidWZmZXJWYWx1ZTsKLSAgICB1MzIgYnVmZmVyQml0czsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKGNvZWZmTGV2ZWwpOwotICAgIEFTU0VSVChuYyA+IC0yKTsKLSAgICBBU1NFUlQobWF4TnVtQ29lZmYgPT0gNCB8fCBtYXhOdW1Db2VmZiA9PSAxNSB8fCBtYXhOdW1Db2VmZiA9PSAxNik7Ci0gICAgQVNTRVJUKFZMQ19OT1RfRk9VTkQgIT0gRU5EX09GX1NUUkVBTSk7Ci0KLSAgICAvKiBhc3N1bWUgdGhhdCBjb2VmZkxldmVsIGFycmF5IGhhcyBiZWVuICJjbGVhbmVkIiBieSBjYWxsZXIgKi8KLQotICAgIEJVRkZFUl9JTklUKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzKTsKLQotICAgIC8qbGludCAtZTc3NCBkaXNhYmxlIGxpbnQgd2FybmluZyBvbiBhbHdheXMgZmFsc2UgY29tcGFyaXNvbiAqLwotICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIDE2KTsKLSAgICAvKmxpbnQgK2U3NzQgKi8KLSAgICB0bXAgPSBEZWNvZGVDb2VmZlRva2VuKGJpdCwgKHUzMiluYyk7Ci0gICAgaWYgKCF0bXApCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIExFTkdUSF9UQyh0bXApKTsKLQotICAgIHRvdGFsQ29lZmYgPSBUT1RBTF9DT0VGRih0bXApOwotICAgIGlmICh0b3RhbENvZWZmID4gbWF4TnVtQ29lZmYpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB0cmFpbGluZ09uZXMgPSBUUkFJTElOR19PTkVTKHRtcCk7Ci0KLSAgICBpZiAodG90YWxDb2VmZiAhPSAwKQotICAgIHsKLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIC8qIG5vbnplcm8gY29lZmZpY2llbnRzOiArLy0gMSAqLwotICAgICAgICBpZiAodHJhaWxpbmdPbmVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBCVUZGRVJfR0VUKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIHRyYWlsaW5nT25lcyk7Ci0gICAgICAgICAgICB0bXAgPSAxIDw8ICh0cmFpbGluZ09uZXMgLSAxKTsKLSAgICAgICAgICAgIGZvciAoOyB0bXA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZXZlbFtpXSA9IGJpdCAmIHRtcCA/IC0xIDogMTsKLSAgICAgICAgICAgICAgICB0bXAgPj49IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBvdGhlciBsZXZlbHMgKi8KLSAgICAgICAgaWYgKHRvdGFsQ29lZmYgPiAxMCAmJiB0cmFpbGluZ09uZXMgPCAzKQotICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMDsKLQotICAgICAgICBmb3IgKDsgaSA8IHRvdGFsQ29lZmY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCwgMTYpOwotICAgICAgICAgICAgbGV2ZWxQcmVmaXggPSBEZWNvZGVMZXZlbFByZWZpeChiaXQpOwotICAgICAgICAgICAgaWYgKGxldmVsUHJlZml4ID09IFZMQ19OT1RfRk9VTkQpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBsZXZlbFByZWZpeCsxKTsKLQotICAgICAgICAgICAgaWYgKGxldmVsUHJlZml4IDwgMTQpCi0gICAgICAgICAgICAgICAgdG1wID0gc3VmZml4TGVuZ3RoOwotICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWxQcmVmaXggPT0gMTQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gc3VmZml4TGVuZ3RoID8gc3VmZml4TGVuZ3RoIDogNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBzZXR0aW5nIHN1ZmZpeExlbmd0aCB0byAxIGhlcmUgY29ycmVzcG9uZHMgdG8gYWRkaW5nIDE1Ci0gICAgICAgICAgICAgICAgICogdG8gbGV2ZWxDb2RlIHZhbHVlIGlmIGxldmVsUHJlZml4ID09IDE1IGFuZAotICAgICAgICAgICAgICAgICAqIHN1ZmZpeExlbmd0aCA9PSAwICovCi0gICAgICAgICAgICAgICAgaWYgKCFzdWZmaXhMZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDE7Ci0gICAgICAgICAgICAgICAgdG1wID0gMTI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdWZmaXhMZW5ndGgpCi0gICAgICAgICAgICAgICAgbGV2ZWxQcmVmaXggPDw9IHN1ZmZpeExlbmd0aDsKLQotICAgICAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCVUZGRVJfR0VUKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBsZXZlbFN1ZmZpeCwgdG1wKTsKLSAgICAgICAgICAgICAgICBsZXZlbFByZWZpeCArPSBsZXZlbFN1ZmZpeDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG1wID0gbGV2ZWxQcmVmaXg7Ci0KLSAgICAgICAgICAgIGlmIChpID09IHRyYWlsaW5nT25lcyAmJiB0cmFpbGluZ09uZXMgPCAzKQotICAgICAgICAgICAgICAgIHRtcCArPSAyOwotCi0gICAgICAgICAgICBsZXZlbFtpXSA9ICh0bXArMik+PjE7Ci0KLSAgICAgICAgICAgIGlmIChzdWZmaXhMZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAxOwotCi0gICAgICAgICAgICBpZiAoKGxldmVsW2ldID4gKDMgPDwgKHN1ZmZpeExlbmd0aCAtIDEpKSkgJiYgc3VmZml4TGVuZ3RoIDwgNikKLSAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGgrKzsKLQotICAgICAgICAgICAgaWYgKHRtcCAmIDB4MSkKLSAgICAgICAgICAgICAgICBsZXZlbFtpXSA9IC1sZXZlbFtpXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHplcm8gcnVucyAqLwotICAgICAgICBpZiAodG90YWxDb2VmZiA8IG1heE51bUNvZWZmKQotICAgICAgICB7Ci0gICAgICAgICAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LDkpOwotICAgICAgICAgICAgemVyb3NMZWZ0ID0gRGVjb2RlVG90YWxaZXJvcyhiaXQsIHRvdGFsQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikobWF4TnVtQ29lZmYgPT0gNCkpOwotICAgICAgICAgICAgaWYgKCF6ZXJvc0xlZnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBMRU5HVEgoemVyb3NMZWZ0KSk7Ci0gICAgICAgICAgICB6ZXJvc0xlZnQgPSBJTkZPKHplcm9zTGVmdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgemVyb3NMZWZ0ID0gMDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDb2VmZiAtIDE7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHplcm9zTGVmdCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCwxMSk7Ci0gICAgICAgICAgICAgICAgdG1wID0gRGVjb2RlUnVuQmVmb3JlKGJpdCwgemVyb3NMZWZ0KTsKLSAgICAgICAgICAgICAgICBpZiAoIXRtcCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgTEVOR1RIKHRtcCkpOwotICAgICAgICAgICAgICAgIHJ1bltpXSA9IElORk8odG1wKTsKLSAgICAgICAgICAgICAgICB6ZXJvc0xlZnQgLT0gcnVuW2ldKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcnVuW2ldID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbWJpbmluZyBsZXZlbCBhbmQgcnVuLCBsZXZlbFN1ZmZpeCB2YXJpYWJsZSB1c2VkIHRvIGhvbGQgY29lZmZNYXAsCi0gICAgICAgICAqIGkuZS4gYml0IG1hcCBpbmRpY2F0aW5nIHdoaWNoIGNvZWZmaWNpZW50cyBoYWQgbm9uLXplcm8gdmFsdWUuICovCi0KLSAgICAgICAgLypsaW50IC1lc3ltKDc3MSxsZXZlbCxydW4pIGxldmVsIGFuZCBydW4gYXJlIGFsd2F5cyBpbml0aWFsaXplZCAqLwotICAgICAgICB0bXAgPSB6ZXJvc0xlZnQ7Ci0gICAgICAgIGNvZWZmTGV2ZWxbdG1wXSA9IGxldmVsW3RvdGFsQ29lZmYtMV07Ci0gICAgICAgIGxldmVsU3VmZml4ID0gMSA8PCB0bXA7Ci0gICAgICAgIGZvciAoaSA9IHRvdGFsQ29lZmYtMTsgaS0tOykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wICs9IHJ1bltpXTsKLSAgICAgICAgICAgIGxldmVsU3VmZml4IHw9IDEgPDwgdG1wOwotICAgICAgICAgICAgY29lZmZMZXZlbFt0bXBdID0gbGV2ZWxbaV07Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGxldmVsU3VmZml4ID0gMDsKLQotICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzItYnVmZmVyQml0cykgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4oKHRvdGFsQ29lZmYgPDwgNCkgfCAobGV2ZWxTdWZmaXggPDwgMTYpKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzNTNkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfQ0FWTENfSAotI2RlZmluZSBIMjY0U1dERUNfQ0FWTENfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgaTMyICpjb2VmZkxldmVsLAotICBpMzIgbmMsCi0gIHUzMiBtYXhOdW1Db2VmZik7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NBVkxDX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFiYTVhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jZmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfQ0ZHX0gKLSNkZWZpbmUgSDI2NFNXREVDX0NGR19ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfTlVNX1JFRl9QSUNTIDE2Ci0jZGVmaW5lIE1BWF9OVU1fU0xJQ0VfR1JPVVBTIDgKLSNkZWZpbmUgTUFYX05VTV9TRVFfUEFSQU1fU0VUUyAzMgotI2RlZmluZSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTIDI1NgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19DRkdfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNjJlZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkQ29uY2VhbAotICAgICAgICAgIENvbmNlYWxNYgotICAgICAgICAgIFRyYW5zZm9ybQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfY29uY2VhbC5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfcmVjb25zdHJ1Y3QuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKmxpbnQgLWU3MDIgZGlzYWJsZSBsaW50IHdhcm5pbmcgb24gcmlnaHQgc2hpZnQgb2Ygc2lnbmVkIHF1YW50aXR5ICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBDb25jZWFsTWIobWJTdG9yYWdlX3QgKnBNYiwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgcm93LCB1MzIgY29sLAotICAgIHUzMiBzbGljZVR5cGUsIHU4ICpkYXRhKTsKLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtKGkzMiAqZGF0YSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkQ29uY2VhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZXJmb3JtIGVycm9yIGNvbmNlYWxtZW50IGZvciBhIHBpY3R1cmUuIFR3byB0eXBlcyBvZiBjb25jZWFsbWVudAotICAgICAgICAgICAgaXMgcGVyZm9ybWVkIGJhc2VkIG9uIHNsaWNlVHlwZToKLSAgICAgICAgICAgICAgICAxKSBjb3B5IGZyb20gcHJldmlvdXMgcGljdHVyZSBmb3IgUC1zbGljZXMuCi0gICAgICAgICAgICAgICAgMikgY29uY2VhbG1lbnQgZnJvbSBuZWlnaGJvdXIgcGl4ZWxzIGZvciBJLXNsaWNlcwotCi0gICAgICAgICAgICBJLXR5cGUgY29uY2VhbG1lbnQgaXMgYmFzZWQgb24gaWRlYXMgcHJlc2VudGVkIGJ5IEphcm5vIFR1bGtraS4KLSAgICAgICAgICAgIFRoZSBjb25jZWFsbWVudCBhbGdvcml0aG0gZGV0ZXJtaW5lcyBmcmVxdWVuY3kgZG9tYWluIGNvZWZmaWNpZW50cwotICAgICAgICAgICAgZnJvbSB0aGUgbmVpZ2hib3VyIHBpeGVscywgYXBwbGllcyBpbnRlZ2VyIHRyYW5zZm9ybSAodGhlIHNhbWUKLSAgICAgICAgICAgIHRyYW5zZm9ybSB1c2VkIGluIHRoZSByZXNpZHVhbCBwcm9jZXNzaW5nKSBhbmQgdXNlcyB0aGUgcmVzdWx0cyBhcwotICAgICAgICAgICAgcGl4ZWwgdmFsdWVzIGZvciBjb25jZWFsZWQgbWFjcm9ibG9ja3MuIFRyYW5zZm9ybSBwcm9kdWNlcyA0eDQKLSAgICAgICAgICAgIGFycmF5IGFuZCBvbmUgcGl4ZWwgdmFsdWUgaGFzIHRvIGJlIHVzZWQgZm9yIDR4NCBsdW1hIGJsb2NrcyBhbmQKLSAgICAgICAgICAgIDJ4MiBjaHJvbWEgYmxvY2tzLgotCi0gICAgICAgICAgICBTaW1pbGFyIGNvbmNlYWxtZW50IGlzIHBlcmZvcm1lZCBmb3Igd2hvbGUgcGljdHVyZSAodGhlIGNob2lzZQotICAgICAgICAgICAgb2YgdGhlIHR5cGUgaXMgYmFzZWQgb24gbGFzdCBzdWNjZXNzZnVsbHkgZGVjb2RlZCBzbGljZSBoZWFkZXIgb2YKLSAgICAgICAgICAgIHRoZSBwaWN0dXJlIGJ1dCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uKS4gSXQgaXMKLSAgICAgICAgICAgIGFja25vd2xlZGdlZCB0aGF0IHRoaXMgbWF5IHJlc3VsdCBpbiB3cm9uZyB0eXBlIG9mIGNvbmNlYWxtZW50Ci0gICAgICAgICAgICB3aGVuIGEgcGljdHVyZSBjb250YWlucyBib3RoIHR5cGVzIG9mIHNsaWNlcy4gSG93ZXZlciwKLSAgICAgICAgICAgIGRldGVybWluYXRpb24gb2Ygc2xpY2UgdHlwZSBtYWNyb2Jsb2NrLWJ5LW1hY3JvYmxvY2sgY2Fubm90Ci0gICAgICAgICAgICBiZSBkb25lIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8ga25vdyB0byB3aGljaAotICAgICAgICAgICAgc2xpY2UgZWFjaCBjb3JydXB0ZWQgKG5vdCBzdWNjZXNzZnVsbHkgZGVjb2RlZCkgbWFjcm9ibG9jawotICAgICAgICAgICAgYmVsb25ncy4KLQotICAgICAgICAgICAgVGhlIGVycm9yIGNvbmNlYWxtZW50IGlzIHN0YXJ0ZWQgYnkgc2VhcmNoaW5nIHRoZSBmaXJzdCBwcm9wb2VybHkKLSAgICAgICAgICAgIGRlY29kZWQgbWFjcm9ibG9jayBhbmQgY29uY2VhbGluZyB0aGUgcm93IGNvbnRhaW5pbmcgdGhlIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIGluIHF1ZXN0aW9uLiBBZnRlciB0aGF0IGFsbCBtYWNyb2Jsb2NrcyBhYm92ZSB0aGUgcm93IGluIHF1ZXN0aW9uCi0gICAgICAgICAgICBhcmUgY29uY2VhbGVkLiBGaW5hbGx5IGNvbmNlYWxtZW50IG9mIHJvd3MgYmVsb3cgaXMgcGVyZm9ybWVkLgotICAgICAgICAgICAgVGhlIG9yZGVyIG9mIGNvbmNlYWxtZW50IGZvciA0eDQgcGljdHVyZSB3aGVyZSBtYWNyb2Jsb2NrIDkgaXMgdGhlCi0gICAgICAgICAgICBmaXJzdCBwcm9wZXJseSBkZWNvZGVkIG9uZSBpcyBhcyBmb2xsb3dzIChwcm9wZXJseSBkZWNvZGVkCi0gICAgICAgICAgICBtYWNyb2Jsb2NrcyBtYXJrZWQgd2l0aCAneCcsIG51bWJlcnMgaW5kaWNhdGluZyB0aGUgb3JkZXIgb2YKLSAgICAgICAgICAgIGNvbmNlYWxtZW50KToKLQotICAgICAgICAgICAgICAgNCAgNiAgOCAxMAotICAgICAgICAgICAgICAgMyAgNSAgNyAgOQotICAgICAgICAgICAgICAgMSAgeCAgeCAgMgotICAgICAgICAgICAgICAxMSAxMiAxMyAxNAotCi0gICAgICAgICAgICBJZiBhbGwgbWFjcm9ibG9ja3Mgb2YgdGhlIHBpY3R1cmUgYXJlIGxvc3QsIHRoZSBjb25jZWFsbWVudCBpcwotICAgICAgICAgICAgY29weSBvZiBwcmV2aW91cyBwaWN0dXJlIGZvciBQLXR5cGUgYW5kIHNldHRpbmcgdGhlIGltYWdlIHRvCi0gICAgICAgICAgICBjb25zdGFudCBncmF5IChwaXhlbCB2YWx1ZSAxMjgpIGZvciBJLXR5cGUuCi0KLSAgICAgICAgICAgIENvbmNlYWxtZW50IHNldHMgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY29uY2VhbGVkCi0gICAgICAgICAgICBtYWNyb2Jsb2NrcyB0byB2YWx1ZSA0MCBhbmQgbWFjcm9ibG9jayB0eXBlIHRvIGludHJhIHRvIGVuYWJsZQotICAgICAgICAgICAgZGVibG9ja2luZyBmaWx0ZXIgdG8gc21vb3RoIHRoZSBlZGdlcyBvZiB0aGUgY29uY2VhbGVkIGFyZWFzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgcG9pbnRlciB0byBjdXJyZW50IGltYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgc2xpY2VUeXBlICAgICAgIHR5cGUgb2YgdGhlIHNsaWNlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBjb25jZWFsZWQgbWFjcm9ibG9ja3Mgd2lsbCBiZSB3cml0dGVuIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ29uY2VhbChzdG9yYWdlX3QgKnBTdG9yYWdlLCBpbWFnZV90ICpjdXJySW1hZ2UsIHUzMiBzbGljZVR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGo7Ci0gICAgdTMyIHJvdywgY29sOwotICAgIHUzMiB3aWR0aCwgaGVpZ2h0OwotICAgIHU4ICpyZWZEYXRhOwotICAgIG1iU3RvcmFnZV90ICptYjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLSAgICBBU1NFUlQoY3VyckltYWdlKTsKLQotICAgIERFQlVHKCgiQ29uY2VhbGluZyAlcyBzbGljZVxuIiwgSVNfSV9TTElDRShzbGljZVR5cGUpID8KLSAgICAgICAgICAgICJpbnRyYSIgOiAiaW50ZXIiKSk7Ci0KLSAgICB3aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7Ci0gICAgcmVmRGF0YSA9IE5VTEw7Ci0gICAgLyogdXNlIHJlZmVyZW5jZSBwaWN0dXJlIHdpdGggc21hbGxlc3QgYXZhaWxhYmxlIGluZGV4ICovCi0gICAgaWYgKElTX1BfU0xJQ0Uoc2xpY2VUeXBlKSB8fCAocFN0b3JhZ2UtPmludHJhQ29uY2VhbG1lbnRGbGFnICE9IDApKQotICAgIHsKLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZkRhdGEgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShwU3RvcmFnZS0+ZHBiLCBpKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIGlmIChpID49IDE2KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IHdoaWxlIChyZWZEYXRhID09IE5VTEwpOwotICAgIH0KLQotICAgIGkgPSByb3cgPSBjb2wgPSAwOwotICAgIC8qIGZpbmQgZmlyc3QgcHJvcGVybHkgZGVjb2RlZCBtYWNyb2Jsb2NrIC0+IHN0YXJ0IHBvaW50IGZvciBjb25jZWFsbWVudCAqLwotICAgIHdoaWxlIChpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyAmJiAhcFN0b3JhZ2UtPm1iW2ldLmRlY29kZWQpCi0gICAgewotICAgICAgICBpKys7Ci0gICAgICAgIGNvbCsrOwotICAgICAgICBpZiAoY29sID09IHdpZHRoKQotICAgICAgICB7Ci0gICAgICAgICAgICByb3crKzsKLSAgICAgICAgICAgIGNvbCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB3aG9sZSBwaWN0dXJlIGxvc3QgLT4gY29weSBwcmV2aW91cyBvciBzZXQgZ3JleSAqLwotICAgIGlmIChpID09IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCi0gICAgewotICAgICAgICBpZiAoIChJU19JX1NMSUNFKHNsaWNlVHlwZSkgJiYgKHBTdG9yYWdlLT5pbnRyYUNvbmNlYWxtZW50RmxhZyA9PSAwKSkgfHwKLSAgICAgICAgICAgICByZWZEYXRhID09IE5VTEwpCi0gICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoY3VyckltYWdlLT5kYXRhLCAxMjgsIHdpZHRoKmhlaWdodCozODQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBIMjY0U3dEZWNNZW1jcHkoY3VyckltYWdlLT5kYXRhLCByZWZEYXRhLCB3aWR0aCpoZWlnaHQqMzg0KTsKLQotICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzID0gcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsKLQotICAgICAgICAvKiBubyBmaWx0ZXJpbmcgaWYgd2hvbGUgcGljdHVyZSBjb25jZWFsZWQgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7IGkrKykKLSAgICAgICAgICAgIHBTdG9yYWdlLT5tYltpXS5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IDE7Ci0KLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotCi0gICAgLyogc3RhcnQgZnJvbSB0aGUgcm93IGNvbnRhaW5pbmcgdGhlIGZpcnN0IGNvcnJlY3QgbWFjcm9ibG9jaywgY29uY2VhbCB0aGUKLSAgICAgKiByb3cgaW4gcXVlc3Rpb24sIGFsbCByb3dzIGFib3ZlIHRoYXQgcm93IGFuZCB0aGVuIGNvbnRpbnVlIGRvd253YXJkcyAqLwotICAgIG1iID0gcFN0b3JhZ2UtPm1iICsgcm93ICogd2lkdGg7Ci0gICAgZm9yIChqID0gY29sOyBqLS07KQotICAgIHsKLSAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgcm93LCBqLCBzbGljZVR5cGUsIHJlZkRhdGEpOwotICAgICAgICBtYltqXS5kZWNvZGVkID0gMTsKLSAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOwotICAgIH0KLSAgICBmb3IgKGogPSBjb2wgKyAxOyBqIDwgd2lkdGg7IGorKykKLSAgICB7Ci0gICAgICAgIGlmICghbWJbal0uZGVjb2RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgcm93LCBqLCBzbGljZVR5cGUsIHJlZkRhdGEpOwotICAgICAgICAgICAgbWJbal0uZGVjb2RlZCA9IDE7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogaWYgcHJldmlvdXMgcm93KHMpIGNvdWxkIG5vdCBiZSBjb25jZWFsZWQgLT4gY29uY2VhbCB0aGVtIG5vdyAqLwotICAgIGlmIChyb3cpCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaSA9IHJvdyAtIDE7Ci0gICAgICAgICAgICBtYiA9IHBTdG9yYWdlLT5tYiArIGkqd2lkdGggKyBqOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25jZWFsTWIobWIsIGN1cnJJbWFnZSwgaSwgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKLSAgICAgICAgICAgICAgICBtYi0+ZGVjb2RlZCA9IDE7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOwotICAgICAgICAgICAgICAgIG1iIC09IHdpZHRoOwotICAgICAgICAgICAgfSB3aGlsZShpLS0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcHJvY2VzcyByb3dzIGJlbG93IHRoZSBvbmUgY29udGFpbmluZyB0aGUgZmlyc3QgY29ycmVjdCBtYWNyb2Jsb2NrICovCi0gICAgZm9yIChpID0gcm93ICsgMTsgaSA8IGhlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgbWIgPSBwU3RvcmFnZS0+bWIgKyBpICogd2lkdGg7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghbWJbal0uZGVjb2RlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25jZWFsTWIobWIraiwgY3VyckltYWdlLCBpLCBqLCBzbGljZVR5cGUsIHJlZkRhdGEpOwotICAgICAgICAgICAgICAgIG1iW2pdLmRlY29kZWQgPSAxOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogQ29uY2VhbE1iCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlcmZvcm0gZXJyb3IgY29uY2VhbG1lbnQgZm9yIG9uZSBtYWNyb2Jsb2NrLCBsb2NhdGlvbiBvZiB0aGUKLSAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIHBpY3R1cmUgaW5kaWNhdGVkIGJ5IHJvdyBhbmQgY29sCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBDb25jZWFsTWIobWJTdG9yYWdlX3QgKnBNYiwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgcm93LCB1MzIgY29sLAotICAgIHUzMiBzbGljZVR5cGUsIHU4ICpyZWZEYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqLCBjb21wOwotICAgIHUzMiBob3IsIHZlcjsKLSAgICB1MzIgbWJOdW07Ci0gICAgdTMyIHdpZHRoLCBoZWlnaHQ7Ci0gICAgdTggKm1iUG9zOwotICAgIHU4IGRhdGFbMzg0XTsKLSAgICB1OCAqcERhdGE7Ci0gICAgaTMyIHRtcDsKLSAgICBpMzIgZmlyc3RQaGFzZVsxNl07Ci0gICAgaTMyICpwVG1wOwotICAgIC8qIG5laWdoYm91cnMgYWJvdmUsIGJlbG93LCBsZWZ0IGFuZCByaWdodCAqLwotICAgIGkzMiBhWzRdID0geyAwLDAsMCwwIH0sIGJbNF0sIGxbNF0gPSB7IDAsMCwwLDAgfSwgcls0XTsKLSAgICB1MzIgQSwgQiwgTCwgUjsKLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKLSAgICB1OCAqcEZpbGw7Ci0jZW5kaWYKLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVCghcE1iLT5kZWNvZGVkKTsKLSAgICBBU1NFUlQoY3VyckltYWdlKTsKLSAgICBBU1NFUlQoY29sIDwgY3VyckltYWdlLT53aWR0aCk7Ci0gICAgQVNTRVJUKHJvdyA8IGN1cnJJbWFnZS0+aGVpZ2h0KTsKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICBwRmlsbCA9IEFMSUdOKGZpbGxCdWZmLCAxNik7Ci0jZW5kaWYKLSAgICB3aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7Ci0gICAgbWJOdW0gPSByb3cgKiB3aWR0aCArIGNvbDsKLQotICAgIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGN1cnJJbWFnZSwgbWJOdW0pOwotCi0gICAgbWJQb3MgPSBjdXJySW1hZ2UtPmRhdGEgKyByb3cgKiAxNiAqIHdpZHRoICogMTYgKyBjb2wgKiAxNjsKLSAgICBBID0gQiA9IEwgPSBSID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgLyogc2V0IHFwWSB0byA0MCB0byBlbmFibGUgc29tZSBmaWx0ZXJpbmcgaW4gZGVibG9ja2luZyAoc3RldHNvbiB2YWx1ZSkgKi8KLSAgICBwTWItPnFwWSA9IDQwOwotICAgIHBNYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAwOwotICAgIC8qIG1iVHlwZSBzZXQgdG8gaW50cmEgdG8gcGVyZm9ybSBmaWx0ZXJpbmcgZGVzcGl0ZSB0aGUgdmFsdWVzIG9mIG90aGVyCi0gICAgICogYm91bmRhcnkgc3RyZW5ndGggZGV0ZXJtaW5hdGlvbiBmaWVsZHMgKi8KLSAgICBwTWItPm1iVHlwZSA9IElfNHg0OwotICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QSA9IDA7Ci0gICAgcE1iLT5maWx0ZXJPZmZzZXRCID0gMDsKLSAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQgPSAwOwotCi0gICAgaWYgKElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSkKLSAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbXZfdCBtdiA9IHswLDB9OwotICAgICAgICBpbWFnZV90IHJlZkltYWdlOwotICAgICAgICByZWZJbWFnZS53aWR0aCA9IHdpZHRoOwotICAgICAgICByZWZJbWFnZS5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHJlZkltYWdlLmRhdGEgPSByZWZEYXRhOwotICAgICAgICBpZiAocmVmSW1hZ2UuZGF0YSkKLSAgICAgICAgewotI2lmbmRlZiBIMjY0REVDX09NWERMCi0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgJm12LCAmcmVmSW1hZ2UsIGNvbCoxNiwgcm93KjE2LAotICAgICAgICAgICAgICAgIDAsIDAsIDE2LCAxNik7Ci0jZWxzZQotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsICZtdiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAoKHJvdyoxNikgKyAoKGNvbCoxNik8PDE2KSksCi0gICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTAsIHBGaWxsKTsKLSNlbmRpZgotICAgICAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOwotCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9Ci0KLSAgICBIMjY0U3dEZWNNZW1zZXQoZmlyc3RQaGFzZSwgMCwgc2l6ZW9mKGZpcnN0UGhhc2UpKTsKLQotICAgIC8qIGNvdW50ZXIgZm9yIG51bWJlciBvZiBuZWlnaGJvdXJzIHVzZWQgKi8KLSAgICBqID0gMDsKLSAgICBob3IgPSB2ZXIgPSAwOwotICAgIGlmIChyb3cgJiYgKHBNYi13aWR0aCktPmRlY29kZWQpCi0gICAgewotICAgICAgICBBID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIHBEYXRhID0gbWJQb3MgLSB3aWR0aCoxNjsKLSAgICAgICAgYVswXSA9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOwotICAgICAgICBhWzFdID0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7Ci0gICAgICAgIGFbMl0gPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsKLSAgICAgICAgYVszXSA9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOwotICAgICAgICBqKys7Ci0gICAgICAgIGhvcisrOwotICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGFbMF0gKyBhWzFdICsgYVsyXSArIGFbM107Ci0gICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYVswXSArIGFbMV0gLSBhWzJdIC0gYVszXTsKLSAgICB9Ci0gICAgaWYgKChyb3cgIT0gaGVpZ2h0IC0gMSkgJiYgKHBNYit3aWR0aCktPmRlY29kZWQpCi0gICAgewotICAgICAgICBCID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIHBEYXRhID0gbWJQb3MgKyAxNip3aWR0aCoxNjsKLSAgICAgICAgYlswXSA9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOwotICAgICAgICBiWzFdID0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7Ci0gICAgICAgIGJbMl0gPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsKLSAgICAgICAgYlszXSA9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOwotICAgICAgICBqKys7Ci0gICAgICAgIGhvcisrOwotICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGJbMF0gKyBiWzFdICsgYlsyXSArIGJbM107Ci0gICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYlswXSArIGJbMV0gLSBiWzJdIC0gYlszXTsKLSAgICB9Ci0gICAgaWYgKGNvbCAmJiAocE1iLTEpLT5kZWNvZGVkKQotICAgIHsKLSAgICAgICAgTCA9IEhBTlRST19UUlVFOwotICAgICAgICBwRGF0YSA9IG1iUG9zIC0gMTsKLSAgICAgICAgbFswXSA9IHBEYXRhWzBdOyBsWzBdICs9IHBEYXRhWzE2KndpZHRoXTsKLSAgICAgICAgbFswXSArPSBwRGF0YVszMip3aWR0aF07IGxbMF0gKz0gcERhdGFbNDgqd2lkdGhdOwotICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKLSAgICAgICAgbFsxXSA9IHBEYXRhWzBdOyBsWzFdICs9IHBEYXRhWzE2KndpZHRoXTsKLSAgICAgICAgbFsxXSArPSBwRGF0YVszMip3aWR0aF07IGxbMV0gKz0gcERhdGFbNDgqd2lkdGhdOwotICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKLSAgICAgICAgbFsyXSA9IHBEYXRhWzBdOyBsWzJdICs9IHBEYXRhWzE2KndpZHRoXTsKLSAgICAgICAgbFsyXSArPSBwRGF0YVszMip3aWR0aF07IGxbMl0gKz0gcERhdGFbNDgqd2lkdGhdOwotICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKLSAgICAgICAgbFszXSA9IHBEYXRhWzBdOyBsWzNdICs9IHBEYXRhWzE2KndpZHRoXTsKLSAgICAgICAgbFszXSArPSBwRGF0YVszMip3aWR0aF07IGxbM10gKz0gcERhdGFbNDgqd2lkdGhdOwotICAgICAgICBqKys7Ci0gICAgICAgIHZlcisrOwotICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGxbMF0gKyBsWzFdICsgbFsyXSArIGxbM107Ci0gICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gbFswXSArIGxbMV0gLSBsWzJdIC0gbFszXTsKLSAgICB9Ci0gICAgaWYgKChjb2wgIT0gd2lkdGggLSAxKSAmJiAocE1iKzEpLT5kZWNvZGVkKQotICAgIHsKLSAgICAgICAgUiA9IEhBTlRST19UUlVFOwotICAgICAgICBwRGF0YSA9IG1iUG9zICsgMTY7Ci0gICAgICAgIHJbMF0gPSBwRGF0YVswXTsgclswXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIHJbMF0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzBdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIHJbMV0gPSBwRGF0YVswXTsgclsxXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIHJbMV0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzFdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIHJbMl0gPSBwRGF0YVswXTsgclsyXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIHJbMl0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzJdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIHJbM10gPSBwRGF0YVswXTsgclszXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIHJbM10gKz0gcERhdGFbMzIqd2lkdGhdOyByWzNdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgaisrOwotICAgICAgICB2ZXIrKzsKLSAgICAgICAgZmlyc3RQaGFzZVswXSArPSByWzBdICsgclsxXSArIHJbMl0gKyByWzNdOwotICAgICAgICBmaXJzdFBoYXNlWzRdICs9IHJbMF0gKyByWzFdIC0gclsyXSAtIHJbM107Ci0gICAgfQotCi0gICAgLyogYXQgbGVhc3Qgb25lIHByb3Blcmx5IGRlY29kZWQgbmVpZ2hib3VyIGF2YWlsYWJsZSAqLwotICAgIEFTU0VSVChqKTsKLQotICAgIC8qbGludCAtZXN5bSg2NDQsbCxyLGEsYikgdmFyaWFibGUgaW5pdGlhbGl6ZWQgYWJvdmUgKi8KLSAgICBpZiAoIWhvciAmJiBMICYmIFIpCi0gICAgICAgIGZpcnN0UGhhc2VbMV0gPSAobFswXStsWzFdK2xbMl0rbFszXS1yWzBdLXJbMV0tclsyXS1yWzNdKSA+PiA1OwotICAgIGVsc2UgaWYgKGhvcikKLSAgICAgICAgZmlyc3RQaGFzZVsxXSA+Pj0gKDMraG9yKTsKLQotICAgIGlmICghdmVyICYmIEEgJiYgQikKLSAgICAgICAgZmlyc3RQaGFzZVs0XSA9IChhWzBdK2FbMV0rYVsyXSthWzNdLWJbMF0tYlsxXS1iWzJdLWJbM10pID4+IDU7Ci0gICAgZWxzZSBpZiAodmVyKQotICAgICAgICBmaXJzdFBoYXNlWzRdID4+PSAoMyt2ZXIpOwotCi0gICAgc3dpdGNoIChqKQotICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSAoZmlyc3RQaGFzZVswXSo0LzMpPj42ICovCi0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdID0gKDIxICogZmlyc3RQaGFzZVswXSkgPj4gMTA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiA0ICovCi0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0KLQotICAgIFRyYW5zZm9ybShmaXJzdFBoYXNlKTsKLQotICAgIGZvciAoaSA9IDAsIHBEYXRhID0gZGF0YSwgcFRtcCA9IGZpcnN0UGhhc2U7IGkgPCAyNTY7KQotICAgIHsKLSAgICAgICAgdG1wID0gcFRtcFsoaSAmIDB4Rik+PjJdOwotICAgICAgICAvKmxpbnQgLWU3MzQgQ0xJUDEgbWFjcm8gcmVzdWx0cyBpbiB2YWx1ZSB0aGF0IGZpdHMgaW50byA4IGJpdHMgKi8KLSAgICAgICAgKnBEYXRhKysgPSBDTElQMSh0bXApOwotICAgICAgICAvKmxpbnQgK2U3MzQgKi8KLQotICAgICAgICBpKys7Ci0gICAgICAgIGlmICghKGkgJiAweDNGKSkKLSAgICAgICAgICAgIHBUbXAgKz0gNDsKLSAgICB9Ci0KLSAgICAvKiBjaHJvbWEgY29tcG9uZW50cyAqLwotICAgIG1iUG9zID0gY3VyckltYWdlLT5kYXRhICsgd2lkdGggKiBoZWlnaHQgKiAyNTYgKwotICAgICAgIHJvdyAqIDggKiB3aWR0aCAqIDggKyBjb2wgKiA4OwotICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCAyOyBjb21wKyspCi0gICAgewotCi0gICAgICAgIEgyNjRTd0RlY01lbXNldChmaXJzdFBoYXNlLCAwLCBzaXplb2YoZmlyc3RQaGFzZSkpOwotCi0gICAgICAgIC8qIGNvdW50ZXIgZm9yIG51bWJlciBvZiBuZWlnaGJvdXJzIHVzZWQgKi8KLSAgICAgICAgaiA9IDA7Ci0gICAgICAgIGhvciA9IHZlciA9IDA7Ci0gICAgICAgIGlmIChBKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGF0YSA9IG1iUG9zIC0gd2lkdGgqODsKLSAgICAgICAgICAgIGFbMF0gPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGFbMV0gPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGFbMl0gPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGFbM10gPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIGhvcisrOwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSBhWzBdICsgYVsxXSArIGFbMl0gKyBhWzNdOwotICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBhWzBdICsgYVsxXSAtIGFbMl0gLSBhWzNdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGF0YSA9IG1iUG9zICsgOCp3aWR0aCo4OwotICAgICAgICAgICAgYlswXSA9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOwotICAgICAgICAgICAgYlsxXSA9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOwotICAgICAgICAgICAgYlsyXSA9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOwotICAgICAgICAgICAgYlszXSA9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOwotICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgaG9yKys7Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGJbMF0gKyBiWzFdICsgYlsyXSArIGJbM107Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGJbMF0gKyBiWzFdIC0gYlsyXSAtIGJbM107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgLSAxOwotICAgICAgICAgICAgbFswXSA9IHBEYXRhWzBdOyBsWzBdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7Ci0gICAgICAgICAgICBsWzFdID0gcERhdGFbMF07IGxbMV0gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKLSAgICAgICAgICAgIGxbMl0gPSBwRGF0YVswXTsgbFsyXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOwotICAgICAgICAgICAgbFszXSA9IHBEYXRhWzBdOyBsWzNdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgdmVyKys7Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGxbMF0gKyBsWzFdICsgbFsyXSArIGxbM107Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzRdICs9IGxbMF0gKyBsWzFdIC0gbFsyXSAtIGxbM107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgKyA4OwotICAgICAgICAgICAgclswXSA9IHBEYXRhWzBdOyByWzBdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7Ci0gICAgICAgICAgICByWzFdID0gcERhdGFbMF07IHJbMV0gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKLSAgICAgICAgICAgIHJbMl0gPSBwRGF0YVswXTsgclsyXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOwotICAgICAgICAgICAgclszXSA9IHBEYXRhWzBdOyByWzNdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgdmVyKys7Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IHJbMF0gKyByWzFdICsgclsyXSArIHJbM107Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzRdICs9IHJbMF0gKyByWzFdIC0gclsyXSAtIHJbM107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFob3IgJiYgTCAmJiBSKQotICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSA9IChsWzBdK2xbMV0rbFsyXStsWzNdLXJbMF0tclsxXS1yWzJdLXJbM10pID4+IDQ7Ci0gICAgICAgIGVsc2UgaWYgKGhvcikKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gPj49ICgyK2hvcik7Ci0KLSAgICAgICAgaWYgKCF2ZXIgJiYgQSAmJiBCKQotICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSA9IChhWzBdK2FbMV0rYVsyXSthWzNdLWJbMF0tYlsxXS1iWzJdLWJbM10pID4+IDQ7Ci0gICAgICAgIGVsc2UgaWYgKHZlcikKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gPj49ICgyK3Zlcik7Ci0KLSAgICAgICAgc3dpdGNoIChqKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSAoZmlyc3RQaGFzZVswXSo0LzMpPj41ICovCi0gICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA9ICgyMSAqIGZpcnN0UGhhc2VbMF0pID4+IDk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qIDQgKi8KLSAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIH0KLQotICAgICAgICBUcmFuc2Zvcm0oZmlyc3RQaGFzZSk7Ci0KLSAgICAgICAgcERhdGEgPSBkYXRhICsgMjU2ICsgY29tcCo2NDsKLSAgICAgICAgZm9yIChpID0gMCwgcFRtcCA9IGZpcnN0UGhhc2U7IGkgPCA2NDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IHBUbXBbKGkgJiAweDcpPj4xXTsKLSAgICAgICAgICAgIC8qbGludCAtZTczNCBDTElQMSBtYWNybyByZXN1bHRzIGluIHZhbHVlIHRoYXQgZml0cyBpbnRvIDggYml0cyAqLwotICAgICAgICAgICAgKnBEYXRhKysgPSBDTElQMSh0bXApOwotICAgICAgICAgICAgLypsaW50ICtlNzM0ICovCi0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIGlmICghKGkgJiAweEYpKQotICAgICAgICAgICAgICAgIHBUbXAgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGluY3JlbWVudCBwb2ludGVycyBmb3IgY3IgKi8KLSAgICAgICAgbWJQb3MgKz0gd2lkdGggKiBoZWlnaHQgKiA2NDsKLSAgICB9Ci0KLSAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBUcmFuc2Zvcm0KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU2ltcGxpZmllZCB0cmFuc2Zvcm0sIGFzc3VtaW5nIHRoYXQgb25seSBkYyBjb21wb25lbnQgYW5kIGxvd2VzdAotICAgICAgICAgICAgaG9yaXpvbnRhbCBhbmQgbG93ZXN0IHZlcnRpY2FsIGNvbXBvbmVudCBtYXkgYmUgbm9uLXplcm8KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBUcmFuc2Zvcm0oaTMyICpkYXRhKQotewotCi0gICAgdTMyIGNvbDsKLSAgICBpMzIgdG1wMCwgdG1wMTsKLQotICAgIGlmICghZGF0YVsxXSAmJiAhZGF0YVs0XSkKLSAgICB7Ci0gICAgICAgIGRhdGFbMV0gID0gZGF0YVsyXSAgPSBkYXRhWzNdICA9IGRhdGFbNF0gID0gZGF0YVs1XSAgPQotICAgICAgICBkYXRhWzZdICA9IGRhdGFbN10gID0gZGF0YVs4XSAgPSBkYXRhWzldICA9IGRhdGFbMTBdID0KLSAgICAgICAgZGF0YVsxMV0gPSBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9IGRhdGFbMF07Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLyogZmlyc3QgaG9yaXpvbnRhbCB0cmFuc2Zvcm0gZm9yIHJvd3MgMCBhbmQgMSAqLwotICAgIHRtcDAgPSBkYXRhWzBdOwotICAgIHRtcDEgPSBkYXRhWzFdOwotICAgIGRhdGFbMF0gPSB0bXAwICsgdG1wMTsKLSAgICBkYXRhWzFdID0gdG1wMCArICh0bXAxPj4xKTsKLSAgICBkYXRhWzJdID0gdG1wMCAtICh0bXAxPj4xKTsKLSAgICBkYXRhWzNdID0gdG1wMCAtIHRtcDE7Ci0KLSAgICB0bXAwID0gZGF0YVs0XTsKLSAgICBkYXRhWzVdID0gdG1wMDsKLSAgICBkYXRhWzZdID0gdG1wMDsKLSAgICBkYXRhWzddID0gdG1wMDsKLQotICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtICovCi0gICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQotICAgIHsKLSAgICAgICAgdG1wMCA9IGRhdGFbMF07Ci0gICAgICAgIHRtcDEgPSBkYXRhWzRdOwotICAgICAgICBkYXRhWzBdID0gdG1wMCArIHRtcDE7Ci0gICAgICAgIGRhdGFbNF0gPSB0bXAwICsgKHRtcDE+PjEpOwotICAgICAgICBkYXRhWzhdID0gdG1wMCAtICh0bXAxPj4xKTsKLSAgICAgICAgZGF0YVsxMl0gPSB0bXAwIC0gdG1wMTsKLSAgICB9Ci0KLX0KLS8qbGludCArZTcwMiAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzNDY3MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19DT05DRUFMX0gKLSNkZWZpbmUgSDI2NFNXREVDX0NPTkNFQUxfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ29uY2VhbChzdG9yYWdlX3QgKnBTdG9yYWdlLCBpbWFnZV90ICpjdXJySW1hZ2UsIHUzMiBzbGljZVR5cGUpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19DT05DRUFMX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbnRhaW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbnRhaW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI3NGEwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfQ09OVEFJTkVSX0gKLSNkZWZpbmUgSDI2NFNXREVDX0NPTlRBSU5FUl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogU3RyaW5nIGxlbmd0aCBmb3IgdHJhY2luZyAqLwotI2RlZmluZSBIMjY0REVDX1RSQUNFX1NUUl9MRU4gMTAwCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBlbnVtIHsKLSAgICAgICAgVU5JTklUSUFMSVpFRCwKLSAgICAgICAgSU5JVElBTElaRUQsCi0gICAgICAgIE5FV19IRUFERVJTCi0gICAgfSBkZWNTdGF0OwotCi0gICAgdTMyIHBpY051bWJlcjsKLSAgICBzdG9yYWdlX3Qgc3RvcmFnZTsKLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgY2hhciBzdHJbSDI2NERFQ19UUkFDRV9TVFJfTEVOXTsKLSNlbmRpZgotfSBkZWNDb250YWluZXJfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ERUNDT05UQUlORVJfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjMWY3Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEZpbHRlclBpY3R1cmUKLSAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZQotICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlCi0gICAgICAgICAgRmlsdGVySG9yTHVtYQotICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UKLSAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlCi0gICAgICAgICAgRmlsdGVySG9yQ2hyb21hCi0gICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoCi0gICAgICAgICAgRWRnZUJvdW5kYXJ5U3RyZW5ndGgKLSAgICAgICAgICBHZXRCb3VuZGFyeVN0cmVuZ3RocwotICAgICAgICAgIElzU2xpY2VCb3VuZGFyeU9uTGVmdAotICAgICAgICAgIElzU2xpY2VCb3VuZGFyeU9uVG9wCi0gICAgICAgICAgR2V0TWJGaWx0ZXJpbmdGbGFncwotICAgICAgICAgIEdldEx1bWFFZGdlVGhyZXNob2xkcwotICAgICAgICAgIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCi0gICAgICAgICAgRmlsdGVyTHVtYQotICAgICAgICAgIEZpbHRlckNocm9tYQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6Ci0gKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKLSAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKLSAqLwotLypsaW50IC1lNzAxIC1lNzAyICovCi0KLS8qIGFycmF5IG9mIGFscGhhIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQgKi8KLXN0YXRpYyBjb25zdCB1OCBhbHBoYXNbNTJdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCw0LDUsNiw3LDgsOSwxMCwKLSAgICAxMiwxMywxNSwxNywyMCwyMiwyNSwyOCwzMiwzNiw0MCw0NSw1MCw1Niw2Myw3MSw4MCw5MCwxMDEsMTEzLDEyNywxNDQsMTYyLAotICAgIDE4MiwyMDMsMjI2LDI1NSwyNTV9OwotCi0vKiBhcnJheSBvZiBiZXRhIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQgKi8KLXN0YXRpYyBjb25zdCB1OCBiZXRhc1s1Ml0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMiwzLDMsMywzLDQsNCwKLSAgICA0LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOH07Ci0KLQotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLS8qIGFycmF5IG9mIHRjMCB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkLCBlYWNoIHRyaXBsZXQgY29ycmVzcG9uZHMgdG8gYQotICogY29sdW1uIGluIHRoZSB0YWJsZS4gSW5kZXhpbmcgZ29lcyBhcyB0YzBbaW5kZXhBXVtiUy0xXSAqLwotc3RhdGljIGNvbnN0IHU4IHRjMFs1Ml1bM10gPSB7Ci0gICAgezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LAotICAgIHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSwKLSAgICB7MCwwLDB9LHswLDAsMX0sezAsMCwxfSx7MCwwLDF9LHswLDAsMX0sezAsMSwxfSx7MCwxLDF9LHsxLDEsMX0sCi0gICAgezEsMSwxfSx7MSwxLDF9LHsxLDEsMX0sezEsMSwyfSx7MSwxLDJ9LHsxLDEsMn0sezEsMSwyfSx7MSwyLDN9LAotICAgIHsxLDIsM30sezIsMiwzfSx7MiwyLDR9LHsyLDMsNH0sezIsMyw0fSx7MywzLDV9LHszLDQsNn0sezMsNCw2fSwKLSAgICB7NCw1LDd9LHs0LDUsOH0sezQsNiw5fSx7NSw3LDEwfSx7Niw4LDExfSx7Niw4LDEzfSx7NywxMCwxNH0sezgsMTEsMTZ9LAotICAgIHs5LDEyLDE4fSx7MTAsMTMsMjB9LHsxMSwxNSwyM30sezEzLDE3LDI1fQotfTsKLSNlbHNlCi0vKiBhcnJheSBvZiB0YzAgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCwgZWFjaCB0cmlwbGV0IGNvcnJlc3BvbmRzIHRvIGEKLSAqIGNvbHVtbiBpbiB0aGUgdGFibGUuIEluZGV4aW5nIGdvZXMgYXMgdGMwW2luZGV4QV1bYlNdICovCi1zdGF0aWMgY29uc3QgdTggdGMwWzUyXVs1XSA9IHsKLSAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCi0gICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAotICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKLSAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCi0gICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMSwgMH0sIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDAsIDEsIDB9LAotICAgIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDEsIDEsIDB9LCB7MCwgMCwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwKLSAgICB7MCwgMSwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwgezAsIDEsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMiwgMH0sCi0gICAgezAsIDEsIDEsIDIsIDB9LCB7MCwgMSwgMSwgMiwgMH0sIHswLCAxLCAxLCAyLCAwfSwgezAsIDEsIDIsIDMsIDB9LAotICAgIHswLCAxLCAyLCAzLCAwfSwgezAsIDIsIDIsIDMsIDB9LCB7MCwgMiwgMiwgNCwgMH0sIHswLCAyLCAzLCA0LCAwfSwKLSAgICB7MCwgMiwgMywgNCwgMH0sIHswLCAzLCAzLCA1LCAwfSwgezAsIDMsIDQsIDYsIDB9LCB7MCwgMywgNCwgNiwgMH0sCi0gICAgezAsIDQsIDUsIDcsIDB9LCB7MCwgNCwgNSwgOCwgMH0sIHswLCA0LCA2LCA5LCAwfSwgezAsIDUsIDcsIDEwLCAwfSwKLSAgICB7MCwgNiwgOCwgMTEsIDB9LCB7MCwgNiwgOCwgMTMsIDB9LCB7MCwgNywgMTAsIDE0LCAwfSwKLSAgICB7MCwgOCwgMTEsIDE2LCAwfSwgezAsIDksIDEyLCAxOCwgMH0sIHswLCAxMCwgMTMsIDIwLCAwfSwKLSAgICB7MCwgMTEsIDE1LCAyMywgMH0sIHswLCAxMywgMTcsIDI1LCAwfQotfTsKLSNlbmRpZgotCi0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotLyogbWFwcGluZyBvZiByYXN0ZXIgc2NhbiBibG9jayBpbmRleCB0byA0eDQgYmxvY2sgaW5kZXggKi8KLXN0YXRpYyBjb25zdCB1MzIgbWI0eDRJbmRleFsxNl0gPQotICAgIHswLCAxLCA0LCA1LCAyLCAzLCA2LCA3LCA4LCA5LCAxMiwgMTMsIDEwLCAxMSwgMTQsIDE1fTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IHU4ICp0YzA7Ci0gICAgdTMyIGFscGhhOwotICAgIHUzMiBiZXRhOwotfSBlZGdlVGhyZXNob2xkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MzIgdG9wOwotICAgIHUzMiBsZWZ0OwotfSBiU190OwotCi1lbnVtIHsgVE9QID0gMCwgTEVGVCA9IDEsIElOTkVSID0gMiB9OwotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotI2RlZmluZSBGSUxURVJfTEVGVF9FREdFICAgIDB4MDQKLSNkZWZpbmUgRklMVEVSX1RPUF9FREdFICAgICAweDAyCi0jZGVmaW5lIEZJTFRFUl9JTk5FUl9FREdFICAgMHgwMQotCi0KLS8qIGNsaXBwaW5nIHRhYmxlIGRlZmluZWQgaW4gaW50cmFfcHJlZGljdGlvbi5jICovCi1leHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaTEsIHUzMiBpMik7Ci0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyLAotICAgIHUzMiBpMSwgdTMyIGkyKTsKLSNlbHNlCi1zdGF0aWMgdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aDIobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGkxLCB1MzIgaTIpOwotc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMik7Ci1zdGF0aWMgdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpOwotI2VuZGlmCi0KLXN0YXRpYyB1MzIgSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iU3RvcmFnZV90ICptYik7Ci0KLXN0YXRpYyB1MzIgSXNTbGljZUJvdW5kYXJ5T25Ub3AobWJTdG9yYWdlX3QgKm1iKTsKLQotc3RhdGljIHUzMiBHZXRNYkZpbHRlcmluZ0ZsYWdzKG1iU3RvcmFnZV90ICptYik7Ci0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotCi1zdGF0aWMgdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgYlNfdCAqYnMsIHUzMiBmbGFncyk7Ci0KLXN0YXRpYyB2b2lkIEZpbHRlckx1bWEodTggKmRhdGEsIGJTX3QgKmJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKLQotc3RhdGljIHZvaWQgRmlsdGVyQ2hyb21hKHU4ICpjYiwgdTggKmNyLCBiU190ICpiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICAgICAgICB1MzIgaW1hZ2VXaWR0aCk7Ci0KLXN0YXRpYyB2b2lkIEZpbHRlclZlckx1bWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKLXN0YXRpYyB2b2lkIEZpbHRlckhvckx1bWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gICAgICAgIGkzMiBpbWFnZVdpZHRoKTsKLXN0YXRpYyB2b2lkIEZpbHRlckhvckx1bWEoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgICAgICAgaTMyIGltYWdlV2lkdGgpOwotCi1zdGF0aWMgdm9pZCBGaWx0ZXJWZXJDaHJvbWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIHUzMiBpbWFnZVdpZHRoKTsKLXN0YXRpYyB2b2lkIEZpbHRlckhvckNocm9tYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIGltYWdlV2lkdGgpOwotc3RhdGljIHZvaWQgRmlsdGVySG9yQ2hyb21hKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIGkzMiBpbWFnZVdpZHRoKTsKLQotc3RhdGljIHZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIG1iU3RvcmFnZV90ICptYiwKLSAgdTMyIGZpbHRlcmluZ0ZsYWdzKTsKLQotc3RhdGljIHZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgbWJTdG9yYWdlX3QgKm1iLAotICB1MzIgZmlsdGVyaW5nRmxhZ3MsCi0gIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi1zdGF0aWMgdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgdTggKCpicylbMTZdLCB1MzIgZmxhZ3MpOwotCi1zdGF0aWMgdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCi0gICAgbWJTdG9yYWdlX3QgKm1iLAotICAgIHU4ICgqYWxwaGEpWzJdLAotICAgIHU4ICgqYmV0YSlbMl0sCi0gICAgdTggKCp0aHJlc2hvbGQpWzE2XSwKLSAgICB1OCAoKmJzKVsxNl0sCi0gICAgdTMyIGZpbHRlcmluZ0ZsYWdzICk7Ci0KLXN0YXRpYyB2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAotICAgIG1iU3RvcmFnZV90ICptYiwKLSAgICB1OCAoKmFscGhhKVsyXSwKLSAgICB1OCAoKmJldGEpWzJdLAotICAgIHU4ICgqdGhyZXNob2xkKVs4XSwKLSAgICB1OCAoKmJzKVsxNl0sCi0gICAgdTMyIGZpbHRlcmluZ0ZsYWdzLAotICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKLQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJc1NsaWNlQm91bmRhcnlPbkxlZnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2xpY2UgYm91bmRhcnkgb24gdGhlIGxlZnQgc2lkZQotICAgICAgICAgICAgb2YgYSBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIElzU2xpY2VCb3VuZGFyeU9uTGVmdChtYlN0b3JhZ2VfdCAqbWIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWIgJiYgbWItPm1iQSk7Ci0KLSAgICBpZiAobWItPnNsaWNlSWQgIT0gbWItPm1iQS0+c2xpY2VJZCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSXNTbGljZUJvdW5kYXJ5T25Ub3AKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2xpY2UgYm91bmRhcnkgYWJvdmUgdGhlCi0gICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgSXNTbGljZUJvdW5kYXJ5T25Ub3AobWJTdG9yYWdlX3QgKm1iKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iICYmIG1iLT5tYkIpOwotCi0gICAgaWYgKG1iLT5zbGljZUlkICE9IG1iLT5tYkItPnNsaWNlSWQpCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldE1iRmlsdGVyaW5nRmxhZ3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBlZGdlcyBvZiBhIG1hY3JvYmxvY2sgaGFzIHRvIGJlCi0gICAgICAgICAgZmlsdGVyZWQuIE91dHB1dCBpcyBhIGJpdC13aXNlIE9SIG9mIEZJTFRFUl9MRUZUX0VER0UsCi0gICAgICAgICAgRklMVEVSX1RPUF9FREdFIGFuZCBGSUxURVJfSU5ORVJfRURHRSwgZGVwZW5kaW5nIG9uIHdoaWNoIGVkZ2VzCi0gICAgICAgICAgc2hhbGwgYmUgZmlsdGVyZWQuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgR2V0TWJGaWx0ZXJpbmdGbGFncyhtYlN0b3JhZ2VfdCAqbWIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGZsYWdzID0gMDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iKTsKLQotICAgIC8qIG5vdGhpbmcgd2lsbCBiZSBmaWx0ZXJlZCBpZiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9PSAxICovCi0gICAgaWYgKG1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAxKQotICAgIHsKLSAgICAgICAgZmxhZ3MgfD0gRklMVEVSX0lOTkVSX0VER0U7Ci0KLSAgICAgICAgLyogZmlsdGVyTGVmdE1iRWRnZUZsYWcsIGxlZnQgbWIgaXMgTUJfQSAqLwotICAgICAgICBpZiAobWItPm1iQSAmJgotICAgICAgICAgICAgKChtYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMikgfHwKLSAgICAgICAgICAgICAhSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iKSkpCi0gICAgICAgICAgICBmbGFncyB8PSBGSUxURVJfTEVGVF9FREdFOwotCi0gICAgICAgIC8qIGZpbHRlclRvcE1iRWRnZUZsYWcgKi8KLSAgICAgICAgaWYgKG1iLT5tYkIgJiYKLSAgICAgICAgICAgICgobWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDIpIHx8Ci0gICAgICAgICAgICAgIUlzU2xpY2VCb3VuZGFyeU9uVG9wKG1iKSkpCi0gICAgICAgICAgICBmbGFncyB8PSBGSUxURVJfVE9QX0VER0U7Ci0gICAgfQotCi0gICAgcmV0dXJuKGZsYWdzKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IElubmVyQm91bmRhcnlTdHJlbmd0aAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGFuIGlubmVyCi0gICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlIGlzIGNoZWNrZWQgYmVmb3JlIHRoaXMgaXMKLSAgICAgICAgICAgIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb24gaGVyZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGluZDEsIHUzMiBpbmQyKQotewotICAgIGkzMiB0bXAxLCB0bXAyOwotICAgIGkzMiBtdjEsIG12MiwgbXYzLCBtdjQ7Ci0KLSAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmW2luZDFdOwotICAgIHRtcDIgPSBtYjEtPnRvdGFsQ29lZmZbaW5kMl07Ci0gICAgbXYxID0gbWIxLT5tdltpbmQxXS5ob3I7Ci0gICAgbXYyID0gbWIxLT5tdltpbmQyXS5ob3I7Ci0gICAgbXYzID0gbWIxLT5tdltpbmQxXS52ZXI7Ci0gICAgbXY0ID0gbWIxLT5tdltpbmQyXS52ZXI7Ci0KLSAgICBpZiAodG1wMSB8fCB0bXAyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAoQUJTKG12MSAtIG12MikgPj0gNCkgfHwgKEFCUyhtdjMgLSBtdjQpID49IDQpIHx8Ci0gICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjEtPnJlZkFkZHJbaW5kMiA+PiAyXSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGFuIGlubmVyCi0gICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gVGhlIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzCi0gICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGggYnV0IHdpdGhvdXQgY2hlY2tpbmcgdG90YWxDb2VmZi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpbmQxLCB1MzIgaW5kMikKLXsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKLQotICAgIHRtcDEgPSBtYjEtPm12W2luZDFdLmhvcjsKLSAgICB0bXAyID0gbWIxLT5tdltpbmQyXS5ob3I7Ci0gICAgdG1wMyA9IG1iMS0+bXZbaW5kMV0udmVyOwotICAgIHRtcDQgPSBtYjEtPm12W2luZDJdLnZlcjsKLQotICAgIGlmICggKEFCUyh0bXAxIC0gdG1wMikgPj0gNCkgfHwgKEFCUyh0bXAzIC0gdG1wNCkgPj0gNCkgfHwKLSAgICAgICAgIChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjEtPnJlZkFkZHJbaW5kMiA+PiAyXSkpCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBFZGdlQm91bmRhcnlTdHJlbmd0aAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGxlZnQtIG9yCi0gICAgICAgICAgICB0b3AtbW9zdCBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAotICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyLAotICAgIHUzMiBpbmQxLCB1MzIgaW5kMikKLXsKLQotICAgIGlmIChtYjEtPnRvdGFsQ29lZmZbaW5kMV0gfHwgbWIyLT50b3RhbENvZWZmW2luZDJdKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjItPnJlZkFkZHJbaW5kMiA+PiAyXSkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbaW5kMV0uaG9yIC0gbWIyLT5tdltpbmQyXS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12W2luZDFdLnZlciAtIG1iMi0+bXZbaW5kMl0udmVyKSA+PSA0KSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi0jZWxzZSAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvcgotICAgICAgICAgICAgdG9wLW1vc3QgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZXMgYXJlIGNoZWNrZWQKLSAgICAgICAgICAgIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb25zIGhlcmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMikKLXsKLSAgICB1MzIgdG9wQnMgPSAwOwotICAgIHUzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwotCi0gICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZlswXTsKLSAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzEwXTsKLSAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzFdOwotICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTFdOwotICAgIGlmICh0bXAxIHx8IHRtcDIpCi0gICAgewotICAgICAgICB0b3BCcyA9IDI8PDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlswXS5ob3IgLSBtYjItPm12WzEwXS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzBdLnZlciAtIG1iMi0+bXZbMTBdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkclsxMCA+PiAyXSkpCi0gICAgewotICAgICAgICB0b3BCcyA9IDE8PDA7Ci0gICAgfQotICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbNF07Ci0gICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxNF07Ci0gICAgaWYgKHRtcDMgfHwgdG1wNCkKLSAgICB7Ci0gICAgICAgIHRvcEJzICs9IDI8PDg7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlsxXS5ob3IgLSBtYjItPm12WzExXS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzFdLnZlciAtIG1iMi0+bXZbMTFdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkclsxMSA+PiAyXSkpCi0gICAgewotICAgICAgICB0b3BCcyArPSAxPDw4OwotICAgIH0KLSAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzVdOwotICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTVdOwotICAgIGlmICh0bXAxIHx8IHRtcDIpCi0gICAgewotICAgICAgICB0b3BCcyArPSAyPDwxNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzRdLmhvciAtIG1iMi0+bXZbMTRdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbNF0udmVyIC0gbWIyLT5tdlsxNF0udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbNCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTQgPj4gMl0pKQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMTw8MTY7Ci0gICAgfQotICAgIGlmICh0bXAzIHx8IHRtcDQpCi0gICAgewotICAgICAgICB0b3BCcyArPSAyPDwyNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzVdLmhvciAtIG1iMi0+bXZbMTVdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbNV0udmVyIC0gbWIyLT5tdlsxNV0udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbNSA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTUgPj4gMl0pKQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMTw8MjQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRvcEJzOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGxlZnQtCi0gICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAotICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMikKLXsKLSAgICB1MzIgbGVmdEJzID0gMDsKLSAgICB1MzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKLQotICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbMF07Ci0gICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZls1XTsKLSAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzJdOwotICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbN107Ci0KLSAgICBpZiAodG1wMSB8fCB0bXAyKQotICAgIHsKLSAgICAgICAgbGVmdEJzID0gMjw8MDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzBdLmhvciAtIG1iMi0+bXZbNV0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlswXS52ZXIgLSBtYjItPm12WzVdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkcls1ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIGxlZnRCcyA9IDE8PDA7Ci0gICAgfQotICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbOF07Ci0gICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxM107Ci0gICAgaWYgKHRtcDMgfHwgdG1wNCkKLSAgICB7Ci0gICAgICAgIGxlZnRCcyArPSAyPDw4OwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMl0uaG9yIC0gbWIyLT5tdls3XS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzJdLnZlciAtIG1iMi0+bXZbN10udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzcgPj4gMl0pKQotICAgIHsKLSAgICAgICAgbGVmdEJzICs9IDE8PDg7Ci0gICAgfQotICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbMTBdOwotICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTVdOwotICAgIGlmICh0bXAxIHx8IHRtcDIpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMjw8MTY7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdls4XS5ob3IgLSBtYjItPm12WzEzXS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzhdLnZlciAtIG1iMi0+bXZbMTNdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzggPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzEzID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIGxlZnRCcyArPSAxPDwxNjsKLSAgICB9Ci0gICAgaWYgKHRtcDMgfHwgdG1wNCkKLSAgICB7Ci0gICAgICAgIGxlZnRCcyArPSAyPDwyNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzEwXS5ob3IgLSBtYjItPm12WzE1XS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzEwXS52ZXIgLSBtYjItPm12WzE1XS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkclsxMCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTUgPj4gMl0pKQotICAgIHsKLSAgICAgICAgbGVmdEJzICs9IDE8PDI0OwotICAgIH0KLQotICAgIHJldHVybiBsZWZ0QnM7Ci19Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsdGVyUGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZyBmb3IgYSBwaWN0dXJlLiBGaWx0ZXIgZG9lcyBub3QgY29weQotICAgICAgICAgIHRoZSBvcmlnaW5hbCBwaWN0dXJlIGFueXdoZXJlIGJ1dCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGRpcmVjdGx5Ci0gICAgICAgICAgb24gdGhlIG9yaWdpbmFsIGltYWdlLiBQYXJhbWV0ZXJzIGNvbnRyb2xsaW5nIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcwotICAgICAgICAgIGFyZSBjb21wdXRlZCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgb2YgdGhlCi0gICAgICAgICAgZmlsdGVyZWQgbWFjcm9ibG9jaywgbWFjcm9ibG9jayBhYm92ZSBhbmQgbWFjcm9ibG9jayBvbiB0aGUgbGVmdCBvZgotICAgICAgICAgIHRoZSBmaWx0ZXJlZCBvbmUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIGltYWdlICAgICAgICAgcG9pbnRlciB0byBpbWFnZSB0byBiZSBmaWx0ZXJlZAotICAgICAgICAgIG1iICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgc3RydWN0dXJlIG9mIHRoZSB0b3AtbGVmdAotICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayBvZiB0aGUgcGljdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgaW1hZ2UgICAgICAgICBmaWx0ZXJlZCBpbWFnZSBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX09NWERMCi12b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAotICBpbWFnZV90ICppbWFnZSwKLSAgbWJTdG9yYWdlX3QgKm1iKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBmbGFnczsKLSAgICB1MzIgcGljU2l6ZUluTWJzLCBtYlJvdywgbWJDb2w7Ci0gICAgdTMyIHBpY1dpZHRoSW5NYnM7Ci0gICAgdTggKmRhdGE7Ci0gICAgbWJTdG9yYWdlX3QgKnBNYjsKLSAgICBiU190IGJTWzE2XTsKLSAgICBlZGdlVGhyZXNob2xkX3QgdGhyZXNob2xkc1szXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChpbWFnZS0+ZGF0YSk7Ci0gICAgQVNTRVJUKGltYWdlLT53aWR0aCk7Ci0gICAgQVNTRVJUKGltYWdlLT5oZWlnaHQpOwotCi0gICAgcGljV2lkdGhJbk1icyA9IGltYWdlLT53aWR0aDsKLSAgICBkYXRhID0gaW1hZ2UtPmRhdGE7Ci0gICAgcGljU2l6ZUluTWJzID0gcGljV2lkdGhJbk1icyAqIGltYWdlLT5oZWlnaHQ7Ci0KLSAgICBwTWIgPSBtYjsKLQotICAgIGZvciAobWJSb3cgPSAwLCBtYkNvbCA9IDA7IG1iUm93IDwgaW1hZ2UtPmhlaWdodDsgcE1iKyspCi0gICAgewotICAgICAgICBmbGFncyA9IEdldE1iRmlsdGVyaW5nRmxhZ3MocE1iKTsKLQotICAgICAgICBpZiAoZmxhZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldEJvdW5kYXJ5U3RyZW5ndGhzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUgaWYgYW55IG9mCi0gICAgICAgICAgICAgKiB0aGUgYlMgdmFsdWVzIGZvciB0aGUgbWFjcm9ibG9jayBiZWluZyBwcm9jZXNzZWQgd2FzIG5vbi16ZXJvICovCi0gICAgICAgICAgICBpZiAoR2V0Qm91bmRhcnlTdHJlbmd0aHMocE1iLCBiUywgZmxhZ3MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGx1bWEgKi8KLSAgICAgICAgICAgICAgICBHZXRMdW1hRWRnZVRocmVzaG9sZHModGhyZXNob2xkcywgcE1iLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogMjU2ICsgbWJDb2wgKiAxNjsKLQotICAgICAgICAgICAgICAgIEZpbHRlckx1bWEoKHU4KilkYXRhLCBiUywgdGhyZXNob2xkcywgcGljV2lkdGhJbk1icyoxNik7Ci0KLSAgICAgICAgICAgICAgICAvKiBjaHJvbWEgKi8KLSAgICAgICAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcyh0aHJlc2hvbGRzLCBwTWIsIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpOwotICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemVJbk1icyAqIDI1NiArCi0gICAgICAgICAgICAgICAgICAgIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDY0ICsgbWJDb2wgKiA4OwotCi0gICAgICAgICAgICAgICAgRmlsdGVyQ2hyb21hKCh1OCopZGF0YSwgZGF0YSArIDY0KnBpY1NpemVJbk1icywgYlMsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRzLCBwaWNXaWR0aEluTWJzKjgpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtYkNvbCsrOwotICAgICAgICBpZiAobWJDb2wgPT0gcGljV2lkdGhJbk1icykKLSAgICAgICAgewotICAgICAgICAgICAgbWJDb2wgPSAwOwotICAgICAgICAgICAgbWJSb3crKzsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbHRlclZlckx1bWFFZGdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZpbHRlciBvbmUgdmVydGljYWwgNC1waXhlbCBsdW1hIGVkZ2UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlclZlckx1bWFFZGdlKAotICB1OCAqZGF0YSwKLSAgdTMyIGJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIHUzMiBpbWFnZVdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKLSAgICB1MzIgaTsKLSAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOwotICAgIHUzMiB0bXBGbGFnOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChiUyAmJiBiUyA8PSA0KTsKLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0KLSAgICBpZiAoYlMgPCA0KQotICAgIHsKLSAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07Ci0gICAgICAgIHRtcCA9IHRjOwotICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGEgKz0gaW1hZ2VXaWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLTNdOwotICAgICAgICAgICAgICAgIHEyID0gZGF0YVsyXTsKLQotICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkYXRhWy0yXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOwotICAgICAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9ICh1OCkocTEgKyBDTElQMygtdGMsdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOwotICAgICAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotCi0gICAgICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICAgICAgdG1wID0gdGM7Ci0gICAgICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKLSAgICAgICAgICAgICAgICBkYXRhWyAwXSA9IHEwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSwgZGF0YSArPSBpbWFnZVdpZHRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOwotICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07Ci0gICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcEZsYWcgPQotICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCAoKHRocmVzaG9sZHMtPmFscGhhID4+IDIpICsyKSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLTNdOwotICAgICAgICAgICAgICAgIHEyID0gZGF0YVsyXTsKLQotICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IHAxICsgcDAgKyBxMDsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSAodTgpKChwMiArIDIgKiB0bXAgKyBxMSArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICBkYXRhWy0yXSA9ICh1OCkoKHAyICsgdG1wICsgMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLTNdID0gKHU4KSgoMiAqIGRhdGFbLTRdICsgMyAqIHAyICsgdG1wICsgNCkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7Ci0KLSAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMCArIHEwICsgcTE7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAodTgpKChwMSArIDIgKiB0bXAgKyBxMiArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICBkYXRhWzFdID0gKHU4KSgodG1wICsgcTIgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSA9ICh1OCkoKDIgKiBkYXRhWzNdICsgMyAqIHEyICsgdG1wICsgNCkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9ICh1OCkoKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbHRlckhvckx1bWFFZGdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZpbHRlciBvbmUgaG9yaXpvbnRhbCA0LXBpeGVsIGx1bWEgZWRnZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJIb3JMdW1hRWRnZSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBpMzIgaW1hZ2VXaWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgZGVsdGEsIHRjLCB0bXA7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTEsIHAyLCBxMjsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgPCA0KTsKLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0KLSAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXTsKLSAgICB0bXAgPSB0YzsKLSAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGErKykKLSAgICB7Ci0gICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKLSAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07Ci0gICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107Ci0KLSAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCi0gICAgICAgICAgICAgICAgICAgIChwMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHAxIDw8IDEpKSA+PiAxKSk7Ci0gICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOwotCi0gICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKHExICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOwotICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0KLSAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICB0bXAgPSB0YzsKLSAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gcDA7Ci0gICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JMdW1hCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZpbHRlciBhbGwgZm91ciBzdWNjZXNzaXZlIGhvcml6b250YWwgNC1waXhlbCBsdW1hIGVkZ2VzLiBUaGlzIGNhbgotICAgICAgICAgICAgYmUgZG9uZSB3aGVuIGJTIGlzIGVxdWFsIHRvIGFsbCBmb3VyIGVkZ2VzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJIb3JMdW1hKAotICB1OCAqZGF0YSwKLSAgdTMyIGJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIGkzMiBpbWFnZVdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKLSAgICB1MzIgaTsKLSAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOwotICAgIHUzMiB0bXBGbGFnOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChiUyA8PSA0KTsKLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0KLSAgICBpZiAoYlMgPCA0KQotICAgIHsKLSAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07Ci0gICAgICAgIHRtcCA9IHRjOwotICAgICAgICBmb3IgKGkgPSAxNjsgaTsgaS0tLCBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW2ltYWdlV2lkdGhdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOwotICAgICAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBxMiA9IGRhdGFbaW1hZ2VXaWR0aCoyXTsKLQotICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGhdID0gKHU4KShxMSArIENMSVAzKC10Yyx0YywKLSAgICAgICAgICAgICAgICAgICAgICAgIChxMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHExIDw8IDEpKSA+PiAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRtcCwgdG1wLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0KLSAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKLSAgICAgICAgICAgICAgICB0bXAgPSB0YzsKLSAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9IHAwOwotICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDE2OyBpOyBpLS0sIGRhdGErKykKLSAgICAgICAgewotICAgICAgICAgICAgcDEgPSBkYXRhWy1pbWFnZVdpZHRoKjJdOyBwMCA9IGRhdGFbLWltYWdlV2lkdGhdOwotICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07Ci0gICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcEZsYWcgPSAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCAoKHRocmVzaG9sZHMtPmFscGhhID4+IDIpICsyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgcDIgPSBkYXRhWy1pbWFnZVdpZHRoKjNdOwotICAgICAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOwotCi0gICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gcDEgKyBwMCArIHEwOwotICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9ICh1OCkoKHAyICsgMiAqIHRtcCArIHExICsgNCkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqMl0gPSAodTgpKChwMiArIHRtcCArIDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjNdID0gKHU4KSgoMiAqIGRhdGFbLWltYWdlV2lkdGgqNF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBwMiArIHRtcCArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gKHU4KSgoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDIpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gcDAgKyBxMCArIHExOwotICAgICAgICAgICAgICAgICAgICBkYXRhWyAwXSA9ICh1OCkoKHAxICsgMiAqIHRtcCArIHEyICsgNCkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKCh0bXAgKyBxMiArIDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGgqMl0gPSAodTgpKCgyICogZGF0YVtpbWFnZVdpZHRoKjNdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBxMiArIHRtcCArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJWZXJDaHJvbWFFZGdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZpbHRlciBvbmUgdmVydGljYWwgMi1waXhlbCBjaHJvbWEgZWRnZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJWZXJDaHJvbWFFZGdlKAotICB1OCAqZGF0YSwKLSAgdTMyIGJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIHUzMiB3aWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgZGVsdGEsIHRjOwotICAgIHU4IHAwLCBxMCwgcDEsIHExOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChiUyA8PSA0KTsKLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0KLSAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOwotICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOwotICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICB7Ci0gICAgICAgIGlmIChiUyA8IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKLSAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0gICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKLSAgICAgICAgICAgIGRhdGFbIDBdID0gcTA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhWy0xXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKLSAgICAgICAgICAgIGRhdGFbIDBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOwotICAgICAgICB9Ci0gICAgfQotICAgIGRhdGEgKz0gd2lkdGg7Ci0gICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKLSAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKLSAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgewotICAgICAgICBpZiAoYlMgPCA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7Ci0gICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKLSAgICAgICAgICAgIGRhdGFbLTFdID0gcDA7Ci0gICAgICAgICAgICBkYXRhWyAwXSA9IHEwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7Ci0gICAgICAgICAgICBkYXRhWyAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbHRlckhvckNocm9tYUVkZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmlsdGVyIG9uZSBob3Jpem9udGFsIDItcGl4ZWwgY2hyb21hIGVkZ2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVySG9yQ2hyb21hRWRnZSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBpMzIgd2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGRlbHRhLCB0YzsKLSAgICB1MzIgaTsKLSAgICB1OCBwMCwgcTAsIHAxLCBxMTsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgPCA0KTsKLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0KLSAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7Ci0gICAgZm9yIChpID0gMjsgaTsgaS0tLCBkYXRhKyspCi0gICAgewotICAgICAgICBwMSA9IGRhdGFbLXdpZHRoKjJdOyBwMCA9IGRhdGFbLXdpZHRoXTsKLSAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOwotICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLSAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICBkYXRhWy13aWR0aF0gPSBwMDsKLSAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbHRlckhvckNocm9tYQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgYWxsIGZvdXIgc3VjY2Vzc2l2ZSBob3Jpem9udGFsIDItcGl4ZWwgY2hyb21hIGVkZ2VzLiBUaGlzCi0gICAgICAgICAgICBjYW4gYmUgZG9uZSBpZiBiUyBpcyBlcXVhbCBmb3IgYWxsIGZvdXIgZWRnZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlckhvckNocm9tYSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBpMzIgd2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGRlbHRhLCB0YzsKLSAgICB1MzIgaTsKLSAgICB1OCBwMCwgcTAsIHAxLCBxMTsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgPD0gNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgaWYgKGJTIDwgNCkKLSAgICB7Ci0gICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKLSAgICAgICAgZm9yIChpID0gODsgaTsgaS0tLCBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstd2lkdGgqMl07IHAwID0gZGF0YVstd2lkdGhdOwotICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLSAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKLSAgICAgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSBwMDsKLSAgICAgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSA4OyBpOyBpLS0sIGRhdGErKykKLSAgICAgICAgewotICAgICAgICAgICAgcDEgPSBkYXRhWy13aWR0aCoyXTsgcDAgPSBkYXRhWy13aWR0aF07Ci0gICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVt3aWR0aF07Ci0gICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0Qm91bmRhcnlTdHJlbmd0aHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RocyBmb3IgYWxsIGVkZ2VzIG9mIGEKLSAgICAgICAgICAgIG1hY3JvYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgSEFOVFJPX1RSVUUgaWYgYW55IG9mIHRoZSBiUyB2YWx1ZXMgZm9yCi0gICAgICAgICAgICB0aGUgbWFjcm9ibG9jayBoYWQgbm9uLXplcm8gdmFsdWUsIEhBTlRST19GQUxTRSBvdGhlcndpc2UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCBiU190ICpiUywgdTMyIGZsYWdzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgSEFOVFJPX1RSVUUgYXMgc29vbiBhcyBhbnkgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgaXMKLSAgICAgKiBub24temVybyAqLwotICAgIHUzMiBub25aZXJvQnMgPSBIQU5UUk9fRkFMU0U7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYik7Ci0gICAgQVNTRVJUKGJTKTsKLSAgICBBU1NFUlQoZmxhZ3MpOwotCi0gICAgLyogdG9wIGVkZ2VzICovCi0gICAgaWYgKGZsYWdzICYgRklMVEVSX1RPUF9FREdFKQotICAgIHsKLSAgICAgICAgaWYgKElTX0lOVFJBX01CKCptYikgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1swXS50b3AgPSBiU1sxXS50b3AgPSBiU1syXS50b3AgPSBiU1szXS50b3AgPSA0OwotICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1swXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgMCwgMTApOwotICAgICAgICAgICAgYlNbMV0udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDEsIDExKTsKLSAgICAgICAgICAgIGJTWzJdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCA0LCAxNCk7Ci0gICAgICAgICAgICBiU1szXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgNSwgMTUpOwotICAgICAgICAgICAgaWYgKGJTWzBdLnRvcCB8fCBiU1sxXS50b3AgfHwgYlNbMl0udG9wIHx8IGJTWzNdLnRvcCkKLSAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBiU1swXS50b3AgPSBiU1sxXS50b3AgPSBiU1syXS50b3AgPSBiU1szXS50b3AgPSAwOwotICAgIH0KLQotICAgIC8qIGxlZnQgZWRnZXMgKi8KLSAgICBpZiAoZmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQotICAgIHsKLSAgICAgICAgaWYgKElTX0lOVFJBX01CKCptYikgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1swXS5sZWZ0ID0gYlNbNF0ubGVmdCA9IGJTWzhdLmxlZnQgPSBiU1sxMl0ubGVmdCA9IDQ7Ci0gICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzBdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgMCwgNSk7Ci0gICAgICAgICAgICBiU1s0XS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDIsIDcpOwotICAgICAgICAgICAgYlNbOF0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCA4LCAxMyk7Ci0gICAgICAgICAgICBiU1sxMl0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCAxMCwgMTUpOwotICAgICAgICAgICAgaWYgKCFub25aZXJvQnMgJiYKLSAgICAgICAgICAgICAgICAoYlNbMF0ubGVmdCB8fCBiU1s0XS5sZWZ0IHx8IGJTWzhdLmxlZnQgfHwgYlNbMTJdLmxlZnQpKQotICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGJTWzBdLmxlZnQgPSBiU1s0XS5sZWZ0ID0gYlNbOF0ubGVmdCA9IGJTWzEyXS5sZWZ0ID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpbm5lciBlZGdlcyAqLwotICAgIGlmIChJU19JTlRSQV9NQigqbWIpKQotICAgIHsKLSAgICAgICAgYlNbNF0udG9wICA9IGJTWzVdLnRvcCAgPSBiU1s2XS50b3AgID0gYlNbN10udG9wICA9Ci0gICAgICAgIGJTWzhdLnRvcCAgPSBiU1s5XS50b3AgID0gYlNbMTBdLnRvcCA9IGJTWzExXS50b3AgPQotICAgICAgICBiU1sxMl0udG9wID0gYlNbMTNdLnRvcCA9IGJTWzE0XS50b3AgPSBiU1sxNV0udG9wID0gMzsKLQotICAgICAgICBiU1sxXS5sZWZ0ICA9IGJTWzJdLmxlZnQgID0gYlNbM10ubGVmdCAgPQotICAgICAgICBiU1s1XS5sZWZ0ICA9IGJTWzZdLmxlZnQgID0gYlNbN10ubGVmdCAgPQotICAgICAgICBiU1s5XS5sZWZ0ICA9IGJTWzEwXS5sZWZ0ID0gYlNbMTFdLmxlZnQgPQotICAgICAgICBiU1sxM10ubGVmdCA9IGJTWzE0XS5sZWZ0ID0gYlNbMTVdLmxlZnQgPSAzOwotICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogMTZ4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBvciBtb3Rpb24gdmVjdG9ycyBjYW5ub3QgZGlmZmVyLAotICAgICAgICAgKiBvbmx5IGNoZWNrIGlmIGVpdGhlciBvZiB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzICovCi0gICAgICAgIGlmIChoMjY0YnNkTnVtTWJQYXJ0KG1iLT5tYlR5cGUpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzJdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS50b3AgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNl0udG9wID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLnRvcCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzVdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s4XS50b3AgPSBtYi0+dG90YWxDb2VmZls4XSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOV0udG9wID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEwXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzExXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbN10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOwotCi0gICAgICAgICAgICBiU1sxXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMV0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzJdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls0XSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbN10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s5XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTRdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTFdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxNF0gPyAyIDogMDsKLSAgICAgICAgfQotICAgICAgICAvKiAxNng4IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSBob3Jpem9udGFsIGVkZ2UsIGZvciB0aGUgb3RoZXIgdG9wIGVkZ2VzIGl0IGlzCi0gICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKLSAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCBsZWZ0IGVkZ2VzLiAqLwotICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfMTZ4OCkKLSAgICAgICAgewotICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOF0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA4LCAyKTsKLSAgICAgICAgICAgIGJTWzldLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOSwgMyk7Ci0gICAgICAgICAgICBiU1sxMF0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgNik7Ci0gICAgICAgICAgICBiU1sxMV0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMywgNyk7Ci0KLSAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzRdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1szXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNV0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s3XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzldLmxlZnQgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbMTBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzE0XSA/IDIgOiAwOwotICAgICAgICB9Ci0gICAgICAgIC8qIDh4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAotICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIHZlcnRpY2FsIGVkZ2UsIGZvciB0aGUgb3RoZXIgbGVmdCBlZGdlcyBpdCBpcwotICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCi0gICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgdG9wIGVkZ2VzLiAqLwotICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfOHgxNikKLSAgICAgICAgewotICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzhdLnRvcCA9IG1iLT50b3RhbENvZWZmWzhdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s5XS50b3AgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTBdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTFdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZls3XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTJdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEwXSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTNdLnRvcCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE1XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTNdID8gMiA6IDA7Ci0KLSAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLmxlZnQgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1syXS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKLSAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDYsIDMpOwotICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA5KTsKLSAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlNbNF0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNF0sIG1iNHg0SW5kZXhbMF0pOwotICAgICAgICAgICAgYlNbNV0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNV0sIG1iNHg0SW5kZXhbMV0pOwotICAgICAgICAgICAgYlNbNl0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNl0sIG1iNHg0SW5kZXhbMl0pOwotICAgICAgICAgICAgYlNbN10udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbN10sIG1iNHg0SW5kZXhbM10pOwotICAgICAgICAgICAgYlNbOF0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOF0sIG1iNHg0SW5kZXhbNF0pOwotICAgICAgICAgICAgYlNbOV0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOV0sIG1iNHg0SW5kZXhbNV0pOwotICAgICAgICAgICAgYlNbMTBdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEwXSwgbWI0eDRJbmRleFs2XSk7Ci0gICAgICAgICAgICBiU1sxMV0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTFdLCBtYjR4NEluZGV4WzddKTsKLSAgICAgICAgICAgIGJTWzEyXS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMl0sIG1iNHg0SW5kZXhbOF0pOwotICAgICAgICAgICAgYlNbMTNdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEzXSwgbWI0eDRJbmRleFs5XSk7Ci0gICAgICAgICAgICBiU1sxNF0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTRdLCBtYjR4NEluZGV4WzEwXSk7Ci0gICAgICAgICAgICBiU1sxNV0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTVdLCBtYjR4NEluZGV4WzExXSk7Ci0KLSAgICAgICAgICAgIGJTWzFdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxXSwgbWI0eDRJbmRleFswXSk7Ci0gICAgICAgICAgICBiU1syXS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMl0sIG1iNHg0SW5kZXhbMV0pOwotICAgICAgICAgICAgYlNbM10ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzNdLCBtYjR4NEluZGV4WzJdKTsKLSAgICAgICAgICAgIGJTWzVdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs1XSwgbWI0eDRJbmRleFs0XSk7Ci0gICAgICAgICAgICBiU1s2XS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNl0sIG1iNHg0SW5kZXhbNV0pOwotICAgICAgICAgICAgYlNbN10ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzddLCBtYjR4NEluZGV4WzZdKTsKLSAgICAgICAgICAgIGJTWzldLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs5XSwgbWI0eDRJbmRleFs4XSk7Ci0gICAgICAgICAgICBiU1sxMF0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEwXSwgbWI0eDRJbmRleFs5XSk7Ci0gICAgICAgICAgICBiU1sxMV0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzExXSwgbWI0eDRJbmRleFsxMF0pOwotICAgICAgICAgICAgYlNbMTNdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxM10sIG1iNHg0SW5kZXhbMTJdKTsKLSAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTRdLCBtYjR4NEluZGV4WzEzXSk7Ci0gICAgICAgICAgICBiU1sxNV0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE1XSwgbWI0eDRJbmRleFsxNF0pOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbm9uWmVyb0JzICYmCi0gICAgICAgICAgICAoYlNbNF0udG9wIHx8IGJTWzVdLnRvcCB8fCBiU1s2XS50b3AgfHwgYlNbN10udG9wIHx8Ci0gICAgICAgICAgICAgYlNbOF0udG9wIHx8IGJTWzldLnRvcCB8fCBiU1sxMF0udG9wIHx8IGJTWzExXS50b3AgfHwKLSAgICAgICAgICAgICBiU1sxMl0udG9wIHx8IGJTWzEzXS50b3AgfHwgYlNbMTRdLnRvcCB8fCBiU1sxNV0udG9wIHx8Ci0gICAgICAgICAgICAgYlNbMV0ubGVmdCB8fCBiU1syXS5sZWZ0IHx8IGJTWzNdLmxlZnQgfHwKLSAgICAgICAgICAgICBiU1s1XS5sZWZ0IHx8IGJTWzZdLmxlZnQgfHwgYlNbN10ubGVmdCB8fAotICAgICAgICAgICAgIGJTWzldLmxlZnQgfHwgYlNbMTBdLmxlZnQgfHwgYlNbMTFdLmxlZnQgfHwKLSAgICAgICAgICAgICBiU1sxM10ubGVmdCB8fCBiU1sxNF0ubGVmdCB8fCBiU1sxNV0ubGVmdCkpCi0gICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4obm9uWmVyb0JzKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldEx1bWFFZGdlVGhyZXNob2xkcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAotICAgICAgICAgICAgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBtYlN0b3JhZ2VfdCAqbWIsCi0gIHUzMiBmaWx0ZXJpbmdGbGFncykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaW5kZXhBLCBpbmRleEI7Ci0gICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBxcCA9IG1iLT5xcFk7Ci0KLSAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgIHRocmVzaG9sZHNbSU5ORVJdLmJldGEgPSBiZXRhc1tpbmRleEJdOwotICAgIHRocmVzaG9sZHNbSU5ORVJdLnRjMCA9IHRjMFtpbmRleEFdOwotCi0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBxcCkKLSAgICAgICAgewotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0YzBbaW5kZXhBXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBxcCkKLSAgICAgICAgewotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSBiZXRhc1tpbmRleEJdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0YzBbaW5kZXhBXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCi0gICAgICAgICAgICBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBtYlN0b3JhZ2VfdCAqbWIsCi0gIHUzMiBmaWx0ZXJpbmdGbGFncywKLSAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGluZGV4QSwgaW5kZXhCOwotICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgcXAgPSBtYi0+cXBZOwotICAgIHFwID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLQotICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgIHRocmVzaG9sZHNbSU5ORVJdLmFscGhhID0gYWxwaGFzW2luZGV4QV07Ci0gICAgdGhyZXNob2xkc1tJTk5FUl0uYmV0YSA9IGJldGFzW2luZGV4Ql07Ci0gICAgdGhyZXNob2xkc1tJTk5FUl0udGMwID0gdGMwW2luZGV4QV07Ci0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGMwW2luZGV4QV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKLSAgICAgICAgewotICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOwotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSBiZXRhc1tpbmRleEJdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0YzBbaW5kZXhBXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbHRlckx1bWEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmlsdGVyIGFsbCBsdW1hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jawotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJMdW1hKAotICB1OCAqZGF0YSwKLSAgYlNfdCAqYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgdTMyIHdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB2YmxvY2s7Ci0gICAgYlNfdCAqdG1wOwotICAgIHU4ICpwdHI7Ci0gICAgdTMyIG9mZnNldDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChiUyk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgcHRyID0gZGF0YTsKLSAgICB0bXAgPSBiUzsKLQotICAgIG9mZnNldCAgPSBUT1A7Ci0KLSAgICAvKiBsb29wIGJsb2NrIHJvd3MsIHBlcmZvcm0gZmlsdGVyaW5nIGZvciBhbGwgdmVydGljYWwgZWRnZXMgb2YgdGhlIGJsb2NrCi0gICAgICogcm93IGZpcnN0LCB0aGVuIGZpbHRlciBlYWNoIGhvcml6b250YWwgZWRnZSBvZiB0aGUgcm93ICovCi0gICAgZm9yICh2YmxvY2sgPSA0OyB2YmxvY2stLTspCi0gICAgewotICAgICAgICAvKiBvbmx5IHBlcmZvcm0gZmlsdGVyaW5nIGlmIGJTIGlzIG5vbi16ZXJvLCBmaXJzdCBvZiB0aGUgZm91cgotICAgICAgICAgKiBGaWx0ZXJWZXJMdW1hRWRnZSBoYW5kbGVzIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIG1hY3JvYmxvY2ssIG90aGVycwotICAgICAgICAgKiBmaWx0ZXIgaW5uZXIgZWRnZXMgKi8KLSAgICAgICAgaWYgKHRtcFswXS5sZWZ0KQotICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyLCB0bXBbMF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsIHdpZHRoKTsKLSAgICAgICAgaWYgKHRtcFsxXS5sZWZ0KQotICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzQsIHRtcFsxXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKLSAgICAgICAgaWYgKHRtcFsyXS5sZWZ0KQotICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzgsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKLSAgICAgICAgaWYgKHRtcFszXS5sZWZ0KQotICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzEyLCB0bXBbM10ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7Ci0KLSAgICAgICAgLyogaWYgYlMgaXMgZXF1YWwgZm9yIGFsbCBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSByb3cgLT4gcGVyZm9ybQotICAgICAgICAgKiBmaWx0ZXJpbmcgd2l0aCBGaWx0ZXJIb3JMdW1hLCBvdGhlcndpc2UgdXNlIEZpbHRlckhvckx1bWFFZGdlIGZvcgotICAgICAgICAgKiBlYWNoIGVkZ2Ugc2VwYXJhdGVseS4gb2Zmc2V0IHZhcmlhYmxlIGluZGljYXRlcyB0b3AgbWFjcm9ibG9jayBlZGdlCi0gICAgICAgICAqIG9uIHRoZSBmaXJzdCBsb29wIHJvdW5kLCBpbm5lciBlZGdlIGZvciB0aGUgb3RoZXIgcm91bmRzICovCi0gICAgICAgIGlmICh0bXBbMF0udG9wID09IHRtcFsxXS50b3AgJiYgdG1wWzFdLnRvcCA9PSB0bXBbMl0udG9wICYmCi0gICAgICAgICAgICB0bXBbMl0udG9wID09IHRtcFszXS50b3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRtcFswXS50b3ApCi0gICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYShwdHIsIHRtcFswXS50b3AsIHRocmVzaG9sZHMgKyBvZmZzZXQsIChpMzIpd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIGlmKHRtcFsxXS50b3ApCi0gICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzQsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIGlmKHRtcFsyXS50b3ApCi0gICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzgsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIGlmKHRtcFszXS50b3ApCi0gICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzEyLCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBmb3VyIHBpeGVsIHJvd3MgYWhlYWQsIGkuZS4gbmV4dCByb3cgb2YgNHg0LWJsb2NrcyAqLwotICAgICAgICBwdHIgKz0gd2lkdGgqNDsKLSAgICAgICAgdG1wICs9IDQ7Ci0gICAgICAgIG9mZnNldCA9IElOTkVSOwotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJDaHJvbWEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmlsdGVyIGFsbCBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlckNocm9tYSgKLSAgdTggKmRhdGFDYiwKLSAgdTggKmRhdGFDciwKLSAgYlNfdCAqYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgdTMyIHdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB2YmxvY2s7Ci0gICAgYlNfdCAqdG1wOwotICAgIHUzMiBvZmZzZXQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhQ2IpOwotICAgIEFTU0VSVChkYXRhQ3IpOwotICAgIEFTU0VSVChiUyk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgdG1wID0gYlM7Ci0gICAgb2Zmc2V0ID0gVE9QOwotCi0gICAgLyogbG9vcCBibG9jayByb3dzLCBwZXJmb3JtIGZpbHRlcmluZyBmb3IgYWxsIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBibG9jawotICAgICAqIHJvdyBmaXJzdCwgdGhlbiBmaWx0ZXIgZWFjaCBob3Jpem9udGFsIGVkZ2Ugb2YgdGhlIHJvdyAqLwotICAgIGZvciAodmJsb2NrID0gMDsgdmJsb2NrIDwgMjsgdmJsb2NrKyspCi0gICAgewotICAgICAgICAvKiBvbmx5IHBlcmZvcm0gZmlsdGVyaW5nIGlmIGJTIGlzIG5vbi16ZXJvLCBmaXJzdCB0d28gb2YgdGhlIGZvdXIKLSAgICAgICAgICogRmlsdGVyVmVyQ2hyb21hRWRnZSBjYWxscyBoYW5kbGUgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFjcm9ibG9jaywKLSAgICAgICAgICogb3RoZXJzIGZpbHRlciB0aGUgaW5uZXIgZWRnZS4gTm90ZSB0aGF0IGFzIGNocm9tYSB1c2VzIGJTIHZhbHVlcwotICAgICAgICAgKiBkZXRlcm1pbmVkIGZvciBsdW1hIGVkZ2VzLCBlYWNoIGJTIGlzIHVzZWQgb25seSBmb3IgMiBwaXhlbHMgb2YKLSAgICAgICAgICogYSA0LXBpeGVsIGVkZ2UgKi8KLSAgICAgICAgaWYgKHRtcFswXS5sZWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYiwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDciwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtcFs0XS5sZWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYisyKndpZHRoLCB0bXBbNF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsCi0gICAgICAgICAgICAgICAgd2lkdGgpOwotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrMip3aWR0aCwgdG1wWzRdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULAotICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG1wWzJdLmxlZnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiKzQsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsCi0gICAgICAgICAgICAgICAgd2lkdGgpOwotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrNCwgdG1wWzJdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwKLSAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtcFs2XS5sZWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYisyKndpZHRoKzQsIHRtcFs2XS5sZWZ0LAotICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOwotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrMip3aWR0aCs0LCB0bXBbNl0ubGVmdCwKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlmIGJTIGlzIGVxdWFsIGZvciBhbGwgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgcm93IC0+IHBlcmZvcm0KLSAgICAgICAgICogZmlsdGVyaW5nIHdpdGggRmlsdGVySG9yQ2hyb21hLCBvdGhlcndpc2UgdXNlIEZpbHRlckhvckNocm9tYUVkZ2UKLSAgICAgICAgICogZm9yIGVhY2ggZWRnZSBzZXBhcmF0ZWx5LiBvZmZzZXQgdmFyaWFibGUgaW5kaWNhdGVzIHRvcCBtYWNyb2Jsb2NrCi0gICAgICAgICAqIGVkZ2Ugb24gdGhlIGZpcnN0IGxvb3Agcm91bmQsIGlubmVyIGVkZ2UgZm9yIHRoZSBzZWNvbmQgKi8KLSAgICAgICAgaWYgKHRtcFswXS50b3AgPT0gdG1wWzFdLnRvcCAmJiB0bXBbMV0udG9wID09IHRtcFsyXS50b3AgJiYKLSAgICAgICAgICAgIHRtcFsyXS50b3AgPT0gdG1wWzNdLnRvcCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWEoZGF0YUNiLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hKGRhdGFDciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRtcFswXS50b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRtcFsxXS50b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IrMiwgdG1wWzFdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyKzIsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0bXBbMl0udG9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiKzQsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDcis0LCB0bXBbMl0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG1wWzNdLnRvcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYis2LCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IrNiwgdG1wWzNdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdG1wICs9IDg7Ci0gICAgICAgIGRhdGFDYiArPSB3aWR0aCo0OwotICAgICAgICBkYXRhQ3IgKz0gd2lkdGgqNDsKLSAgICAgICAgb2Zmc2V0ID0gSU5ORVI7Ci0gICAgfQotfQotCi0jZWxzZSAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZpbHRlclBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gZGVibG9ja2luZyBmaWx0ZXJpbmcgZm9yIGEgcGljdHVyZS4gRmlsdGVyIGRvZXMgbm90IGNvcHkKLSAgICAgICAgICB0aGUgb3JpZ2luYWwgcGljdHVyZSBhbnl3aGVyZSBidXQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBkaXJlY3RseQotICAgICAgICAgIG9uIHRoZSBvcmlnaW5hbCBpbWFnZS4gUGFyYW1ldGVycyBjb250cm9sbGluZyB0aGUgZmlsdGVyaW5nIHByb2Nlc3MKLSAgICAgICAgICBhcmUgY29tcHV0ZWQgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gbWFjcm9ibG9jayBzdHJ1Y3R1cmVzIG9mIHRoZQotICAgICAgICAgIGZpbHRlcmVkIG1hY3JvYmxvY2ssIG1hY3JvYmxvY2sgYWJvdmUgYW5kIG1hY3JvYmxvY2sgb24gdGhlIGxlZnQgb2YKLSAgICAgICAgICB0aGUgZmlsdGVyZWQgb25lLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBpbWFnZSAgICAgICAgIHBvaW50ZXIgdG8gaW1hZ2UgdG8gYmUgZmlsdGVyZWQKLSAgICAgICAgICBtYiAgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgdG9wLWxlZnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgb2YgdGhlIHBpY3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGltYWdlICAgICAgICAgZmlsdGVyZWQgaW1hZ2Ugc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLypsaW50IC0tZXs1NTB9IFN5bWJvbCBub3QgYWNjZXNzZWQgKi8KLXZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCi0gIGltYWdlX3QgKmltYWdlLAotICBtYlN0b3JhZ2VfdCAqbWIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGZsYWdzOwotICAgIHUzMiBwaWNTaXplSW5NYnMsIG1iUm93LCBtYkNvbDsKLSAgICB1MzIgcGljV2lkdGhJbk1iczsKLSAgICB1OCAqZGF0YTsKLSAgICBtYlN0b3JhZ2VfdCAqcE1iOwotICAgIHU4IGJTWzJdWzE2XTsKLSAgICB1OCB0aHJlc2hvbGRMdW1hWzJdWzE2XTsKLSAgICB1OCB0aHJlc2hvbGRDaHJvbWFbMl1bOF07Ci0gICAgdTggYWxwaGFbMl1bMl07Ci0gICAgdTggYmV0YVsyXVsyXTsKLSAgICBPTVhSZXN1bHQgcmVzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChtYik7Ci0gICAgQVNTRVJUKGltYWdlLT5kYXRhKTsKLSAgICBBU1NFUlQoaW1hZ2UtPndpZHRoKTsKLSAgICBBU1NFUlQoaW1hZ2UtPmhlaWdodCk7Ci0KLSAgICBwaWNXaWR0aEluTWJzID0gaW1hZ2UtPndpZHRoOwotICAgIGRhdGEgPSBpbWFnZS0+ZGF0YTsKLSAgICBwaWNTaXplSW5NYnMgPSBwaWNXaWR0aEluTWJzICogaW1hZ2UtPmhlaWdodDsKLQotICAgIHBNYiA9IG1iOwotCi0gICAgZm9yIChtYlJvdyA9IDAsIG1iQ29sID0gMDsgbWJSb3cgPCBpbWFnZS0+aGVpZ2h0OyBwTWIrKykKLSAgICB7Ci0gICAgICAgIGZsYWdzID0gR2V0TWJGaWx0ZXJpbmdGbGFncyhwTWIpOwotCi0gICAgICAgIGlmIChmbGFncykKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0Qm91bmRhcnlTdHJlbmd0aHMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyB2YWx1ZSBpZiBhbnkgb2YKLSAgICAgICAgICAgICAqIHRoZSBiUyB2YWx1ZXMgZm9yIHRoZSBtYWNyb2Jsb2NrIGJlaW5nIHByb2Nlc3NlZCB3YXMgbm9uLXplcm8gKi8KLSAgICAgICAgICAgIGlmIChHZXRCb3VuZGFyeVN0cmVuZ3RocyhwTWIsIGJTLCBmbGFncykpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKiBMdW1hICovCi0gICAgICAgICAgICAgICAgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKHBNYixhbHBoYSxiZXRhLHRocmVzaG9sZEx1bWEsYlMsZmxhZ3MpOwotICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDI1NiArIG1iQ29sICogMTY7Ci0KLSAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjE2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZEx1bWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOwotCi0gICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyoxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkTHVtYSsxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTKzE2ICk7Ci0gICAgICAgICAgICAgICAgLyogQ2IgKi8KLSAgICAgICAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcyhwTWIsIGFscGhhLCBiZXRhLCB0aHJlc2hvbGRDaHJvbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlMsIGZsYWdzLCBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpOwotICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemVJbk1icyAqIDI1NiArCi0gICAgICAgICAgICAgICAgICAgIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDY0ICsgbWJDb2wgKiA4OwotCi0gICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOwotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhKzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hKzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMrMTYgKTsKLSAgICAgICAgICAgICAgICAvKiBDciAqLwotICAgICAgICAgICAgICAgIGRhdGEgKz0gKHBpY1NpemVJbk1icyAqIDY0KTsKLSAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTICk7Ci0gICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWErOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUysxNiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWJDb2wrKzsKLSAgICAgICAgaWYgKG1iQ29sID09IHBpY1dpZHRoSW5NYnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1iQ29sID0gMDsKLSAgICAgICAgICAgIG1iUm93Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRCb3VuZGFyeVN0cmVuZ3RocwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGhzIGZvciBhbGwgZWRnZXMgb2YgYQotICAgICAgICAgICAgbWFjcm9ibG9jay4gRnVuY3Rpb24gcmV0dXJucyBIQU5UUk9fVFJVRSBpZiBhbnkgb2YgdGhlIGJTIHZhbHVlcyBmb3IKLSAgICAgICAgICAgIHRoZSBtYWNyb2Jsb2NrIGhhZCBub24temVybyB2YWx1ZSwgSEFOVFJPX0ZBTFNFIG90aGVyd2lzZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIHU4ICgqYlMpWzE2XSwgdTMyIGZsYWdzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgSEFOVFJPX1RSVUUgYXMgc29vbiBhcyBhbnkgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgaXMKLSAgICAgKiBub24temVybyAqLwotICAgIHUzMiBub25aZXJvQnMgPSBIQU5UUk9fRkFMU0U7Ci0gICAgdTMyICpwVG1wOwotICAgIHUzMiB0bXAxLCB0bXAyLCBpc0ludHJhTWI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYik7Ci0gICAgQVNTRVJUKGJTKTsKLSAgICBBU1NFUlQoZmxhZ3MpOwotCi0gICAgaXNJbnRyYU1iID0gSVNfSU5UUkFfTUIoKm1iKTsKLQotICAgIC8qIHRvcCBlZGdlcyAqLwotICAgIHBUbXAgPSAodTMyKikmYlNbMV1bMF07Ci0gICAgaWYgKGZsYWdzICYgRklMVEVSX1RPUF9FREdFKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW50cmFNYiB8fCBJU19JTlRSQV9NQigqbWItPm1iQikpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwVG1wID0gMHgwNDA0MDQwNDsKLSAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBUbXAgPSBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcChtYiwgbWItPm1iQik7Ci0gICAgICAgICAgICBpZiAoKnBUbXApCi0gICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnBUbXAgPSAwOwotICAgIH0KLQotICAgIC8qIGxlZnQgZWRnZXMgKi8KLSAgICBwVG1wID0gKHUzMiopJmJTWzBdWzBdOwotICAgIGlmIChmbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCi0gICAgewotICAgICAgICBpZiAoaXNJbnRyYU1iIHx8IElTX0lOVFJBX01CKCptYi0+bWJBKSkKLSAgICAgICAgewotICAgICAgICAgICAgLypiU1swXVswXSA9IGJTWzBdWzFdID0gYlNbMF1bMl0gPSBiU1swXVszXSA9IDQ7Ki8KLSAgICAgICAgICAgICpwVG1wID0gMHgwNDA0MDQwNDsKLSAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBUbXAgPSBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWIsIG1iLT5tYkEpOwotICAgICAgICAgICAgaWYgKCFub25aZXJvQnMgJiYgKnBUbXApCi0gICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnBUbXAgPSAwOwotICAgIH0KLQotICAgIC8qIGlubmVyIGVkZ2VzICovCi0gICAgaWYgKGlzSW50cmFNYikKLSAgICB7Ci0gICAgICAgIHBUbXArKzsKLSAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7Ci0gICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOwotICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKLSAgICAgICAgcFRtcCsrOwotICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKLSAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7Ci0gICAgICAgICpwVG1wID0gMHgwMzAzMDMwMzsKLQotICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFRtcCA9ICh1MzIqKW1iLT50b3RhbENvZWZmOwotCi0gICAgICAgIC8qIDE2eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgb3IgbW90aW9uIHZlY3RvcnMgY2Fubm90IGRpZmZlciwKLSAgICAgICAgICogb25seSBjaGVjayBpZiBlaXRoZXIgb2YgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyAqLwotICAgICAgICBpZiAoaDI2NGJzZE51bU1iUGFydChtYi0+bWJUeXBlKSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIHRtcDIgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNF0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMl0gIHx8IFswXSAqLwotICAgICAgICAgICAgYlNbMV1bNV0gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsxXSAqLwotICAgICAgICAgICAgYlNbMF1bNF0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMV0gIHx8IFswXSAqLwotICAgICAgICAgICAgYlNbMF1bNV0gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsyXSAqLwotCi0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KLSAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKLSAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCi0KLSAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLwotICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KLSAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCi0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHUzMiB0bXAzLCB0bXA0OwotCi0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbOF07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMl07Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbOV07Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107Ci0KLSAgICAgICAgICAgIGJTWzFdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzZdOwotICAgICAgICAgICAgYlNbMV1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxM107Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbN107Ci0gICAgICAgICAgICBiU1sxXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls0XTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsxXTsKLSAgICAgICAgICAgIGJTWzFdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzZdOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOwotICAgICAgICAgICAgYlNbMF1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbOV07Ci0gICAgICAgICAgICBiU1swXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzE0XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlsxMV07Ci0gICAgICAgICAgICBiU1swXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzBdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogMTZ4OCBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50Ci0gICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgaG9yaXpvbnRhbCBlZGdlLCBmb3IgdGhlIG90aGVyIHRvcCBlZGdlcyBpdCBpcwotICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCi0gICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgbGVmdCBlZGdlcy4gKi8KLSAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzE2eDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgdG1wMiA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs0XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsyXSAgfHwgWzBdICovCi0gICAgICAgICAgICBiU1sxXVs1XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzFdICovCi0gICAgICAgICAgICBiU1swXVs0XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxXSAgfHwgWzBdICovCi0gICAgICAgICAgICBiU1swXVs1XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzJdICovCi0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KLSAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKLSAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCi0KLSAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLwotICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KLSAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCi0KLSAgICAgICAgICAgIGJTWzFdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOCwgMik7Ci0gICAgICAgICAgICBiU1sxXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDksIDMpOwotICAgICAgICAgICAgYlNbMV1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDYpOwotICAgICAgICAgICAgYlNbMV1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTMsIDcpOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKLQotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzRdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzFdOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzZdOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOwotICAgICAgICAgICAgYlNbMF1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbOV07Ci0gICAgICAgICAgICBiU1swXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzE0XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlsxMV07Ci0gICAgICAgICAgICBiU1swXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzBdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIDh4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAotICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIHZlcnRpY2FsIGVkZ2UsIGZvciB0aGUgb3RoZXIgbGVmdCBlZGdlcyBpdCBpcwotICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCi0gICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgdG9wIGVkZ2VzLiAqLwotICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfOHgxNikKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICB0bXAyID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzRdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzJdICB8fCBbMF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzVdICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzRdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzFdICB8fCBbMF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzVdICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMl0gKi8KLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbNl0gIHx8IFs0XSAqLwotICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs1XSAqLwotICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbNV0gIHx8IFs0XSAqLwotICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs2XSAqLwotICAgICAgICAgICAgdG1wMiA9ICpwVG1wOwotICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTBdIHx8IFs4XSAqLwotICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFs5XSAqLwotICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbOV0gIHx8IFs4XSAqLwotICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFsxMF0gKi8KLQotICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTRdIHx8IFsxMl0gKi8KLSAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTNdICovCi0gICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxM10gfHwgWzEyXSAqLwotICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxNF0gKi8KLQotICAgICAgICAgICAgYlNbMF1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKLSAgICAgICAgICAgIGJTWzBdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7Ci0gICAgICAgICAgICBiU1swXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7Ci0gICAgICAgICAgICBiU1swXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKLQotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzhdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzJdOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzldOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOwotICAgICAgICAgICAgYlNbMV1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbNl07Ci0gICAgICAgICAgICBiU1sxXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzEzXTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZls3XTsKLSAgICAgICAgICAgIGJTWzFdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMV1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzRdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMiwgMCk7Ci0gICAgICAgICAgICBiU1sxXVs1XSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDMsIDEpOwotICAgICAgICAgICAgYlNbMF1bNF0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxLCAwKTsKLSAgICAgICAgICAgIGJTWzBdWzVdID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMywgMik7Ci0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDYsIDQpOwotICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNywgNSk7Ci0gICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA1LCA0KTsKLSAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDcsIDYpOwotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMCwgOCk7Ci0gICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMSwgOSk7Ci0gICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA5LCA4KTsKLSAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDExLCAxMCk7Ci0gICAgICAgICAgICB0bXAxID0gKnBUbXA7Ci0gICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNCwgMTIpOwotICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTUsIDEzKTsKLSAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDEzLCAxMik7Ci0gICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNSwgMTQpOwotCi0gICAgICAgICAgICBiU1sxXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDgsIDIpOwotICAgICAgICAgICAgYlNbMV1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA5LCAzKTsKLSAgICAgICAgICAgIGJTWzFdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA2KTsKLSAgICAgICAgICAgIGJTWzFdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEzLCA3KTsKLQotICAgICAgICAgICAgYlNbMF1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKLSAgICAgICAgICAgIGJTWzBdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7Ci0gICAgICAgICAgICBiU1swXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7Ci0gICAgICAgICAgICBiU1swXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOwotICAgICAgICB9Ci0gICAgICAgIHBUbXAgPSAodTMyKikmYlNbMF1bMF07Ci0gICAgICAgIGlmICghbm9uWmVyb0JzICYmIChwVG1wWzFdIHx8IHBUbXBbMl0gfHwgcFRtcFszXSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFs1XSB8fCBwVG1wWzZdIHx8IHBUbXBbN10pICkKLSAgICAgICAgewotICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4obm9uWmVyb0JzKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldEx1bWFFZGdlVGhyZXNob2xkcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAotICAgICAgICAgICAgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKLSAgICBtYlN0b3JhZ2VfdCAqbWIsCi0gICAgdTggKCphbHBoYSlbMl0sCi0gICAgdTggKCpiZXRhKVsyXSwKLSAgICB1OCAoKnRocmVzaG9sZClbMTZdLAotICAgIHU4ICgqYnMpWzE2XSwKLSAgICB1MzIgZmlsdGVyaW5nRmxhZ3MgKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpbmRleEEsIGluZGV4QjsKLSAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOwotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQodGhyZXNob2xkKTsKLSAgICBBU1NFUlQoYnMpOwotICAgIEFTU0VSVChiZXRhKTsKLSAgICBBU1NFUlQoYWxwaGEpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBxcCA9IG1iLT5xcFk7Ci0KLSAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAvKiBJbnRlcm5hbCBlZGdlIHZhbHVlcyAqLwotICAgIGFscGhhWzBdWzFdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYWxwaGFbMV1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYmV0YVswXVsxXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgYmV0YVsxXVsxXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07Ci0KLSAgICAvKiB2ZXJ0aWNhbCBzY2FuIG9yZGVyICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICB7Ci0gICAgICAgIHUzMiB0MSwgdDI7Ci0KLSAgICAgICAgdDEgPSBic1tpXVswXTsKLSAgICAgICAgdDIgPSBic1tpXVsxXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzBdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzJdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bM107Ci0gICAgICAgIHRocmVzaG9sZFtpXVsyXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVs0XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzNdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzVdOwotICAgICAgICB0aHJlc2hvbGRbaV1bNF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bNl07Ci0gICAgICAgIHRocmVzaG9sZFtpXVs1XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVs3XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzZdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzhdOwotICAgICAgICB0aHJlc2hvbGRbaV1bN10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bOV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVs4XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVsxMF07Ci0gICAgICAgIHRocmVzaG9sZFtpXVs5XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVsxMV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxMF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVsxMl07Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxMV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVsxM107Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxMl0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVsxNF07Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxM10gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVsxNV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxNF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdGhyZXNob2xkW2ldWzE1XSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgIH0KLQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gcXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMiB0MSwgdDIsIHQzLCB0NDsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICAgICAgICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOwotICAgICAgICAgICAgdDEgPSBic1sxXVswXTsKLSAgICAgICAgICAgIHQyID0gYnNbMV1bMV07Ci0gICAgICAgICAgICB0MyA9IGJzWzFdWzJdOwotICAgICAgICAgICAgdDQgPSBic1sxXVszXTsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVswXSA9ICh0MSAmJiAodDEgPCA0KSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzFdID0gKHQyICYmICh0MiA8IDQpKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bMl0gPSAodDMgJiYgKHQzIDwgNCkpID8gdGMwW2luZGV4QV1bdDNdIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVszXSA9ICh0NCAmJiAodDQgPCA0KSkgPyB0YzBbaW5kZXhBXVt0NF0gOiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IHFwKQotICAgICAgICB7Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVswXSA9IChic1swXVswXSAmJiAoYnNbMF1bMF0gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVswXV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzFdID0gKGJzWzBdWzFdICYmIChic1swXVsxXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzFdXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bMl0gPSAoYnNbMF1bMl0gJiYgKGJzWzBdWzJdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bMl1dIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVszXSA9IChic1swXVszXSAmJiAoYnNbMF1bM10gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVszXV0gOiAwOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKLSAgICAgICAgICAgIGNocm9tYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAotICAgIG1iU3RvcmFnZV90ICptYiwKLSAgICB1OCAoKmFscGhhKVsyXSwKLSAgICB1OCAoKmJldGEpWzJdLAotICAgIHU4ICgqdGhyZXNob2xkKVs4XSwKLSAgICB1OCAoKmJzKVsxNl0sCi0gICAgdTMyIGZpbHRlcmluZ0ZsYWdzLAotICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpbmRleEEsIGluZGV4QjsKLSAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOwotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQodGhyZXNob2xkKTsKLSAgICBBU1NFUlQoYnMpOwotICAgIEFTU0VSVChiZXRhKTsKLSAgICBBU1NFUlQoYWxwaGEpOwotICAgIEFTU0VSVChtYik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIHFwID0gbWItPnFwWTsKLSAgICBxcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0KLSAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICBhbHBoYVswXVsxXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGFscGhhWzFdWzFdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGJldGFbMF1bMV0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMV1bMV0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICB7Ci0gICAgICAgIHUzMiB0MSwgdDI7Ci0KLSAgICAgICAgdDEgPSBic1tpXVswXTsKLSAgICAgICAgdDIgPSBic1tpXVsxXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzBdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzJdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bM107Ci0gICAgICAgIHRocmVzaG9sZFtpXVsyXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVs4XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzNdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzldOwotICAgICAgICB0aHJlc2hvbGRbaV1bNF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMTBdOwotICAgICAgICB0aHJlc2hvbGRbaV1bNV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bMTFdOwotICAgICAgICB0aHJlc2hvbGRbaV1bNl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHRocmVzaG9sZFtpXVs3XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICB9Ci0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMiB0MSwgdDIsIHQzLCB0NDsKLSAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICAgICAgICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOwotCi0gICAgICAgICAgICB0MSA9IGJzWzFdWzBdOwotICAgICAgICAgICAgdDIgPSBic1sxXVsxXTsKLSAgICAgICAgICAgIHQzID0gYnNbMV1bMl07Ci0gICAgICAgICAgICB0NCA9IGJzWzFdWzNdOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzBdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bMV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVsyXSA9ICh0MykgPyB0YzBbaW5kZXhBXVt0M10gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzNdID0gKHQ0KSA/IHRjMFtpbmRleEFdW3Q0XSA6IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKLSAgICAgICAgewotCi0gICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVswXSA9IChic1swXVswXSkgPyB0YzBbaW5kZXhBXVtic1swXVswXV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzFdID0gKGJzWzBdWzFdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzFdXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bMl0gPSAoYnNbMF1bMl0pID8gdGMwW2luZGV4QV1bYnNbMF1bMl1dIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVszXSA9IChic1swXVszXSkgPyB0YzBbaW5kZXhBXVtic1swXVszXV0gOiAwOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qbGludCArZTcwMSArZTcwMiAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3MWRkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19ERUJMT0NLSU5HX0gKLSNkZWZpbmUgSDI2NFNXREVDX0RFQkxPQ0tJTkdfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkRmlsdGVyUGljdHVyZSgKLSAgaW1hZ2VfdCAqaW1hZ2UsCi0gIG1iU3RvcmFnZV90ICptYik7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0RFQkxPQ0tJTkdfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjNDgwZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkSW5pdAotICAgICAgICAgIGgyNjRic2REZWNvZGUKLSAgICAgICAgICBoMjY0YnNkU2h1dGRvd24KLSAgICAgICAgICBoMjY0YnNkQ3VycmVudEltYWdlCi0gICAgICAgICAgaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlCi0gICAgICAgICAgaDI2NGJzZFBpY1dpZHRoCi0gICAgICAgICAgaDI2NGJzZFBpY0hlaWdodAotICAgICAgICAgIGgyNjRic2RGbHVzaEJ1ZmZlcgotICAgICAgICAgIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzCi0gICAgICAgICAgaDI2NGJzZFZpZGVvUmFuZ2UKLSAgICAgICAgICBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzCi0gICAgICAgICAgaDI2NGJzZENyb3BwaW5nUGFyYW1zCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9kZWNvZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotI2luY2x1ZGUgImgyNjRic2RfYnl0ZV9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZGF0YS5oIgotI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RlYmxvY2tpbmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NvbmNlYWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZEluaXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgZGVjb2Rlci4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcgIGZsYWcgdG8gaW5kaWNhdGUgdGhlIGRlY29kZXIgdGhhdCBpdCBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIHBlcmZvcm0gcmVvcmRlcmluZyBvZiBkaXNwbGF5IGltYWdlcy4KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgICAgICBwb2ludGVyIHRvIGluaXRpYWxpemVkIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbml0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBub091dHB1dFJlb3JkZXJpbmcpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotICAgIHUzMiBzaXplOwotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGgyNjRic2RJbml0U3RvcmFnZShwU3RvcmFnZSk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBtYkxheWVyIHRvIGJlIG5leHQgbXVsdGlwbGUgb2YgNjQgdG8gZW5hYmxlIHVzZSBvZgotICAgICAqIHNwZWNpZmljIE5FT04gb3B0aW1pemVkICJtZW1zZXQiIGZvciBjbGVhcmluZyB0aGUgc3RydWN0dXJlICovCi0gICAgc2l6ZSA9IChzaXplb2YobWFjcm9ibG9ja0xheWVyX3QpICsgNjMpICYgfjB4M0Y7Ci0KLSAgICBwU3RvcmFnZS0+bWJMYXllciA9IChtYWNyb2Jsb2NrTGF5ZXJfdCopSDI2NFN3RGVjTWFsbG9jKHNpemUsIDEpOwotICAgIGlmICghcFN0b3JhZ2UtPm1iTGF5ZXIpCi0gICAgICAgIHJldHVybiBIQU5UUk9fTk9LOwotCi0gICAgaWYgKG5vT3V0cHV0UmVvcmRlcmluZykKLSAgICAgICAgcFN0b3JhZ2UtPm5vUmVvcmRlcmluZyA9IEhBTlRST19UUlVFOwotCi0gICAgcmV0dXJuIEhBTlRST19PSzsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBhIE5BTCB1bml0LiBUaGlzIGZ1bmN0aW9uIGNhbGxzIG90aGVyIG1vZHVsZXMgdG8gcGVyZm9ybQotICAgICAgICAgICAgdGFza3MgbGlrZQotICAgICAgICAgICAgICAgICogZXh0cmFjdCBhbmQgZGVjb2RlIE5BTCB1bml0IGZyb20gdGhlIGJ5dGUgc3RyZWFtCi0gICAgICAgICAgICAgICAgKiBkZWNvZGUgcGFyYW1ldGVyIHNldHMKLSAgICAgICAgICAgICAgICAqIGRlY29kZSBzbGljZSBoZWFkZXIgYW5kIHNsaWNlIGRhdGEKLSAgICAgICAgICAgICAgICAqIGNvbmNlYWwgZXJyb3JzIGluIHRoZSBwaWN0dXJlCi0gICAgICAgICAgICAgICAgKiBwZXJmb3JtIGRlYmxvY2tpbmcgZmlsdGVyaW5nCi0KLSAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY29udGFpbnMgdG9wIGxldmVsIGNvbnRyb2wgbG9naWMgb2YgdGhlIGRlY29kZXIuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgYnl0ZVN0cm0gICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGJ1ZmZlciBnaXZlbiBieSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgbGVuICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzCi0gICAgICAgICAgICBwaWNJZCAgICAgICAgICAgaWRlbnRpZmllciBmb3IgYSBwaWN0dXJlLCBhc3NpZ25lZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICByZWFkQnl0ZXMgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc3RyZWFtIGlzIHN0b3JlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSDI2NEJTRF9SRFkgICAgICAgICAgICAgZGVjb2RpbmcgZmluaXNoZWQsIG5vdGhpbmcgc3BlY2lhbAotICAgICAgICAgICAgSDI2NEJTRF9QSUNfUkRZICAgICAgICAgZGVjb2Rpbmcgb2YgYSBwaWN0dXJlIGZpbmlzaGVkCi0gICAgICAgICAgICBIMjY0QlNEX0hEUlNfUkRZICAgICAgICBwYXJhbSBzZXRzIGFjdGl2YXRlZCwgaW5mb3JtYXRpb24gbGlrZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBkaW1lbnNpb25zIGV0YyBjYW4gYmUgcmVhZAotICAgICAgICAgICAgSDI2NEJTRF9FUlJPUiAgICAgICAgICAgZXJyb3IgaW4gZGVjb2RpbmcKLSAgICAgICAgICAgIEgyNjRCU0RfUEFSQU1fU0VUX0VSUk9SIHNlcml1cyBlcnJvciBpbiBkZWNvZGluZywgZmFpbGVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZSBwYXJhbSBzZXRzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHU4ICpieXRlU3RybSwgdTMyIGxlbiwgdTMyIHBpY0lkLAotICAgIHUzMiAqcmVhZEJ5dGVzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHBwc0lkLCBzcHNJZDsKLSAgICBpMzIgcGljT3JkZXJDbnQ7Ci0gICAgbmFsVW5pdF90IG5hbFVuaXQ7Ci0gICAgc2VxUGFyYW1TZXRfdCBzZXFQYXJhbVNldDsKLSAgICBwaWNQYXJhbVNldF90IHBpY1BhcmFtU2V0OwotICAgIHN0cm1EYXRhX3Qgc3RybTsKLSAgICB1MzIgYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19GQUxTRTsKLSAgICB1MzIgcGljUmVhZHkgPSBIQU5UUk9fRkFMU0U7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0gICAgQVNTRVJUKGJ5dGVTdHJtKTsKLSAgICBBU1NFUlQobGVuKTsKLSAgICBBU1NFUlQocmVhZEJ5dGVzKTsKLQotICAgIC8qIGlmIHByZXZpb3VzIGJ1ZmZlciB3YXMgbm90IGZpbmlzaGVkIGFuZCBzYW1lIHBvaW50ZXIgZ2l2ZW4gLT4gc2tpcCBOQUwKLSAgICAgKiB1bml0IGV4dHJhY3Rpb24gKi8KLSAgICBpZiAocFN0b3JhZ2UtPnByZXZCdWZOb3RGaW5pc2hlZCAmJiBieXRlU3RybSA9PSBwU3RvcmFnZS0+cHJldkJ1ZlBvaW50ZXIpCi0gICAgewotICAgICAgICBzdHJtID0gcFN0b3JhZ2UtPnN0cm1bMF07Ci0gICAgICAgIHN0cm0ucFN0cm1DdXJyUG9zID0gc3RybS5wU3RybUJ1ZmZTdGFydDsKLSAgICAgICAgc3RybS5zdHJtQnVmZlJlYWRCaXRzID0gc3RybS5iaXRQb3NJbldvcmQgPSAwOwotICAgICAgICAqcmVhZEJ5dGVzID0gcFN0b3JhZ2UtPnByZXZCeXRlc0NvbnN1bWVkOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRXh0cmFjdE5hbFVuaXQoYnl0ZVN0cm0sIGxlbiwgJnN0cm0sIHJlYWRCeXRlcyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoIkJZVEVfU1RSRUFNIik7Ci0gICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgLyogc3RvcmUgc3RyZWFtICovCi0gICAgICAgIHBTdG9yYWdlLT5zdHJtWzBdID0gc3RybTsKLSAgICAgICAgcFN0b3JhZ2UtPnByZXZCeXRlc0NvbnN1bWVkID0gKnJlYWRCeXRlczsKLSAgICAgICAgcFN0b3JhZ2UtPnByZXZCdWZQb2ludGVyID0gYnl0ZVN0cm07Ci0gICAgfQotICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlTmFsVW5pdCgmc3RybSwgJm5hbFVuaXQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJOQUxfVU5JVCIpOwotICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgfQotCi0gICAgLyogRGlzY2FyZCB1bnNwZWNpZmllZCwgcmVzZXJ2ZWQsIFNQUyBleHRlbnNpb24gYW5kIGF1eGlsaWFyeSBwaWN0dXJlIHNsaWNlcyAqLwotICAgIGlmKG5hbFVuaXQubmFsVW5pdFR5cGUgPT0gMCB8fCBuYWxVbml0Lm5hbFVuaXRUeXBlID49IDEzKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJESVNDQVJERUQgTkFMIChVTlNQRUNJRklFRCwgUkVHSVNURVJFRCwgU1BTIGV4dCBvciBBVVggc2xpY2UpXG4iKSk7Ci0gICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5KAotICAgICAgJnN0cm0sCi0gICAgICAmbmFsVW5pdCwKLSAgICAgIHBTdG9yYWdlLAotICAgICAgJmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJBQ0NFU1MgVU5JVCBCT1VOREFSWSBDSEVDSyIpOwotICAgICAgICBpZiAodG1wID09IFBBUkFNX1NFVF9FUlJPUikKLSAgICAgICAgICAgIHJldHVybihIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICB9Ci0KLSAgICBpZiAoIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJBY2Nlc3MgdW5pdCBib3VuZGFyeVxuIikpOwotICAgICAgICAvKiBjb25jZWFsIGlmIHBpY3R1cmUgc3RhcnRlZCBhbmQgcGFyYW0gc2V0cyBhY3RpdmF0ZWQgKi8KLSAgICAgICAgaWYgKHBTdG9yYWdlLT5waWNTdGFydGVkICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJDT05DRUFMSU5HLi4uIikpOwotCi0gICAgICAgICAgICAvKiByZXR1cm4gZXJyb3IgaWYgc2Vjb25kIHBoYXNlIG9mCi0gICAgICAgICAgICAgKiBpbml0aWFsaXphdGlvbiBpcyBub3QgY29tcGxldGVkICovCi0gICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVQUklOVCgiUGVuZGluZyBhY3RpdmF0aW9uIG5vdCBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPmRhdGEgPQotICAgICAgICAgICAgICAgICAgICBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShwU3RvcmFnZS0+ZHBiKTsKLSAgICAgICAgICAgICAgICBoMjY0YnNkSW5pdFJlZlBpY0xpc3QocFN0b3JhZ2UtPmRwYik7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZENvbmNlYWwocFN0b3JhZ2UsIHBTdG9yYWdlLT5jdXJySW1hZ2UsIFBfU0xJQ0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDb25jZWFsKHBTdG9yYWdlLCBwU3RvcmFnZS0+Y3VyckltYWdlLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPnNsaWNlVHlwZSk7Ci0KLSAgICAgICAgICAgIHBpY1JlYWR5ID0gSEFOVFJPX1RSVUU7Ci0KLSAgICAgICAgICAgIC8qIGN1cnJlbnQgTkFMIHVuaXQgc2hvdWxkIGJlIGRlY29kZWQgb24gbmV4dCBhY3RpdmF0aW9uIC0+IHNldAotICAgICAgICAgICAgICogcmVhZEJ5dGVzIHRvIDAgKi8KLSAgICAgICAgICAgICpyZWFkQnl0ZXMgPSAwOwotICAgICAgICAgICAgcFN0b3JhZ2UtPnByZXZCdWZOb3RGaW5pc2hlZCA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgREVCVUcoKCIuLi5ET05FXG4iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwU3RvcmFnZS0+c2tpcFJlZHVuZGFudFNsaWNlcyA9IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoIXBpY1JlYWR5KQotICAgIHsKLSAgICAgICAgc3dpdGNoIChuYWxVbml0Lm5hbFVuaXRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE5BTF9TRVFfUEFSQU1fU0VUOgotICAgICAgICAgICAgICAgIERFQlVHKCgiU0VRIFBBUkFNIFNFVFxuIikpOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVTZXFQYXJhbVNldCgmc3RybSwgJnNlcVBhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgiU0VRX1BBUkFNX1NFVCIpOwotICAgICAgICAgICAgICAgICAgICBGUkVFKHNlcVBhcmFtU2V0Lm9mZnNldEZvclJlZkZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShzZXFQYXJhbVNldC52dWlQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldChwU3RvcmFnZSwgJnNlcVBhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOQUxfUElDX1BBUkFNX1NFVDoKLSAgICAgICAgICAgICAgICBERUJVRygoIlBJQyBQQVJBTSBTRVRcbiIpKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQoJnN0cm0sICZwaWNQYXJhbVNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBJQ19QQVJBTV9TRVQiKTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5ydW5MZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBGUkVFKHBpY1BhcmFtU2V0LnRvcExlZnQpOwotICAgICAgICAgICAgICAgICAgICBGUkVFKHBpY1BhcmFtU2V0LmJvdHRvbVJpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5zbGljZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0KHBTdG9yYWdlLCAmcGljUGFyYW1TZXQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5BTF9DT0RFRF9TTElDRV9JRFI6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJJRFIgIikpOwotICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgY2FzZSBOQUxfQ09ERURfU0xJQ0U6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJTTElDRSBIRUFERVJcbiIpKTsKLQotICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIGFuZCBzdGlsbCBkZWNvZGluZyBzYW1lIG9sZAotICAgICAgICAgICAgICAgICAqIGFjY2VzcyB1bml0IC0+IG5vIG5lZWQgdG8gZGVjb2RlIHJlZHVuZGFudCBzbGljZXMgKi8KLSAgICAgICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnNraXBSZWR1bmRhbnRTbGljZXMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7Ci0KLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGljU3RhcnRlZCA9IEhBTlRST19UUlVFOwotCi0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHBTdG9yYWdlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMgPSAwOwotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VycmVudFBpY0lkICAgID0gcGljSWQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrUHBzSWQoJnN0cm0sICZwcHNJZCk7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVCh0bXAgPT0gSEFOVFJPX09LKTsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgb2xkIGFjdGl2ZVNwc0lkIGFuZCByZXR1cm4gaGVhZGVycyByZWFkeQotICAgICAgICAgICAgICAgICAgICAgKiBpbmRpY2F0aW9uIGlmIGFjdGl2ZVNwcyBjaGFuZ2VzICovCi0gICAgICAgICAgICAgICAgICAgIHNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkOwotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMocFN0b3JhZ2UsIHBwc0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVCgmbmFsVW5pdCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiUGFyYW0gc2V0IGFjdGl2YXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodG1wID09IE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIMjY0QlNEX01FTUFMTE9DX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoc3BzSWQgIT0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXFQYXJhbVNldF90ICpvbGRTUFMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VxUGFyYW1TZXRfdCAqbmV3U1BTID0gcFN0b3JhZ2UtPmFjdGl2ZVNwczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBTdG9yYWdlLT5vbGRTcHNJZCA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkU1BTID0gcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+b2xkU3BzSWRdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAqcmVhZEJ5dGVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fVFJVRTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihuYWxVbml0Lm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnKCZub091dHB1dE9mUHJpb3JQaWNzRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RybSwgbmV3U1BTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdC5uYWxVbml0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gSEFOVFJPX05PSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHRtcCAhPSBIQU5UUk9fT0spIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAobm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgIT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU3RvcmFnZS0+ZHBiLT5ub1Jlb3JkZXJpbmcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTID09IE5VTEwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5waWNXaWR0aEluTWJzICE9IG5ld1NQUy0+cGljV2lkdGhJbk1icykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRTUFMtPnBpY0hlaWdodEluTWJzICE9IG5ld1NQUy0+cGljSGVpZ2h0SW5NYnMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5tYXhEcGJTaXplICE9IG5ld1NQUy0+bWF4RHBiU2l6ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmRwYi0+Zmx1c2hlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEZsdXNoRHBiKHBTdG9yYWdlLT5kcGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+b2xkU3BzSWQgPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0hEUlNfUkRZKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHJldHVybiBlcnJvciBpZiBzZWNvbmQgcGhhc2Ugb2YKLSAgICAgICAgICAgICAgICAgKiBpbml0aWFsaXphdGlvbiBpcyBub3QgY29tcGxldGVkICovCi0gICAgICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgiUGVuZGluZyBhY3RpdmF0aW9uIG5vdCBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKCZzdHJtLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXIgKyAxLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLCBwU3RvcmFnZS0+YWN0aXZlUHBzLCAmbmFsVW5pdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNMSUNFX0hFQURFUiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkSXNTdGFydE9mUGljdHVyZShwU3RvcmFnZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIUlTX0lEUl9OQUxfVU5JVCgmbmFsVW5pdCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKHBTdG9yYWdlLT5kcGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzFdLmZyYW1lTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXQubmFsUmVmSWRjICE9IDAgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIkdhcHMgaW4gZnJhbWUgbnVtIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPmRhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UocFN0b3JhZ2UtPmRwYik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogc3RvcmUgc2xpY2UgaGVhZGVyIHRvIHN0b3JhZ2UgaWYgc3VjY2Vzc2Z1bGx5IGRlY29kZWQgKi8KLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMF0gPSBwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMV07Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cHJldk5hbFVuaXRbMF0gPSBuYWxVbml0OwotCi0gICAgICAgICAgICAgICAgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwKHBTdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPnNsaWNlR3JvdXBDaGFuZ2VDeWNsZSk7Ci0KLSAgICAgICAgICAgICAgICBoMjY0YnNkSW5pdFJlZlBpY0xpc3QocFN0b3JhZ2UtPmRwYik7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIsCi0gICAgICAgICAgICAgICAgICAgICZwU3RvcmFnZS0+c2xpY2VIZWFkZXItPnJlZlBpY0xpc3RSZW9yZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZyYW1lTnVtLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgiUmVvcmRlcmluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUcoKCJTTElDRSBEQVRBLCBGSVJTVCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UpKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhKCZzdHJtLCBwU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgiU0xJQ0VfREFUQSIpOwotICAgICAgICAgICAgICAgICAgICBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkKHBTdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHBTdG9yYWdlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBpY1JlYWR5ID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5za2lwUmVkdW5kYW50U2xpY2VzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5BTF9TRUk6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJTRUkgTUVTU0FHRSwgTk9UIERFQ09ERUQiKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJOT1QgSU1QTEVNRU5URUQgWUVUICVkXG4iLG5hbFVuaXQubmFsVW5pdFR5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwaWNSZWFkeSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWx0ZXJQaWN0dXJlKHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5tYik7Ci0KLSAgICAgICAgaDI2NGJzZFJlc2V0U3RvcmFnZShwU3RvcmFnZSk7Ci0KLSAgICAgICAgcGljT3JkZXJDbnQgPSBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQocFN0b3JhZ2UtPnBvYywKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMsIHBTdG9yYWdlLT5zbGljZUhlYWRlciwgcFN0b3JhZ2UtPnByZXZOYWxVbml0KTsKLQotICAgICAgICBpZiAocFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+cHJldk5hbFVuaXQtPm5hbFJlZklkYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkTWFya0RlY1JlZlBpYyhwU3RvcmFnZS0+ZHBiLAotICAgICAgICAgICAgICAgICAgICAmcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZyYW1lTnVtLAotICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCwKLSAgICAgICAgICAgICAgICAgICAgSVNfSURSX05BTF9VTklUKHBTdG9yYWdlLT5wcmV2TmFsVW5pdCkgPwotICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCwgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBub24tcmVmZXJlbmNlIHBpY3R1cmUsIGp1c3Qgc3RvcmUgZm9yIHBvc3NpYmxlIGRpc3BsYXkKLSAgICAgICAgICAgICAqIHJlb3JkZXJpbmcgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkTWFya0RlY1JlZlBpYyhwU3RvcmFnZS0+ZHBiLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZyYW1lTnVtLAotICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCwKLSAgICAgICAgICAgICAgICAgICAgSVNfSURSX05BTF9VTklUKHBTdG9yYWdlLT5wcmV2TmFsVW5pdCkgPwotICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCwgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwU3RvcmFnZS0+cGljU3RhcnRlZCA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgcmV0dXJuKEgyNjRCU0RfUElDX1JEWSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEgyNjRCU0RfUkRZKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RTaHV0ZG93bgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTaHV0ZG93biBhIGRlY29kZXIgaW5zdGFuY2UuIEZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3JpZXMKLSAgICAgICAgICAgIGFsbG9jYXRlZCBmb3IgdGhlIGRlY29kZXIgaW5zdGFuY2UuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RTaHV0ZG93bihzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwU3RvcmFnZS0+c3BzW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0tPm9mZnNldEZvclJlZkZyYW1lKTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpXS0+dnVpUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwU3RvcmFnZS0+cHBzW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0tPnJ1bkxlbmd0aCk7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0tPnRvcExlZnQpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5ib3R0b21SaWdodCk7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0tPnNsaWNlR3JvdXBJZCk7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgRlJFRShwU3RvcmFnZS0+bWJMYXllcik7Ci0gICAgRlJFRShwU3RvcmFnZS0+bWIpOwotICAgIEZSRUUocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXApOwotCi0gICAgaDI2NGJzZEZyZWVEcGIocFN0b3JhZ2UtPmRwYik7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IG5leHQgb3V0cHV0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcGljSWQgICAgICAgaWRlbnRpZmllciBvZiB0aGUgcGljdHVyZSB3aWxsIGJlIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICBpc0lkclBpYyAgICBJRFIgZmxhZyBvZiB0aGUgcGljdHVyZSB3aWxsIGJlIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICBudW1FcnJNYnMgICBudW1iZXIgb2YgY29uY2VhbGVkIG1hY3JvYmxvY2tzIGluIHRoZSBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHBpY3R1cmUgZGF0YQotICAgICAgICAgICAgTlVMTCBpZiBubyBwaWN0dXJlcyBhdmFpbGFibGUgZm9yIGRpc3BsYXkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTgqIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKnBpY0lkLCB1MzIgKmlzSWRyUGljLAotICAgIHUzMiAqbnVtRXJyTWJzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGRwYk91dFBpY3R1cmVfdCAqcE91dDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIHBPdXQgPSBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShwU3RvcmFnZS0+ZHBiKTsKLQotICAgIGlmIChwT3V0ICE9IE5VTEwpCi0gICAgewotICAgICAgICAqcGljSWQgPSBwT3V0LT5waWNJZDsKLSAgICAgICAgKmlzSWRyUGljID0gcE91dC0+aXNJZHI7Ci0gICAgICAgICpudW1FcnJNYnMgPSBwT3V0LT5udW1FcnJNYnM7Ci0gICAgICAgIHJldHVybiAocE91dC0+ZGF0YSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFBpY1dpZHRoCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCB3aWR0aCBvZiB0aGUgcGljdHVyZSBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBpY3R1cmUgd2lkdGgKLSAgICAgICAgICAgIDAgaWYgcGFyYW1ldGVycyBzZXRzIG5vdCB5ZXQgYWN0aXZhdGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUGljV2lkdGgoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcykKLSAgICAgICAgcmV0dXJuKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKDApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFBpY0hlaWdodAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgaGVpZ2h0IG9mIHRoZSBwaWN0dXJlIGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcGljdHVyZSB3aWR0aAotICAgICAgICAgICAgMCBpZiBwYXJhbWV0ZXJzIHNldHMgbm90IHlldCBhY3RpdmF0ZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RQaWNIZWlnaHQoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcykKLSAgICAgICAgcmV0dXJuKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybigwKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaEJ1ZmZlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGbHVzaCB0aGUgZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlciwgc2VlIGRwYi5jIGZvciBkZXRhaWxzCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEZsdXNoQnVmZmVyKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaDI2NGJzZEZsdXNoRHBiKHBTdG9yYWdlLT5kcGIpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgaWYgYW55IHZhbGlkIHBhcmFtZXRlciBzZXQgY29tYmluYXRpb25zIChTUFMvUFBTKSBleGlzdHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICAxICAgICAgIGF0IGxlYXN0IG9uZSB2YWxpZCBTUFMvUFBTIGNvbWJpbmF0aW9uIGZvdW5kCi0gICAgICAgICAgICAwICAgICAgIG5vIHZhbGlkIHBhcmFtIHNldCBjb21iaW5hdGlvbnMgZm91bmQKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICByZXR1cm4oaDI2NGJzZFZhbGlkUGFyYW1TZXRzKHBTdG9yYWdlKSA9PSBIQU5UUk9fT0sgPyAxIDogMCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkVmlkZW9SYW5nZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgdmFsdWUgb2YgdmlkZW9fZnVsbF9yYW5nZV9mbGFnIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIDEgICB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgcmVjZWl2ZWQgYW5kIHZhbHVlIGlzIDEKLSAgICAgICAgICAgIDAgICBvdGhlcndpc2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RWaWRlb1JhbmdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+dmlkZW9GdWxsUmFuZ2VGbGFnKQotICAgICAgICByZXR1cm4oMSk7Ci0gICAgZWxzZSAvKiBkZWZhdWx0IHZhbHVlIG9mIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyBpcyAwICovCi0gICAgICAgIHJldHVybigwKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IHZhbHVlIG9mIG1hdHJpeF9jb2VmZmljaWVudHMgcmVjZWl2ZWQgaW4gdGhlIFZVSSBkYXRhCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICB2YWx1ZSBvZiBtYXRyaXhfY29lZmZpY2llbnRzIGlmIHJlY2VpdmVkCi0gICAgICAgICAgICAyICAgb3RoZXJ3aXNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cyhzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWcpCi0gICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMpOwotICAgIGVsc2UgLyogZGVmYXVsdCB1bnNwZWNpZmllZCAqLwotICAgICAgICByZXR1cm4oMik7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoaDI2NGJzZENyb3BwaW5nUGFyYW1zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBjcm9wcGluZyBwYXJhbWV0ZXJzIG9mIHRoZSBhY3RpdmUgU1BTCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBjcm9wcGluZ0ZsYWcgICAgZmxhZyBpbmRpY2F0aW5nIGlmIGNyb3BwaW5nIHBhcmFtcyBwcmVzZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkIGhlcmUKLSAgICAgICAgICAgIGxlZnRPZmZzZXQgICAgICBjcm9wcGluZyBsZWZ0IG9mZnNldCBpbiBwaXhlbHMgaXMgc3RvcmVkIGhlcmUKLSAgICAgICAgICAgIHdpZHRoICAgICAgICAgICB3aWR0aCBvZiB0aGUgaW1hZ2UgYWZ0ZXIgY3JvcHBpbmcgaXMgc3RvcmVkIGhlcmUKLSAgICAgICAgICAgIHRvcE9mZnNldCAgICAgICBjcm9wcGluZyB0b3Agb2Zmc2V0IGluIHBpeGVscyBpcyBzdG9yZWQgaGVyZQotICAgICAgICAgICAgaGVpZ2h0ICAgICAgICAgIGhlaWdodCBvZiB0aGUgaW1hZ2UgYWZ0ZXIgY3JvcHBpbmcgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RDcm9wcGluZ1BhcmFtcyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKmNyb3BwaW5nRmxhZywKLSAgICB1MzIgKmxlZnRPZmZzZXQsIHUzMiAqd2lkdGgsIHUzMiAqdG9wT2Zmc2V0LCB1MzIgKmhlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BwaW5nRmxhZykKLSAgICB7Ci0gICAgICAgICpjcm9wcGluZ0ZsYWcgPSAxOwotICAgICAgICAqbGVmdE9mZnNldCA9IDIgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0OwotICAgICAgICAqd2lkdGggPSAxNiAqIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgLQotICAgICAgICAgICAgICAgICAyICogKHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcExlZnRPZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0KTsKLSAgICAgICAgKnRvcE9mZnNldCA9IDIgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BUb3BPZmZzZXQ7Ci0gICAgICAgICpoZWlnaHQgPSAxNiAqIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzIC0KLSAgICAgICAgICAgICAgICAgIDIgKiAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wVG9wT2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKmNyb3BwaW5nRmxhZyA9IDA7Ci0gICAgICAgICpsZWZ0T2Zmc2V0ID0gMDsKLSAgICAgICAgKndpZHRoID0gMDsKLSAgICAgICAgKnRvcE9mZnNldCA9IDA7Ci0gICAgICAgICpoZWlnaHQgPSAwOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYXNwZWN0IHJhdGlvIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgc2FyV2lkdGggICAgc2FtcGxlIGFzcGVjdCByYXRpbyBoZWlnaHQKLSAgICAgICAgICAgIHNhckhlaWdodCAgIHNhbXBsZSBhc3BlY3QgcmF0aW8gd2lkdGgKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8oc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpzYXJXaWR0aCwgdTMyICpzYXJIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotICAgIHUzMiB3ID0gMTsKLSAgICB1MzIgaCA9IDE7Ci0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb1ByZXNlbnRGbGFnICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9JZGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPX1VOU1BFQ0lGSUVEOiAgdyA9ICAgMDsgaCA9ICAwOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzFfMTogICAgICAgICAgdyA9ICAgMTsgaCA9ICAxOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzEyXzExOiAgICAgICAgdyA9ICAxMjsgaCA9IDExOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzEwXzExOiAgICAgICAgdyA9ICAxMDsgaCA9IDExOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE2XzExOiAgICAgICAgdyA9ICAxNjsgaCA9IDExOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzQwXzMzOiAgICAgICAgdyA9ICA0MDsgaCA9IDMzOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzI0XzExOiAgICAgICAgdyA9ICAyNDsgaCA9IDExOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzIwXzExOiAgICAgICAgdyA9ICAyMDsgaCA9IDExOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzMyXzExOiAgICAgICAgdyA9ICAzMjsgaCA9IDExOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzgwXzMzOiAgICAgICAgdyA9ICA4MDsgaCA9IDMzOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE4XzExOiAgICAgICAgdyA9ICAxODsgaCA9IDExOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE1XzExOiAgICAgICAgdyA9ICAxNTsgaCA9IDExOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzY0XzMzOiAgICAgICAgdyA9ICA2NDsgaCA9IDMzOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE2MF85OTogICAgICAgdyA9IDE2MDsgaCA9IDk5OyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPX0VYVEVOREVEX1NBUjoKLSAgICAgICAgICAgICAgICB3ID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+c2FyV2lkdGg7Ci0gICAgICAgICAgICAgICAgaCA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnNhckhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoKHcgPT0gMCkgfHwgKGggPT0gMCkpCi0gICAgICAgICAgICAgICAgICAgIHcgPSBoID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdyA9IDA7Ci0gICAgICAgICAgICAgICAgaCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzZXQgYXNwZWN0IHJhdGlvKi8KLSAgICAqc2FyV2lkdGggPSB3OwotICAgICpzYXJIZWlnaHQgPSBoOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByb2ZpbGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IHByb2ZpbGUgaW5mb3JtYXRpb24gZnJvbSBhY3RpdmUgU1BTCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwcm9maWxlICAgY3VycmVudCBwcm9maWxlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZFByb2ZpbGUoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcykKLSAgICAgICAgcmV0dXJuIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnByb2ZpbGVJZGM7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzY1MjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfREVDT0RFUl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19ERUNPREVSX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBlbnVtZXJhdGVkIHJldHVybiB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyAqLwotZW51bSB7Ci0gICAgSDI2NEJTRF9SRFksCi0gICAgSDI2NEJTRF9QSUNfUkRZLAotICAgIEgyNjRCU0RfSERSU19SRFksCi0gICAgSDI2NEJTRF9FUlJPUiwKLSAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiwKLSAgICBIMjY0QlNEX01FTUFMTE9DX0VSUk9SCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbml0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBub091dHB1dFJlb3JkZXJpbmcpOwotdTMyIGgyNjRic2REZWNvZGUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTggKmJ5dGVTdHJtLCB1MzIgbGVuLCB1MzIgcGljSWQsCi0gICAgdTMyICpyZWFkQnl0ZXMpOwotdm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci0KLXU4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKLSAgICB1MzIgKm51bUVyck1icyk7Ci0KLXUzMiBoMjY0YnNkUGljV2lkdGgoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci11MzIgaDI2NGJzZFBpY0hlaWdodChzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXUzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXUzMiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCi0gICAgdTMyICpsZWZ0LCB1MzIgKndpZHRoLCB1MzIgKnRvcCwgdTMyICpoZWlnaHQpOwotdm9pZCBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8oc3RvcmFnZV90ICpwU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KTsKLXUzMiBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLQotdm9pZCBoMjY0YnNkRmx1c2hCdWZmZXIoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci0KLXUzMiBoMjY0YnNkUHJvZmlsZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDT0RFUl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5ZWVlOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBDb21wYXJlUGljdHVyZXMKLSAgICAgICAgICBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QKLSAgICAgICAgICBNbWNvcDEKLSAgICAgICAgICBNbWNvcDIKLSAgICAgICAgICBNbWNvcDMKLSAgICAgICAgICBNbWNvcDQKLSAgICAgICAgICBNbWNvcDUKLSAgICAgICAgICBNbWNvcDYKLSAgICAgICAgICBoMjY0YnNkTWFya0RlY1JlZlBpYwotICAgICAgICAgIGgyNjRic2RHZXRSZWZQaWNEYXRhCi0gICAgICAgICAgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UKLSAgICAgICAgICBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZwotICAgICAgICAgIGgyNjRic2RJbml0RHBiCi0gICAgICAgICAgaDI2NGJzZFJlc2V0RHBiCi0gICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0Ci0gICAgICAgICAgRmluZERwYlBpYwotICAgICAgICAgIFNldFBpY051bXMKLSAgICAgICAgICBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bQotICAgICAgICAgIEZpbmRTbWFsbGVzdFBpY09yZGVyQ250Ci0gICAgICAgICAgT3V0cHV0UGljdHVyZQotICAgICAgICAgIGgyNjRic2REcGJPdXRwdXRQaWN0dXJlCi0gICAgICAgICAgaDI2NGJzZEZsdXNoRHBiCi0gICAgICAgICAgaDI2NGJzZEZyZWVEcGIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogbWFjcm9zIHRvIGRldGVybWluZSBwaWN0dXJlIHN0YXR1cy4gTm90ZSB0aGF0IElTX1NIT1JUX1RFUk0gbWFjcm8gcmV0dXJucwotICogdHJ1ZSBhbHNvIGZvciBub24tZXhpc3RpbmcgcGljdHVyZXMgYmVjYXVzZSBub24tZXhpc3RpbmcgcGljdHVyZXMgYXJlCi0gKiByZWdhcmRlZCBzaG9ydCB0ZXJtIHBpY3R1cmVzIGFjY29yZGluZyB0byBILjI2NCBzdGFuZGFyZCAqLwotI2RlZmluZSBJU19SRUZFUkVOQ0UoYSkgKChhKS5zdGF0dXMpCi0jZGVmaW5lIElTX0VYSVNUSU5HKGEpICgoYSkuc3RhdHVzID4gTk9OX0VYSVNUSU5HKQotI2RlZmluZSBJU19TSE9SVF9URVJNKGEpIFwKLSAgICAoKGEpLnN0YXR1cyA9PSBOT05fRVhJU1RJTkcgfHwgKGEpLnN0YXR1cyA9PSBTSE9SVF9URVJNKQotI2RlZmluZSBJU19MT05HX1RFUk0oYSkgKChhKS5zdGF0dXMgPT0gTE9OR19URVJNKQotCi0vKiBtYWNybyB0byBzZXQgYSBwaWN0dXJlIHVudXNlZCBmb3IgcmVmZXJlbmNlICovCi0jZGVmaW5lIFNFVF9VTlVTRUQoYSkgKGEpLnN0YXR1cyA9IFVOVVNFRDsKLQotI2RlZmluZSBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFIDE2Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGkzMiBDb21wYXJlUGljdHVyZXMoY29uc3Qgdm9pZCAqcHRyMSwgY29uc3Qgdm9pZCAqcHRyMik7Ci0KLXN0YXRpYyB1MzIgTW1jb3AxKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyclBpY051bSwgdTMyIGRpZmZlcmVuY2VPZlBpY051bXMpOwotCi1zdGF0aWMgdTMyIE1tY29wMihkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGxvbmdUZXJtUGljTnVtKTsKLQotc3RhdGljIHUzMiBNbWNvcDMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcywKLSAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCk7Ci0KLXN0YXRpYyB1MzIgTW1jb3A0KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbWF4TG9uZ1Rlcm1GcmFtZUlkeCk7Ci0KLXN0YXRpYyB1MzIgTW1jb3A1KGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotc3RhdGljIHUzMiBNbWNvcDYoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBmcmFtZU51bSwgaTMyIHBpY09yZGVyQ250LAotICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KTsKLQotc3RhdGljIHUzMiBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZyhkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXN0YXRpYyBpMzIgRmluZERwYlBpYyhkcGJTdG9yYWdlX3QgKmRwYiwgaTMyIHBpY051bSwgdTMyIGlzU2hvcnRUZXJtKTsKLQotc3RhdGljIHZvaWQgU2V0UGljTnVtcyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJGcmFtZU51bSk7Ci0KLXN0YXRpYyBkcGJQaWN0dXJlX3QqIEZpbmRTbWFsbGVzdFBpY09yZGVyQ250KGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotc3RhdGljIHUzMiBPdXRwdXRQaWN0dXJlKGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotc3RhdGljIHZvaWQgU2hlbGxTb3J0KGRwYlBpY3R1cmVfdCAqcFBpYywgdTMyIG51bSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogQ29tcGFyZVBpY3R1cmVzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNvbXBhcmUgZHBiIHBpY3R1cmVzLCB1c2VkIGJ5IHRoZSBTaGVsbFNvcnQoKSBmdW5jdGlvbi4KLSAgICAgICAgICAgIE9yZGVyIG9mIHRoZSBwaWN0dXJlcyBhZnRlciBzb3J0aW5nIHNoYWxsIGJlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICAgICAgMSkgc2hvcnQgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgc3RhcnRpbmcgd2l0aCB0aGUgbGFyZ2VzdAotICAgICAgICAgICAgICAgICAgIHBpY051bQotICAgICAgICAgICAgICAgIDIpIGxvbmcgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgc3RhcnRpbmcgd2l0aCB0aGUgc21hbGxlc3QKLSAgICAgICAgICAgICAgICAgICBsb25nVGVybVBpY051bQotICAgICAgICAgICAgICAgIDMpIHBpY3R1cmVzIHVudXNlZCBmb3IgcmVmZXJlbmNlIGJ1dCBuZWVkZWQgZm9yIGRpc3BsYXkKLSAgICAgICAgICAgICAgICA0KSBvdGhlciBwaWN0dXJlcwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICAtMSAgICAgIHBpYyAxIGlzIGdyZWF0ZXIgdGhhbiBwaWMgMgotICAgICAgICAgICAgIDAgICAgICBlcXVhbCBmcm9tIGNvbXBhcmlzb24gcG9pbnQgb2YgdmlldwotICAgICAgICAgICAgIDEgICAgICBwaWMgMiBpcyBncmVhdGVyIHRoZW4gcGljIDEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGkzMiBDb21wYXJlUGljdHVyZXMoY29uc3Qgdm9pZCAqcHRyMSwgY29uc3Qgdm9pZCAqcHRyMikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBkcGJQaWN0dXJlX3QgKnBpYzEsICpwaWMyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocHRyMSk7Ci0gICAgQVNTRVJUKHB0cjIpOwotCi0gICAgcGljMSA9IChkcGJQaWN0dXJlX3QqKXB0cjE7Ci0gICAgcGljMiA9IChkcGJQaWN0dXJlX3QqKXB0cjI7Ci0KLSAgICAvKiBib3RoIGFyZSBub24tcmVmZXJlbmNlIHBpY3R1cmVzLCBjaGVjayBpZiBuZWVkZWQgZm9yIGRpc3BsYXkgKi8KLSAgICBpZiAoIUlTX1JFRkVSRU5DRSgqcGljMSkgJiYgIUlTX1JFRkVSRU5DRSgqcGljMikpCi0gICAgewotICAgICAgICBpZiAocGljMS0+dG9CZURpc3BsYXllZCAmJiAhcGljMi0+dG9CZURpc3BsYXllZCkKLSAgICAgICAgICAgIHJldHVybigtMSk7Ci0gICAgICAgIGVsc2UgaWYgKCFwaWMxLT50b0JlRGlzcGxheWVkICYmIHBpYzItPnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICByZXR1cm4oMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gICAgLyogb25seSBwaWMgMSBuZWVkZWQgZm9yIHJlZmVyZW5jZSAtPiBncmVhdGVyICovCi0gICAgZWxzZSBpZiAoIUlTX1JFRkVSRU5DRSgqcGljMikpCi0gICAgICAgIHJldHVybigtMSk7Ci0gICAgLyogb25seSBwaWMgMiBuZWVkZWQgZm9yIHJlZmVyZW5jZSAtPiBncmVhdGVyICovCi0gICAgZWxzZSBpZiAoIUlTX1JFRkVSRU5DRSgqcGljMSkpCi0gICAgICAgIHJldHVybigxKTsKLSAgICAvKiBib3RoIGFyZSBzaG9ydCB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyAtPiBjaGVjayBwaWNOdW0gKi8KLSAgICBlbHNlIGlmIChJU19TSE9SVF9URVJNKCpwaWMxKSAmJiBJU19TSE9SVF9URVJNKCpwaWMyKSkKLSAgICB7Ci0gICAgICAgIGlmIChwaWMxLT5waWNOdW0gPiBwaWMyLT5waWNOdW0pCi0gICAgICAgICAgICByZXR1cm4oLTEpOwotICAgICAgICBlbHNlIGlmIChwaWMxLT5waWNOdW0gPCBwaWMyLT5waWNOdW0pCi0gICAgICAgICAgICByZXR1cm4oMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gICAgLyogb25seSBwaWMgMSBpcyBzaG9ydCB0ZXJtIC0+IGdyZWF0ZXIgKi8KLSAgICBlbHNlIGlmIChJU19TSE9SVF9URVJNKCpwaWMxKSkKLSAgICAgICAgcmV0dXJuKC0xKTsKLSAgICAvKiBvbmx5IHBpYyAyIGlzIHNob3J0IHRlcm0gLT4gZ3JlYXRlciAqLwotICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzIpKQotICAgICAgICByZXR1cm4oMSk7Ci0gICAgLyogYm90aCBhcmUgbG9uZyB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyAtPiBjaGVjayBwaWNOdW0gKGNvbnRhaW5zIHRoZQotICAgICAqIGxvbmdUZXJtUGljTnVtICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHBpYzEtPnBpY051bSA+IHBpYzItPnBpY051bSkKLSAgICAgICAgICAgIHJldHVybigxKTsKLSAgICAgICAgZWxzZSBpZiAocGljMS0+cGljTnVtIDwgcGljMi0+cGljTnVtKQotICAgICAgICAgICAgcmV0dXJuKC0xKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgYmFzZWQgb24KLSAgICAgICAgICAgIHJlb3JkZXJpbmcgY29tbWFuZHMgcmVjZWl2ZWQgaW4gdGhlIHNsaWNlIGhlYWRlci4gU2VlIGRldGFpbHMKLSAgICAgICAgICAgIG9mIHRoZSBwcm9jZXNzIGluIHRoZSBILjI2NCBzdGFuZGFyZC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICAgICAgcG9pbnRlciB0byBkcGIgc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG9yZGVyICAgICAgICAgICBwb2ludGVyIHRvIHJlb3JkZXJpbmcgY29tbWFuZHMKLSAgICAgICAgICAgIGN1cnJGcmFtZU51bSAgICBjdXJyZW50IGZyYW1lIG51bWJlcgotICAgICAgICAgICAgbnVtUmVmSWR4QWN0aXZlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlIGluZGljZXMgZm9yIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgICAgICAnbGlzdCcgZmllbGQgb2YgdGhlIHN0cnVjdHVyZSByZW9yZGVyZWQKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgaWYgbm9uLWV4aXN0aW5nIHBpY3R1cmVzIHJlZmVycmVkIHRvIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVvcmRlcmluZyBjb21tYW5kcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0KAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqb3JkZXIsCi0gIHUzMiBjdXJyRnJhbWVOdW0sCi0gIHUzMiBudW1SZWZJZHhBY3RpdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGosIGssIHBpY051bVByZWQsIHJlZklkeDsKLSAgICBpMzIgcGljTnVtLCBwaWNOdW1Ob1dyYXAsIGluZGV4OwotICAgIHUzMiBpc1Nob3J0VGVybTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG9yZGVyKTsKLSAgICBBU1NFUlQoY3VyckZyYW1lTnVtIDw9IGRwYi0+bWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChudW1SZWZJZHhBY3RpdmUgPD0gTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSk7Ci0KLSAgICAvKiBzZXQgZHBiIHBpY3R1cmUgbnVtYmVycyBmb3Igc29ydGluZyAqLwotICAgIFNldFBpY051bXMoZHBiLCBjdXJyRnJhbWVOdW0pOwotCi0gICAgaWYgKCFvcmRlci0+cmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDApCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotCi0gICAgcmVmSWR4ICAgICA9IDA7Ci0gICAgcGljTnVtUHJlZCA9IGN1cnJGcmFtZU51bTsKLQotICAgIGkgPSAwOwotICAgIHdoaWxlIChvcmRlci0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjIDwgMykKLSAgICB7Ci0gICAgICAgIC8qIHNob3J0IHRlcm0gKi8KLSAgICAgICAgaWYgKG9yZGVyLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPCAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3JkZXItPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCA9Ci0gICAgICAgICAgICAgICAgICAgIChpMzIpcGljTnVtUHJlZCAtIChpMzIpb3JkZXItPmNvbW1hbmRbaV0uYWJzRGlmZlBpY051bTsKLSAgICAgICAgICAgICAgICBpZiAocGljTnVtTm9XcmFwIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwICs9IChpMzIpZHBiLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgPQotICAgICAgICAgICAgICAgICAgICAoaTMyKShwaWNOdW1QcmVkICsgb3JkZXItPmNvbW1hbmRbaV0uYWJzRGlmZlBpY051bSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBpY051bU5vV3JhcCA+PSAoaTMyKWRwYi0+bWF4RnJhbWVOdW0pCi0gICAgICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCAtPSAoaTMyKWRwYi0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaWNOdW1QcmVkID0gKHUzMilwaWNOdW1Ob1dyYXA7Ci0gICAgICAgICAgICBwaWNOdW0gPSBwaWNOdW1Ob1dyYXA7Ci0gICAgICAgICAgICBpZiAoKHUzMilwaWNOdW1Ob1dyYXAgPiBjdXJyRnJhbWVOdW0pCi0gICAgICAgICAgICAgICAgcGljTnVtIC09IChpMzIpZHBiLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIGlzU2hvcnRUZXJtID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogbG9uZyB0ZXJtICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcGljTnVtID0gKGkzMilvcmRlci0+Y29tbWFuZFtpXS5sb25nVGVybVBpY051bTsKLSAgICAgICAgICAgIGlzU2hvcnRUZXJtID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIH0KLSAgICAgICAgLyogZmluZCBjb3JyZXNwb25kaW5nIHBpY3R1cmUgZnJvbSBkcGIgKi8KLSAgICAgICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBpc1Nob3J0VGVybSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgIUlTX0VYSVNUSU5HKGRwYi0+YnVmZmVyW2luZGV4XSkpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgLyogc2hpZnQgcGljdHVyZXMgKi8KLSAgICAgICAgZm9yIChqID0gbnVtUmVmSWR4QWN0aXZlOyBqID4gcmVmSWR4OyBqLS0pCi0gICAgICAgICAgICBkcGItPmxpc3Rbal0gPSBkcGItPmxpc3Rbai0xXTsKLSAgICAgICAgLyogcHV0IHBpY3R1cmUgaW50byB0aGUgbGlzdCAqLwotICAgICAgICBkcGItPmxpc3RbcmVmSWR4KytdID0gJmRwYi0+YnVmZmVyW2luZGV4XTsKLSAgICAgICAgLyogcmVtb3ZlIGxhdGVyIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgcGljdHVyZSAqLwotICAgICAgICBmb3IgKGogPSBrID0gcmVmSWR4OyBqIDw9IG51bVJlZklkeEFjdGl2ZTsgaisrKQotICAgICAgICAgICAgaWYoZHBiLT5saXN0W2pdICE9ICZkcGItPmJ1ZmZlcltpbmRleF0pCi0gICAgICAgICAgICAgICAgZHBiLT5saXN0W2srK10gPSBkcGItPmxpc3Rbal07Ci0KLSAgICAgICAgaSsrOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTW1jb3AxCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIG1hcmsgYSBzaG9ydC10ZXJtIHJlZmVyZW5jZSBwaWN0dXJlIHVudXNlZCBmb3IKLSAgICAgICAgICAgIHJlZmVyZW5jZSwgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gMQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBmYWlsdXJlLCBwaWN0dXJlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBidWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNbWNvcDEoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgaW5kZXgsIHBpY051bTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGN1cnJQaWNOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKLQotICAgIHBpY051bSA9IChpMzIpY3VyclBpY051bSAtIChpMzIpZGlmZmVyZW5jZU9mUGljTnVtczsKLQotICAgIGluZGV4ID0gRmluZERwYlBpYyhkcGIsIHBpY051bSwgSEFOVFJPX1RSVUUpOwotICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKLSAgICBkcGItPm51bVJlZkZyYW1lcy0tOwotICAgIGlmICghZHBiLT5idWZmZXJbaW5kZXhdLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTW1jb3AyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIG1hcmsgYSBsb25nLXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUgdW51c2VkIGZvcgotICAgICAgICAgICAgcmVmZXJlbmNlLCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byAyCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIHBpY3R1cmUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wMihkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGxvbmdUZXJtUGljTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBpbmRleDsKLQotLyogQ29kZSAqLwotCi0gICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgKGkzMilsb25nVGVybVBpY051bSwgSEFOVFJPX0ZBTFNFKTsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2luZGV4XSk7Ci0gICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICBpZiAoIWRwYi0+YnVmZmVyW2luZGV4XS50b0JlRGlzcGxheWVkKQotICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wMwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBhc3NpbmcgYSBsb25nVGVybUZyYW1lSWR4IHRvIGEgc2hvcnQtdGVybSByZWZlcmVuY2UKLSAgICAgICAgICAgIGZyYW1lIChpLmUuIHRvIGNoYW5nZSBpdCB0byBhIGxvbmctdGVybSByZWZlcmVuY2UgcGljdHVyZSksCi0gICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byAzCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIHNob3J0LXRlcm0gcGljdHVyZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBvciBpcyBhIG5vbi1leGlzdGluZyBwaWN0dXJlLCBvciBpbnZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nVGVybUZyYW1lSWR4IGdpdmVuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgTW1jb3AzKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyclBpY051bSwgdTMyIGRpZmZlcmVuY2VPZlBpY051bXMsCi0gICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGluZGV4LCBwaWNOdW07Ci0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotICAgIEFTU0VSVChjdXJyUGljTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBpZiAoIChkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPT0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMpIHx8Ci0gICAgICAgICAobG9uZ1Rlcm1GcmFtZUlkeCA+IGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCkgKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBjaGVjayBpZiBhIGxvbmcgdGVybSBwaWN0dXJlIHdpdGggdGhlIHNhbWUgbG9uZ1Rlcm1GcmFtZUlkeCBhbHJlYWR5Ci0gICAgICogZXhpc3QgYW5kIHJlbW92ZSBpdCBpZiBuZWNlc3NhcnkgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5tYXhSZWZGcmFtZXM7IGkrKykKLSAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKLSAgICAgICAgICAodTMyKWRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBsb25nVGVybUZyYW1lSWR4KQotICAgICAgICB7Ci0gICAgICAgICAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2ldKTsKLSAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07Ci0gICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIHBpY051bSA9IChpMzIpY3VyclBpY051bSAtIChpMzIpZGlmZmVyZW5jZU9mUGljTnVtczsKLQotICAgIGluZGV4ID0gRmluZERwYlBpYyhkcGIsIHBpY051bSwgSEFOVFJPX1RSVUUpOwotICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBpZiAoIUlTX0VYSVNUSU5HKGRwYi0+YnVmZmVyW2luZGV4XSkpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGRwYi0+YnVmZmVyW2luZGV4XS5zdGF0dXMgPSBMT05HX1RFUk07Ci0gICAgZHBiLT5idWZmZXJbaW5kZXhdLnBpY051bSA9IChpMzIpbG9uZ1Rlcm1GcmFtZUlkeDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTW1jb3A0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHNldCBtYXhMb25nVGVybUZyYW1lSWR4LAotICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgTW1jb3A0KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbWF4TG9uZ1Rlcm1GcmFtZUlkeCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID0gbWF4TG9uZ1Rlcm1GcmFtZUlkeDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm1heFJlZkZyYW1lczsgaSsrKQotICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgotICAgICAgICAgICggKCh1MzIpZHBiLT5idWZmZXJbaV0ucGljTnVtID4gbWF4TG9uZ1Rlcm1GcmFtZUlkeCkgfHwKLSAgICAgICAgICAgIChkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPT0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2ldKTsKLSAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07Ci0gICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotICAgICAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wNQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBtYXJrIGFsbCByZWZlcmVuY2UgcGljdHVyZXMgdW51c2VkIGZvciByZWZlcmVuY2UgYW5kCi0gICAgICAgICAgICBzZXQgbWF4TG9uZ1Rlcm1GcmFtZUlkeCB0byBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUywKLSAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDUuIEZ1bmN0aW9uIGZsdXNoZXMKLSAgICAgICAgICAgIHRoZSBidWZmZXIgYW5kIHBsYWNlcyBhbGwgcGljdHVyZXMgdGhhdCBhcmUgbmVlZGVkIGZvciBkaXNwbGF5IGludG8KLSAgICAgICAgICAgIHRoZSBvdXRwdXQgYnVmZmVyLgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgTW1jb3A1KGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChJU19SRUZFUkVOQ0UoZHBiLT5idWZmZXJbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2ldKTsKLSAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKLSAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBvdXRwdXQgYWxsIHBpY3R1cmVzICovCi0gICAgd2hpbGUgKE91dHB1dFBpY3R1cmUoZHBiKSA9PSBIQU5UUk9fT0spCi0gICAgICAgIDsKLSAgICBkcGItPm51bVJlZkZyYW1lcyA9IDA7Ci0gICAgZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVM7Ci0gICAgZHBiLT5wcmV2UmVmRnJhbWVOdW0gPSAwOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNbWNvcDYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gYXNzaWduIGxvbmdUZXJtRnJhbWVJZHggdG8gdGhlIGN1cnJlbnQgcGljdHVyZSwKLSAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDYKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgaW52YWxpZCBsb25nVGVybUZyYW1lSWR4IG9yIG5vIHJvb20gZm9yIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaW4gdGhlIGJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wNihkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGZyYW1lTnVtLCBpMzIgcGljT3JkZXJDbnQsCi0gICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChmcmFtZU51bSA8IGRwYi0+bWF4RnJhbWVOdW0pOwotCi0gICAgaWYgKCAoZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID09IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTKSB8fAotICAgICAgICAgKGxvbmdUZXJtRnJhbWVJZHggPiBkcGItPm1heExvbmdUZXJtRnJhbWVJZHgpICkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogY2hlY2sgaWYgYSBsb25nIHRlcm0gcGljdHVyZSB3aXRoIHRoZSBzYW1lIGxvbmdUZXJtRnJhbWVJZHggYWxyZWFkeQotICAgICAqIGV4aXN0IGFuZCByZW1vdmUgaXQgaWYgbmVjZXNzYXJ5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bWF4UmVmRnJhbWVzOyBpKyspCi0gICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCi0gICAgICAgICAgKHUzMilkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gbG9uZ1Rlcm1GcmFtZUlkeCkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcy0tOwotICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKLSAgICB7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+ZnJhbWVOdW0gPSBmcmFtZU51bTsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gICA9IChpMzIpbG9uZ1Rlcm1GcmFtZUlkeDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IHBpY09yZGVyQ250OwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyAgID0gTE9OR19URVJNOwotICAgICAgICBpZiAoZHBiLT5ub1Jlb3JkZXJpbmcpCi0gICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IEhBTlRST19UUlVFOwotICAgICAgICBkcGItPm51bVJlZkZyYW1lcysrOwotICAgICAgICBkcGItPmZ1bGxuZXNzKys7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICAvKiBpZiB0aGVyZSBpcyBubyByb29tLCByZXR1cm4gYW4gZXJyb3IgKi8KLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RNYXJrRGVjUmVmUGljCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBwcm9jZXNzLiBUaGlzCi0gICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJvdGggZm9yIHJlZmVyZW5jZSBhbmQgbm9uLXJlZmVyZW5jZQotICAgICAgICAgICAgcGljdHVyZXMuICBOb24tcmVmZXJlbmNlIHBpY3R1cmVzIHNoYWxsIGhhdmUgbWFyayBwb2ludGVyIHNldCB0bwotICAgICAgICAgICAgTlVMTC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICBwb2ludGVyIHRvIHRoZSBEUEIgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG1hcmsgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBjb21tYW5kcwotICAgICAgICAgICAgaW1hZ2UgICAgICAgcG9pbnRlciB0byBjdXJyZW50IHBpY3R1cmUgdG8gYmUgcGxhY2VkIGluIHRoZSBidWZmZXIKLSAgICAgICAgICAgIGZyYW1lTnVtICAgIGZyYW1lIG51bWJlciBvZiB0aGUgY3VycmVudCBwaWN0dXJlCi0gICAgICAgICAgICBwaWNPcmRlckNudCBwaWN0dXJlIG9yZGVyIGNvdW50IGZvciB0aGUgY3VycmVudCBwaWN0dXJlCi0gICAgICAgICAgICBpc0lkciAgICAgICBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSBjdXJyZW50IHBpY3R1cmUgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIElEUiBwaWN0dXJlCi0gICAgICAgICAgICBjdXJyZW50UGljSWQgICAgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcGljdHVyZSwgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiwgc3RvcmVkIGFsb25nIHdpdGggdGhlIHBpY3R1cmUKLSAgICAgICAgICAgIG51bUVyck1icyAgICAgICBudW1iZXIgb2YgY29uY2VhbGVkIG1hY3JvYmxvY2tzIGluIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSwgc3RvcmVkIGFsb25nIHdpdGggdGhlIHBpY3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgJ2J1ZmZlcicgbW9kaWZpZWQsIHBvc3NpYmxlIG91dHB1dCBmcmFtZXMgcGxhY2VkIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICdvdXRCdWYnCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgIGZhaWx1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RNYXJrRGVjUmVmUGljKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgZGVjUmVmUGljTWFya2luZ190ICptYXJrLAotICBpbWFnZV90ICppbWFnZSwKLSAgdTMyIGZyYW1lTnVtLAotICBpMzIgcGljT3JkZXJDbnQsCi0gIHUzMiBpc0lkciwKLSAgdTMyIGN1cnJlbnRQaWNJZCwKLSAgdTMyIG51bUVyck1icykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgc3RhdHVzOwotICAgIHUzMiBtYXJrZWRBc0xvbmdUZXJtOwotICAgIHUzMiB0b0JlRGlzcGxheWVkOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLSAgICBBU1NFUlQobWFyayB8fCAhaXNJZHIpOwotICAgIEFTU0VSVCghaXNJZHIgfHwgKGZyYW1lTnVtID09IDAgJiYgcGljT3JkZXJDbnQgPT0gMCkpOwotICAgIEFTU0VSVChmcmFtZU51bSA8IGRwYi0+bWF4RnJhbWVOdW0pOwotCi0gICAgaWYgKGltYWdlLT5kYXRhICE9IGRwYi0+Y3VycmVudE91dC0+ZGF0YSkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiVFJZSU5HIFRPIE1BUksgTk9OLUFMTE9DQVRFRCBJTUFHRSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgZHBiLT5sYXN0Q29udGFpbnNNbWNvNSA9IEhBTlRST19GQUxTRTsKLSAgICBzdGF0dXMgPSBIQU5UUk9fT0s7Ci0KLSAgICB0b0JlRGlzcGxheWVkID0gZHBiLT5ub1Jlb3JkZXJpbmcgPyBIQU5UUk9fRkFMU0UgOiBIQU5UUk9fVFJVRTsKLQotICAgIC8qIG5vbi1yZWZlcmVuY2UgcGljdHVyZSwgc3RvcmVkIGZvciBkaXNwbGF5IHJlb3JkZXJpbmcgcHVycG9zZXMgKi8KLSAgICBpZiAobWFyayA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgPSBVTlVTRUQ7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+ZnJhbWVOdW0gPSBmcmFtZU51bTsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gPSAoaTMyKWZyYW1lTnVtOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gcGljT3JkZXJDbnQ7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7Ci0gICAgICAgIGlmICghZHBiLT5ub1Jlb3JkZXJpbmcpCi0gICAgICAgICAgICBkcGItPmZ1bGxuZXNzKys7Ci0gICAgfQotICAgIC8qIElEUiBwaWN0dXJlICovCi0gICAgZWxzZSBpZiAoaXNJZHIpCi0gICAgewotCi0gICAgICAgIC8qIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtIG5vdCBjYWxsZWQgZm9yIElEUiBwaWN0dXJlcyAtPiBoYXZlIHRvCi0gICAgICAgICAqIHJlc2V0IG51bU91dCBhbmQgb3V0SW5kZXggaGVyZSAqLwotICAgICAgICBkcGItPm51bU91dCA9IGRwYi0+b3V0SW5kZXggPSAwOwotCi0gICAgICAgIC8qIGZsdXNoIHRoZSBidWZmZXIgKi8KLSAgICAgICAgTW1jb3A1KGRwYik7Ci0gICAgICAgIC8qIGlmIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnIHdhcyBzZXQgLT4gdGhlIHBpY3R1cmVzIHByZWNlZGluZyB0aGUKLSAgICAgICAgICogSURSIHBpY3R1cmUgc2hhbGwgbm90IGJlIG91dHB1dCAtPiBzZXQgb3V0cHV0IGJ1ZmZlciBlbXB0eSAqLwotICAgICAgICBpZiAobWFyay0+bm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgfHwgZHBiLT5ub1Jlb3JkZXJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRwYi0+bnVtT3V0ID0gMDsKLSAgICAgICAgICAgIGRwYi0+b3V0SW5kZXggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hcmstPmxvbmdUZXJtUmVmZXJlbmNlRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgPSBMT05HX1RFUk07Ci0gICAgICAgICAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgPSBTSE9SVF9URVJNOwotICAgICAgICAgICAgZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVM7Ci0gICAgICAgIH0KLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSAgPSAwOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSAgICA9IDA7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSAwOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSB0b0JlRGlzcGxheWVkOwotICAgICAgICBkcGItPmZ1bGxuZXNzID0gMTsKLSAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMgPSAxOwotICAgIH0KLSAgICAvKiByZWZlcmVuY2UgcGljdHVyZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1hcmtlZEFzTG9uZ1Rlcm0gPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIGlmIChtYXJrLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAobWFyay0+b3BlcmF0aW9uW2ldLm1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobWFyay0+b3BlcmF0aW9uW2ldLm1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3AxKAotICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0uZGlmZmVyZW5jZU9mUGljTnVtcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDIoZHBiLCBtYXJrLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1QaWNOdW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gIE1tY29wMygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmRpZmZlcmVuY2VPZlBpY051bXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5sb25nVGVybUZyYW1lSWR4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wNCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0ubWF4TG9uZ1Rlcm1GcmFtZUlkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDUoZHBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+bGFzdENvbnRhaW5zTW1jbzUgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wNigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5sb25nVGVybUZyYW1lSWR4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlZEFzTG9uZ1Rlcm0gPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGludmFsaWQgbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhBTlRST19OT0s7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzID0gU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiKTsKLSAgICAgICAgfQotICAgICAgICAvKiBpZiBjdXJyZW50IHBpY3R1cmUgd2FzIG5vdCBtYXJrZWQgYXMgbG9uZy10ZXJtIHJlZmVyZW5jZSBieQotICAgICAgICAgKiBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiA2IC0+IG1hcmsgY3VycmVudCBhcyBzaG9ydAotICAgICAgICAgKiB0ZXJtIGFuZCBpbnNlcnQgaXQgaW50byBkcGIgKGlmIHRoZXJlIGlzIHJvb20pICovCi0gICAgICAgIGlmICghbWFya2VkQXNMb25nVGVybSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRwYi0+bnVtUmVmRnJhbWVzIDwgZHBiLT5tYXhSZWZGcmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOwotICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtICAgPSAoaTMyKWZyYW1lTnVtOwotICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSBwaWNPcmRlckNudDsKLSAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyAgID0gU0hPUlRfVEVSTTsKLSAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSB0b0JlRGlzcGxheWVkOwotICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKLSAgICAgICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogbm8gcm9vbSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhBTlRST19OT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkcGItPmN1cnJlbnRPdXQtPmlzSWRyID0gaXNJZHI7Ci0gICAgZHBiLT5jdXJyZW50T3V0LT5waWNJZCA9IGN1cnJlbnRQaWNJZDsKLSAgICBkcGItPmN1cnJlbnRPdXQtPm51bUVyck1icyA9IG51bUVyck1iczsKLQotICAgIC8qIGRwYiB3YXMgaW5pdGlhbGl6ZWQgdG8gbm90IHRvIHJlb3JkZXIgdGhlIHBpY3R1cmVzIC0+IG91dHB1dCBjdXJyZW50Ci0gICAgICogcGljdHVyZSBpbW1lZGlhdGVseSAqLwotICAgIGlmIChkcGItPm5vUmVvcmRlcmluZykKLSAgICB7Ci0gICAgICAgIEFTU0VSVChkcGItPm51bU91dCA9PSAwKTsKLSAgICAgICAgQVNTRVJUKGRwYi0+b3V0SW5kZXggPT0gMCk7Ci0gICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5kYXRhICA9IGRwYi0+Y3VycmVudE91dC0+ZGF0YTsKLSAgICAgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmlzSWRyID0gZHBiLT5jdXJyZW50T3V0LT5pc0lkcjsKLSAgICAgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLnBpY0lkID0gZHBiLT5jdXJyZW50T3V0LT5waWNJZDsKLSAgICAgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLm51bUVyck1icyA9IGRwYi0+Y3VycmVudE91dC0+bnVtRXJyTWJzOwotICAgICAgICBkcGItPm51bU91dCsrOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBvdXRwdXQgcGljdHVyZXMgaWYgYnVmZmVyIGZ1bGwgKi8KLSAgICAgICAgd2hpbGUgKGRwYi0+ZnVsbG5lc3MgPiBkcGItPmRwYlNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSBPdXRwdXRQaWN0dXJlKGRwYik7Ci0gICAgICAgICAgICBBU1NFUlQoaSA9PSBIQU5UUk9fT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogc29ydCBkcGIgKi8KLSAgICBTaGVsbFNvcnQoZHBiLT5idWZmZXIsIGRwYi0+ZHBiU2l6ZSsxKTsKLQotICAgIHJldHVybihzdGF0dXMpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEdldFJlZlBpY0RhdGEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZ2V0IHJlZmVyZW5jZSBwaWN0dXJlIGRhdGEgZnJvbSB0aGUgcmVmZXJlbmNlIHBpY3R1cmUKLSAgICAgICAgICAgIGxpc3QKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byBkZXNpcmVkIHJlZmVyZW5jZSBwaWN0dXJlIGRhdGEKLSAgICAgICAgICAgIE5VTEwgaWYgaW52YWxpZCBpbmRleCBvciBub24tZXhpc3RpbmcgcGljdHVyZSByZWZlcnJlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11OCogaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBpbmRleCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIGlmKGluZGV4ID4gMTYgfHwgZHBiLT5saXN0W2luZGV4XSA9PSBOVUxMKQotICAgICAgICByZXR1cm4oTlVMTCk7Ci0gICAgZWxzZSBpZighSVNfRVhJU1RJTkcoKmRwYi0+bGlzdFtpbmRleF0pKQotICAgICAgICByZXR1cm4oTlVMTCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oZHBiLT5saXN0W2luZGV4XS0+ZGF0YSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBmdW5jdGlvbiB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgaW1hZ2UuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QKLSAgICAgICAgICAgIHJlYWxseSBhbGxvY2F0ZSBhbnkgbWVtb3J5IGJ1dCByZXNlcnZlcyBvbmUgb2YgdGhlIGJ1ZmZlcgotICAgICAgICAgICAgcG9zaXRpb25zIGZvciBkZWNvZGluZyBvZiBjdXJyZW50IHBpY3R1cmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byBtZW1vcnkgYXJlYSBmb3IgdGhlIGltYWdlCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTgqIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKCAhZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS50b0JlRGlzcGxheWVkICYmCi0gICAgICAgICAgICAhSVNfUkVGRVJFTkNFKGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0pICk7Ci0gICAgQVNTRVJUKGRwYi0+ZnVsbG5lc3MgPD0gIGRwYi0+ZHBiU2l6ZSk7Ci0KLSAgICBkcGItPmN1cnJlbnRPdXQgPSBkcGItPmJ1ZmZlciArIGRwYi0+ZHBiU2l6ZTsKLQotICAgIHJldHVybihkcGItPmN1cnJlbnRPdXQtPmRhdGEpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBzbGlkaW5nIHdpbmRvdyByZWZlbmNlIHBpY3R1cmUgbWFya2luZyBwcm9jZXNzLgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBmYWlsdXJlLCBubyBzaG9ydC10ZXJtIHJlZmVyZW5jZSBmcmFtZSBmb3VuZCB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VsZCBiZSBtYXJrZWQgdW51c2VkCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZyhkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgaW5kZXgsIHBpY051bTsKLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgaWYgKGRwYi0+bnVtUmVmRnJhbWVzIDwgZHBiLT5tYXhSZWZGcmFtZXMpCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW5kZXggPSAtMTsKLSAgICAgICAgcGljTnVtID0gMDsKLSAgICAgICAgLyogZmluZCB0aGUgb2xkZXN0IHNob3J0IHRlcm0gcGljdHVyZSAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKLSAgICAgICAgICAgIGlmIChJU19TSE9SVF9URVJNKGRwYi0+YnVmZmVyW2ldKSkKLSAgICAgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0ucGljTnVtIDwgcGljTnVtIHx8IGluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAoaTMyKWk7Ci0gICAgICAgICAgICAgICAgICAgIHBpY051bSA9IGRwYi0+YnVmZmVyW2ldLnBpY051bTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2luZGV4XSk7Ci0gICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcy0tOwotICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpbmRleF0udG9CZURpc3BsYXllZCkKLSAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0KLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19OT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEluaXREcGIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBEUEIuIFJlc2VydmVzIG1lbW9yaWVzIGZvciB0aGUgYnVmZmVyLAotICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCBhbmQgb3V0cHV0IGJ1ZmZlci4gZHBiU2l6ZSBpbmRpY2F0ZXMKLSAgICAgICAgICAgIHRoZSBtYXhpbXVtIERQQiBzaXplIGluZGljYXRlZCBieSB0aGUgbGV2ZWxJZGMgaW4gdGhlIHN0cmVhbS4KLSAgICAgICAgICAgIElmIG5vUmVvcmRlcmluZyBmbGFnIGlzIEZBTFNFIHRoZSBEUEIgc3RvcmVzIGRwYlNpemUgcGljdHVyZXMKLSAgICAgICAgICAgIGZvciBkaXNwbGF5IHJlb3JkZXJpbmcgcHVycG9zZXMuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKLSAgICAgICAgICAgIGZsYWcgaXMgVFJVRSB0aGUgRFBCIG9ubHkgc3RvcmVzIG1heFJlZkZyYW1lcyByZWZlcmVuY2UgcGljdHVyZXMKLSAgICAgICAgICAgIGFuZCBvdXRwdXRzIGFsbCB0aGUgcGljdHVyZXMgaW1tZWRpYXRlbHkuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgZHBiU2l6ZSAgICAgICAgIHNpemUgb2YgdGhlIERQQiAobnVtYmVyIG9mIHBpY3R1cmVzKQotICAgICAgICAgICAgbWF4UmVmRnJhbWVzICAgIG1heCBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lcwotICAgICAgICAgICAgbWF4RnJhbWVOdW0gICAgIG1heCBmcmFtZSBudW1iZXIKLSAgICAgICAgICAgIG5vUmVvcmRlcmluZyAgICBmbGFnIHRvIGluZGljYXRlIHRoYXQgRFBCIGRvZXMgbm90IGhhdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlIHRvIHJlb3JkZXIgZnJhbWVzIGZvciBkaXNwbGF5Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgICAgICBwb2ludGVyIHRvIGRwYiBkYXRhIHN0b3JhZ2UKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEluaXREcGIoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICB1MzIgcGljU2l6ZUluTWJzLAotICB1MzIgZHBiU2l6ZSwKLSAgdTMyIG1heFJlZkZyYW1lcywKLSAgdTMyIG1heEZyYW1lTnVtLAotICB1MzIgbm9SZW9yZGVyaW5nKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKLSAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IE1BWF9OVU1fUkVGX1BJQ1MpOwotICAgIEFTU0VSVChtYXhSZWZGcmFtZXMgPD0gZHBiU2l6ZSk7Ci0gICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQoZHBiU2l6ZSk7Ci0KLSAgICAvLyBzZWUgY29tbWVudCBpbiBsb29wIGJlbG93IGFib3V0IHNpemUgY2FsY3VsYXRpb24KLSAgICBpZiAocGljU2l6ZUluTWJzID4gKFVJTlQzMl9NQVggLSAzMiAtIDE1KSAvIDM4NCkgewotICAgICAgICBBTE9HRSgiYi8yODUzMzU2MiIpOwotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI4NTMzNTYyIik7Ci0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgfQotCi0gICAgZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVM7Ci0gICAgZHBiLT5tYXhSZWZGcmFtZXMgICAgICAgID0gTUFYKG1heFJlZkZyYW1lcywgMSk7Ci0gICAgaWYgKG5vUmVvcmRlcmluZykKLSAgICAgICAgZHBiLT5kcGJTaXplICAgICAgICAgPSBkcGItPm1heFJlZkZyYW1lczsKLSAgICBlbHNlCi0gICAgICAgIGRwYi0+ZHBiU2l6ZSAgICAgICAgID0gZHBiU2l6ZTsKLSAgICBkcGItPm1heEZyYW1lTnVtICAgICAgICAgPSBtYXhGcmFtZU51bTsKLSAgICBkcGItPm5vUmVvcmRlcmluZyAgICAgICAgPSBub1Jlb3JkZXJpbmc7Ci0gICAgZHBiLT5mdWxsbmVzcyAgICAgICAgICAgID0gMDsKLSAgICBkcGItPm51bVJlZkZyYW1lcyAgICAgICAgPSAwOwotICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtICAgICA9IDA7Ci0KLSAgICBBTExPQ0FURShkcGItPmJ1ZmZlciwgTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSArIDEsIGRwYlBpY3R1cmVfdCk7Ci0gICAgaWYgKGRwYi0+YnVmZmVyID09IE5VTEwpCi0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgSDI2NFN3RGVjTWVtc2V0KGRwYi0+YnVmZmVyLCAwLAotICAgICAgICAgICAgKE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxKSpzaXplb2YoZHBiUGljdHVyZV90KSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZSArIDE7IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIEFsbG9jYXRlIG5lZWRlZCBhbW91bnQgb2YgbWVtb3J5LCB3aGljaCBpczoKLSAgICAgICAgICogaW1hZ2Ugc2l6ZSArIDMyICsgMTUsIHdoZXJlIDMyIGNhbWVzIGZyb20gdGhlIGZhY3QgdGhhdCBpbiBBUk0gT3Blbk1heAotICAgICAgICAgKiBETCBpbXBsZW1lbnRhdGlvbiBGdW5jdGlvbnMgbWF5IHJlYWQgYmV5b25kIHRoZSBlbmQgb2YgYW4gYXJyYXksCi0gICAgICAgICAqIGJ5IGEgbWF4aW11bSBvZiAzMiBieXRlcy4gQW5kICsxNSBjYW1lcyBmb3IgdGhlIG5lZWQgdG8gYWxpZ24gbWVtb3J5Ci0gICAgICAgICAqIHRvIDE2LWJ5dGUgYm91bmRhcnkgKi8KLSAgICAgICAgQUxMT0NBVEUoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEsIChwaWNTaXplSW5NYnMqMzg0ICsgMzIrMTUpLCB1OCk7Ci0gICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5wQWxsb2NhdGVkRGF0YSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLQotICAgICAgICBkcGItPmJ1ZmZlcltpXS5kYXRhID0gQUxJR04oZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEsIDE2KTsKLSAgICB9Ci0KLSAgICBBTExPQ0FURShkcGItPmxpc3QsIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxLCBkcGJQaWN0dXJlX3QqKTsKLSAgICBBTExPQ0FURShkcGItPm91dEJ1ZiwgZHBiLT5kcGJTaXplKzEsIGRwYk91dFBpY3R1cmVfdCk7Ci0KLSAgICBpZiAoZHBiLT5saXN0ID09IE5VTEwgfHwgZHBiLT5vdXRCdWYgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLQotICAgIEgyNjRTd0RlY01lbXNldChkcGItPmxpc3QsIDAsCi0gICAgICAgICAgICAoKE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxKSAqIHNpemVvZihkcGJQaWN0dXJlX3QqKSkgKTsKLQotICAgIGRwYi0+bnVtT3V0ID0gZHBiLT5vdXRJbmRleCA9IDA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RSZXNldERwYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byByZXNldCBEUEIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGFuIElEUgotICAgICAgICAgICAgc2xpY2UgKG90aGVyIHRoYW4gdGhlIGZpcnN0KSBhY3RpdmF0ZXMgbmV3IHNlcXVlbmNlIHBhcmFtZXRlciBzZXQuCi0gICAgICAgICAgICBGdW5jdGlvbiBjYWxscyBoMjY0YnNkRnJlZURwYiB0byBmcmVlIG9sZCBhbGxvY2F0ZWQgbWVtb3JpZXMgYW5kCi0gICAgICAgICAgICBoMjY0YnNkSW5pdERwYiB0byByZS1pbml0aWFsaXplIHRoZSBEUEIuIFNhbWUgaW5wdXRzLCBvdXRwdXRzIGFuZAotICAgICAgICAgICAgcmV0dXJucyBhcyBmb3IgaDI2NGJzZEluaXREcGIuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUmVzZXREcGIoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICB1MzIgcGljU2l6ZUluTWJzLAotICB1MzIgZHBiU2l6ZSwKLSAgdTMyIG1heFJlZkZyYW1lcywKLSAgdTMyIG1heEZyYW1lTnVtLAotICB1MzIgbm9SZW9yZGVyaW5nKQotewotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKLSAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IE1BWF9OVU1fUkVGX1BJQ1MpOwotICAgIEFTU0VSVChtYXhSZWZGcmFtZXMgPD0gZHBiU2l6ZSk7Ci0gICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQoZHBiU2l6ZSk7Ci0KLSAgICBoMjY0YnNkRnJlZURwYihkcGIpOwotCi0gICAgcmV0dXJuIGgyNjRic2RJbml0RHBiKGRwYiwgcGljU2l6ZUluTWJzLCBkcGJTaXplLCBtYXhSZWZGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1heEZyYW1lTnVtLCBub1Jlb3JkZXJpbmcpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbml0UmVmUGljTGlzdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBpbml0aWFsaXplIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QuIEZ1bmN0aW9uIGp1c3QKLSAgICAgICAgICAgIHNldHMgcG9pbnRlcnMgaW4gdGhlIGxpc3QgYWNjb3JkaW5nIHRvIHBpY3R1cmVzIGluIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBUaGUgYnVmZmVyIGlzIGFzc3VtZWQgdG8gY29udGFpbiBwaWN0dXJlcyBzb3J0ZWQgYWNjb3JkaW5nIHRvCi0gICAgICAgICAgICB3aGF0IHRoZSBILjI2NCBzdGFuZGFyZCBzYXlzIGFib3V0IGluaXRpYWwgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgJ2xpc3QnIGZpZWxkIGluaXRpYWxpemVkCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW5pdFJlZlBpY0xpc3QoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bVJlZkZyYW1lczsgaSsrKQotICAgICAgICBkcGItPmxpc3RbaV0gPSAmZHBiLT5idWZmZXJbaV07Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaW5kRHBiUGljCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZpbmQgYSByZWZlcmVuY2UgcGljdHVyZSBmcm9tIHRoZSBidWZmZXIuIFRoZSBwaWN0dXJlCi0gICAgICAgICAgICB0byBiZSBmb3VuZCBpcyBpZGVudGlmaWVkIGJ5IHBpY051bSBhbmQgaXNTaG9ydFRlcm0gZmxhZy4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBpY3R1cmUgaW4gdGhlIGJ1ZmZlcgotICAgICAgICAgICAgLTEgaWYgdGhlIHNwZWNpZmllZCBwaWN0dXJlIHdhcyBub3QgZm91bmQgaW4gdGhlIGJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaTMyIEZpbmREcGJQaWMoZHBiU3RvcmFnZV90ICpkcGIsIGkzMiBwaWNOdW0sIHUzMiBpc1Nob3J0VGVybSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSA9IDA7Ci0gICAgdTMyIGZvdW5kID0gSEFOVFJPX0ZBTFNFOwotCi0vKiBDb2RlICovCi0KLSAgICBpZiAoaXNTaG9ydFRlcm0pCi0gICAgewotICAgICAgICB3aGlsZSAoaSA8IGRwYi0+bWF4UmVmRnJhbWVzICYmICFmb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCi0gICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBwaWNOdW0pCi0gICAgICAgICAgICAgICAgZm91bmQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQVNTRVJUKHBpY051bSA+PSAwKTsKLSAgICAgICAgd2hpbGUgKGkgPCBkcGItPm1heFJlZkZyYW1lcyAmJiAhZm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCi0gICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBwaWNOdW0pCi0gICAgICAgICAgICAgICAgZm91bmQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZm91bmQpCi0gICAgICAgIHJldHVybigoaTMyKWkpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKC0xKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFNldFBpY051bXMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gc2V0IHBpY051bSB2YWx1ZXMgZm9yIHNob3J0LXRlcm0gcGljdHVyZXMgaW4gdGhlCi0gICAgICAgICAgICBidWZmZXIuIE51bWJlcmluZyBvZiBwaWN0dXJlcyBpcyBiYXNlZCBvbiBmcmFtZSBudW1iZXJzIGFuZCBhcwotICAgICAgICAgICAgZnJhbWUgbnVtYmVycyBhcmUgbW9kdWxvIG1heEZyYW1lTnVtIC0+IGZyYW1lIG51bWJlcnMgb2Ygb2xkZXIKLSAgICAgICAgICAgIHBpY3R1cmVzIGluIHRoZSBidWZmZXIgbWF5IGJlIGJpZ2dlciB0aGFuIHRoZSBjdXJyRnJhbWVOdW0uCi0gICAgICAgICAgICBwaWNOdW1zIHdpbGwgYmUgc2V0IHNvIHRoYXQgY3VycmVudCBmcmFtZSBoYXMgdGhlIGxhcmdlc3QgcGljTnVtCi0gICAgICAgICAgICBhbmQgYWxsIHRoZSBzaG9ydC10ZXJtIGZyYW1lcyBpbiB0aGUgYnVmZmVyIHdpbGwgZ2V0IHNtYWxsZXIgcGljTnVtCi0gICAgICAgICAgICByZXByZXNlbnRpbmcgdGhlaXIgImRpc3RhbmNlIiBmcm9tIHRoZSBjdXJyZW50IGZyYW1lLiBUaGlzCi0gICAgICAgICAgICBmdW5jdGlvbiBraW5kIG9mIG1hcHMgdGhlIG1vZHVsbyBhcml0aG1ldGljIGJhY2sgdG8gbm9ybWFsLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBTZXRQaWNOdW1zKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyckZyYW1lTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIGkzMiBmcmFtZU51bVdyYXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotICAgIEFTU0VSVChjdXJyRnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bVJlZkZyYW1lczsgaSsrKQotICAgICAgICBpZiAoSVNfU0hPUlRfVEVSTShkcGItPmJ1ZmZlcltpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5mcmFtZU51bSA+IGN1cnJGcmFtZU51bSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bVdyYXAgPQotICAgICAgICAgICAgICAgICAgICAoaTMyKWRwYi0+YnVmZmVyW2ldLmZyYW1lTnVtIC0gKGkzMilkcGItPm1heEZyYW1lTnVtOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZyYW1lTnVtV3JhcCA9IChpMzIpZHBiLT5idWZmZXJbaV0uZnJhbWVOdW07Ci0gICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPSBmcmFtZU51bVdyYXA7Ci0gICAgICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNoZWNrIGdhcHMgaW4gZnJhbWVfbnVtIGFuZCBnZW5lcmF0ZSBub24tZXhpc3RpbmcKLSAgICAgICAgICAgIChzaG9ydCB0ZXJtKSByZWZlcmVuY2UgcGljdHVyZXMgaWYgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIHNob3VsZAotICAgICAgICAgICAgYmUgY2FsbGVkIG9ubHkgZm9yIG5vbi1JRFIgcGljdHVyZXMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgcG9pbnRlciB0byBkcGIgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGZyYW1lTnVtICAgIGZyYW1lIG51bWJlciBvZiB0aGUgY3VycmVudCBwaWN0dXJlCi0gICAgICAgICAgICBpc1JlZlBpYyAgICBmbGFnIHRvIGluZGljYXRlIGlmIGN1cnJlbnQgcGljdHVyZSBpcyBhIHJlZmVyZW5jZSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXJlZmVyZW5jZSBwaWN0dXJlCi0gICAgICAgICAgICBnYXBzQWxsb3dlZCBGbGFnIHdoaWNoIGluZGljYXRlcyBhY3RpdmUgU1BTIHN0YW5jZSBvbiB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBhbGxvdyBnYXBzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgICdidWZmZXInIHBvc3NpYmx5IG1vZGlmaWVkIGJ5IGluc2VydGluZyBub24tZXhpc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVzIHdpdGggc2xpZGluZyB3aW5kb3cgbWFya2luZyBwcm9jZXNzCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgIGVycm9yIGluIHNsaWRpbmcgd2luZG93IHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtIGVxdWFsIHRvIHByZXZpb3VzIHJlZmVyZW5jZSBmcmFtZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgYSByZWZlcmVuY2UgcGljdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0oZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBmcmFtZU51bSwgdTMyIGlzUmVmUGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBnYXBzQWxsb3dlZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW07Ci0gICAgdTggKnRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0gICAgQVNTRVJUKGRwYi0+ZnVsbG5lc3MgPD0gZHBiLT5kcGJTaXplKTsKLSAgICBBU1NFUlQoZnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKLQotICAgIGRwYi0+bnVtT3V0ID0gMDsKLSAgICBkcGItPm91dEluZGV4ID0gMDsKLQotICAgIGlmKCFnYXBzQWxsb3dlZCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLSAgICBpZiAoIChmcmFtZU51bSAhPSBkcGItPnByZXZSZWZGcmFtZU51bSkgJiYKLSAgICAgICAgIChmcmFtZU51bSAhPSAoKGRwYi0+cHJldlJlZkZyYW1lTnVtICsgMSkgJSBkcGItPm1heEZyYW1lTnVtKSkpCi0gICAgewotCi0gICAgICAgIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtID0gKGRwYi0+cHJldlJlZkZyYW1lTnVtICsgMSkgJSBkcGItPm1heEZyYW1lTnVtOwotCi0gICAgICAgIC8qIHN0b3JlIGRhdGEgcG9pbnRlciBvZiBsYXN0IGJ1ZmZlciBwb3NpdGlvbiB0byBiZSB1c2VkIGFzIG5leHQKLSAgICAgICAgICogImFsbG9jYXRlZCIgZGF0YSBwb2ludGVyIGlmIGxhc3QgYnVmZmVyIHBvc2l0aW9uIGFmdGVyIHRoaXMgcHJvY2VzcwotICAgICAgICAgKiBjb250YWlucyBkYXRhIHBvaW50ZXIgbG9jYXRlZCBpbiBvdXRCdWYgKGJ1ZmZlciBwbGFjZWQgaW4gdGhlIG91dHB1dAotICAgICAgICAgKiBzaGFsbCBub3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGN1cnJlbnQgcGljdHVyZSkgKi8KLSAgICAgICAgdG1wID0gZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5kYXRhOwotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRQaWNOdW1zKGRwYiwgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0pOwotCi0gICAgICAgICAgICBpZiAoU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBvdXRwdXQgcGljdHVyZXMgaWYgYnVmZmVyIGZ1bGwgKi8KLSAgICAgICAgICAgIHdoaWxlIChkcGItPmZ1bGxuZXNzID49IGRwYi0+ZHBiU2l6ZSkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBfQVNTRVJUX1VTRUQKLSAgICAgICAgICAgICAgICBBU1NFUlQoIWRwYi0+bm9SZW9yZGVyaW5nKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIE91dHB1dFBpY3R1cmUoZHBiKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBhZGQgdG8gZW5kIG9mIGxpc3QgKi8KLSAgICAgICAgICAgIEFTU0VSVCggIWRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0udG9CZURpc3BsYXllZCAmJgotICAgICAgICAgICAgICAgICAgICAhSVNfUkVGRVJFTkNFKGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0pICk7Ci0gICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnN0YXR1cyA9IE5PTl9FWElTVElORzsKLSAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZnJhbWVOdW0gPSB1blVzZWRTaG9ydFRlcm1GcmFtZU51bTsKLSAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0ucGljTnVtICAgPSAoaTMyKXVuVXNlZFNob3J0VGVybUZyYW1lTnVtOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5waWNPcmRlckNudCA9IDA7Ci0gICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgICAgICBkcGItPmZ1bGxuZXNzKys7Ci0gICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcysrOwotCi0gICAgICAgICAgICAvKiBzb3J0IHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIFNoZWxsU29ydChkcGItPmJ1ZmZlciwgZHBiLT5kcGJTaXplKzEpOwotCi0gICAgICAgICAgICB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSA9ICh1blVzZWRTaG9ydFRlcm1GcmFtZU51bSArIDEpICUKLSAgICAgICAgICAgICAgICBkcGItPm1heEZyYW1lTnVtOwotCi0gICAgICAgIH0gd2hpbGUgKHVuVXNlZFNob3J0VGVybUZyYW1lTnVtICE9IGZyYW1lTnVtKTsKLQotICAgICAgICAvKiBwaWN0dXJlcyBwbGFjZWQgaW4gb3V0cHV0IGJ1ZmZlciAtPiBjaGVjayB0aGF0ICdkYXRhJyBpbgotICAgICAgICAgKiBidWZmZXIgcG9zaXRpb24gZHBiU2l6ZSBpcyBub3QgaW4gdGhlIG91dHB1dCBidWZmZXIgKHRoaXMgd2lsbCBiZQotICAgICAgICAgKiAiYWxsb2NhdGVkIiBieSBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZSkuIElmIGl0IGlzIC0+IGV4Y2hhbmdlIGRhdGEKLSAgICAgICAgICogcG9pbnRlciB3aXRoIHRoZSBvbmUgc3RvcmVkIGluIHRoZSBiZWdpbm5pbmcgKi8KLSAgICAgICAgaWYgKGRwYi0+bnVtT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtT3V0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRwYi0+b3V0QnVmW2ldLmRhdGEgPT0gZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5kYXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogZmluZCBidWZmZXIgcG9zaXRpb24gY29udGFpbmluZyBkYXRhIHBvaW50ZXIgc3RvcmVkIGluCi0gICAgICAgICAgICAgICAgICAgICAqIHRtcCAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5kcGJTaXplOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5kYXRhID09IHRtcCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBU1NFUlQoaSA8IGRwYi0+ZHBiU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBmcmFtZU51bSBmb3IgcmVmZXJlbmNlIHBpY3R1cmVzIHNoYWxsIG5vdCBiZSB0aGUgc2FtZSBhcyBmb3IgcHJldmlvdXMKLSAgICAgKiByZWZlcmVuY2UgcGljdHVyZSwgb3RoZXJ3aXNlIGFjY2Vzc2VzIHRvIHBpY3R1cmVzIGluIHRoZSBidWZmZXIgY2Fubm90Ci0gICAgICogYmUgc29sdmVkIHVuYW1iaWd1b3VzbHkgKi8KLSAgICBlbHNlIGlmIChpc1JlZlBpYyAmJiBmcmFtZU51bSA9PSBkcGItPnByZXZSZWZGcmFtZU51bSkKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBzYXZlIGN1cnJlbnQgZnJhbWVfbnVtIGluIHByZXZSZWZGcmFtZU51bS4gRm9yIG5vbi1yZWZlcmVuY2UgZnJhbWUKLSAgICAgKiBwcmV2RnJhbWVOdW0gaXMgc2V0IHRvIGZyYW1lIG51bWJlciBvZiBsYXN0IG5vbi1leGlzdGluZyBmcmFtZSBhYm92ZSAqLwotICAgIGlmIChpc1JlZlBpYykKLSAgICAgICAgZHBiLT5wcmV2UmVmRnJhbWVOdW0gPSBmcmFtZU51bTsKLSAgICBlbHNlIGlmIChmcmFtZU51bSAhPSBkcGItPnByZXZSZWZGcmFtZU51bSkKLSAgICB7Ci0gICAgICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0KLSAgICAgICAgICAgIChmcmFtZU51bSArIGRwYi0+bWF4RnJhbWVOdW0gLSAxKSAlIGRwYi0+bWF4RnJhbWVOdW07Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaW5kU21hbGxlc3RQaWNPcmRlckNudAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmaW5kIHBpY3R1cmUgd2l0aCBzbWFsbGVzdCBwaWN0dXJlIG9yZGVyIGNvdW50LiBUaGlzCi0gICAgICAgICAgICB3aWxsIGJlIHRoZSBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgcGljdHVyZSwgTlVMTCBpZiBubyBwaWN0dXJlcyB0byBiZSBkaXNwbGF5ZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZHBiUGljdHVyZV90KiBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICBpMzIgcGljT3JkZXJDbnQ7Ci0gICAgZHBiUGljdHVyZV90ICp0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotCi0gICAgcGljT3JkZXJDbnQgPSAweDdGRkZGRkZGOwotICAgIHRtcCA9IE5VTEw7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDw9IGRwYi0+ZHBiU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQgJiYKLSAgICAgICAgICAgIChkcGItPmJ1ZmZlcltpXS5waWNPcmRlckNudCA8IHBpY09yZGVyQ250KSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gZHBiLT5idWZmZXIgKyBpOwotICAgICAgICAgICAgcGljT3JkZXJDbnQgPSBkcGItPmJ1ZmZlcltpXS5waWNPcmRlckNudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybih0bXApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogT3V0cHV0UGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBwdXQgbmV4dCBkaXNwbGF5IG9yZGVyIHBpY3R1cmUgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgbm8gcGljdHVyZXMgdG8gZGlzcGxheQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBkcGJQaWN0dXJlX3QgKnRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0KLSAgICBpZiAoZHBiLT5ub1Jlb3JkZXJpbmcpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IEZpbmRTbWFsbGVzdFBpY09yZGVyQ250KGRwYik7Ci0KLSAgICAvKiBubyBwaWN0dXJlcyB0byBiZSBkaXNwbGF5ZWQgKi8KLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5kYXRhICA9IHRtcC0+ZGF0YTsKLSAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uaXNJZHIgPSB0bXAtPmlzSWRyOwotICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5waWNJZCA9IHRtcC0+cGljSWQ7Ci0gICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLm51bUVyck1icyA9IHRtcC0+bnVtRXJyTWJzOwotICAgIGRwYi0+bnVtT3V0Kys7Ci0KLSAgICB0bXAtPnRvQmVEaXNwbGF5ZWQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgaWYgKCFJU19SRUZFUkVOQ0UoKnRtcCkpCi0gICAgewotICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBnZXQgbmV4dCBkaXNwbGF5IG9yZGVyIHBpY3R1cmUgZnJvbSB0aGUgb3V0cHV0IGJ1ZmZlci4KLQotICAgICAgICBSZXR1cm46Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG91dHB1dCBwaWN0dXJlIHN0cnVjdHVyZSwgTlVMTCBpZiBubyBwaWN0dXJlcyB0bwotICAgICAgICAgICAgZGlzcGxheQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1kcGJPdXRQaWN0dXJlX3QqIGgyNjRic2REcGJPdXRwdXRQaWN0dXJlKGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0KLSAgICBpZiAoZHBiLT5vdXRJbmRleCA8IGRwYi0+bnVtT3V0KQotICAgICAgICByZXR1cm4oZHBiLT5vdXRCdWYgKyBkcGItPm91dEluZGV4KyspOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoRHBiCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZsdXNoIHRoZSBEUEIuIEZ1bmN0aW9uIHB1dHMgYWxsIHBpY3R1cmVzIG5lZWRlZCBmb3IKLSAgICAgICAgICAgIGRpc3BsYXkgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhpcyBmdW5jdGlvbiBzaGFsbCBiZSBjYWxsZWQgaW4KLSAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB0byBvYnRhaW4gcGljdHVyZXMgYnVmZmVyZWQgZm9yIGRpc3BsYXkKLSAgICAgICAgICAgIHJlLW9yZGVyaW5nIHB1cnBvc2VzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RGbHVzaERwYihkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotICAgIC8qIGRvbid0IGRvIGFueXRoaW5nIGlmIGJ1ZmZlciBub3QgcmVzZXJ2ZWQgKi8KLSAgICBpZiAoZHBiLT5idWZmZXIpCi0gICAgewotICAgICAgICBkcGItPmZsdXNoZWQgPSAxOwotICAgICAgICAvKiBvdXRwdXQgYWxsIHBpY3R1cmVzICovCi0gICAgICAgIHdoaWxlIChPdXRwdXRQaWN0dXJlKGRwYikgPT0gSEFOVFJPX09LKQotICAgICAgICAgICAgOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGcmVlRHBiCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3JpZXMgcmVzZXJ2ZWQgZm9yIHRoZSBEUEIuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEZyZWVEcGIoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotCi0gICAgaWYgKGRwYi0+YnVmZmVyKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZSsxOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZSRUUoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZSRUUoZHBiLT5idWZmZXIpOwotICAgIEZSRUUoZHBiLT5saXN0KTsKLSAgICBGUkVFKGRwYi0+b3V0QnVmKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFNoZWxsU29ydAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTb3J0IHBpY3R1cmVzIGluIHRoZSBidWZmZXIuIEZ1bmN0aW9uIGltcGxlbWVudHMgU2hlbGwncyBtZXRob2QsCi0gICAgICAgICAgICBpLmUuIGRpbWluaXNoaW5nIGluY3JlbWVudCBzb3J0LiBTZWUgZS5nLiAiTnVtZXJpY2FsIFJlY2lwZXMgaW4gQyIKLSAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBTaGVsbFNvcnQoZHBiUGljdHVyZV90ICpwUGljLCB1MzIgbnVtKQotewotCi0gICAgdTMyIGksIGo7Ci0gICAgdTMyIHN0ZXA7Ci0gICAgZHBiUGljdHVyZV90IHRtcFBpYzsKLQotICAgIHN0ZXAgPSA3OwotCi0gICAgd2hpbGUgKHN0ZXApCi0gICAgewotICAgICAgICBmb3IgKGkgPSBzdGVwOyBpIDwgbnVtOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcFBpYyA9IHBQaWNbaV07Ci0gICAgICAgICAgICBqID0gaTsKLSAgICAgICAgICAgIHdoaWxlIChqID49IHN0ZXAgJiYgQ29tcGFyZVBpY3R1cmVzKHBQaWMgKyBqIC0gc3RlcCwgJnRtcFBpYykgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQaWNbal0gPSBwUGljW2otc3RlcF07Ci0gICAgICAgICAgICAgICAgaiAtPSBzdGVwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBpY1tqXSA9IHRtcFBpYzsKLSAgICAgICAgfQotICAgICAgICBzdGVwID4+PSAxOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjUwODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfRFBCX0gKLSNkZWZpbmUgSDI2NFNXREVDX0RQQl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBlbnVtZXJhdGlvbiB0byByZXByZXNlbnQgc3RhdHVzIG9mIGJ1ZmZlcmVkIGltYWdlICovCi10eXBlZGVmIGVudW0gewotICAgIFVOVVNFRCA9IDAsCi0gICAgTk9OX0VYSVNUSU5HLAotICAgIFNIT1JUX1RFUk0sCi0gICAgTE9OR19URVJNCi19IGRwYlBpY3R1cmVTdGF0dXNfZTsKLQotLyogc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhIGJ1ZmZlcmVkIHBpY3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCAqZGF0YTsgICAgICAgICAgIC8qIDE2LWJ5dGUgYWxpZ25lZCBwb2ludGVyIG9mIHBBbGxvY2F0ZWREYXRhICovCi0gICAgdTggKnBBbGxvY2F0ZWREYXRhOyAvKiBhbGxvY2F0ZWQgcGljdHVyZSBwb2ludGVyOyAoc2l6ZSArIDE1KSBieXRlcyAqLwotICAgIGkzMiBwaWNOdW07Ci0gICAgdTMyIGZyYW1lTnVtOwotICAgIGkzMiBwaWNPcmRlckNudDsKLSAgICBkcGJQaWN0dXJlU3RhdHVzX2Ugc3RhdHVzOwotICAgIHUzMiB0b0JlRGlzcGxheWVkOwotICAgIHUzMiBwaWNJZDsKLSAgICB1MzIgbnVtRXJyTWJzOwotICAgIHUzMiBpc0lkcjsKLX0gZHBiUGljdHVyZV90OwotCi0vKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGRpc3BsYXkgaW1hZ2Ugb3V0cHV0IGZyb20gdGhlIGJ1ZmZlciAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHU4ICpkYXRhOwotICAgIHUzMiBwaWNJZDsKLSAgICB1MzIgbnVtRXJyTWJzOwotICAgIHUzMiBpc0lkcjsKLX0gZHBiT3V0UGljdHVyZV90OwotCi0vKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IERQQiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGRwYlBpY3R1cmVfdCAqYnVmZmVyOwotICAgIGRwYlBpY3R1cmVfdCAqKmxpc3Q7Ci0gICAgZHBiUGljdHVyZV90ICpjdXJyZW50T3V0OwotICAgIGRwYk91dFBpY3R1cmVfdCAqb3V0QnVmOwotICAgIHUzMiBudW1PdXQ7Ci0gICAgdTMyIG91dEluZGV4OwotICAgIHUzMiBtYXhSZWZGcmFtZXM7Ci0gICAgdTMyIGRwYlNpemU7Ci0gICAgdTMyIG1heEZyYW1lTnVtOwotICAgIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4OwotICAgIHUzMiBudW1SZWZGcmFtZXM7Ci0gICAgdTMyIGZ1bGxuZXNzOwotICAgIHUzMiBwcmV2UmVmRnJhbWVOdW07Ci0gICAgdTMyIGxhc3RDb250YWluc01tY281OwotICAgIHUzMiBub1Jlb3JkZXJpbmc7Ci0gICAgdTMyIGZsdXNoZWQ7Ci19IGRwYlN0b3JhZ2VfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEluaXREcGIoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICB1MzIgcGljU2l6ZUluTWJzLAotICB1MzIgZHBiU2l6ZSwKLSAgdTMyIG51bVJlZkZyYW1lcywKLSAgdTMyIG1heEZyYW1lTnVtLAotICB1MzIgbm9SZW9yZGVyaW5nKTsKLQotdTMyIGgyNjRic2RSZXNldERwYigKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIHUzMiBwaWNTaXplSW5NYnMsCi0gIHUzMiBkcGJTaXplLAotICB1MzIgbnVtUmVmRnJhbWVzLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIHUzMiBub1Jlb3JkZXJpbmcpOwotCi12b2lkIGgyNjRic2RJbml0UmVmUGljTGlzdChkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXU4KiBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXU4KiBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGluZGV4KTsKLQotdTMyIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdCgKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKm9yZGVyLAotICB1MzIgY3VyckZyYW1lTnVtLAotICB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKLQotdTMyIGgyNjRic2RNYXJrRGVjUmVmUGljKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgZGVjUmVmUGljTWFya2luZ190ICptYXJrLAotICBpbWFnZV90ICppbWFnZSwKLSAgdTMyIGZyYW1lTnVtLAotICBpMzIgcGljT3JkZXJDbnQsCi0gIHUzMiBpc0lkciwKLSAgdTMyIHBpY0lkLAotICB1MzIgbnVtRXJyTWJzKTsKLQotdTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpOwotCi1kcGJPdXRQaWN0dXJlX3QqIGgyNjRic2REcGJPdXRwdXRQaWN0dXJlKGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotdm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpOwotCi12b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfRFBCX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5Mjg3MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jawotICAgICAgICAgIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiB4LSBhbmQgeS1jb29yZGluYXRlcyBmb3IgZWFjaCBibG9jaywgZGVmaW5lZCBpbiBoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyAqLwotZXh0ZXJuIGNvbnN0IHUzMiBoMjY0YnNkQmxvY2tYW107Ci1leHRlcm4gY29uc3QgdTMyIGgyNjRic2RCbG9ja1lbXTsKLQotLyogY2xpcHBpbmcgdGFibGUsIGRlZmluZWQgaW4gaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgKi8KLWV4dGVybiBjb25zdCB1OCBoMjY0YnNkQ2xpcFtdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgV3JpdGUgb25lIG1hY3JvYmxvY2sgaW50byB0aGUgaW1hZ2UuIEJvdGggbHVtYSBhbmQgY2hyb21hCi0gICAgICAgICAgICBjb21wb25lbnRzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgdG8gYmUgd3JpdHRlbiwgMjU2IHZhbHVlcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgaW1hZ2UgICBwb2ludGVyIHRvIHRoZSBpbWFnZSB3aGVyZSB0aGUgbWFjcm9ibG9jayB3aWxsIGJlIHdyaXR0ZW4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX05FT04KLXZvaWQgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhpbWFnZV90ICppbWFnZSwgdTggKmRhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHdpZHRoOwotICAgIHUzMiAqbHVtLCAqY2IsICpjcjsKLSAgICB1MzIgKnB0cjsKLSAgICB1MzIgdG1wMSwgdG1wMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKCEoKHUzMilkYXRhJjB4MykpOwotCi0gICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7Ci0KLSAgICAvKmxpbnQgLXNhdmUgLWU4MjYgbHVtLCBjYiBhbmQgY3IgdXNlZCB0byBjb3B5IDQgYnl0ZXMgYXQgdGhlIHRpbWUsIGRpc2FibGUKLSAgICAgKiAiYXJlYSB0b28gc21hbGwiIGluZm8gbWVzc2FnZSAqLwotICAgIGx1bSA9ICh1MzIqKWltYWdlLT5sdW1hOwotICAgIGNiID0gKHUzMiopaW1hZ2UtPmNiOwotICAgIGNyID0gKHUzMiopaW1hZ2UtPmNyOwotICAgIEFTU0VSVCghKCh1MzIpbHVtJjB4MykpOwotICAgIEFTU0VSVCghKCh1MzIpY2ImMHgzKSk7Ci0gICAgQVNTRVJUKCEoKHUzMiljciYweDMpKTsKLQotICAgIHB0ciA9ICh1MzIqKWRhdGE7Ci0KLSAgICB3aWR0aCAqPSA0OwotICAgIGZvciAoaSA9IDE2OyBpIDsgaS0tKQotICAgIHsKLSAgICAgICAgdG1wMSA9ICpwdHIrKzsKLSAgICAgICAgdG1wMiA9ICpwdHIrKzsKLSAgICAgICAgKmx1bSsrID0gdG1wMTsKLSAgICAgICAgKmx1bSsrID0gdG1wMjsKLSAgICAgICAgdG1wMSA9ICpwdHIrKzsKLSAgICAgICAgdG1wMiA9ICpwdHIrKzsKLSAgICAgICAgKmx1bSsrID0gdG1wMTsKLSAgICAgICAgKmx1bSsrID0gdG1wMjsKLSAgICAgICAgbHVtICs9IHdpZHRoLTQ7Ci0gICAgfQotCi0gICAgd2lkdGggPj49IDE7Ci0gICAgZm9yIChpID0gODsgaSA7IGktLSkKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAqcHRyKys7Ci0gICAgICAgIHRtcDIgPSAqcHRyKys7Ci0gICAgICAgICpjYisrID0gdG1wMTsKLSAgICAgICAgKmNiKysgPSB0bXAyOwotICAgICAgICBjYiArPSB3aWR0aC0yOwotICAgIH0KLQotICAgIGZvciAoaSA9IDg7IGkgOyBpLS0pCi0gICAgewotICAgICAgICB0bXAxID0gKnB0cisrOwotICAgICAgICB0bXAyID0gKnB0cisrOwotICAgICAgICAqY3IrKyA9IHRtcDE7Ci0gICAgICAgICpjcisrID0gdG1wMjsKLSAgICAgICAgY3IgKz0gd2lkdGgtMjsKLSAgICB9Ci0KLX0KLSNlbmRpZgotI2lmbmRlZiBIMjY0REVDX09NWERMCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gUHJlZGljdGlvbiBmb3IgdGhlIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIGFuZCB0aGUgcmVzaWR1YWwgYXJlIGdpdmVuIHNlcGFyYXRlbHkgYW5kIHdpbGwgYmUgY29tYmluZWQgd2hpbGUKLSAgICAgICAgICAgIHdyaXRpbmcgdGhlIGRhdGEgdG8gdGhlIGltYWdlCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gZGF0YSwgMjU2IHZhbHVlcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCi0gICAgICAgICAgICBtYk51bSAgICAgICBudW1iZXIgb2YgdGhlIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIHJlc2lkdWFsICAgIHBvaW50ZXIgdG8gcmVzaWR1YWwgZGF0YSwgMTYgMTYtZWxlbWVudCBhcnJheXMgZm9yIGx1bWEKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IDQgMTYtZWxlbWVudCBhcnJheXMgZm9yIGJvdGggY2hyb21hCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGltYWdlICAgICAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzKGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0sIHU4ICpkYXRhLAotICAgICAgICBpMzIgcmVzaWR1YWxbXVsxNl0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHBpY1dpZHRoLCBwaWNTaXplOwotICAgIHU4ICpsdW0sICpjYiwgKmNyOwotICAgIHU4ICppbWFnZUJsb2NrOwotICAgIHU4ICp0bXA7Ci0gICAgdTMyIHJvdywgY29sOwotICAgIHUzMiBibG9jazsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgKnBSZXM7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobWJOdW0gPCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0KTsKLSAgICBBU1NFUlQoISgodTMyKWRhdGEmMHgzKSk7Ci0KLSAgICAvKiBJbWFnZSBzaXplIGluIG1hY3JvYmxvY2tzICovCi0gICAgcGljV2lkdGggPSBpbWFnZS0+d2lkdGg7Ci0gICAgcGljU2l6ZSA9IHBpY1dpZHRoICogaW1hZ2UtPmhlaWdodDsKLSAgICByb3cgPSBtYk51bSAvIHBpY1dpZHRoOwotICAgIGNvbCA9IG1iTnVtICUgcGljV2lkdGg7Ci0KLSAgICAvKiBPdXRwdXQgbWFjcm9ibG9jayBwb3NpdGlvbiBpbiBvdXRwdXQgcGljdHVyZSAqLwotICAgIGx1bSA9IChpbWFnZS0+ZGF0YSArIHJvdyAqIHBpY1dpZHRoICogMjU2ICsgY29sICogMTYpOwotICAgIGNiID0gKGltYWdlLT5kYXRhICsgcGljU2l6ZSAqIDI1NiArIHJvdyAqIHBpY1dpZHRoICogNjQgKyBjb2wgKiA4KTsKLSAgICBjciA9IChjYiArIHBpY1NpemUgKiA2NCk7Ci0KLSAgICBwaWNXaWR0aCAqPSAxNjsKLQotICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDE2OyBibG9jaysrKQotICAgIHsKLSAgICAgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tdOwotICAgICAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja107Ci0KLSAgICAgICAgcFJlcyA9IHJlc2lkdWFsW2Jsb2NrXTsKLQotICAgICAgICBBU1NFUlQocFJlcyk7Ci0KLSAgICAgICAgdG1wID0gZGF0YSArIHkqMTYgKyB4OwotICAgICAgICBpbWFnZUJsb2NrID0gbHVtICsgeSpwaWNXaWR0aCArIHg7Ci0KLSAgICAgICAgQVNTRVJUKCEoKHUzMil0bXAmMHgzKSk7Ci0gICAgICAgIEFTU0VSVCghKCh1MzIpaW1hZ2VCbG9jayYweDMpKTsKLQotICAgICAgICBpZiAoSVNfUkVTSURVQUxfRU1QVFkocFJlcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qbGludCAtZTgyNiAqLwotICAgICAgICAgICAgaTMyICppbjMyID0gKGkzMiopdG1wOwotICAgICAgICAgICAgaTMyICpvdXQzMiA9IChpMzIqKWltYWdlQmxvY2s7Ci0KLSAgICAgICAgICAgIC8qIFJlc2lkdWFsIGlzIHplcm8gPT4gY29weSBwcmVkaWN0aW9uIGJsb2NrIHRvIG91dHB1dCAqLwotICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSA0OwotICAgICAgICAgICAgdG1wMiA9ICppbjMyOyAgaW4zMiArPSA0OwotICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7IG91dDMyICs9IHBpY1dpZHRoLzQ7Ci0gICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDQ7Ci0gICAgICAgICAgICB0bXAyID0gKmluMzI7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OwotICAgICAgICAgICAgKm91dDMyID0gdG1wMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICAgICAgUkFOR0VfQ0hFQ0tfQVJSQVkocFJlcywgLTUxMiwgNTExLCAxNik7Ci0KLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBpbWFnZSA9IHByZWRpY3Rpb24gKyByZXNpZHVhbAotICAgICAgICAgICAgICogUHJvY2VzcyBmb3VyIHBpeGVscyBpbiBhIGxvb3AgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzBdOwotICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIHRtcDMgPSB0bXBbMV07Ci0gICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07Ci0gICAgICAgICAgICAgICAgdG1wNCA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1swXSA9ICh1OCl0bXAxOwotICAgICAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOwotICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMl07Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1sxXSA9ICh1OCl0bXAzOwotICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOwotICAgICAgICAgICAgICAgIHRtcDMgPSB0bXBbM107Ci0gICAgICAgICAgICAgICAgdG1wNCA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1syXSA9ICh1OCl0bXAxOwotICAgICAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOwotICAgICAgICAgICAgICAgIHRtcCArPSAxNjsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzNdID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9jayArPSBwaWNXaWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcGljV2lkdGggLz0gMjsKLQotICAgIGZvciAoYmxvY2sgPSAxNjsgYmxvY2sgPD0gMjM7IGJsb2NrKyspCi0gICAgewotICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9jayAmIDB4M107Ci0gICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrICYgMHgzXTsKLQotICAgICAgICBwUmVzID0gcmVzaWR1YWxbYmxvY2tdOwotCi0gICAgICAgIEFTU0VSVChwUmVzKTsKLQotICAgICAgICB0bXAgPSBkYXRhICsgMjU2OwotICAgICAgICBpbWFnZUJsb2NrID0gY2I7Ci0KLSAgICAgICAgaWYgKGJsb2NrID49IDIwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbWFnZUJsb2NrID0gY3I7Ci0gICAgICAgICAgICB0bXAgKz0gNjQ7Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgKz0geSo4ICsgeDsKLSAgICAgICAgaW1hZ2VCbG9jayArPSB5KnBpY1dpZHRoICsgeDsKLQotICAgICAgICBBU1NFUlQoISgodTMyKXRtcCYweDMpKTsKLSAgICAgICAgQVNTRVJUKCEoKHUzMilpbWFnZUJsb2NrJjB4MykpOwotCi0gICAgICAgIGlmIChJU19SRVNJRFVBTF9FTVBUWShwUmVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgLypsaW50IC1lODI2ICovCi0gICAgICAgICAgICBpMzIgKmluMzIgPSAoaTMyKil0bXA7Ci0gICAgICAgICAgICBpMzIgKm91dDMyID0gKGkzMiopaW1hZ2VCbG9jazsKLQotICAgICAgICAgICAgLyogUmVzaWR1YWwgaXMgemVybyA9PiBjb3B5IHByZWRpY3Rpb24gYmxvY2sgdG8gb3V0cHV0ICovCi0gICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDI7Ci0gICAgICAgICAgICB0bXAyID0gKmluMzI7ICBpbjMyICs9IDI7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OwotICAgICAgICAgICAgKm91dDMyID0gdG1wMjsgb3V0MzIgKz0gcGljV2lkdGgvNDsKLSAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gMjsKLSAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotCi0gICAgICAgICAgICBSQU5HRV9DSEVDS19BUlJBWShwUmVzLCAtNTEyLCA1MTEsIDE2KTsKLQotICAgICAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMF07Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHRtcFsxXTsKLSAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKLSAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzBdID0gKHU4KXRtcDE7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07Ci0gICAgICAgICAgICAgICAgdG1wMSA9IHRtcFsyXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzFdID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHRtcFszXTsKLSAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzJdID0gKHU4KXRtcDE7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07Ci0gICAgICAgICAgICAgICAgdG1wICs9IDg7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1szXSA9ICh1OCl0bXAzOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2sgKz0gcGljV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2MxOGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0lNQUdFX0gKLSNkZWZpbmUgSDI2NFNXREVDX0lNQUdFX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTggKmRhdGE7Ci0gICAgdTMyIHdpZHRoOwotICAgIHUzMiBoZWlnaHQ7Ci0gICAgLyogY3VycmVudCBNQidzIGNvbXBvbmVudHMgKi8KLSAgICB1OCAqbHVtYTsKLSAgICB1OCAqY2I7Ci0gICAgdTggKmNyOwotfSBpbWFnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhpbWFnZV90ICppbWFnZSwgdTggKmRhdGEpOwotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLXZvaWQgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzKGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0sIHU4ICpkYXRhLAotICAgIGkzMiByZXNpZHVhbFtdWzE2XSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU1BR0VfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4MWM0YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEludGVyUHJlZGljdGlvbgotICAgICAgICAgIE12UHJlZGljdGlvbjE2eDE2Ci0gICAgICAgICAgTXZQcmVkaWN0aW9uMTZ4OAotICAgICAgICAgIE12UHJlZGljdGlvbjh4MTYKLSAgICAgICAgICBNdlByZWRpY3Rpb244eDgKLSAgICAgICAgICBNdlByZWRpY3Rpb24KLSAgICAgICAgICBNZWRpYW5GaWx0ZXIKLSAgICAgICAgICBHZXRJbnRlck5laWdoYm91cgotICAgICAgICAgIEdldFByZWRpY3Rpb25NdgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oIgotI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9yZWNvbnN0cnVjdC5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGF2YWlsYWJsZTsKLSAgICB1MzIgcmVmSW5kZXg7Ci0gICAgbXZfdCBtdjsKLX0gaW50ZXJOZWlnaGJvdXJfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE12UHJlZGljdGlvbjE2eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIpOwotc3RhdGljIHUzMiBNdlByZWRpY3Rpb24xNng4KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIpOwotc3RhdGljIHUzMiBNdlByZWRpY3Rpb244eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIpOwotc3RhdGljIHUzMiBNdlByZWRpY3Rpb244eDgobWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwKLSAgICBkcGJTdG9yYWdlX3QgKmRwYik7Ci1zdGF0aWMgdTMyIE12UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLAotICAgIHUzMiBtYlBhcnRJZHgsIHUzMiBzdWJNYlBhcnRJZHgpOwotc3RhdGljIGkzMiBNZWRpYW5GaWx0ZXIoaTMyIGEsIGkzMiBiLCBpMzIgYyk7Ci0KLXN0YXRpYyB2b2lkIEdldEludGVyTmVpZ2hib3VyKHUzMiBzbGljZUlkLCBtYlN0b3JhZ2VfdCAqbk1iLAotICAgIGludGVyTmVpZ2hib3VyX3QgKm4sIHUzMiBpbmRleCk7Ci1zdGF0aWMgdm9pZCBHZXRQcmVkaWN0aW9uTXYobXZfdCAqbXYsIGludGVyTmVpZ2hib3VyX3QgKmEsIHUzMiByZWZJbmRleCk7Ci0KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0FfU1VCX1BBUlRbNF1bNF1bNF0gPSB7Ci0gICAgeyB7IHtNQl9BLDV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDV9LCB7TUJfQSw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsNX0sIHtNQl9DVVJSLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSw1fSwge01CX0NVUlIsMH0sIHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSB9IH0sCi0KLSAgICB7IHsge01CX0NVUlIsMX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsMX0sIHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9IH0gfSwKLQotICAgIHsgeyB7TUJfQSwxM30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsMTN9LCB7TUJfQSwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDEzfSwge01CX0NVUlIsOH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDEzfSwge01CX0NVUlIsOH0sIHtNQl9BLDE1fSwge01CX0NVUlIsMTB9IH0gfSwKLQotICAgIHsgeyB7TUJfQ1VSUiw5fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LCB7TUJfQ1VSUiwxMX0sIHtNQl9DVVJSLDE0fSB9IH0gfTsKLQotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQl9TVUJfUEFSVFs0XVs0XVs0XSA9IHsKLSAgICB7IHsge01CX0IsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDEwfSwge01CX0NVUlIsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDEwfSwge01CX0IsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMH0sIHtNQl9CLDExfSwge01CX0NVUlIsMH0sIHtNQl9DVVJSLDF9IH0gfSwKLQotICAgIHsgeyB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTR9LCB7TUJfQ1VSUiw0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTR9LCB7TUJfQiwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE0fSwge01CX0IsMTV9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsNX0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsMn0sIHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDh9LCB7TUJfQ1VSUiw5fSB9IH0sCi0KLSAgICB7IHsge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDEyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDd9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9DVVJSLDEyfSwge01CX0NVUlIsMTN9IH0gfSB9OwotCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9DX1NVQl9QQVJUWzRdWzRdWzRdID0gewotICAgIHsgeyB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTR9LCB7TUJfTkEsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX0NVUlIsMX0sIHtNQl9OQSw0fSB9IH0sCi0KLSAgICB7IHsge01CX0MsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxNX0sIHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTV9LCB7TUJfQywxMH0sIHtNQl9DVVJSLDV9LCB7TUJfTkEsMH0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9OQSwxMn0gfSB9LAotCi0gICAgeyB7IHtNQl9OQSwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfTkEsMn0sIHtNQl9OQSw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsN30sIHtNQl9OQSwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsN30sIHtNQl9OQSwyfSwge01CX0NVUlIsMTN9LCB7TUJfTkEsOH0gfSB9IH07Ci0KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0RfU1VCX1BBUlRbNF1bNF1bNF0gPSB7Ci0gICAgeyB7IHtNQl9ELDE1fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfRCwxNX0sIHtNQl9BLDV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfRCwxNX0sIHtNQl9CLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0QsMTV9LCB7TUJfQiwxMH0sIHtNQl9BLDV9LCB7TUJfQ1VSUiwwfSB9IH0sCi0KLSAgICB7IHsge01CX0IsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDExfSwge01CX0NVUlIsMX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9IH0gfSwKLQotICAgIHsgeyB7TUJfQSw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSw3fSwge01CX0EsMTN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSw3fSwge01CX0NVUlIsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSwge01CX0EsMTN9LCB7TUJfQ1VSUiw4fSB9IH0sCi0KLSAgICB7IHsge01CX0NVUlIsM30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSB9IH0gfTsKLQotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlclByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50ZXIgbWFjcm9ibG9jay4gUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCi0gICAgICAgICAgYW5kIHJlY29uc3RydWN0cyBwcmVkaWN0aW9uIG1hY3JvYmxvY2suIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jawotICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoY3VyckltYWdlKQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICAgICAgIHBNYkxheWVyICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQotICAgICAgICAgIGRwYiAgICAgICAgICAgcG9pbnRlciB0byBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyCi0gICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCi0gICAgICAgICAgY3VyckltYWdlICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQotICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB3aGVyZSBwcmVkaWN0ZWQgbWFjcm9ibG9jayB3aWxsIGJlIHN0b3JlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIGN1cnJJbWFnZSAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBpbWFnZQotICAgICAgICAgIGRhdGEgICAgICAgICAgcHJlZGljdGlvbiBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCi0gICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICpjdXJySW1hZ2UsIHU4ICpkYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiB4LCB5OwotICAgIHUzMiBjb2xBbmRSb3c7Ci0gICAgc3ViTWJQYXJ0TW9kZV9lIHN1YlBhcnRNb2RlOwotICAgIGltYWdlX3QgcmVmSW1hZ2U7Ci0gICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKLSAgICB1OCAqcEZpbGw7Ci0gICAgdTMyIHRtcDsKLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7Ci0gICAgQVNTRVJUKHBNYkxheWVyKTsKLQotICAgIC8qIDE2LWJ5dGUgYWxpZ25tZW50ICovCi0gICAgcEZpbGwgPSBBTElHTihmaWxsQnVmZiwgMTYpOwotCi0gICAgLyogc2V0IHJvdyBiaXRzIDE1OjAgKi8KLSAgICBjb2xBbmRSb3cgPSBtYk51bSAvIGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgLypzZXQgY29sIHRvIGJpdHMgMzE6MTYgKi8KLSAgICBjb2xBbmRSb3cgKz0gKG1iTnVtIC0gY29sQW5kUm93ICogY3VyckltYWdlLT53aWR0aCkgPDwgMTY7Ci0gICAgY29sQW5kUm93IDw8PSA0OwotCi0gICAgcmVmSW1hZ2Uud2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOwotICAgIHJlZkltYWdlLmhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OwotCi0gICAgc3dpdGNoIChwTWItPm1iVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUF9Ta2lwOgotICAgICAgICBjYXNlIFBfTDBfMTZ4MTY6Ci0gICAgICAgICAgICBpZiAoTXZQcmVkaWN0aW9uMTZ4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKLSAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoMDw8MTYpICsgKDE2PDw4KSArIDE2OwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKLSAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uMTZ4OChwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOwotICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoMTY8PDgpICsgODsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotCi0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzJdOwotICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICg4PDwxNikgKyAoMTY8PDgpICsgODsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzgsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBfTDBfTDBfOHgxNjoKLSAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHgxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOwotICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoODw8OCkgKyAxNjsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsxXTsKLSAgICAgICAgICAgIHRtcCA9ICg4PDwyNCkgKyAoMDw8MTYpICsgKDg8PDgpICsgMTY7Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0LCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogUF84eDggYW5kIFBfOHg4cmVmMCAqLwotICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDgocE1iLCAmcE1iTGF5ZXItPnN1Yk1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyW2ldOwotICAgICAgICAgICAgICAgIHN1YlBhcnRNb2RlID0KLSAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUocE1iTGF5ZXItPnN1Yk1iUHJlZC5zdWJNYlR5cGVbaV0pOwotICAgICAgICAgICAgICAgIHggPSBpICYgMHgxID8gOCA6IDA7Ci0gICAgICAgICAgICAgICAgeSA9IGkgPCAyID8gMCA6IDg7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzdWJQYXJ0TW9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg4OgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoODw8OCkgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg0OgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoODw8OCkgKyA0OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoKHkrNCk8PDE2KSArICg4PDw4KSArIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzR4ODoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA0OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICgoeSs0KTw8MTYpICsgKDQ8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoeCs0KTw8MjQpICsgKCh5KzQpPDwxNikgKyAoNDw8OCkgKyA0OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzMsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAotICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLwotICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQotICAgICAgICByZXR1cm4gSEFOVFJPX09LOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzZXMgb25lIGludGVyIG1hY3JvYmxvY2suIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgotICAgICAgICAgIGFuZCByZWNvbnN0cnVjdHMgcHJlZGljdGlvbiBtYWNyb2Jsb2NrLiBXcml0ZXMgdGhlIGZpbmFsIG1hY3JvYmxvY2sKLSAgICAgICAgICAocHJlZGljdGlvbiArIHJlc2lkdWFsKSBpbnRvIHRoZSBvdXRwdXQgaW1hZ2UgKGN1cnJJbWFnZSkKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICBwTWJMYXllciAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KLSAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgotICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgotICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgcHJlZGljdGVkIG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICBjdXJySW1hZ2UgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKLSAgICAgICAgICBkYXRhICAgICAgICAgIHByZWRpY3Rpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcwotICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1OCAqZGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgeCwgeTsKLSAgICB1MzIgcm93LCBjb2w7Ci0gICAgc3ViTWJQYXJ0TW9kZV9lIHN1YlBhcnRNb2RlOwotICAgIGltYWdlX3QgcmVmSW1hZ2U7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7Ci0gICAgQVNTRVJUKHBNYkxheWVyKTsKLQotICAgIHJvdyA9IG1iTnVtIC8gY3VyckltYWdlLT53aWR0aDsKLSAgICBjb2wgPSBtYk51bSAtIHJvdyAqIGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgcm93ICo9IDE2OwotICAgIGNvbCAqPSAxNjsKLQotICAgIHJlZkltYWdlLndpZHRoID0gY3VyckltYWdlLT53aWR0aDsKLSAgICByZWZJbWFnZS5oZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKLQotICAgIHN3aXRjaCAocE1iLT5tYlR5cGUpCi0gICAgewotICAgICAgICBjYXNlIFBfU2tpcDoKLSAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgotICAgICAgICAgICAgaWYgKE12UHJlZGljdGlvbjE2eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKLSAgICAgICAgICAgICAgICAxNiwgMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQX0wwX0wwXzE2eDg6Ci0gICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjE2eDgocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCAwLAotICAgICAgICAgICAgICAgIDE2LCA4KTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMl07Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis4LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCA4LAotICAgICAgICAgICAgICAgIDE2LCA4KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUF9MMF9MMF84eDE2OgotICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKLSAgICAgICAgICAgICAgICA4LCAxNik7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzFdOwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCwgJnJlZkltYWdlLCBjb2wsIHJvdywgOCwgMCwKLSAgICAgICAgICAgICAgICA4LCAxNik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBQXzh4OCBhbmQgUF84eDhyZWYwICovCi0gICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4OChwTWIsICZwTWJMYXllci0+c3ViTWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbaV07Ci0gICAgICAgICAgICAgICAgc3ViUGFydE1vZGUgPQotICAgICAgICAgICAgICAgICAgICBoMjY0YnNkU3ViTWJQYXJ0TW9kZShwTWJMYXllci0+c3ViTWJQcmVkLnN1Yk1iVHlwZVtpXSk7Ci0gICAgICAgICAgICAgICAgeCA9IGkgJiAweDEgPyA4IDogMDsKLSAgICAgICAgICAgICAgICB5ID0gaSA8IDIgPyAwIDogODsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YlBhcnRNb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgOCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA4LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHkrNCwgOCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzR4ODoKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgrNCwgeSwgNCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCs0LCB5LCA0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHkrNCwgNCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMywgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4KzQsIHkrNCwgNCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCi0gICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCi0gICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCi0gICAgICAgIHJldHVybiBIQU5UUk9fT0s7Ci0KLSAgICBpZiAocE1iLT5tYlR5cGUgIT0gUF9Ta2lwKQotICAgIHsKLSAgICAgICAgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzKGN1cnJJbWFnZSwgbWJOdW0sIGRhdGEsCi0gICAgICAgICAgICBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjE2eDE2Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgMTZ4MTYgcGFydGl0aW9uIG1vZGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE12UHJlZGljdGlvbjE2eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIG12X3QgbXY7Ci0gICAgbXZfdCBtdlByZWQ7Ci0gICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCi0gICAgdTMyIHJlZkluZGV4OwotICAgIHU4ICp0bXA7Ci0gICAgdTMyICp0bXBNdjEsICp0bXBNdjI7Ci0KLS8qIENvZGUgKi8KLQotICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKLQotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDUpOwotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOwotICAgIC8qbGludCAtLWUoNzQwKSAgVW51c3VhbCBwb2ludGVyIGNhc3QgKGluY29tcGF0aWJsZSBpbmRpcmVjdCB0eXBlcykgKi8KLSAgICB0bXBNdjEgPSAodTMyKikoJmFbMF0ubXYpOyAvKiB3ZSB0ZXN0IGp1c3QgdGhhdCBib3RoIE1WcyBhcmUgemVybyAqLwotICAgIC8qbGludCAtLWUoNzQwKSAqLwotICAgIHRtcE12MiA9ICh1MzIqKSgmYVsxXS5tdik7IC8qIGkuZS4gYVswXS5tdi5ob3IgPT0gMCAmJiBhWzBdLm12LnZlciA9PSAwICovCi0gICAgaWYgKHBNYi0+bWJUeXBlID09IFBfU2tpcCAmJgotICAgICAgICAoIWFbMF0uYXZhaWxhYmxlIHx8ICFhWzFdLmF2YWlsYWJsZSB8fAotICAgICAgICAgKCBhWzBdLnJlZkluZGV4ID09IDAgJiYgKCh1MzIpKCp0bXBNdjEpID09IDApICkgfHwKLSAgICAgICAgICggYVsxXS5yZWZJbmRleCA9PSAwICYmICgodTMyKSgqdG1wTXYyKSA9PSAwKSApKSkKLSAgICB7Ci0gICAgICAgICAgICBtdi5ob3IgPSBtdi52ZXIgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOwotICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKLSAgICAgICAgfQotCi0gICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7Ci0KLSAgICAgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7Ci0gICAgICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCi0gICAgICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0KLSAgICAgICAgICogKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCi0gICAgICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KLSAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0KLSAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPQotICAgIHBNYi0+bXZbMTJdID0gcE1iLT5tdlsxM10gPSBwTWItPm12WzE0XSA9IHBNYi0+bXZbMTVdID0gbXY7Ci0KLSAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZQaWNbMl0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1szXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmQWRkclswXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7Ci0gICAgcE1iLT5yZWZBZGRyWzJdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclszXSA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uMTZ4OAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDE2eDggcGFydGl0aW9uIG1vZGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE12UHJlZGljdGlvbjE2eDgobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgbXZfdCBtdjsKLSAgICBtdl90IG12UHJlZDsKLSAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KLSAgICB1MzIgcmVmSW5kZXg7Ci0gICAgdTggKnRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgbXYgPSBtYlByZWQtPm12ZEwwWzBdOwotICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKLQotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOwotCi0gICAgaWYgKGFbMV0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCi0gICAgICAgIG12UHJlZCA9IGFbMV0ubXY7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOwotICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKLSAgICAgICAgfQotCi0gICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7Ci0KLSAgICB9Ci0gICAgbXYuaG9yICs9IG12UHJlZC5ob3I7Ci0gICAgbXYudmVyICs9IG12UHJlZC52ZXI7Ci0KLSAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcE1iLT5tdlswXSA9IHBNYi0+bXZbMV0gPSBwTWItPm12WzJdID0gcE1iLT5tdlszXSA9Ci0gICAgcE1iLT5tdls0XSA9IHBNYi0+bXZbNV0gPSBwTWItPm12WzZdID0gcE1iLT5tdls3XSA9IG12OwotICAgIHBNYi0+cmVmUGljWzBdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZQaWNbMV0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZkFkZHJbMF0gPSB0bXA7Ci0gICAgcE1iLT5yZWZBZGRyWzFdID0gdG1wOwotCi0gICAgbXYgPSBtYlByZWQtPm12ZEwwWzFdOwotICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFsxXTsKLQotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDEzKTsKLSAgICBpZiAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkKLSAgICAgICAgbXZQcmVkID0gYVswXS5tdjsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBhWzFdLmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOwotICAgICAgICBhWzFdLnJlZkluZGV4ID0gcE1iLT5yZWZQaWNbMF07Ci0gICAgICAgIGFbMV0ubXYgPSBwTWItPm12WzBdOwotCi0gICAgICAgIC8qIGMgaXMgbm90IGF2YWlsYWJsZSAqLwotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhKzIsIDcpOwotCi0gICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7Ci0KLSAgICB9Ci0gICAgbXYuaG9yICs9IG12UHJlZC5ob3I7Ci0gICAgbXYudmVyICs9IG12UHJlZC52ZXI7Ci0KLSAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcE1iLT5tdls4XSA9IHBNYi0+bXZbOV0gPSBwTWItPm12WzEwXSA9IHBNYi0+bXZbMTFdID0KLSAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OwotICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZkFkZHJbMl0gPSB0bXA7Ci0gICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb244eDE2Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgOHgxNiBwYXJ0aXRpb24gbW9kZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgTXZQcmVkaWN0aW9uOHgxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBtdl90IG12OwotICAgIG12X3QgbXZQcmVkOwotICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLwotICAgIHUzMiByZWZJbmRleDsKLSAgICB1OCAqdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07Ci0gICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzBdOwotCi0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7Ci0KLSAgICBpZiAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkKLSAgICAgICAgbXZQcmVkID0gYVswXS5tdjsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDEwKTsKLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsyLCAxNCk7Ci0gICAgICAgIGlmICghYVsyXS5hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkQsIGErMiwgMTUpOwotICAgICAgICB9Ci0KLSAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKLQotICAgIH0KLSAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKLSAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKLQotICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCi0gICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCi0gICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KLSAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPSBtdjsKLSAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZBZGRyWzBdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclsyXSA9IHRtcDsKLQotICAgIG12ID0gbWJQcmVkLT5tdmRMMFsxXTsKLSAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMV07Ci0KLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJDLCBhKzIsIDEwKTsKLSAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQotICAgIHsKLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsyLCAxMSk7Ci0gICAgfQotICAgIGlmIChhWzJdLnJlZkluZGV4ID09IHJlZkluZGV4KQotICAgICAgICBtdlByZWQgPSBhWzJdLm12OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGFbMF0uYXZhaWxhYmxlID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIGFbMF0ucmVmSW5kZXggPSBwTWItPnJlZlBpY1swXTsKLSAgICAgICAgYVswXS5tdiA9IHBNYi0+bXZbMF07Ci0KLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxNCk7Ci0KLSAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKLQotICAgIH0KLSAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKLSAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKLQotICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCi0gICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCi0gICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0KLSAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OwotICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7Ci0gICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb244eDgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciA4eDggcGFydGl0aW9uIG1vZGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE12UHJlZGljdGlvbjh4OChtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgajsKLSAgICB1MzIgbnVtU3ViTWJQYXJ0OwotCi0vKiBDb2RlICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgbnVtU3ViTWJQYXJ0ID0gaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlByZWQtPnN1Yk1iVHlwZVtpXSk7Ci0gICAgICAgIHBNYi0+cmVmUGljW2ldID0gc3ViTWJQcmVkLT5yZWZJZHhMMFtpXTsKLSAgICAgICAgcE1iLT5yZWZBZGRyW2ldID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCBzdWJNYlByZWQtPnJlZklkeEwwW2ldKTsKLSAgICAgICAgaWYgKHBNYi0+cmVmQWRkcltpXSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtU3ViTWJQYXJ0OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChNdlByZWRpY3Rpb24ocE1iLCBzdWJNYlByZWQsIGksIGopICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE12UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZXJmb3JtIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3Igc3ViLXBhcnRpdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgTXZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsIHUzMiBtYlBhcnRJZHgsCi0gICAgdTMyIHN1Yk1iUGFydElkeCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBtdl90IG12LCBtdlByZWQ7Ci0gICAgdTMyIHJlZkluZGV4OwotICAgIHN1Yk1iUGFydE1vZGVfZSBzdWJNYlBhcnRNb2RlOwotICAgIGNvbnN0IG5laWdoYm91cl90ICpuOwotICAgIG1iU3RvcmFnZV90ICpuTWI7Ci0gICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCi0KLS8qIENvZGUgKi8KLQotICAgIG12ID0gc3ViTWJQcmVkLT5tdmRMMFttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF07Ci0gICAgc3ViTWJQYXJ0TW9kZSA9IGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iUHJlZC0+c3ViTWJUeXBlW21iUGFydElkeF0pOwotICAgIHJlZkluZGV4ID0gc3ViTWJQcmVkLT5yZWZJZHhMMFttYlBhcnRJZHhdOwotCi0gICAgbiA9IE5fQV9TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKLSAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7Ci0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGEsIG4tPmluZGV4KTsKLQotICAgIG4gPSBOX0JfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7Ci0gICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOwotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzEsIG4tPmluZGV4KTsKLQotICAgIG4gPSBOX0NfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7Ci0gICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOwotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzIsIG4tPmluZGV4KTsKLQotICAgIGlmICghYVsyXS5hdmFpbGFibGUpCi0gICAgewotICAgICAgICBuID0gTl9EX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OwotICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzIsIG4tPmluZGV4KTsKLSAgICB9Ci0KLSAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgbXYuaG9yICs9IG12UHJlZC5ob3I7Ci0gICAgbXYudmVyICs9IG12UHJlZC52ZXI7Ci0KLSAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgIGlmICgoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCi0gICAgaWYgKCgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBzd2l0Y2ggKHN1Yk1iUGFydE1vZGUpCi0gICAgewotICAgICAgICBjYXNlIE1CX1NQXzh4ODoKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHhdID0gbXY7Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMV0gPSBtdjsKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyXSA9IG12OwotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDNdID0gbXY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE1CX1NQXzh4NDoKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyKnN1Yk1iUGFydElkeF0gPSBtdjsKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyKnN1Yk1iUGFydElkeCArIDFdID0gbXY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE1CX1NQXzR4ODoKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyBzdWJNYlBhcnRJZHhdID0gbXY7Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgc3ViTWJQYXJ0SWR4ICsgMl0gPSBtdjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTUJfU1BfNHg0OgotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIHN1Yk1iUGFydElkeF0gPSBtdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTWVkaWFuRmlsdGVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIE1lZGlhbiBmaWx0ZXJpbmcgZm9yIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pMzIgTWVkaWFuRmlsdGVyKGkzMiBhLCBpMzIgYiwgaTMyIGMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIG1heCxtaW4sbWVkOwotCi0vKiBDb2RlICovCi0KLSAgICBtYXggPSBtaW4gPSBtZWQgPSBhOwotICAgIGlmIChiID4gbWF4KQotICAgIHsKLSAgICAgICAgbWF4ID0gYjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYiA8IG1pbikKLSAgICB7Ci0gICAgICAgIG1pbiA9IGI7Ci0gICAgfQotICAgIGlmIChjID4gbWF4KQotICAgIHsKLSAgICAgICAgbWVkID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChjIDwgbWluKQotICAgIHsKLSAgICAgICAgbWVkID0gbWluOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZWQgPSBjOwotICAgIH0KLQotICAgIHJldHVybihtZWQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldEludGVyTmVpZ2hib3VyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBhdmFpbGFiaWxpdHksIHJlZmVyZW5jZSBpbmRleCBhbmQgbW90aW9uIHZlY3RvciBvZiBhIG5laWdoYm91cgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEdldEludGVyTmVpZ2hib3VyKHUzMiBzbGljZUlkLCBtYlN0b3JhZ2VfdCAqbk1iLAotICAgIGludGVyTmVpZ2hib3VyX3QgKm4sIHUzMiBpbmRleCkKLXsKLQotICAgIG4tPmF2YWlsYWJsZSA9IEhBTlRST19GQUxTRTsKLSAgICBuLT5yZWZJbmRleCA9IDB4RkZGRkZGRkY7Ci0gICAgbi0+bXYuaG9yID0gbi0+bXYudmVyID0gMDsKLQotICAgIGlmIChuTWIgJiYgKHNsaWNlSWQgPT0gbk1iLT5zbGljZUlkKSkKLSAgICB7Ci0gICAgICAgIHUzMiB0bXA7Ci0gICAgICAgIG12X3QgdG1wTXY7Ci0KLSAgICAgICAgdG1wID0gbk1iLT5tYlR5cGU7Ci0gICAgICAgIG4tPmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOwotICAgICAgICAvKiBNYlBhcnRQcmVkTW9kZSAiaW5saW5lZCIgKi8KLSAgICAgICAgaWYgKHRtcCA8PSBQXzh4OHJlZjApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcE12ID0gbk1iLT5tdltpbmRleF07Ci0gICAgICAgICAgICB0bXAgPSBuTWItPnJlZlBpY1tpbmRleD4+Ml07Ci0gICAgICAgICAgICBuLT5yZWZJbmRleCA9IHRtcDsKLSAgICAgICAgICAgIG4tPm12ID0gdG1wTXY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRQcmVkaWN0aW9uTXYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBiYXNlZCBvbiBuZWlnaGJvdXJzIEEsIEIgYW5kIEMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBHZXRQcmVkaWN0aW9uTXYobXZfdCAqbXYsIGludGVyTmVpZ2hib3VyX3QgKmEsIHUzMiByZWZJbmRleCkKLXsKLQotICAgIGlmICggYVsxXS5hdmFpbGFibGUgfHwgYVsyXS5hdmFpbGFibGUgfHwgIWFbMF0uYXZhaWxhYmxlKQotICAgIHsKLSAgICAgICAgdTMyIGlzQSwgaXNCLCBpc0M7Ci0gICAgICAgIGlzQSA9IChhWzBdLnJlZkluZGV4ID09IHJlZkluZGV4KSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgICAgICBpc0IgPSAoYVsxXS5yZWZJbmRleCA9PSByZWZJbmRleCkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICAgICAgaXNDID0gKGFbMl0ucmVmSW5kZXggPT0gcmVmSW5kZXgpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgaWYgKCgodTMyKWlzQSsodTMyKWlzQisodTMyKWlzQykgIT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgbXYtPmhvciA9IChpMTYpTWVkaWFuRmlsdGVyKGFbMF0ubXYuaG9yLCBhWzFdLm12LmhvciwgYVsyXS5tdi5ob3IpOwotICAgICAgICAgICAgbXYtPnZlciA9IChpMTYpTWVkaWFuRmlsdGVyKGFbMF0ubXYudmVyLCBhWzFdLm12LnZlciwgYVsyXS5tdi52ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlzQSkKLSAgICAgICAgICAgICptdiA9IGFbMF0ubXY7Ci0gICAgICAgIGVsc2UgaWYgKGlzQikKLSAgICAgICAgICAgICptdiA9IGFbMV0ubXY7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICptdiA9IGFbMl0ubXY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICptdiA9IGFbMF0ubXY7Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZGVlMjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfSU5URVJfUFJFRElDVElPTl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19JTlRFUl9QUkVESUNUSU9OX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbnRlclByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbWJOdW0sIGltYWdlX3QgKmltYWdlLCB1OCAqZGF0YSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0lOVEVSX1BSRURJQ1RJT05fSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjODVlNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEludHJhUHJlZGljdGlvbgotICAgICAgICAgIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzCi0gICAgICAgICAgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uCi0gICAgICAgICAgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbgotICAgICAgICAgIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24KLSAgICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwKLSAgICAgICAgICBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmExNngxNkRjUHJlZGljdGlvbgotICAgICAgICAgIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYUNocm9tYURjUHJlZGljdGlvbgotICAgICAgICAgIEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uCi0gICAgICAgICAgR2V0NHg0TmVpZ2hib3VyUGVscwotICAgICAgICAgIFdyaXRlNHg0VG8xNngxNgotICAgICAgICAgIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0RGNQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uCi0gICAgICAgICAgRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6Ci0gKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKi8KLS8qbGludCAtZTcwMiAqLwotCi0KLS8qIHgtIGFuZCB5LWNvb3JkaW5hdGVzIGZvciBlYWNoIGJsb2NrICovCi1jb25zdCB1MzIgaDI2NGJzZEJsb2NrWFsxNl0gPQotICAgIHsgMCwgNCwgMCwgNCwgOCwgMTIsIDgsIDEyLCAwLCA0LCAwLCA0LCA4LCAxMiwgOCwgMTIgfTsKLWNvbnN0IHUzMiBoMjY0YnNkQmxvY2tZWzE2XSA9Ci0gICAgeyAwLCAwLCA0LCA0LCAwLCAwLCA0LCA0LCA4LCA4LCAxMiwgMTIsIDgsIDgsIDEyLCAxMiB9OwotCi1jb25zdCB1OCBoMjY0YnNkQ2xpcFsxMjgwXSA9Ci17Ci0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsCi0gICAgMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsCi0gICAgMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsCi0gICAgNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsCi0gICAgNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksCi0gICAgODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsCi0gICAgOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsCi0gICAgMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTI3LAotICAgIDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywKLSAgICAxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksCi0gICAgMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LAotICAgIDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwKLSAgICAxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsCi0gICAgMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLAotICAgIDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwKLSAgICAyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NQotfTsKLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBHZXQ0eDROZWlnaGJvdXJQZWxzKHU4ICphLCB1OCAqbCwgdTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCi0gICAgdTMyIGJsb2NrTnVtKTsKLXN0YXRpYyB2b2lkIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7Ci1zdGF0aWMgdm9pZCBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCi0gICAgdTMyIEEsIHUzMiBCKTsKLXN0YXRpYyB2b2lkIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOwotc3RhdGljIHZvaWQgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCi0gICAgdTMyIEEsIHUzMiBCKTsKLXN0YXRpYyB2b2lkIEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOwotc3RhdGljIHZvaWQgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOwotCi1zdGF0aWMgdm9pZCBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKLXN0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhNHg0RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgQSwgdTMyIEIpOwotc3RhdGljIHZvaWQgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKLXN0YXRpYyB2b2lkIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOwotc3RhdGljIHZvaWQgSW50cmE0eDRIb3Jpem9udGFsRG93blByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOwotc3RhdGljIHZvaWQgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOwotc3RhdGljIHZvaWQgSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7Ci12b2lkIGgyNjRic2RBZGRSZXNpZHVhbCh1OCAqZGF0YSwgaTMyICpyZXNpZHVhbCwgdTMyIGJsb2NrTnVtKTsKLQotc3RhdGljIHZvaWQgV3JpdGU0eDRUbzE2eDE2KHU4ICpkYXRhLCB1OCAqZGF0YTR4NCwgdTMyIGJsb2NrTnVtKTsKLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLXN0YXRpYyB1MzIgRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZShtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgdTMyIGF2YWlsYWJsZSwgbmVpZ2hib3VyX3QgKm5BLCBuZWlnaGJvdXJfdCAqbkIsIHUzMiBpbmRleCwKLSAgICBtYlN0b3JhZ2VfdCAqbk1iQSwgbWJTdG9yYWdlX3QgKm5NYkIpOwotCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZAotICAgICAgICAgIHJlc2lkdWFsIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUKLSAgICAgICAgICBzdG9yZWQgaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1OCAqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgd2lkdGgsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlRDsKLSAgICBPTVhSZXN1bHQgb214UmVzOwotCi0vKiBDb2RlICovCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChwdHIpOwotICAgIEFTU0VSVChoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KHBNYi0+bWJUeXBlKSA8IDQpOwotCi0gICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOwotICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7Ci0gICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiggKHB0ci0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KHBNYi0+bWJUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKyAoYXZhaWxhYmxlQTw8MSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSkgKTsKLSAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgIHJldHVybiBIQU5UUk9fTk9LOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAotICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUgc3RvcmVkIGluCi0gICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAnZGF0YScuIFRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoCi0gICAgICAgICAgYmxvY2sgaXMgc3RvcmVkIGluICdwTWInIHN0cnVjdHVyZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcHRyLCB1MzIgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHUzMiBibG9jaykKLXsKLQotLyogVmFyaWFibGVzICovCi0gICAgdTMyIG1vZGU7Ci0gICAgbmVpZ2hib3VyX3QgbmVpZ2hib3VyLCBuZWlnaGJvdXJCOwotICAgIG1iU3RvcmFnZV90ICpuTWIsICpuTWIyOwotICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVDLCBhdmFpbGFibGVEOwotCi0gICAgT01YUmVzdWx0IG9teFJlczsKLSAgICB1MzIgeCwgeTsKLSAgICB1OCAqbCwgKmEsICphbDsKLS8qIENvZGUgKi8KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKG1iTGF5ZXIpOwotICAgIEFTU0VSVChwdHIpOwotICAgIEFTU0VSVChwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdIDwgOSk7Ci0KLSAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9jayk7Ci0gICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKLSAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgbmVpZ2hib3VyQiA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKGJsb2NrKTsKLSAgICBuTWIyID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyQi5tYik7Ci0gICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYjIpOwotICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iMi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgbW9kZSA9IERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWJMYXllciwKLSAgICAgICAgKHUzMikoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKSwKLSAgICAgICAgJm5laWdoYm91ciwgJm5laWdoYm91ckIsIGJsb2NrLCBuTWIsIG5NYjIpOwotICAgIHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPSAodTgpbW9kZTsKLQotICAgIG5laWdoYm91ciA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKGJsb2NrKTsKLSAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOwotICAgIGF2YWlsYWJsZUMgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOwotICAgIGlmIChhdmFpbGFibGVDICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmxlQyA9IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRChibG9jayk7Ci0gICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKLSAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tdOwotICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrXTsKLQotICAgIGlmICh5ID09IDApCi0gICAgICAgIGEgPSBwdHIgLSB3aWR0aCArIHg7Ci0gICAgZWxzZQotICAgICAgICBhID0gZGF0YS0xNjsKLQotICAgIGlmICh4ID09IDApCi0gICAgICAgIGwgPSBwdHIgKyB5ICogd2lkdGggLTE7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbCA9IGRhdGEtMTsKLSAgICAgICAgd2lkdGggPSAxNjsKLSAgICB9Ci0KLSAgICBpZiAoeCA9PSAwKQotICAgICAgICBhbCA9IGwtd2lkdGg7Ci0gICAgZWxzZQotICAgICAgICBhbCA9IGEtMTsKLQotICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCggbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUE8PDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQzw8NikpICk7Ci0gICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKLSAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgY2hyb21hIHBpeGVscyBhcmUgc3RvcmVkIGluICdkYXRhJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpbWFnZV90ICppbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlRDsKLSAgICBPTVhSZXN1bHQgb214UmVzOwotICAgIHU4ICpwdHI7Ci0gICAgdTMyIHdpZHRoOwotCi0vKiBDb2RlICovCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKHByZWRNb2RlIDwgNCk7Ci0KLSAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpOwotICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQS0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQik7Ci0gICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJCLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJEKTsKLSAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkQtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlRCA9IEhBTlRST19GQUxTRTsKLQotICAgIHB0ciA9IGltYWdlLT5jYjsKLSAgICB3aWR0aCA9IGltYWdlLT53aWR0aCo4OwotCi0gICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KCAocHRyLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCAtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpKSApOwotICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7Ci0KLSAgICAvKiBhZHZhbmNlIHBvaW50ZXJzICovCi0gICAgZGF0YSArPSA2NDsKLSAgICBwdHIgPSBpbWFnZS0+Y3I7Ci0KLSAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgoIChwdHItMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoIC0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMikoYXZhaWxhYmxlQiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUE8PDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkpICk7Ci0gICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludHJhUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2Vzc2VzIG9uZSBpbnRyYSBtYWNyb2Jsb2NrLiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIHVzaW5nCi0gICAgICAgICAgc3BlY2lmaWVkIHByZWRpY3Rpb24gbW9kZS4gV3JpdGVzIHRoZSBmaW5hbCBtYWNyb2Jsb2NrCi0gICAgICAgICAgKHByZWRpY3Rpb24gKyByZXNpZHVhbCkgaW50byB0aGUgb3V0cHV0IGltYWdlIChpbWFnZSkKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICBtYkxheWVyICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KLSAgICAgICAgICBpbWFnZSAgICAgICAgIHBvaW50ZXIgdG8gb3V0cHV0IGltYWdlCi0gICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCi0gICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWQgIGZsYWcgc3BlY2lmeWluZyBpZiBuZWlnaGJvdXJpbmcgaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3MgYXJlIHVzZWQgaW4gaW50cmEgcHJlZGljdGlvbgotICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB3aGVyZSBvdXRwdXQgbWFjcm9ibG9jayB3aWxsIGJlIHN0b3JlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIGltYWdlICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBpbWFnZQotICAgICAgICAgIGRhdGEgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKLSAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIGludHJhIHByZWRpY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBoMjY0YnNkSW50cmFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAotICAgIGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0sIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwgdTggKmRhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgLyogcGVsQWJvdmUgYW5kIHBlbExlZnQgY29udGFpbiBzYW1wbGVzIGFib3ZlIGFuZCBsZWZ0IHRvIHRoZSBjdXJyZW50Ci0gICAgICogbWFjcm9ibG9jay4gQWJvdmUgYXJyYXkgY29udGFpbnMgYWxzbyBzYW1wbGUgYWJvdmUtbGVmdCB0byB0aGUgY3VycmVudAotICAgICAqIG1iIGFzIHdlbGwgYXMgNCBzYW1wbGVzIGFib3ZlLXJpZ2h0IHRvIHRoZSBjdXJyZW50IG1iIChsYXR0ZXIgb25seSBmb3IKLSAgICAgKiBsdW1hKSAqLwotICAgIC8qIGx1bUQgKyBsdW1CICsgbHVtQyArIGNiRCArIGNiQiArIGNyRCArIGNyQiAqLwotICAgIHU4IHBlbEFib3ZlWzEgKyAxNiArIDQgKyAxICsgOCArIDEgKyA4XTsKLSAgICAvKiBsdW1BICsgY2JBICsgY3JBICovCi0gICAgdTggcGVsTGVmdFsxNiArIDggKyA4XTsKLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOwotICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpICE9IFBSRURfTU9ERV9JTlRFUik7Ci0KLSAgICBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscyhpbWFnZSwgcGVsQWJvdmUsIHBlbExlZnQsIG1iTnVtKTsKLQotICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKHBNYiwgZGF0YSwgbWJMYXllci0+cmVzaWR1YWwubGV2ZWwsCi0gICAgICAgICAgICBwZWxBYm92ZSwgcGVsTGVmdCwgY29uc3RyYWluZWRJbnRyYVByZWQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKHBNYiwgZGF0YSwgbWJMYXllciwKLSAgICAgICAgICAgIHBlbEFib3ZlLCBwZWxMZWZ0LCBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihwTWIsIGRhdGEgKyAyNTYsCi0gICAgICAgICAgICBtYkxheWVyLT5yZXNpZHVhbC5sZXZlbCsxNiwgcGVsQWJvdmUgKyAyMSwgcGVsTGVmdCArIDE2LAotICAgICAgICAgICAgbWJMYXllci0+bWJQcmVkLmludHJhQ2hyb21hUHJlZE1vZGUsIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCi0gICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCi0gICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCi0gICAgICAgIHJldHVybiBIQU5UUk9fT0s7Ci0KLSAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGltYWdlLCBkYXRhKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEdldE5laWdoYm91clBlbHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEdldCBwaXhlbCB2YWx1ZXMgZnJvbSBuZWlnaGJvdXJpbmcgbWFjcm9ibG9ja3MgaW50byAnYWJvdmUnCi0gICAgICAgICAgYW5kICdsZWZ0JyBhcnJheXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2VfdCAqaW1hZ2UsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBtYk51bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgd2lkdGgsIHBpY1NpemU7Ci0gICAgdTggKnB0ciwgKnRtcDsKLSAgICB1MzIgcm93LCBjb2w7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0gICAgQVNTRVJUKG1iTnVtIDwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCk7Ci0KLSAgICBpZiAoIW1iTnVtKQotICAgICAgICByZXR1cm47Ci0KLSAgICB3aWR0aCA9IGltYWdlLT53aWR0aDsKLSAgICBwaWNTaXplID0gd2lkdGggKiBpbWFnZS0+aGVpZ2h0OwotICAgIHJvdyA9IG1iTnVtIC8gd2lkdGg7Ci0gICAgY29sID0gbWJOdW0gLSByb3cgKiB3aWR0aDsKLQotICAgIHdpZHRoICo9IDE2OwotICAgIHB0ciA9IGltYWdlLT5kYXRhICsgcm93ICogMTYgKiB3aWR0aCAgKyBjb2wgKiAxNjsKLQotICAgIC8qIG5vdGUgdGhhdCBsdW1hIHNhbXBsZXMgYWJvdmUtcmlnaHQgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRvIG5vdCBtYWtlCi0gICAgICogc2Vuc2Ugd2hlbiBjdXJyZW50IG1iIGlzIHRoZSByaWdodC1tb3N0IG1iIGluIGEgcm93LiBTYW1lIGFwcGxpZXMgdG8KLSAgICAgKiBzYW1wbGUgYWJvdmUtbGVmdCBpZiBjb2wgaXMgemVyby4gSG93ZXZlciwgdXNhZ2Ugb2YgcGVscyBpbiBwcmVkaWN0aW9uCi0gICAgICogaXMgY29udHJvbGxlZCBieSBuZWlnaGJvdXIgYXZhaWxhYmlsaXR5IGluZm9ybWF0aW9uIGluIGFjdHVhbCBwcmVkaWN0aW9uCi0gICAgICogcHJvY2VzcyAqLwotICAgIGlmIChyb3cpCi0gICAgewotICAgICAgICB0bXAgPSBwdHIgLSAod2lkdGggKyAxKTsKLSAgICAgICAgZm9yIChpID0gMjE7IGktLTspCi0gICAgICAgICAgICAqYWJvdmUrKyA9ICp0bXArKzsKLSAgICB9Ci0KLSAgICBpZiAoY29sKQotICAgIHsKLSAgICAgICAgcHRyLS07Ci0gICAgICAgIGZvciAoaSA9IDE2OyBpLS07IHB0cis9d2lkdGgpCi0gICAgICAgICAgICAqbGVmdCsrID0gKnB0cjsKLSAgICB9Ci0KLSAgICB3aWR0aCA+Pj0gMTsKLSAgICBwdHIgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemUgKiAyNTYgKyByb3cgKiA4ICogd2lkdGggICsgY29sICogODsKLQotICAgIGlmIChyb3cpCi0gICAgewotICAgICAgICB0bXAgPSBwdHIgLSAod2lkdGggKyAxKTsKLSAgICAgICAgZm9yIChpID0gOTsgaS0tOykKLSAgICAgICAgICAgICphYm92ZSsrID0gKnRtcCsrOwotICAgICAgICB0bXAgKz0gKHBpY1NpemUgKiA2NCkgLSA5OwotICAgICAgICBmb3IgKGkgPSA5OyBpLS07KQotICAgICAgICAgICAgKmFib3ZlKysgPSAqdG1wKys7Ci0gICAgfQotCi0gICAgaWYgKGNvbCkKLSAgICB7Ci0gICAgICAgIHB0ci0tOwotICAgICAgICBmb3IgKGkgPSA4OyBpLS07IHB0cis9d2lkdGgpCi0gICAgICAgICAgICAqbGVmdCsrID0gKnB0cjsKLSAgICAgICAgcHRyICs9IChwaWNTaXplICogNjQpIC0gOCAqIHdpZHRoOwotICAgICAgICBmb3IgKGkgPSA4OyBpLS07IHB0cis9d2lkdGgpCi0gICAgICAgICAgICAqbGVmdCsrID0gKnB0cjsKLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmExNngxNlByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlIGZvciBsdW1hIHBpeGVscyBhbmQgYWRkCi0gICAgICAgICAgcmVzaWR1YWwgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGx1bWEgcGl4ZWxzIGFyZQotICAgICAgICAgIHN0b3JlZCBpbiBtYWNyb2Jsb2NrIGFycmF5ICdkYXRhJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQocmVzaWR1YWwpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotICAgIEFTU0VSVChoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KHBNYi0+bWJUeXBlKSA8IDQpOwotCi0gICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOwotICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7Ci0gICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBzd2l0Y2goaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkpCi0gICAgewotICAgICAgICBjYXNlIDA6IC8qIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCi0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTogLyogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLwotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbihkYXRhLCBsZWZ0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjogLyogSW50cmFfMTZ4MTZfREMgKi8KLSAgICAgICAgICAgIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCwgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDM6IEludHJhXzE2eDE2X1BsYW5lICovCi0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgSW50cmExNngxNlBsYW5lUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxLCBsZWZ0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBhZGQgcmVzaWR1YWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsKGRhdGEsIHJlc2lkdWFsW2ldLCBpKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCi0gICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGx1bWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4KLSAgICAgICAgICBtYWNyb2Jsb2NrIGFycmF5ICdkYXRhJy4gVGhlIGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2gKLSAgICAgICAgICBibG9jayBpcyBzdG9yZWQgaW4gJ3BNYicgc3RydWN0dXJlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLCB1OCAqYWJvdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBibG9jazsKLSAgICB1MzIgbW9kZTsKLSAgICBuZWlnaGJvdXJfdCBuZWlnaGJvdXIsIG5laWdoYm91ckI7Ci0gICAgbWJTdG9yYWdlX3QgKm5NYiwgKm5NYjI7Ci0gICAgdTggYVsxICsgNCArIDRdLCBsWzEgKyA0XTsKLSAgICB1MzIgZGF0YTR4NFs0XTsKLSAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlQywgYXZhaWxhYmxlRDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChtYkxheWVyKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDE2OyBibG9jaysrKQotICAgIHsKLQotICAgICAgICBBU1NFUlQocE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA8IDkpOwotCi0gICAgICAgIG5laWdoYm91ciA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKGJsb2NrKTsKLSAgICAgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKLSAgICAgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7Ci0gICAgICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG5laWdoYm91ckIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9jayk7Ci0gICAgICAgIG5NYjIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXJCLm1iKTsKLSAgICAgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYjIpOwotICAgICAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWIyLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9kZSA9IERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWJMYXllciwKLSAgICAgICAgICAgICh1MzIpKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQiksCi0gICAgICAgICAgICAmbmVpZ2hib3VyLCAmbmVpZ2hib3VyQiwgYmxvY2ssIG5NYiwgbk1iMik7Ci0gICAgICAgIHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPSAodTgpbW9kZTsKLQotICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyhibG9jayk7Ci0gICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgICAgIGF2YWlsYWJsZUMgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOwotICAgICAgICBpZiAoYXZhaWxhYmxlQyAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZUMgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRChibG9jayk7Ci0gICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOwotICAgICAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBHZXQ0eDROZWlnaGJvdXJQZWxzKGEsIGwsIGRhdGEsIGFib3ZlLCBsZWZ0LCBibG9jayk7Ci0KLSAgICAgICAgc3dpdGNoKG1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDogLyogSW50cmFfNHg0X1ZlcnRpY2FsICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IC8qIEludHJhXzR4NF9Ib3Jpem9udGFsICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGwgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogLyogSW50cmFfNHg0X0RDICovCi0gICAgICAgICAgICAgICAgSW50cmE0eDREY1ByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSwgbCArIDEsCi0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOiAvKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVDKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGFbNl0gPSBhWzddID0gYVs4XSA9IGFbNF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6IC8qIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSwgbCArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA1OiAvKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjogLyogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNzogLyogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhWzVdID0gYVs2XSA9IGFbN10gPSBhWzhdID0gYVs0XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogLyogY2FzZSA4IEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgbCArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgV3JpdGU0eDRUbzE2eDE2KGRhdGEsICh1OCopZGF0YTR4NCwgYmxvY2spOwotICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwoZGF0YSwgbWJMYXllci0+cmVzaWR1YWwubGV2ZWxbYmxvY2tdLCBibG9jayk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYVByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCi0gICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGNocm9tYSBwaXhlbHMgYXJlIHN0b3JlZCBpbiAnZGF0YScuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCi0gICAgICAgICAgICAgICAgICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBwcmVkTW9kZSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBjb21wLCBibG9jazsKLSAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlRDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChyZXNpZHVhbCk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0gICAgQVNTRVJUKHByZWRNb2RlIDwgNCk7Ci0KLSAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpOwotICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQS0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQik7Ci0gICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJCLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJEKTsKLSAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkQtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlRCA9IEhBTlRST19GQUxTRTsKLQotICAgIGZvciAoY29tcCA9IDAsIGJsb2NrID0gMTY7IGNvbXAgPCAyOyBjb21wKyspCi0gICAgewotICAgICAgICBzd2l0Y2gocHJlZE1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDogLyogSW50cmFfQ2hyb21hX0RDICovCi0gICAgICAgICAgICAgICAgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCwgYXZhaWxhYmxlQSwKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTogLyogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKGRhdGEsIGxlZnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6IC8qIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMzogSW50cmFfQ2hyb21hX1BsYW5lICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYmxvY2srKykKLSAgICAgICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbChkYXRhLCByZXNpZHVhbFtpXSwgYmxvY2spOwotCi0gICAgICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgKi8KLSAgICAgICAgZGF0YSArPSA2NDsKLSAgICAgICAgYWJvdmUgKz0gOTsKLSAgICAgICAgbGVmdCArPSA4OwotICAgICAgICByZXNpZHVhbCArPSA0OwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEFkZFJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBBZGQgcmVzaWR1YWwgb2YgYSBibG9jayBpbnRvIHByZWRpY3Rpb24gaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCi0gICAgICAgICAgVGhlIHJlc3VsdCAocmVzaWR1YWwgKyBwcmVkaWN0aW9uKSBpcyBzdG9yZWQgaW4gJ2RhdGEnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX09NWERMCi12b2lkIGgyNjRic2RBZGRSZXNpZHVhbCh1OCAqZGF0YSwgaTMyICpyZXNpZHVhbCwgdTMyIGJsb2NrTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiB4LCB5OwotICAgIHUzMiB3aWR0aDsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKLSAgICB1OCAqdG1wOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChyZXNpZHVhbCk7Ci0gICAgQVNTRVJUKGJsb2NrTnVtIDwgMTYgKyA0ICsgNCk7Ci0KLSAgICBpZiAoSVNfUkVTSURVQUxfRU1QVFkocmVzaWR1YWwpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBSQU5HRV9DSEVDS19BUlJBWShyZXNpZHVhbCwgLTUxMiwgNTExLCAxNik7Ci0KLSAgICBpZiAoYmxvY2tOdW0gPCAxNikKLSAgICB7Ci0gICAgICAgIHdpZHRoID0gMTY7Ci0gICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKLSAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tOdW1dOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB3aWR0aCA9IDg7Ci0gICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtICYgMHgzXTsKLSAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tOdW0gJiAweDNdOwotICAgIH0KLQotICAgIHRtcCA9IGRhdGEgKyB5KndpZHRoICsgeDsKLSAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCi0gICAgewotICAgICAgICB0bXAxID0gKnJlc2lkdWFsKys7Ci0gICAgICAgIHRtcDIgPSB0bXBbMF07Ci0gICAgICAgIHRtcDMgPSAqcmVzaWR1YWwrKzsKLSAgICAgICAgdG1wNCA9IHRtcFsxXTsKLQotICAgICAgICB0bXBbMF0gPSBjbHBbdG1wMSArIHRtcDJdOwotCi0gICAgICAgIHRtcDEgPSAqcmVzaWR1YWwrKzsKLSAgICAgICAgdG1wMiA9IHRtcFsyXTsKLQotICAgICAgICB0bXBbMV0gPSBjbHBbdG1wMyArIHRtcDRdOwotCi0gICAgICAgIHRtcDMgPSAqcmVzaWR1YWwrKzsKLSAgICAgICAgdG1wNCA9IHRtcFszXTsKLQotICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKLSAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07Ci0gICAgICAgIHRtcFsyXSA9ICh1OCl0bXAxOwotICAgICAgICB0bXBbM10gPSAodTgpdG1wMzsKLQotICAgICAgICB0bXAgKz0gd2lkdGg7Ci0gICAgfQotCi19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiB2ZXJ0aWNhbCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkYXRhKysgPSBhYm92ZVtqXTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBob3Jpem9udGFsIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgKmRhdGErKyA9IGxlZnRbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IERDIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKLSAgICB1MzIgYXZhaWxhYmxlQikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICB0bXAgKz0gYWJvdmVbaV0gKyBsZWZ0W2ldOwotICAgICAgICB0bXAgPSAodG1wICsgMTYpID4+IDU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUEpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgIHRtcCArPSBsZWZ0W2ldOwotICAgICAgICB0bXAgPSAodG1wICsgOCkgPj4gNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgdG1wICs9IGFib3ZlW2ldOwotICAgICAgICB0bXAgPSAodG1wICsgOCkgPj4gNDsKLSAgICB9Ci0gICAgLyogbmVpdGhlciBBIG5vciBCIGF2YWlsYWJsZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcCA9IDEyODsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgICBkYXRhW2ldID0gKHU4KXRtcDsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgcGxhbmUgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGksIGo7Ci0gICAgaTMyIGEsIGIsIGM7Ci0gICAgaTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgYSA9IDE2ICogKGFib3ZlWzE1XSArIGxlZnRbMTVdKTsKLQotICAgIGZvciAoaSA9IDAsIGIgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICBiICs9IChpICsgMSkgKiAoYWJvdmVbOCtpXSAtIGFib3ZlWzYtaV0pOwotICAgIGIgPSAoNSAqIGIgKyAzMikgPj4gNjsKLQotICAgIGZvciAoaSA9IDAsIGMgPSAwOyBpIDwgNzsgaSsrKQotICAgICAgICBjICs9IChpICsgMSkgKiAobGVmdFs4K2ldIC0gbGVmdFs2LWldKTsKLSAgICAvKiBwWy0xLC0xXSBoYXMgdG8gYmUgYWNjZXNzZWQgdGhyb3VnaCBhYm92ZSBwb2ludGVyICovCi0gICAgYyArPSAoaSArIDEpICogKGxlZnRbOCtpXSAtIGFib3ZlWy0xXSk7Ci0gICAgYyA9ICg1ICogYyArIDMyKSA+PiA2OwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gKGEgKyBiICogKGogLSA3KSArIGMgKiAoaSAtIDcpICsgMTYpID4+IDU7Ci0gICAgICAgICAgICBkYXRhW2kqMTYral0gPSAodTgpQ0xJUDEodG1wKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhQ2hyb21hRGNQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBEQyBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBhdmFpbGFibGVBLAotICAgIHUzMiBhdmFpbGFibGVCKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiB0bXAxLCB0bXAyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICAvKiB5ID0gMC4uMyAqLwotICAgIGlmIChhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICB0bXAxID0gYWJvdmVbMF0gKyBhYm92ZVsxXSArIGFib3ZlWzJdICsgYWJvdmVbM10gKwotICAgICAgICAgICAgICBsZWZ0WzBdICsgbGVmdFsxXSArIGxlZnRbMl0gKyBsZWZ0WzNdOwotICAgICAgICB0bXAxID0gKHRtcDEgKyA0KSA+PiAzOwotICAgICAgICB0bXAyID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgICAgICB0bXAyID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmxlQSkKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAobGVmdFswXSArIGxlZnRbMV0gKyBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7Ci0gICAgICAgIHRtcDIgPSB0bXAxOwotICAgIH0KLSAgICAvKiBuZWl0aGVyIEEgbm9yIEIgYXZhaWxhYmxlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wMSA9IHRtcDIgPSAxMjg7Ci0gICAgfQotCi0gICAgQVNTRVJUKHRtcDEgPCAyNTYgJiYgdG1wMiA8IDI1Nik7Ci0gICAgZm9yIChpID0gNDsgaS0tOykKLSAgICB7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgIH0KLQotICAgIC8qIHkgPSA0Li4uNyAqLwotICAgIGlmIChhdmFpbGFibGVBKQotICAgIHsKLSAgICAgICAgdG1wMSA9IChsZWZ0WzRdICsgbGVmdFs1XSArIGxlZnRbNl0gKyBsZWZ0WzddICsgMikgPj4gMjsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDIgPSBhYm92ZVs0XSArIGFib3ZlWzVdICsgYWJvdmVbNl0gKyBhYm92ZVs3XSArCi0gICAgICAgICAgICAgICAgICAgbGVmdFs0XSArIGxlZnRbNV0gKyBsZWZ0WzZdICsgbGVmdFs3XTsKLSAgICAgICAgICAgIHRtcDIgPSAodG1wMiArIDQpID4+IDM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdG1wMiA9IHRtcDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICB0bXAxID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICAgICAgdG1wMiA9IChhYm92ZVs0XSArIGFib3ZlWzVdICsgYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcDEgPSB0bXAyID0gMTI4OwotICAgIH0KLQotICAgIEFTU0VSVCh0bXAxIDwgMjU2ICYmIHRtcDIgPCAyNTYpOwotICAgIGZvciAoaSA9IDQ7IGktLTspCi0gICAgewotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSBjaHJvbWEgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBmb3IgKGkgPSA4OyBpLS07KQotICAgIHsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQrKzsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSBjaHJvbWEgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotCi0gICAgZm9yIChpID0gODsgaS0tO2RhdGErKy8qYWJvdmUtPTgqLykKLSAgICB7Ci0gICAgICAgIGRhdGFbMF0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbOF0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbMTZdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzI0XSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVszMl0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbNDBdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzQ4XSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVs1Nl0gPSAqYWJvdmUrKzsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSBjaHJvbWEgcGxhbmUgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIGkzMiBhLCBiLCBjOwotICAgIGkzMiB0bXA7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBhID0gMTYgKiAoYWJvdmVbN10gKyBsZWZ0WzddKTsKLQotICAgIGIgPSAoYWJvdmVbNF0gLSBhYm92ZVsyXSkgKyAyICogKGFib3ZlWzVdIC0gYWJvdmVbMV0pCi0gICAgICAgICsgMyAqIChhYm92ZVs2XSAtIGFib3ZlWzBdKSArIDQgKiAoYWJvdmVbN10gLSBhYm92ZVstMV0pOwotICAgIGIgPSAoMTcgKiBiICsgMTYpID4+IDU7Ci0KLSAgICAvKiBwWy0xLC0xXSBoYXMgdG8gYmUgYWNjZXNzZWQgdGhyb3VnaCBhYm92ZSBwb2ludGVyICovCi0gICAgYyA9IChsZWZ0WzRdIC0gbGVmdFsyXSkgKyAyICogKGxlZnRbNV0gLSBsZWZ0WzFdKQotICAgICAgICArIDMgKiAobGVmdFs2XSAtIGxlZnRbMF0pICsgNCAqIChsZWZ0WzddIC0gYWJvdmVbLTFdKTsKLSAgICBjID0gKDE3ICogYyArIDE2KSA+PiA1OwotCi0gICAgLyphICs9IDE2OyovCi0gICAgYSA9IGEgLSAzICogYyArIDE2OwotICAgIGZvciAoaSA9IDg7IGktLTsgYSArPSBjKQotICAgIHsKLSAgICAgICAgdG1wID0gKGEgLSAzICogYik7Ci0gICAgICAgICpkYXRhKysgPSBjbHBbdG1wPj41XTsKLSAgICAgICAgdG1wICs9IGI7Ci0gICAgICAgICpkYXRhKysgPSBjbHBbdG1wPj41XTsKLSAgICAgICAgdG1wICs9IGI7Ci0gICAgICAgICpkYXRhKysgPSBjbHBbdG1wPj41XTsKLSAgICAgICAgdG1wICs9IGI7Ci0gICAgICAgICpkYXRhKysgPSBjbHBbdG1wPj41XTsKLSAgICAgICAgdG1wICs9IGI7Ci0gICAgICAgICpkYXRhKysgPSBjbHBbdG1wPj41XTsKLSAgICAgICAgdG1wICs9IGI7Ci0gICAgICAgICpkYXRhKysgPSBjbHBbdG1wPj41XTsKLSAgICAgICAgdG1wICs9IGI7Ci0gICAgICAgICpkYXRhKysgPSBjbHBbdG1wPj41XTsKLSAgICAgICAgdG1wICs9IGI7Ci0gICAgICAgICpkYXRhKysgPSBjbHBbdG1wPj41XTsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXQ0eDROZWlnaGJvdXJQZWxzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBHZXQgbmVpZ2hib3VyaW5nIHBpeGVscyBvZiBhIDR4NCBibG9jayBpbnRvICdhJyBhbmQgJ2wnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEdldDR4NE5laWdoYm91clBlbHModTggKmEsIHU4ICpsLCB1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwKLSAgICB1MzIgYmxvY2tOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHgsIHk7Ci0gICAgdTggdDEsIHQyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYSk7Ci0gICAgQVNTRVJUKGwpOwotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLSAgICBBU1NFUlQoYmxvY2tOdW0gPCAxNik7Ci0KLSAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bV07Ci0gICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tOdW1dOwotCi0gICAgLyogQSBhbmQgRCAqLwotICAgIGlmICh4ID09IDApCi0gICAgewotICAgICAgICB0MSA9IGxlZnRbeSAgICBdOwotICAgICAgICB0MiA9IGxlZnRbeSArIDFdOwotICAgICAgICBsWzFdID0gdDE7Ci0gICAgICAgIGxbMl0gPSB0MjsKLSAgICAgICAgdDEgPSBsZWZ0W3kgKyAyXTsKLSAgICAgICAgdDIgPSBsZWZ0W3kgKyAzXTsKLSAgICAgICAgbFszXSA9IHQxOwotICAgICAgICBsWzRdID0gdDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHQxID0gZGF0YVt5ICogMTYgKyB4IC0gMSAgICAgXTsKLSAgICAgICAgdDIgPSBkYXRhW3kgKiAxNiArIHggLSAxICsgMTZdOwotICAgICAgICBsWzFdID0gdDE7Ci0gICAgICAgIGxbMl0gPSB0MjsKLSAgICAgICAgdDEgPSBkYXRhW3kgKiAxNiArIHggLSAxICsgMzJdOwotICAgICAgICB0MiA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyA0OF07Ci0gICAgICAgIGxbM10gPSB0MTsKLSAgICAgICAgbFs0XSA9IHQyOwotICAgIH0KLQotICAgIC8qIEIsIEMgYW5kIEQgKi8KLSAgICBpZiAoeSA9PSAwKQotICAgIHsKLSAgICAgICAgdDEgPSBhYm92ZVt4ICAgIF07Ci0gICAgICAgIHQyID0gYWJvdmVbeCAgICBdOwotICAgICAgICBsWzBdID0gdDE7Ci0gICAgICAgIGFbMF0gPSB0MjsKLSAgICAgICAgdDEgPSBhYm92ZVt4ICsgMV07Ci0gICAgICAgIHQyID0gYWJvdmVbeCArIDJdOwotICAgICAgICBhWzFdID0gdDE7Ci0gICAgICAgIGFbMl0gPSB0MjsKLSAgICAgICAgdDEgPSBhYm92ZVt4ICsgM107Ci0gICAgICAgIHQyID0gYWJvdmVbeCArIDRdOwotICAgICAgICBhWzNdID0gdDE7Ci0gICAgICAgIGFbNF0gPSB0MjsKLSAgICAgICAgdDEgPSBhYm92ZVt4ICsgNV07Ci0gICAgICAgIHQyID0gYWJvdmVbeCArIDZdOwotICAgICAgICBhWzVdID0gdDE7Ci0gICAgICAgIGFbNl0gPSB0MjsKLSAgICAgICAgdDEgPSBhYm92ZVt4ICsgN107Ci0gICAgICAgIHQyID0gYWJvdmVbeCArIDhdOwotICAgICAgICBhWzddID0gdDE7Ci0gICAgICAgIGFbOF0gPSB0MjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggICAgXTsKLSAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAxXTsKLSAgICAgICAgYVsxXSA9IHQxOwotICAgICAgICBhWzJdID0gdDI7Ci0gICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgMl07Ci0gICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgM107Ci0gICAgICAgIGFbM10gPSB0MTsKLSAgICAgICAgYVs0XSA9IHQyOwotICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDRdOwotICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDVdOwotICAgICAgICBhWzVdID0gdDE7Ci0gICAgICAgIGFbNl0gPSB0MjsKLSAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyA2XTsKLSAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyA3XTsKLSAgICAgICAgYVs3XSA9IHQxOwotICAgICAgICBhWzhdID0gdDI7Ci0KLSAgICAgICAgaWYgKHggPT0gMCkKLSAgICAgICAgICAgIGxbMF0gPSBhWzBdID0gbGVmdFt5LTFdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsWzBdID0gYVswXSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCAtIDFdOwotICAgIH0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCB2ZXJ0aWNhbCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1OCB0MSwgdDI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotCi0gICAgdDEgPSBhYm92ZVswXTsKLSAgICB0MiA9IGFib3ZlWzFdOwotICAgIGRhdGFbMF0gPSBkYXRhWzRdID0gZGF0YVs4XSA9IGRhdGFbMTJdID0gdDE7Ci0gICAgZGF0YVsxXSA9IGRhdGFbNV0gPSBkYXRhWzldID0gZGF0YVsxM10gPSB0MjsKLSAgICB0MSA9IGFib3ZlWzJdOwotICAgIHQyID0gYWJvdmVbM107Ci0gICAgZGF0YVsyXSA9IGRhdGFbNl0gPSBkYXRhWzEwXSA9IGRhdGFbMTRdID0gdDE7Ci0gICAgZGF0YVszXSA9IGRhdGFbN10gPSBkYXRhWzExXSA9IGRhdGFbMTVdID0gdDI7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBob3Jpem9udGFsIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1OCB0MSwgdDI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICB0MSA9IGxlZnRbMF07Ci0gICAgdDIgPSBsZWZ0WzFdOwotICAgIGRhdGFbMF0gPSBkYXRhWzFdID0gZGF0YVsyXSA9IGRhdGFbM10gPSB0MTsKLSAgICBkYXRhWzRdID0gZGF0YVs1XSA9IGRhdGFbNl0gPSBkYXRhWzddID0gdDI7Ci0gICAgdDEgPSBsZWZ0WzJdOwotICAgIHQyID0gbGVmdFszXTsKLSAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPSB0MTsKLSAgICBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9IHQyOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDREY1ByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IERDIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NERjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCi0gICAgdTMyIGF2YWlsYWJsZUIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLSAgICB1OCB0MSwgdDIsIHQzLCB0NDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKLSAgICB7Ci0gICAgICAgIHQxID0gYWJvdmVbMF07IHQyID0gYWJvdmVbMV07IHQzID0gYWJvdmVbMl07IHQ0ID0gYWJvdmVbM107Ci0gICAgICAgIHRtcCA9IHQxICsgdDIgKyB0MyArIHQ0OwotICAgICAgICB0MSA9IGxlZnRbMF07IHQyID0gbGVmdFsxXTsgdDMgPSBsZWZ0WzJdOyB0NCA9IGxlZnRbM107Ci0gICAgICAgIHRtcCArPSB0MSArIHQyICsgdDMgKyB0NDsKLSAgICAgICAgdG1wID0gKHRtcCArIDQpID4+IDM7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUEpCi0gICAgewotICAgICAgICB0MSA9IGxlZnRbMF07IHQyID0gbGVmdFsxXTsgdDMgPSBsZWZ0WzJdOyB0NCA9IGxlZnRbM107Ci0gICAgICAgIHRtcCA9ICh0MSArIHQyICsgdDMgKyB0NCArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICB0MSA9IGFib3ZlWzBdOyB0MiA9IGFib3ZlWzFdOyB0MyA9IGFib3ZlWzJdOyB0NCA9IGFib3ZlWzNdOwotICAgICAgICB0bXAgPSAodDEgKyB0MiArIHQzICsgdDQgKyAyKSA+PiAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSAxMjg7Ci0gICAgfQotCi0gICAgQVNTRVJUKHRtcCA8IDI1Nik7Ci0gICAgZGF0YVswXSA9IGRhdGFbMV0gPSBkYXRhWzJdID0gZGF0YVszXSA9Ci0gICAgZGF0YVs0XSA9IGRhdGFbNV0gPSBkYXRhWzZdID0gZGF0YVs3XSA9Ci0gICAgZGF0YVs4XSA9IGRhdGFbOV0gPSBkYXRhWzEwXSA9IGRhdGFbMTFdID0KLSAgICBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9ICh1OCl0bXA7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBkaWFnb25hbCBkb3duLWxlZnQgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotCi0gICAgZGF0YVsgMF0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgMV0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNF0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgMl0gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNV0gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOF0gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgM10gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNl0gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOV0gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMl0gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgN10gPSAoYWJvdmVbNF0gKyAyICogYWJvdmVbNV0gKyBhYm92ZVs2XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMF0gPSAoYWJvdmVbNF0gKyAyICogYWJvdmVbNV0gKyBhYm92ZVs2XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxM10gPSAoYWJvdmVbNF0gKyAyICogYWJvdmVbNV0gKyBhYm92ZVs2XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMV0gPSAoYWJvdmVbNV0gKyAyICogYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNF0gPSAoYWJvdmVbNV0gKyAyICogYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNV0gPSAoYWJvdmVbNl0gKyAzICogYWJvdmVbN10gKyAyKSA+PiAyOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGRpYWdvbmFsIGRvd24tcmlnaHQgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZGF0YVsgMF0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNV0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMF0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNV0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgMV0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDZdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKLSAgICBkYXRhWzExXSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgMl0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgN10gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgM10gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNF0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDldID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKLSAgICBkYXRhWzE0XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOF0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxM10gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMl0gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgdmVydGljYWwgcmlnaHQgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBkYXRhWyAwXSA9IChhYm92ZVstMV0gKyBhYm92ZVswXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgOV0gPSAoYWJvdmVbLTFdICsgYWJvdmVbMF0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDVdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKLSAgICBkYXRhWzE0XSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNF0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxM10gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgMV0gPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMF0gPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgNl0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNV0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgMl0gPSAoYWJvdmVbMV0gKyBhYm92ZVsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMV0gPSAoYWJvdmVbMV0gKyBhYm92ZVsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgN10gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgM10gPSAoYWJvdmVbMl0gKyBhYm92ZVszXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgOF0gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzBdICsgbGVmdFstMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTJdID0gKGxlZnRbMl0gKyAyICogbGVmdFsxXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRIb3Jpem9udGFsRG93blByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGhvcml6b250YWwgZG93biBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDRIb3Jpem9udGFsRG93blByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBkYXRhWyAwXSA9IChsZWZ0Wy0xXSArIGxlZnRbMF0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDZdID0gKGxlZnRbLTFdICsgbGVmdFswXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgNV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTFdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKLSAgICBkYXRhWyA0XSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMF0gPSAobGVmdFswXSArIGxlZnRbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDldID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTVdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDhdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWzE0XSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsxM10gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMl0gPSAobGVmdFsyXSArIGxlZnRbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbIDFdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDddID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbLTFdICsgMikgPj4gMjsKLSAgICBkYXRhWyAzXSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzBdICsgMikgPj4gMjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFZlcnRpY2FsTGVmdFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHZlcnRpY2FsIGxlZnQgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0KLSAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKLSAgICBkYXRhWyAxXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWyAyXSA9IChhYm92ZVsyXSArIGFib3ZlWzNdICsgMSkgPj4gMTsKLSAgICBkYXRhWyAzXSA9IChhYm92ZVszXSArIGFib3ZlWzRdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA0XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKLSAgICBkYXRhWyA1XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyA2XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKLSAgICBkYXRhWyA3XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKLSAgICBkYXRhWyA4XSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA5XSA9IChhYm92ZVsyXSArIGFib3ZlWzNdICsgMSkgPj4gMTsKLSAgICBkYXRhWzEwXSA9IChhYm92ZVszXSArIGFib3ZlWzRdICsgMSkgPj4gMTsKLSAgICBkYXRhWzExXSA9IChhYm92ZVs0XSArIGFib3ZlWzVdICsgMSkgPj4gMTsKLSAgICBkYXRhWzEyXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICBkYXRhWzEzXSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKLSAgICBkYXRhWzE0XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKLSAgICBkYXRhWzE1XSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgaG9yaXpvbnRhbCB1cCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBkYXRhWyAwXSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgMV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgMl0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDNdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDRdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA1XSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyA2XSA9IChsZWZ0WzJdICsgbGVmdFszXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgN10gPSAobGVmdFsyXSArIDMgKiBsZWZ0WzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyA4XSA9IChsZWZ0WzJdICsgbGVmdFszXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgOV0gPSAobGVmdFsyXSArIDMgKiBsZWZ0WzNdICsgMikgPj4gMjsKLSAgICBkYXRhWzEwXSA9IGxlZnRbM107Ci0gICAgZGF0YVsxMV0gPSBsZWZ0WzNdOwotICAgIGRhdGFbMTJdID0gbGVmdFszXTsKLSAgICBkYXRhWzEzXSA9IGxlZnRbM107Ci0gICAgZGF0YVsxNF0gPSBsZWZ0WzNdOwotICAgIGRhdGFbMTVdID0gbGVmdFszXTsKLQotfQotCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFdyaXRlNHg0VG8xNngxNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgV3JpdGUgYSA0eDQgYmxvY2sgKGRhdGE0eDQpIGludG8gY29ycmVjdCBwb3NpdGlvbgotICAgICAgICAgIGluIDE2eDE2IG1hY3JvYmxvY2sgKGRhdGEpLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIFdyaXRlNHg0VG8xNngxNih1OCAqZGF0YSwgdTggKmRhdGE0eDQsIHUzMiBibG9ja051bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgeCwgeTsKLSAgICB1MzIgKmluMzIsICpvdXQzMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChkYXRhNHg0KTsKLSAgICBBU1NFUlQoYmxvY2tOdW0gPCAxNik7Ci0KLSAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bV07Ci0gICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tOdW1dOwotCi0gICAgZGF0YSArPSB5KjE2K3g7Ci0KLSAgICBBU1NFUlQoKCh1MzIpZGF0YSYweDMpID09IDApOwotCi0gICAgLypsaW50IC0tZSg4MjYpICovCi0gICAgb3V0MzIgPSAodTMyICopZGF0YTsKLSAgICAvKmxpbnQgLS1lKDgyNikgKi8KLSAgICBpbjMyID0gKHUzMiAqKWRhdGE0eDQ7Ci0KLSAgICBvdXQzMlswXSA9ICppbjMyKys7Ci0gICAgb3V0MzJbNF0gPSAqaW4zMisrOwotICAgIG91dDMyWzhdID0gKmluMzIrKzsKLSAgICBvdXQzMlsxMl0gPSAqaW4zMisrOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERldGVybWluZUludHJhNHg0UHJlZE1vZGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgb2YgYSBibG9jayBiYXNlZCBvbiB0aGUKLSAgICAgICAgICBuZWlnaGJvdXJpbmcgbWFjcm9ibG9ja3MgYW5kIGluZm9ybWF0aW9uIHBhcnNlZCBmcm9tIHN0cmVhbS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIHUzMiBhdmFpbGFibGUsIG5laWdoYm91cl90ICpuQSwgbmVpZ2hib3VyX3QgKm5CLCB1MzIgaW5kZXgsCi0gICAgbWJTdG9yYWdlX3QgKm5NYkEsIG1iU3RvcmFnZV90ICpuTWJCKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBtb2RlMSwgbW9kZTI7Ci0gICAgbWJTdG9yYWdlX3QgKnBNYjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYkxheWVyKTsKLQotICAgIC8qIGRjIG9ubHkgcHJlZGljdGlvbj8gKi8KLSAgICBpZiAoIWF2YWlsYWJsZSkKLSAgICAgICAgbW9kZTEgPSAyOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBNYiA9IG5NYkE7Ci0gICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTR4NCkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kZTEgPSBwTWItPmludHJhNHg0UHJlZE1vZGVbbkEtPmluZGV4XTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtb2RlMSA9IDI7Ci0KLSAgICAgICAgcE1iID0gbk1iQjsKLSAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlMiA9IHBNYi0+aW50cmE0eDRQcmVkTW9kZVtuQi0+aW5kZXhdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1vZGUyID0gMjsKLQotICAgICAgICBtb2RlMSA9IE1JTihtb2RlMSwgbW9kZTIpOwotICAgIH0KLQotICAgIGlmICghcE1iTGF5ZXItPm1iUHJlZC5wcmV2SW50cmE0eDRQcmVkTW9kZUZsYWdbaW5kZXhdKQotICAgIHsKLSAgICAgICAgaWYgKHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF0gPCBtb2RlMSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kZTEgPSBwTWJMYXllci0+bWJQcmVkLnJlbUludHJhNHg0UHJlZE1vZGVbaW5kZXhdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbW9kZTEgPSBwTWJMYXllci0+bWJQcmVkLnJlbUludHJhNHg0UHJlZE1vZGVbaW5kZXhdICsgMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihtb2RlMSk7Ci19Ci0KLQotLypsaW50ICtlNzAyICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NTJiZDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19JTlRSQV9QUkVESUNUSU9OX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLXUzMiBoMjY0YnNkSW50cmFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAotICAgIGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0sIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwgdTggKmRhdGEpOwotCi11MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLXUzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKLSAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOwotCi11MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAotICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBwcmVkTW9kZSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLQotdm9pZCBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscyhpbWFnZV90ICppbWFnZSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIG1iTnVtKTsKLQotI2Vsc2UKLQotdTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpwSW1hZ2UsIHUzMiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwgdTMyIGJsb2NrKTsKLQotdTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTggKnBJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgd2lkdGgsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0KLXUzMiBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpbWFnZV90ICppbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0KLSNlbmRpZgotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19JTlRSQV9QUkVESUNUSU9OX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiM2U3ZjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIKLSAgICAgICAgICBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUKLSAgICAgICAgICBoMjY0YnNkTnVtTWJQYXJ0Ci0gICAgICAgICAgaDI2NGJzZE51bVN1Yk1iUGFydAotICAgICAgICAgIERlY29kZU1iUHJlZAotICAgICAgICAgIERlY29kZVN1Yk1iUHJlZAotICAgICAgICAgIERlY29kZVJlc2lkdWFsCi0gICAgICAgICAgRGV0ZXJtaW5lTmMKLSAgICAgICAgICBDYnBJbnRyYTE2eDE2Ci0gICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNgotICAgICAgICAgIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrCi0gICAgICAgICAgUHJvY2Vzc1Jlc2lkdWFsCi0gICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jYXZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgiCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIEgyNjRERUNfT01YREwKLXN0YXRpYyBjb25zdCB1MzIgY2hyb21hSW5kZXhbOF0gPSB7IDI1NiwgMjYwLCAyODgsIDI5MiwgMzIwLCAzMjQsIDM1MiwgMzU2IH07Ci1zdGF0aWMgY29uc3QgdTMyIGx1bWFJbmRleFsxNl0gPSB7ICAgMCwgICA0LCAgNjQsICA2OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgMTIsICA3MiwgIDc2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDEzMiwgMTkyLCAxOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNiwgMTQwLCAyMDAsIDIwNCB9OwotI2VuZGlmCi0vKiBtYXBwaW5nIG9mIGRjIGNvZWZmaWNpZW50cyBhcnJheSB0byBsdW1hIGJsb2NrcyAqLwotc3RhdGljIGNvbnN0IHUzMiBkY0NvZWZmSW5kZXhbMTZdID0KLSAgICB7MCwgMSwgNCwgNSwgMiwgMywgNiwgNywgOCwgOSwgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBtYlByZWRfdCAqcE1iUHJlZCwKLSAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpOwotc3RhdGljIHUzMiBEZWNvZGVTdWJNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdWJNYlByZWRfdCAqcFN1Yk1iUHJlZCwKLSAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpOwotc3RhdGljIHUzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKLSAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybik7Ci0KLSNpZmRlZiBIMjY0REVDX09NWERMCi1zdGF0aWMgdTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCB1OCAqcFRvdGFsQ29lZmYpOwotI2Vsc2UKLXN0YXRpYyB1MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIGkxNiAqcFRvdGFsQ29lZmYpOwotI2VuZGlmCi0KLXN0YXRpYyB1MzIgQ2JwSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpOwotI2lmZGVmIEgyNjRERUNfT01YREwKLXN0YXRpYyB1MzIgUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKLSAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsIGNvbnN0IHU4ICoqcFNyYywgaW1hZ2VfdCAqaW1hZ2UpOwotc3RhdGljIHUzMiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGNvbnN0IHU4ICoqcFNyYyApOwotc3RhdGljIHUzMiBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCi0gICAgICAgICAgICAgICAgICAgIHUzMiBpbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdCB1OCAqKnBTcmMsIGltYWdlX3QgKmltYWdlKTsKLQotCi0jZWxzZQotc3RhdGljIHUzMiBQcm9jZXNzUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgaTMyIHJlc2lkdWFsTGV2ZWxbXVsxNl0sIHUzMiAqKTsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGFyc2UgbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBTdHJtRGF0YSAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgcE1iICAgICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgc2xpY2VUeXBlICAgICAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBzbGljZQotICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSAgIG1heGltdW0gcmVmZXJlbmNlIGluZGV4Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwTWJMYXllciAgICAgICAgICBzdG9yZXMgdGhlIG1hY3JvYmxvY2sgZGF0YSBwYXJzZWQgZnJvbSBzdHJlYW0KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIEhBTlRST19PSyAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCBtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgc2xpY2VUeXBlLAotICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgdmFsdWU7Ci0gICAgaTMyIGl0bXA7Ci0gICAgbWJQYXJ0UHJlZE1vZGVfZSBwYXJ0TW9kZTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBNYkxheWVyKTsKLQotI2lmZGVmIEgyNjRERUNfTkVPTgotICAgIGgyNjRic2RDbGVhck1iTGF5ZXIocE1iTGF5ZXIsICgoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGKSk7Ci0jZWxzZQotICAgIEgyNjRTd0RlY01lbXNldChwTWJMYXllciwgMCwgc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSk7Ci0jZW5kaWYKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0KLSAgICBpZiAoSVNfSV9TTElDRShzbGljZVR5cGUpKQotICAgIHsKLSAgICAgICAgaWYgKCh2YWx1ZSArIDYpID4gMzEgfHwgdG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSA9IChtYlR5cGVfZSkodmFsdWUgKyA2KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKCh2YWx1ZSArIDEpID4gMzEgfHwgdG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSA9IChtYlR5cGVfZSkodmFsdWUgKyAxKTsKLSAgICB9Ci0KLSAgICBpZiAocE1iTGF5ZXItPm1iVHlwZSA9PSBJX1BDTSkKLSAgICB7Ci0gICAgICAgIGkzMiAqbGV2ZWw7Ci0gICAgICAgIHdoaWxlKCAhaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHBjbV9hbGlnbm1lbnRfemVyb19iaXQgKi8KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICBpZiAodG1wKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldmVsID0gcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsWzBdOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzg0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICpsZXZlbCsrID0gKGkzMil2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwYXJ0TW9kZSA9IGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWJMYXllci0+bWJUeXBlKTsKLSAgICAgICAgaWYgKCAocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVEVSKSAmJgotICAgICAgICAgICAgIChoMjY0YnNkTnVtTWJQYXJ0KHBNYkxheWVyLT5tYlR5cGUpID09IDQpICkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gRGVjb2RlU3ViTWJQcmVkKHBTdHJtRGF0YSwgJnBNYkxheWVyLT5zdWJNYlByZWQsCi0gICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSwgbnVtUmVmSWR4QWN0aXZlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IERlY29kZU1iUHJlZChwU3RybURhdGEsICZwTWJMYXllci0+bWJQcmVkLAotICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlR5cGUsIG51bVJlZklkeEFjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICBpZiAocGFydE1vZGUgIT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQocFN0cm1EYXRhLCAmdmFsdWUsCi0gICAgICAgICAgICAgICAgKHUzMikocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybiA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuID0gQ2JwSW50cmExNngxNihwTWJMYXllci0+bWJUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuIHx8Ci0gICAgICAgICAgICAgKHBhcnRNb2RlID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCAoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkgKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBNYkxheWVyLT5tYlFwRGVsdGEgPSBpdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBEZWNvZGVSZXNpZHVhbChwU3RybURhdGEsICZwTWJMYXllci0+cmVzaWR1YWwsIHBNYiwKLSAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJUeXBlLCBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4pOwotCi0gICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPQotICAgICAgICAgICAgICAgICh1MzIpKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zIC0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCkgKiA4ICsKLSAgICAgICAgICAgICAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKLQotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RNYlBhcnRQcmVkTW9kZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgcHJlZGljdGlvbiBtb2RlIG9mIGEgbWFjcm9ibG9jayB0eXBlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLW1iUGFydFByZWRNb2RlX2UgaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZV9lIG1iVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iVHlwZSA8PSAzMSk7Ci0KLSAgICBpZiAoKG1iVHlwZSA8PSBQXzh4OHJlZjApKQotICAgICAgICByZXR1cm4oUFJFRF9NT0RFX0lOVEVSKTsKLSAgICBlbHNlIGlmIChtYlR5cGUgPT0gSV80eDQpCi0gICAgICAgIHJldHVybihQUkVEX01PREVfSU5UUkE0eDQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKFBSRURfTU9ERV9JTlRSQTE2eDE2KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROdW1NYlBhcnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIGFtb3VudCBvZiBtYWNyb2Jsb2NrIHBhcnRpdGlvbnMgaW4gYSBtYWNyb2Jsb2NrIHR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2ROdW1NYlBhcnQobWJUeXBlX2UgbWJUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKLQotICAgIHN3aXRjaCAobWJUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgotICAgICAgICBjYXNlIFBfU2tpcDoKLSAgICAgICAgICAgIHJldHVybigxKTsKLQotICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKLSAgICAgICAgY2FzZSBQX0wwX0wwXzh4MTY6Ci0gICAgICAgICAgICByZXR1cm4oMik7Ci0KLSAgICAgICAgLyogUF84eDggb3IgUF84eDhyZWYwICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4oNCk7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE51bVN1Yk1iUGFydAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgYW1vdW50IG9mIHN1Yi1wYXJ0aXRpb25zIGluIGEgc3ViLW1hY3JvYmxvY2sgdHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlR5cGVfZSBzdWJNYlR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChzdWJNYlR5cGUgPD0gUF9MMF80eDQpOwotCi0gICAgc3dpdGNoIChzdWJNYlR5cGUpCi0gICAgewotICAgICAgICBjYXNlIFBfTDBfOHg4OgotICAgICAgICAgICAgcmV0dXJuKDEpOwotCi0gICAgICAgIGNhc2UgUF9MMF84eDQ6Ci0gICAgICAgIGNhc2UgUF9MMF80eDg6Ci0gICAgICAgICAgICByZXR1cm4oMik7Ci0KLSAgICAgICAgLyogUF9MMF80eDQgKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybig0KTsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVNYlByZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBhcnNlIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kIHN0b3JlCi0gICAgICAgICAgaW4gJ3BNYlByZWQnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbWJQcmVkX3QgKnBNYlByZWQsIG1iVHlwZV9lIG1iVHlwZSwKLSAgICB1MzIgbnVtUmVmSWR4QWN0aXZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIGosIHZhbHVlOwotICAgIGkzMiBpdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocE1iUHJlZCk7Ci0KLSAgICBzd2l0Y2ggKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpKQotICAgIHsKLSAgICAgICAgY2FzZSBQUkVEX01PREVfSU5URVI6IC8qIFBSRURfTU9ERV9JTlRFUiAqLwotICAgICAgICAgICAgaWYgKG51bVJlZklkeEFjdGl2ZSA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gaDI2NGJzZE51bU1iUGFydChtYlR5cGUpLCBqID0gMDsgaS0tOyAgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChwU3RybURhdGEsICZ2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG51bVJlZklkeEFjdGl2ZSA+IDIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPj0gbnVtUmVmSWR4QWN0aXZlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnJlZklkeEwwW2pdID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGkgPSBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZSksIGogPSAwOyBpLS07ICBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgcE1iUHJlZC0+bXZkTDBbal0uaG9yID0gKGkxNilpdG1wOwotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgcE1iUHJlZC0+bXZkTDBbal0udmVyID0gKGkxNilpdG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQUkVEX01PREVfSU5UUkE0eDQ6Ci0gICAgICAgICAgICBmb3IgKGl0bXAgPSAwLCBpID0gMDsgaXRtcCA8IDI7IGl0bXArKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgICAgICAgICAgdG1wID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSA4OyBqLS07IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAmIDB4ODAwMDAwMDAgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcE1iUHJlZC0+cHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwTWJQcmVkLT5yZW1JbnRyYTR4NFByZWRNb2RlW2ldID0gdmFsdWU+PjI5OwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDggKyAzKnRtcCkgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZmFsbC10aHJvdWdoICovCi0KLSAgICAgICAgY2FzZSBQUkVEX01PREVfSU5UUkExNngxNjoKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+IDMpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcE1iUHJlZC0+aW50cmFDaHJvbWFQcmVkTW9kZSA9IHZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJNYlByZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBhcnNlIHN1Yi1tYWNyb2Jsb2NrIHByZWRpY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZAotICAgICAgICAgIHN0b3JlIGluICdwTWJQcmVkJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZVN1Yk1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHN1Yk1iUHJlZF90ICpwU3ViTWJQcmVkLAotICAgIG1iVHlwZV9lIG1iVHlwZSwgdTMyIG51bVJlZklkeEFjdGl2ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCBqLCB2YWx1ZTsKLSAgICBpMzIgaXRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdWJNYlByZWQpOwotICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID4gMykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1Yk1iUHJlZC0+c3ViTWJUeXBlW2ldID0gKHN1Yk1iVHlwZV9lKXZhbHVlOwotICAgIH0KLQotICAgIGlmICggKG51bVJlZklkeEFjdGl2ZSA+IDEpICYmIChtYlR5cGUgIT0gUF84eDhyZWYwKSApCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHBTdHJtRGF0YSwgJnZhbHVlLAotICAgICAgICAgICAgICAgICh1MzIpKG51bVJlZklkeEFjdGl2ZSA+IDIpKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID49IG51bVJlZklkeEFjdGl2ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwU3ViTWJQcmVkLT5yZWZJZHhMMFtpXSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGogPSAwOwotICAgICAgICBmb3IgKHZhbHVlID0gaDI2NGJzZE51bVN1Yk1iUGFydChwU3ViTWJQcmVkLT5zdWJNYlR5cGVbaV0pOwotICAgICAgICAgICAgIHZhbHVlLS07IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFN1Yk1iUHJlZC0+bXZkTDBbaV1bal0uaG9yID0gKGkxNilpdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwU3ViTWJQcmVkLT5tdmRMMFtpXVtqXS52ZXIgPSAoaTE2KWl0bXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGFyc2UgcmVzaWR1YWwgaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZCBzdG9yZSBpbiAncFJlc2lkdWFsJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZVJlc2lkdWFsKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcmVzaWR1YWxfdCAqcFJlc2lkdWFsLAotICAgIG1iU3RvcmFnZV90ICpwTWIsIG1iVHlwZV9lIG1iVHlwZSwgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiBibG9ja0NvZGVkOwotICAgIHUzMiBibG9ja0luZGV4OwotICAgIHUzMiBpczE2eDE2OwotICAgIE9NWF9JTlQgbmM7Ci0gICAgT01YUmVzdWx0IG9teFJlczsKLSAgICBPTVhfVTggKnBQb3NDb2VmQnVmOwotCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUmVzaWR1YWwpOwotCi0gICAgcFBvc0NvZWZCdWYgPSBwUmVzaWR1YWwtPnBvc0NvZWZCdWY7Ci0KLSAgICAvKiBsdW1hIERDIGlzIGF0IGluZGV4IDI0ICovCi0gICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgIHsKLSAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsIDAsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7Ci0jaWZuZGVmIEgyNjRERUNfTkVPTgotICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdLAotICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAxNik7Ci0jZWxzZQotICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdLAotICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAxNik7Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBpczE2eDE2ID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgaXMxNngxNiA9IEhBTlRST19GQUxTRTsKLQotICAgIGZvciAoaSA9IDQsIGJsb2NrSW5kZXggPSAwOyBpLS07KQotICAgIHsKLSAgICAgICAgLyogbHVtYSBjYnAgaW4gYml0cyAwLTMgKi8KLSAgICAgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgxOwotICAgICAgICBjb2RlZEJsb2NrUGF0dGVybiA+Pj0gMTsKLSAgICAgICAgaWYgKGJsb2NrQ29kZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDQ7IGotLTsgYmxvY2tJbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5jID0gKE9NWF9JTlQpRGV0ZXJtaW5lTmMocE1iLGJsb2NrSW5kZXgscFJlc2lkdWFsLT50b3RhbENvZWZmKTsKLSAgICAgICAgICAgICAgICBpZiAoaXMxNngxNikKLSAgICAgICAgICAgICAgICB7Ci0jaWZuZGVmIEgyNjRERUNfTkVPTgotICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1KTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIG9teFJlcyA9ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1KTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBibG9ja0luZGV4ICs9IDQ7Ci0gICAgfQotCi0gICAgLyogY2hyb21hIERDIGJsb2NrIGFyZSBhdCBpbmRpY2VzIDI1IGFuZCAyNiAqLwotICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MzsKLSAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICB7Ci0jaWZuZGVmIEgyNjRERUNfTkVPTgotICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI1XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYpOwotI2Vsc2UKLSAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjVdLAotICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAxNywKLSAgICAgICAgICAgICAgICA0KTsKLSNlbmRpZgotICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0jaWZuZGVmIEgyNjRERUNfTkVPTgotICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYpOwotI2Vsc2UKLSAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjZdLAotICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAxNywKLSAgICAgICAgICAgICAgICA0KTsKLSNlbmRpZgotICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogY2hyb21hIEFDICovCi0gICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgyOwotICAgIGlmIChibG9ja0NvZGVkKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gODsgaS0tO2Jsb2NrSW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7Ci0jaWZuZGVmIEgyNjRERUNfTkVPTgotICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgIG5jLAotICAgICAgICAgICAgICAgICAgICAxNSk7Ci0jZWxzZQotICAgICAgICAgICAgb214UmVzID0gIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgMTUpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotI2Vsc2UKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBhcnNlIHJlc2lkdWFsIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQgc3RvcmUgaW4gJ3BSZXNpZHVhbCcuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKLSAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgaiwgdG1wOwotICAgIGkzMiBuYzsKLSAgICB1MzIgYmxvY2tDb2RlZDsKLSAgICB1MzIgYmxvY2tJbmRleDsKLSAgICB1MzIgaXMxNngxNjsKLSAgICBpMzIgKCpsZXZlbClbMTZdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFJlc2lkdWFsKTsKLQotICAgIGxldmVsID0gcFJlc2lkdWFsLT5sZXZlbDsKLQotICAgIC8qIGx1bWEgREMgaXMgYXQgaW5kZXggMjQgKi8KLSAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCi0gICAgewotICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCAwLCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwgbGV2ZWxbMjRdLCBuYywgMTYpOwotICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNF0gPSAodG1wID4+IDQpICYgMHhGRjsKLSAgICAgICAgaXMxNngxNiA9IEhBTlRST19UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBmb3IgKGkgPSA0LCBibG9ja0luZGV4ID0gMDsgaS0tOykKLSAgICB7Ci0gICAgICAgIC8qIGx1bWEgY2JwIGluIGJpdHMgMC0zICovCi0gICAgICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MTsKLSAgICAgICAgY29kZWRCbG9ja1BhdHRlcm4gPj49IDE7Ci0gICAgICAgIGlmIChibG9ja0NvZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSA0OyBqLS07IGJsb2NrSW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCBibG9ja0luZGV4LCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgICAgIGlmIChpczE2eDE2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSArIDEsIG5jLCAxNSk7Ci0gICAgICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSB0bXAgPj4gMTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbYmxvY2tJbmRleF0sIG5jLCAxNik7Ci0gICAgICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSB0bXAgPj4gMTY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSA9ICh0bXAgPj4gNCkgJiAweEZGOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJsb2NrSW5kZXggKz0gNDsKLSAgICB9Ci0KLSAgICAvKiBjaHJvbWEgREMgYmxvY2sgYXJlIGF0IGluZGljZXMgMjUgYW5kIDI2ICovCi0gICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgzOwotICAgIGlmIChibG9ja0NvZGVkKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI1XSwgLTEsIDQpOwotICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNV0gPSAodG1wID4+IDQpICYgMHhGRjsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI1XSs0LCAtMSwgNCk7Ci0gICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSA9ICh0bXAgPj4gNCkgJiAweEZGOwotICAgIH0KLQotICAgIC8qIGNocm9tYSBBQyAqLwotICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MjsKLSAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDg7IGktLTtibG9ja0luZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5jID0gKGkzMilEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSArIDEsIG5jLCAxNSk7Ci0gICAgICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiA0KSAmIDB4RkY7Ci0gICAgICAgICAgICBwUmVzaWR1YWwtPmNvZWZmTWFwW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiAxNSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGV0ZXJtaW5lTmMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIG5DIG9mIGEgYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgSDI2NERFQ19PTVhETAotdTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCB1OCAqcFRvdGFsQ29lZmYpCi0jZWxzZQotdTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCBpMTYgKnBUb3RhbENvZWZmKQotI2VuZGlmCi17Ci0vKmxpbnQgLWU3MDIgKi8KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLSAgICBpMzIgbjsKLSAgICBjb25zdCBuZWlnaGJvdXJfdCAqbmVpZ2hib3VyQSwgKm5laWdoYm91ckI7Ci0gICAgdTggbmVpZ2hib3VyQWluZGV4LCBuZWlnaGJvdXJCaW5kZXg7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOwotCi0gICAgLyogaWYgbmVpZ2hib3VyIGJsb2NrIGJlbG9uZ3MgdG8gY3VycmVudCBtYWNyb2Jsb2NrIHRvdGFsQ29lZmYgYXJyYXkKLSAgICAgKiBtYlN0b3JhZ2UgaGFzIG5vdCBiZWVuIHNldC91cGRhdGVkIHlldCAtPiB1c2UgcFRvdGFsQ29lZmYgKi8KLSAgICBuZWlnaGJvdXJBID0gaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9ja0luZGV4KTsKLSAgICBuZWlnaGJvdXJCID0gaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9ja0luZGV4KTsKLSAgICBuZWlnaGJvdXJBaW5kZXggPSBuZWlnaGJvdXJBLT5pbmRleDsKLSAgICBuZWlnaGJvdXJCaW5kZXggPSBuZWlnaGJvdXJCLT5pbmRleDsKLSAgICBpZiAobmVpZ2hib3VyQS0+bWIgPT0gTUJfQ1VSUiAmJiBuZWlnaGJvdXJCLT5tYiA9PSBNQl9DVVJSKQotICAgIHsKLSAgICAgICAgbiA9IChwVG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdICsKLSAgICAgICAgICAgICBwVG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdICsgMSk+PjE7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5laWdoYm91ckEtPm1iID09IE1CX0NVUlIpCi0gICAgewotICAgICAgICBuID0gcFRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XTsKLSAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKSkKLSAgICAgICAgewotICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpID4+IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyQi0+bWIgPT0gTUJfQ1VSUikKLSAgICB7Ci0gICAgICAgIG4gPSBwVG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdOwotICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBuID0gKG4gKyBwTWItPm1iQS0+dG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdICsgMSkgPj4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuID0gdG1wID0gMDsKLSAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKSkKLSAgICAgICAgewotICAgICAgICAgICAgbiA9IHBNYi0+bWJBLT50b3RhbENvZWZmW25laWdoYm91ckFpbmRleF07Ci0gICAgICAgICAgICB0bXAgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpID4+IDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbiA9IHBNYi0+bWJCLT50b3RhbENvZWZmW25laWdoYm91ckJpbmRleF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuKCh1MzIpbik7Ci0vKmxpbnQgK2U3MDIgKi8KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBDYnBJbnRyYTE2eDE2Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBjb2RlZCBibG9jayBwYXR0ZXJuIGZvciBpbnRyYSAxNngxNiBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgQ2JwSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGNicDsKLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWJUeXBlID49IElfMTZ4MTZfMF8wXzAgJiYgbWJUeXBlIDw9IElfMTZ4MTZfM18yXzEpOwotCi0gICAgaWYgKG1iVHlwZSA+PSBJXzE2eDE2XzBfMF8xKQotICAgICAgICBjYnAgPSAxNTsKLSAgICBlbHNlCi0gICAgICAgIGNicCA9IDA7Ci0KLSAgICAvKiB0bXAgaXMgMCBmb3IgSV8xNngxNl8wXzBfMCBtYiB0eXBlICovCi0gICAgLyogaWdub3JlIGxpbnQgd2FybmluZyBvbiBhcml0aG1ldGljIG9uIGVudW0ncyAqLwotICAgIHRtcCA9IC8qbGludCAtZSg2NTYpKi8obWJUeXBlIC0gSV8xNngxNl8wXzBfMCkgPj4gMjsKLSAgICBpZiAodG1wID4gMikKLSAgICAgICAgdG1wIC09IDM7Ci0KLSAgICBjYnAgKz0gdG1wIDw8IDQ7Ci0KLSAgICByZXR1cm4oY2JwKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIHByZWRpY3Rpb24gbW9kZSBmb3IgaW50cmEgMTZ4MTYgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYlR5cGUgPj0gSV8xNngxNl8wXzBfMCAmJiBtYlR5cGUgPD0gSV8xNngxNl8zXzJfMSk7Ci0KLSAgICAvKiB0bXAgaXMgMCBmb3IgSV8xNngxNl8wXzBfMCBtYiB0eXBlICovCi0gICAgLyogaWdub3JlIGxpbnQgd2FybmluZyBvbiBhcml0aG1ldGljIG9uIGVudW0ncyAqLwotICAgIHRtcCA9IC8qbGludCAtZSg2NTYpKi8obWJUeXBlIC0gSV8xNngxNl8wXzBfMCk7Ci0KLSAgICByZXR1cm4odG1wICYgMHgzKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBEZWNvZGUgb25lIG1hY3JvYmxvY2sgYW5kIHdyaXRlIGludG8gb3V0cHV0IGltYWdlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICAgICAgIG1iTGF5ZXIgICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQotICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKLSAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgotICAgICAgICAgIHFwWSAgICAgICAgICAgcG9pbnRlciB0byBzbGljZSBRUAotICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgotICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICBjdXJySW1hZ2UgICAgIGRlY29kZWQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gb3V0cHV0IGltYWdlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKLSAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIG1hY3JvYmxvY2sgZGVjb2RpbmcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICBpbWFnZV90ICpjdXJySW1hZ2UsIGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgKnFwWSwgdTMyIG1iTnVtLAotICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIHU4KiBkYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXA7Ci0gICAgbWJUeXBlX2UgbWJUeXBlOwotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICBjb25zdCB1OCAqcFNyYzsKLSNlbmRpZgotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKHBNYkxheWVyKTsKLSAgICBBU1NFUlQoY3VyckltYWdlKTsKLSAgICBBU1NFUlQocXBZICYmICpxcFkgPCA1Mik7Ci0gICAgQVNTRVJUKG1iTnVtIDwgY3VyckltYWdlLT53aWR0aCpjdXJySW1hZ2UtPmhlaWdodCk7Ci0KLSAgICBtYlR5cGUgPSBwTWJMYXllci0+bWJUeXBlOwotICAgIHBNYi0+bWJUeXBlID0gbWJUeXBlOwotCi0gICAgcE1iLT5kZWNvZGVkKys7Ci0KLSAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhjdXJySW1hZ2UsIG1iTnVtKTsKLQotICAgIGlmIChtYlR5cGUgPT0gSV9QQ00pCi0gICAgewotICAgICAgICB1OCAqcERhdGEgPSAodTgqKWRhdGE7Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgICAgICB1OCAqdG90ID0gcE1iLT50b3RhbENvZWZmOwotI2Vsc2UKLSAgICAgICAgaTE2ICp0b3QgPSBwTWItPnRvdGFsQ29lZmY7Ci0jZW5kaWYKLSAgICAgICAgaTMyICpsZXYgPSBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWxbMF07Ci0KLSAgICAgICAgcE1iLT5xcFkgPSAwOwotCi0gICAgICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKLSAgICAgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCi0gICAgICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAyNDsgaS0tOykKLSAgICAgICAgICAgICAgICAqdG90KysgPSAxNjsKLSAgICAgICAgICAgIHJldHVybiBIQU5UUk9fT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGkgPSAyNDsgaS0tOykKLSAgICAgICAgewotICAgICAgICAgICAgKnRvdCsrID0gMTY7Ci0gICAgICAgICAgICBmb3IgKHRtcCA9IDE2OyB0bXAtLTspCi0gICAgICAgICAgICAgICAgKnBEYXRhKysgPSAodTgpKCpsZXYrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsICh1OCopZGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKHBNYiwgcE1iTGF5ZXIsIGRwYiwgbWJOdW0sCi0gICAgICAgICAgICAgICAgY3VyckltYWdlLCAodTgqKWRhdGEpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spIHJldHVybiAodG1wKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmIChtYlR5cGUgIT0gUF9Ta2lwKQotICAgICAgICB7Ci0gICAgICAgICAgICBIMjY0U3dEZWNNZW1jcHkocE1iLT50b3RhbENvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC50b3RhbENvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3KnNpemVvZigqcE1iLT50b3RhbENvZWZmKSk7Ci0KLSAgICAgICAgICAgIC8qIHVwZGF0ZSBxcFkgKi8KLSAgICAgICAgICAgIGlmIChwTWJMYXllci0+bWJRcERlbHRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpxcFkgPSAqcXBZICsgcE1iTGF5ZXItPm1iUXBEZWx0YTsKLSAgICAgICAgICAgICAgICBpZiAoKnFwWSA8IDApICpxcFkgKz0gNTI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKnFwWSA+PSA1MikgKnFwWSAtPSA1MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBNYi0+cXBZID0gKHUzMikqcXBZOwotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgICAgICAgICAgcFNyYyA9IHBNYkxheWVyLT5yZXNpZHVhbC5wb3NDb2VmQnVmOwotCi0gICAgICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9NWFJlc3VsdCByZXM7Ci0gICAgICAgICAgICAgICAgdTggKnA7Ci0gICAgICAgICAgICAgICAgdTggKnRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgdG90YWxDb2VmZisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcCA9IGRhdGEgKyBsdW1hSW5kZXhbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqdG90YWxDb2VmZikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsIHAsIDAsIHAsIDE2LCAxNiwgKnFwWSwgKnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTR4NCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbChwTWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyckltYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChwTWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJJbWFnZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKHBNYiwgZGF0YSwgJnBTcmMpOwotCi0jZWxzZQotICAgICAgICAgICAgdG1wID0gUHJvY2Vzc1Jlc2lkdWFsKHBNYiwgcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAotICAgICAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC5jb2VmZk1hcCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldChwTWItPnRvdGFsQ29lZmYsIDAsIDI3KnNpemVvZigqcE1iLT50b3RhbENvZWZmKSk7Ci0gICAgICAgICAgICBwTWItPnFwWSA9ICh1MzIpKnFwWTsKLSAgICAgICAgfQotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICAgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAotICAgICAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KLSAgICAgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCi0gICAgICAgICAgICByZXR1cm4gSEFOVFJPX09LOwotCi0gICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKLSNlbHNlCi0gICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYVByZWRpY3Rpb24ocE1iLCBwTWJMYXllciwgY3VyckltYWdlLCBtYk51bSwKLSAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsICh1OCopZGF0YSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykgcmV0dXJuICh0bXApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEludGVyUHJlZGljdGlvbihwTWIsIHBNYkxheWVyLCBkcGIsIG1iTnVtLAotICAgICAgICAgICAgICAgIGN1cnJJbWFnZSwgKHU4KilkYXRhKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKSByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICAgIHJldHVybiBIQU5UUk9fT0s7Ci19Ci0KLQotI2lmZGVmIEgyNjRERUNfT01YREwKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgY2hyb21hIHdpdGgKLSAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBjb25zdCB1OCAqKnBTcmMgKQotewotICAgIHUzMiBpOwotICAgIHUzMiBjaHJvbWFRcDsKLSAgICBpMTYgKnBEYzsKLSAgICBpMTYgZGNbNCArIDRdID0gezAsMCwwLDAsMCwwLDAsMH07Ci0gICAgdTggKnRvdGFsQ29lZmY7Ci0gICAgT01YUmVzdWx0IHJlc3VsdDsKLSAgICB1OCAqcDsKLQotICAgIC8qIGNocm9tYSBEQyBwcm9jZXNzaW5nLiBGaXJzdCBjaHJvbWEgZGMgYmxvY2sgaXMgYmxvY2sgd2l0aCBpbmRleCAyNSAqLwotICAgIGNocm9tYVFwID0KLSAgICAgICAgaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilwTWItPnFwWSArIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCldOwotCi0gICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNV0pCi0gICAgewotICAgICAgICBwRGMgPSBkYzsKLSAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcigKLSAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgIHBEYywKLSAgICAgICAgICAgICAgICAoaTMyKWNocm9tYVFwKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNl0pCi0gICAgewotICAgICAgICBwRGMgPSBkYys0OwotICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAotICAgICAgICAgICAgICAgIHBTcmMsCi0gICAgICAgICAgICAgICAgcERjLAotICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXApOwotICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHBEYyA9IGRjOwotICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmYgKyAxNjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBwRGMrKywgdG90YWxDb2VmZisrKQotICAgIHsKLSAgICAgICAgLyogY2hyb21hIHByZWRpY3Rpb24gKi8KLSAgICAgICAgaWYgKCp0b3RhbENvZWZmIHx8ICpwRGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAgPSBkYXRhICsgY2hyb21hSW5kZXhbaV07Ci0gICAgICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAotICAgICAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICBwRGMsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXAsCi0gICAgICAgICAgICAgICAgICAgICp0b3RhbENvZWZmKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBsdW1hIHdpdGgKLSAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4KiogcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3QgKmltYWdlKQotewotICAgIHUzMiBpOwotICAgIGkxNiAqcERjOwotICAgIGkxNiBkY1sxNl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07Ci0gICAgdTggKnRvdGFsQ29lZmY7Ci0gICAgT01YUmVzdWx0IHJlc3VsdDsKLSAgICB1OCAqcDsKLQotICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7Ci0KLSAgICBpZiAodG90YWxDb2VmZlsyNF0pCi0gICAgewotICAgICAgICBwRGMgPSBkYzsKLSAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIoCi0gICAgICAgICAgICAgICAgICAgIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgIHBEYywKLSAgICAgICAgICAgICAgICAgICAgKGkzMilwTWItPnFwWSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIC8qIEludHJhIDE2eDE2IHByZWQgKi8KLSAgICBpZiAoaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKHBNYiwgZGF0YSwgaW1hZ2UtPmx1bWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPndpZHRoKjE2LCBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIHRvdGFsQ29lZmYrKykKLSAgICB7Ci0gICAgICAgIHAgPSBkYXRhICsgbHVtYUluZGV4W2ldOwotICAgICAgICBwRGMgPSAmZGNbZGNDb2VmZkluZGV4W2ldXTsKLSAgICAgICAgaWYgKCp0b3RhbENvZWZmIHx8ICpwRGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCi0gICAgICAgICAgICAgICAgICAgIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIHBEYywKLSAgICAgICAgICAgICAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZLAotICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKLSAgICAgICAgICAgICAgICBpbWFnZSwKLSAgICAgICAgICAgICAgICBpbnRyYUNocm9tYVByZWRNb2RlLAotICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkKSAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHJldHVybiBIQU5UUk9fT0s7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgbHVtYSB3aXRoCi0gICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICoqcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV90ICppbWFnZSkKLXsKLSAgICB1MzIgaTsKLSAgICB1OCAqdG90YWxDb2VmZjsKLSAgICBPTVhSZXN1bHQgcmVzdWx0OwotICAgIHU4ICpwOwotCi0gICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCB0b3RhbENvZWZmKyspCi0gICAgewotICAgICAgICBwID0gZGF0YSArIGx1bWFJbmRleFtpXTsKLSAgICAgICAgaWYgKGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24ocE1iLCBwLCBtYkxheWVyLCBpbWFnZS0+bHVtYSwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPndpZHRoKjE2LCBjb25zdHJhaW5lZEludHJhUHJlZCwgaSkgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmICgqdG90YWxDb2VmZikKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKLSAgICAgICAgICAgICAgICAgICAgcFNyYywKLSAgICAgICAgICAgICAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZLAotICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKLSAgICAgICAgICAgICAgICBpbWFnZSwKLSAgICAgICAgICAgICAgICBtYkxheWVyLT5tYlByZWQuaW50cmFDaHJvbWFQcmVkTW9kZSwKLSAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4gSEFOVFJPX09LOwotfQotCi0jZWxzZSAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogUHJvY2Vzc1Jlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIG9uZSBtYWNyb2Jsb2NrIHdpdGgKLSAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBQcm9jZXNzUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgaTMyIHJlc2lkdWFsTGV2ZWxbXVsxNl0sIHUzMiAqY29lZmZNYXApCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIGNocm9tYVFwOwotICAgIGkzMiAoKmJsb2NrRGF0YSlbMTZdOwotICAgIGkzMiAoKmJsb2NrRGMpWzE2XTsKLSAgICBpMTYgKnRvdGFsQ29lZmY7Ci0gICAgaTMyICpjaHJvbWFEYzsKLSAgICBjb25zdCB1MzIgKmRjQ29lZmZJZHg7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChyZXNpZHVhbExldmVsKTsKLQotICAgIC8qIHNldCBwb2ludGVycyB0byBEQyBjb2VmZmljaWVudCBibG9ja3MgKi8KLSAgICBibG9ja0RjID0gcmVzaWR1YWxMZXZlbCArIDI0OwotCi0gICAgYmxvY2tEYXRhID0gcmVzaWR1YWxMZXZlbDsKLSAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOwotICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgIHsKLSAgICAgICAgaWYgKHRvdGFsQ29lZmZbMjRdKQotICAgICAgICB7Ci0gICAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0x1bWFEYygqYmxvY2tEYywgcE1iLT5xcFkpOwotICAgICAgICB9Ci0gICAgICAgIGRjQ29lZmZJZHggPSBkY0NvZWZmSW5kZXg7Ci0KLSAgICAgICAgZm9yIChpID0gMTY7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogc2V0IGRjIGNvZWZmaWNpZW50IG9mIGx1bWEgYmxvY2sgKi8KLSAgICAgICAgICAgICgqYmxvY2tEYXRhKVswXSA9ICgqYmxvY2tEYylbKmRjQ29lZmZJZHgrK107Ci0gICAgICAgICAgICBpZiAoKCpibG9ja0RhdGEpWzBdIHx8ICp0b3RhbENvZWZmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIHBNYi0+cXBZLCAxLCAqY29lZmZNYXApICE9Ci0gICAgICAgICAgICAgICAgICAgIEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMTY7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCp0b3RhbENvZWZmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIHBNYi0+cXBZLCAwLCAqY29lZmZNYXApICE9Ci0gICAgICAgICAgICAgICAgICAgIEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjaHJvbWEgREMgcHJvY2Vzc2luZy4gRmlyc3QgY2hyb21hIGRjIGJsb2NrIGlzIGJsb2NrIHdpdGggaW5kZXggMjUgKi8KLSAgICBjaHJvbWFRcCA9Ci0gICAgICAgIGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcE1iLT5xcFkgKyBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLSAgICBpZiAocE1iLT50b3RhbENvZWZmWzI1XSB8fCBwTWItPnRvdGFsQ29lZmZbMjZdKQotICAgICAgICBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKHJlc2lkdWFsTGV2ZWxbMjVdLCBjaHJvbWFRcCk7Ci0gICAgY2hyb21hRGMgPSByZXNpZHVhbExldmVsWzI1XTsKLSAgICBmb3IgKGkgPSA4OyBpLS07IGJsb2NrRGF0YSsrLCB0b3RhbENvZWZmKyssIGNvZWZmTWFwKyspCi0gICAgewotICAgICAgICAvKiBzZXQgZGMgY29lZmZpY2llbnQgb2YgY2hyb21hIGJsb2NrICovCi0gICAgICAgICgqYmxvY2tEYXRhKVswXSA9ICpjaHJvbWFEYysrOwotICAgICAgICBpZiAoKCpibG9ja0RhdGEpWzBdIHx8ICp0b3RhbENvZWZmKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaDI2NGJzZFByb2Nlc3NCbG9jaygqYmxvY2tEYXRhLCBjaHJvbWFRcCwgMSwqY29lZmZNYXApICE9Ci0gICAgICAgICAgICAgICAgSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBNQVJLX1JFU0lEVUFMX0VNUFRZKCpibG9ja0RhdGEpOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3ViTWJQYXJ0TW9kZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgbWFjcm9ibG9jaydzIHN1Yi1wYXJ0aXRpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3ViTWJQYXJ0TW9kZV9lIGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHN1Yk1iVHlwZSA8IDQpOwotCi0gICAgcmV0dXJuKChzdWJNYlBhcnRNb2RlX2Upc3ViTWJUeXBlKTsKLQotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJjMzQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19NQUNST0JMT0NLX0xBWUVSX0gKLSNkZWZpbmUgSDI2NFNXREVDX01BQ1JPQkxPQ0tfTEFZRVJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogTWFjcm8gdG8gZGV0ZXJtaW5lIGlmIGEgbWIgaXMgYW4gaW50cmEgbWIgKi8KLSNkZWZpbmUgSVNfSU5UUkFfTUIoYSkgKChhKS5tYlR5cGUgPiA1KQotCi0vKiBNYWNybyB0byBkZXRlcm1pbmUgaWYgYSBtYiBpcyBhbiBJX1BDTSBtYiAqLwotI2RlZmluZSBJU19JX1BDTV9NQihhKSAoKGEpLm1iVHlwZSA9PSAzMSkKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQX1NraXAgICAgICAgICAgPSAwLAotICAgIFBfTDBfMTZ4MTYgICAgICA9IDEsCi0gICAgUF9MMF9MMF8xNng4ICAgID0gMiwKLSAgICBQX0wwX0wwXzh4MTYgICAgPSAzLAotICAgIFBfOHg4ICAgICAgICAgICA9IDQsCi0gICAgUF84eDhyZWYwICAgICAgID0gNSwKLSAgICBJXzR4NCAgICAgICAgICAgPSA2LAotICAgIElfMTZ4MTZfMF8wXzAgICA9IDcsCi0gICAgSV8xNngxNl8xXzBfMCAgID0gOCwKLSAgICBJXzE2eDE2XzJfMF8wICAgPSA5LAotICAgIElfMTZ4MTZfM18wXzAgICA9IDEwLAotICAgIElfMTZ4MTZfMF8xXzAgICA9IDExLAotICAgIElfMTZ4MTZfMV8xXzAgICA9IDEyLAotICAgIElfMTZ4MTZfMl8xXzAgICA9IDEzLAotICAgIElfMTZ4MTZfM18xXzAgICA9IDE0LAotICAgIElfMTZ4MTZfMF8yXzAgICA9IDE1LAotICAgIElfMTZ4MTZfMV8yXzAgICA9IDE2LAotICAgIElfMTZ4MTZfMl8yXzAgICA9IDE3LAotICAgIElfMTZ4MTZfM18yXzAgICA9IDE4LAotICAgIElfMTZ4MTZfMF8wXzEgICA9IDE5LAotICAgIElfMTZ4MTZfMV8wXzEgICA9IDIwLAotICAgIElfMTZ4MTZfMl8wXzEgICA9IDIxLAotICAgIElfMTZ4MTZfM18wXzEgICA9IDIyLAotICAgIElfMTZ4MTZfMF8xXzEgICA9IDIzLAotICAgIElfMTZ4MTZfMV8xXzEgICA9IDI0LAotICAgIElfMTZ4MTZfMl8xXzEgICA9IDI1LAotICAgIElfMTZ4MTZfM18xXzEgICA9IDI2LAotICAgIElfMTZ4MTZfMF8yXzEgICA9IDI3LAotICAgIElfMTZ4MTZfMV8yXzEgICA9IDI4LAotICAgIElfMTZ4MTZfMl8yXzEgICA9IDI5LAotICAgIElfMTZ4MTZfM18yXzEgICA9IDMwLAotICAgIElfUENNICAgICAgICAgICA9IDMxCi19IG1iVHlwZV9lOwotCi10eXBlZGVmIGVudW0gewotICAgIFBfTDBfOHg4ID0gMCwKLSAgICBQX0wwXzh4NCA9IDEsCi0gICAgUF9MMF80eDggPSAyLAotICAgIFBfTDBfNHg0ID0gMwotfSBzdWJNYlR5cGVfZTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBNQl9QXzE2eDE2ID0gMCwKLSAgICBNQl9QXzE2eDgsCi0gICAgTUJfUF84eDE2LAotICAgIE1CX1BfOHg4Ci19IG1iUGFydE1vZGVfZTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBNQl9TUF84eDggPSAwLAotICAgIE1CX1NQXzh4NCwKLSAgICBNQl9TUF80eDgsCi0gICAgTUJfU1BfNHg0Ci19IHN1Yk1iUGFydE1vZGVfZTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQUkVEX01PREVfSU5UUkE0eDQgPSAwLAotICAgIFBSRURfTU9ERV9JTlRSQTE2eDE2ICAsCi0gICAgUFJFRF9NT0RFX0lOVEVSCi19IG1iUGFydFByZWRNb2RlX2U7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBNdlByZWRpY3Rpb24xNngxNiBhc3N1bWVzIHRoYXQgTVZzIGFyZSAxNmJpdHMgKi8KLSAgICBpMTYgaG9yOwotICAgIGkxNiB2ZXI7Ci19IG12X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1sxNl07Ci0gICAgdTMyIHJlbUludHJhNHg0UHJlZE1vZGVbMTZdOwotICAgIHUzMiBpbnRyYUNocm9tYVByZWRNb2RlOwotICAgIHUzMiByZWZJZHhMMFs0XTsKLSAgICBtdl90IG12ZEwwWzRdOwotfSBtYlByZWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBzdWJNYlR5cGVfZSBzdWJNYlR5cGVbNF07Ci0gICAgdTMyIHJlZklkeEwwWzRdOwotICAgIG12X3QgbXZkTDBbNF1bNF07Ci19IHN1Yk1iUHJlZF90OwotCi10eXBlZGVmIHN0cnVjdAotewotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICB1OCBwb3NDb2VmQnVmWzI3KjE2KjNdOwotICAgIHU4IHRvdGFsQ29lZmZbMjddOwotI2Vsc2UKLSAgICBpMTYgdG90YWxDb2VmZlsyN107Ci0jZW5kaWYKLSAgICBpMzIgbGV2ZWxbMjZdWzE2XTsKLSAgICB1MzIgY29lZmZNYXBbMjRdOwotfSByZXNpZHVhbF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG1iVHlwZV9lIG1iVHlwZTsKLSAgICB1MzIgY29kZWRCbG9ja1BhdHRlcm47Ci0gICAgaTMyIG1iUXBEZWx0YTsKLSAgICBtYlByZWRfdCBtYlByZWQ7Ci0gICAgc3ViTWJQcmVkX3Qgc3ViTWJQcmVkOwotICAgIHJlc2lkdWFsX3QgcmVzaWR1YWw7Ci19IG1hY3JvYmxvY2tMYXllcl90OwotCi10eXBlZGVmIHN0cnVjdCBtYlN0b3JhZ2UKLXsKLSAgICBtYlR5cGVfZSBtYlR5cGU7Ci0gICAgdTMyIHNsaWNlSWQ7Ci0gICAgdTMyIGRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjOwotICAgIGkzMiBmaWx0ZXJPZmZzZXRBOwotICAgIGkzMiBmaWx0ZXJPZmZzZXRCOwotICAgIHUzMiBxcFk7Ci0gICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQ7Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgIHU4IHRvdGFsQ29lZmZbMjddOwotI2Vsc2UKLSAgICBpMTYgdG90YWxDb2VmZlsyN107Ci0jZW5kaWYKLSAgICB1OCBpbnRyYTR4NFByZWRNb2RlWzE2XTsKLSAgICB1MzIgcmVmUGljWzRdOwotICAgIHU4KiByZWZBZGRyWzRdOwotICAgIG12X3QgbXZbMTZdOwotICAgIHUzMiBkZWNvZGVkOwotICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iQTsKLSAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkI7Ci0gICAgc3RydWN0IG1iU3RvcmFnZSAqbWJDOwotICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iRDsKLX0gbWJTdG9yYWdlX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwgbWJTdG9yYWdlX3QgKnBNYiwgdTMyIHNsaWNlVHlwZSwKLSAgICB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKLQotdTMyIGgyNjRic2ROdW1NYlBhcnQobWJUeXBlX2UgbWJUeXBlKTsKLXUzMiBoMjY0YnNkTnVtU3ViTWJQYXJ0KHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSk7Ci0KLXN1Yk1iUGFydE1vZGVfZSBoMjY0YnNkU3ViTWJQYXJ0TW9kZShzdWJNYlR5cGVfZSBzdWJNYlR5cGUpOwotCi11MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2sobWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgZHBiU3RvcmFnZV90ICpkcGIsIGkzMiAqcXBZLCB1MzIgbWJOdW0sCi0gICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywgdTgqIGRhdGEpOwotCi11MzIgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpOwotCi1tYlBhcnRQcmVkTW9kZV9lIGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGVfZSBtYlR5cGUpOwotI2lmZGVmIEgyNjRERUNfTkVPTgotdTMyIGgyNjRic2RDbGVhck1iTGF5ZXIobWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCB1MzIgc2l6ZSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTUFDUk9CTE9DS19MQVlFUl9IICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0YzQzYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZU5hbFVuaXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVOYWxVbml0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBOQUwgdW5pdCBoZWFkZXIgaW5mb3JtYXRpb24KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcE5hbFVuaXQgICAgICAgIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlTmFsVW5pdChzdHJtRGF0YV90ICpwU3RybURhdGEsIG5hbFVuaXRfdCAqcE5hbFVuaXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBOYWxVbml0KTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPT0gMCk7Ci0KLSAgICAvKiBmb3JiaWRkZW5femVyb19iaXQgKG5vdCBjaGVja2VkIHRvIGJlIHplcm8sIGVycm9ycyBpZ25vcmVkKSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgLyogQXNzdW1pbmcgdGhhdCBOQUwgdW5pdCBzdGFydHMgZnJvbSBieXRlIGJvdW5kYXJ5IK0+IGRvbid0IGhhdmUgdG8gY2hlY2sKLSAgICAgKiBmb2xsb3dpbmcgNyBiaXRzIGZvciBFTkRfT0ZfU1RSRUFNICovCi0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOwotICAgIHBOYWxVbml0LT5uYWxSZWZJZGMgPSB0bXA7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIHBOYWxVbml0LT5uYWxVbml0VHlwZSA9IChuYWxVbml0VHlwZV9lKXRtcDsKLQotICAgIC8qIGRhdGEgcGFydGl0aW9uaW5nIE5BTCB1bml0cyBub3Qgc3VwcG9ydGVkICovCi0gICAgaWYgKCAodG1wID09IDIpIHx8ICh0bXAgPT0gMykgfHwgKHRtcCA9PSA0KSApCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogbmFsX3JlZl9pZGMgc2hhbGwgbm90IGJlIHplcm8gZm9yIHRoZXNlIG5hbF91bml0X3R5cGVzICovCi0gICAgaWYgKCAoICh0bXAgPT0gTkFMX1NFUV9QQVJBTV9TRVQpIHx8ICh0bXAgPT0gTkFMX1BJQ19QQVJBTV9TRVQpIHx8Ci0gICAgICAgICAgICh0bXAgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikgKSAmJiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwKSApCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIC8qIG5hbF9yZWZfaWRjIHNoYWxsIGJlIHplcm8gZm9yIHRoZXNlIG5hbF91bml0X3R5cGVzICovCi0gICAgZWxzZSBpZiAoICggKHRtcCA9PSBOQUxfU0VJKSB8fCAodG1wID09IE5BTF9BQ0NFU1NfVU5JVF9ERUxJTUlURVIpIHx8Ci0gICAgICAgICAgICAgICAgKHRtcCA9PSBOQUxfRU5EX09GX1NFUVVFTkNFKSB8fCAodG1wID09IE5BTF9FTkRfT0ZfU1RSRUFNKSB8fAotICAgICAgICAgICAgICAgICh0bXAgPT0gTkFMX0ZJTExFUl9EQVRBKSApICYmIChwTmFsVW5pdC0+bmFsUmVmSWRjICE9IDApICkKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk1N2JmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19OQUxfVU5JVF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19OQUxfVU5JVF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgTkFMIHVuaXQgcG9pbnRlZCBieSBwTmFsVW5pdCBjb250YWlucyBhbiBJRFIgc2xpY2UgKi8KLSNkZWZpbmUgSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSBcCi0gICAgKChwTmFsVW5pdCktPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBOQUxfQ09ERURfU0xJQ0UgPSAxLAotICAgIE5BTF9DT0RFRF9TTElDRV9JRFIgPSA1LAotICAgIE5BTF9TRUkgPSA2LAotICAgIE5BTF9TRVFfUEFSQU1fU0VUID0gNywKLSAgICBOQUxfUElDX1BBUkFNX1NFVCA9IDgsCi0gICAgTkFMX0FDQ0VTU19VTklUX0RFTElNSVRFUiA9IDksCi0gICAgTkFMX0VORF9PRl9TRVFVRU5DRSA9IDEwLAotICAgIE5BTF9FTkRfT0ZfU1RSRUFNID0gMTEsCi0gICAgTkFMX0ZJTExFUl9EQVRBID0gMTIsCi0gICAgTkFMX01BWF9UWVBFX1ZBTFVFID0gMzEKLX0gbmFsVW5pdFR5cGVfZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlOwotICAgIHUzMiBuYWxSZWZJZGM7Ci19IG5hbFVuaXRfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkFMX1VOSVRfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNWVlZmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycwotICAgICAgICAgIGgyNjRic2RHZXROZWlnaGJvdXJNYgotICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EKLSAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCCi0gICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQwotICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBGb2xsb3dpbmcgZm91ciB0YWJsZXMgaW5kaWNhdGUgbmVpZ2hib3VycyBvZiBlYWNoIGJsb2NrIG9mIGEgbWFjcm9ibG9jay4KLSAqIEZpcnN0IDE2IHZhbHVlcyBhcmUgZm9yIGx1bWEgYmxvY2tzLCBuZXh0IDQgdmFsdWVzIGZvciBDYiBhbmQgbGFzdCA0Ci0gKiB2YWx1ZXMgZm9yIENyLiBFbGVtZW50cyBvZiB0aGUgdGFibGUgaW5kaWNhdGUgdG8gd2hpY2ggbWFjcm9ibG9jayB0aGUKLSAqIG5laWdoYm91ciBibG9jayBiZWxvbmdzIGFuZCB0aGUgaW5kZXggb2YgdGhlIG5laWdoYm91ciBibG9jayBpbiBxdWVzdGlvbi4KLSAqIEluZGV4aW5nIG9mIHRoZSBibG9ja3MgZ29lcyBhcyBmb2xsb3dzCi0gKgotICogICAgICAgICAgWSAgICAgICAgICAgICBDYiAgICAgICBDcgotICogICAgICAwICAxICA0ICA1ICAgICAgMTYgMTcgICAgMjAgMjEKLSAqICAgICAgMiAgMyAgNiAgNyAgICAgIDE4IDE5ICAgIDIyIDIzCi0gKiAgICAgIDggIDkgMTIgMTMKLSAqICAgICAxMCAxMSAxNCAxNQotICovCi0KLS8qIGxlZnQgbmVpZ2hib3VyIGZvciBlYWNoIGJsb2NrICovCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9BXzR4NEJbMjRdID0gewotICAgIHtNQl9BLDV9LCAgICB7TUJfQ1VSUiwwfSwge01CX0EsN30sICAgIHtNQl9DVVJSLDJ9LAotICAgIHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LAotICAgIHtNQl9BLDEzfSwgICB7TUJfQ1VSUiw4fSwge01CX0EsMTV9LCAgIHtNQl9DVVJSLDEwfSwKLSAgICB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LHtNQl9DVVJSLDExfSx7TUJfQ1VSUiwxNH0sCi0gICAge01CX0EsMTd9LCAgIHtNQl9DVVJSLDE2fSx7TUJfQSwxOX0sICAge01CX0NVUlIsMTh9LAotICAgIHtNQl9BLDIxfSwgICB7TUJfQ1VSUiwyMH0se01CX0EsMjN9LCAgIHtNQl9DVVJSLDIyfSB9OwotCi0vKiBhYm92ZSBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0JfNHg0QlsyNF0gPSB7Ci0gICAge01CX0IsMTB9LCAgIHtNQl9CLDExfSwgICB7TUJfQ1VSUiwwfSwge01CX0NVUlIsMX0sCi0gICAge01CX0IsMTR9LCAgIHtNQl9CLDE1fSwgICB7TUJfQ1VSUiw0fSwge01CX0NVUlIsNX0sCi0gICAge01CX0NVUlIsMn0sIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw4fSwge01CX0NVUlIsOX0sCi0gICAge01CX0NVUlIsNn0sIHtNQl9DVVJSLDd9LCB7TUJfQ1VSUiwxMn0se01CX0NVUlIsMTN9LAotICAgIHtNQl9CLDE4fSwgICB7TUJfQiwxOX0sICAge01CX0NVUlIsMTZ9LHtNQl9DVVJSLDE3fSwKLSAgICB7TUJfQiwyMn0sICAge01CX0IsMjN9LCAgIHtNQl9DVVJSLDIwfSx7TUJfQ1VSUiwyMX0gfTsKLQotLyogYWJvdmUtcmlnaHQgbmVpZ2hib3VyIGZvciBlYWNoIGJsb2NrICovCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9DXzR4NEJbMjRdID0gewotICAgIHtNQl9CLDExfSwgICB7TUJfQiwxNH0sICAge01CX0NVUlIsMX0sIHtNQl9OQSw0fSwKLSAgICB7TUJfQiwxNX0sICAge01CX0MsMTB9LCAgIHtNQl9DVVJSLDV9LCB7TUJfTkEsMH0sCi0gICAge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX05BLDEyfSwKLSAgICB7TUJfQ1VSUiw3fSwge01CX05BLDJ9LCAgIHtNQl9DVVJSLDEzfSx7TUJfTkEsOH0sCi0gICAge01CX0IsMTl9LCAgIHtNQl9DLDE4fSwgICB7TUJfQ1VSUiwxN30se01CX05BLDE2fSwKLSAgICB7TUJfQiwyM30sICAge01CX0MsMjJ9LCAgIHtNQl9DVVJSLDIxfSx7TUJfTkEsMjB9IH07Ci0KLS8qIGFib3ZlLWxlZnQgbmVpZ2hib3VyIGZvciBlYWNoIGJsb2NrICovCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9EXzR4NEJbMjRdID0gewotICAgIHtNQl9ELDE1fSwgICB7TUJfQiwxMH0sICAge01CX0EsNX0sICAgIHtNQl9DVVJSLDB9LAotICAgIHtNQl9CLDExfSwgICB7TUJfQiwxNH0sICAge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LAotICAgIHtNQl9BLDd9LCAgICB7TUJfQ1VSUiwyfSwge01CX0EsMTN9LCAgIHtNQl9DVVJSLDh9LAotICAgIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSwKLSAgICB7TUJfRCwxOX0sICAge01CX0IsMTh9LCAgIHtNQl9BLDE3fSwgICB7TUJfQ1VSUiwxNn0sCi0gICAge01CX0QsMjN9LCAgIHtNQl9CLDIyfSwgICB7TUJfQSwyMX0sICAge01CX0NVUlIsMjB9IH07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBJbml0aWFsaXplIG1hY3JvYmxvY2sgbmVpZ2hib3Vycy4gRnVuY3Rpb24gc2V0cyBuZWlnaGJvdXIKLSAgICAgICAgICAgIG1hY3JvYmxvY2sgcG9pbnRlcnMgaW4gbWFjcm9ibG9jayBzdHJ1Y3R1cmVzIHRvIHBvaW50IHRvCi0gICAgICAgICAgICBtYWNyb2Jsb2NrcyBvbiB0aGUgbGVmdCwgYWJvdmUsIGFib3ZlLXJpZ2h0IGFuZCBhYm92ZS1sZWZ0LgotICAgICAgICAgICAgUG9pbnRlcnMgYXJlIHNldCBOVUxMIGlmIHRoZSBuZWlnaGJvdXIgZG9lcyBub3QgZml0IGludG8gdGhlCi0gICAgICAgICAgICBwaWN0dXJlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICB3aWR0aCBvZiB0aGUgcGljdHVyZSBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgIG5vIG5lZWQgdG8gY2xhcmlmeQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwTWJTdG9yYWdlICAgICAgbmVpZ2hib3VyIHBvaW50ZXJzIG9mIGVhY2ggbWJTdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycyhtYlN0b3JhZ2VfdCAqcE1iU3RvcmFnZSwgdTMyIHBpY1dpZHRoLAotICAgIHUzMiBwaWNTaXplSW5NYnMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHJvdywgY29sOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iU3RvcmFnZSk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoKTsKLSAgICBBU1NFUlQocGljV2lkdGggPD0gcGljU2l6ZUluTWJzKTsKLSAgICBBU1NFUlQoKChwaWNTaXplSW5NYnMgLyBwaWNXaWR0aCkgKiBwaWNXaWR0aCkgPT0gcGljU2l6ZUluTWJzKTsKLQotICAgIHJvdyA9IGNvbCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZUluTWJzOyBpKyspCi0gICAgewotCi0gICAgICAgIGlmIChjb2wpCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQSA9IHBNYlN0b3JhZ2UgKyBpIC0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkEgPSBOVUxMOwotCi0gICAgICAgIGlmIChyb3cpCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQiA9IHBNYlN0b3JhZ2UgKyBpIC0gcGljV2lkdGg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJCID0gTlVMTDsKLQotICAgICAgICBpZiAocm93ICYmIChjb2wgPCBwaWNXaWR0aCAtIDEpKQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkMgPSBwTWJTdG9yYWdlICsgaSAtIChwaWNXaWR0aCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQyA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKHJvdyAmJiBjb2wpCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iRCA9IHBNYlN0b3JhZ2UgKyBpIC0gKHBpY1dpZHRoICsgMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJEID0gTlVMTDsKLQotICAgICAgICBjb2wrKzsKLSAgICAgICAgaWYgKGNvbCA9PSBwaWNXaWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgY29sID0gMDsKLSAgICAgICAgICAgIHJvdysrOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEdldE5laWdoYm91ck1iCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBwb2ludGVyIHRvIG5laWdoYm91ciBtYWNyb2Jsb2NrLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBNYiAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzdHJ1Y3R1cmUgb2YgdGhlIG1hY3JvYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIG5laWdoYm91ciBpcyB3YW50ZWQKLSAgICAgICAgICAgIG5laWdoYm91ciAgIGluZGljYXRlcyB3aGljaCBuZWlnaGJvdXIgaXMgd2FudGVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgbWFjcm9ibG9jawotICAgICAgICAgICAgTlVMTCBpZiBub3QgYXZhaWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLW1iU3RvcmFnZV90KiBoMjY0YnNkR2V0TmVpZ2hib3VyTWIobWJTdG9yYWdlX3QgKnBNYiwgbmVpZ2hib3VyTWJfZSBuZWlnaGJvdXIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCgobmVpZ2hib3VyIDw9IE1CX0NVUlIpIHx8IChuZWlnaGJvdXIgPT0gTUJfTkEpKTsKLQotICAgIGlmIChuZWlnaGJvdXIgPT0gTUJfQSkKLSAgICAgICAgcmV0dXJuKHBNYi0+bWJBKTsKLSAgICBlbHNlIGlmIChuZWlnaGJvdXIgPT0gTUJfQikKLSAgICAgICAgcmV0dXJuKHBNYi0+bWJCKTsKLSAgICBlbHNlIGlmIChuZWlnaGJvdXIgPT0gTUJfQykKLSAgICAgICAgcmV0dXJuKHBNYi0+bWJDKTsKLSAgICBlbHNlIGlmIChuZWlnaGJvdXIgPT0gTUJfRCkKLSAgICAgICAgcmV0dXJuKHBNYi0+bWJEKTsKLSAgICBlbHNlIGlmIChuZWlnaGJvdXIgPT0gTUJfQ1VSUikKLSAgICAgICAgcmV0dXJuKHBNYik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oTlVMTCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBsZWZ0IG5laWdoYm91ciBvZiB0aGUgYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgcG9pbnRlciB0bwotICAgICAgICAgICAgdGhlIHRhYmxlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBibG9ja0luZGV4ICBpbmRpY2F0ZXMgdGhlIGJsb2NrIHdob3NlIG5laWdoYm91cnMgYXJlIHdhbnRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIHN0cnVjdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQSh1MzIgYmxvY2tJbmRleCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOwotCi0gICAgcmV0dXJuKE5fQV80eDRCK2Jsb2NrSW5kZXgpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYWJvdmUgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCi0gICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCi0KLSAgICAgICAgT3V0cHV0czoKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKHUzMiBibG9ja0luZGV4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7Ci0KLSAgICByZXR1cm4oTl9CXzR4NEIrYmxvY2tJbmRleCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBhYm92ZS1yaWdodCAgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyCi0gICAgICAgICAgICB0byB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCi0KLSAgICAgICAgT3V0cHV0czoKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKHUzMiBibG9ja0luZGV4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7Ci0KLSAgICByZXR1cm4oTl9DXzR4NEIrYmxvY2tJbmRleCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tECi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBhYm92ZS1sZWZ0IG5laWdoYm91ciBvZiB0aGUgYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgcG9pbnRlciB0bwotICAgICAgICAgICAgdGhlIHRhYmxlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBibG9ja0luZGV4ICBpbmRpY2F0ZXMgdGhlIGJsb2NrIHdob3NlIG5laWdoYm91cnMgYXJlIHdhbnRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIHN0cnVjdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRCh1MzIgYmxvY2tJbmRleCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOwotCi0gICAgcmV0dXJuKE5fRF80eDRCK2Jsb2NrSW5kZXgpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIG5laWdoYm91ciBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZS4gTmVpZ2hib3VyIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIGlzIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGlmIGl0IGlzIHdpdGhpbiB0aGUgcGljdHVyZSBhbmQgYmVsb25ncwotICAgICAgICAgICAgdG8gdGhlIHNhbWUgc2xpY2UgYXMgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwTWIgICAgICAgICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICAgIHBOZWlnaGJvdXIgIHBvaW50ZXIgdG8gdGhlIG5laWdoYm91ciBtYWNyb2Jsb2NrCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgVFJVRSAgICBuZWlnaGJvdXIgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBGQUxTRSAgIG5laWdoYm91ciBpcyBub3QgYXZhaWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUobWJTdG9yYWdlX3QgKnBNYiwgbWJTdG9yYWdlX3QgKnBOZWlnaGJvdXIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBpZiAoIChwTmVpZ2hib3VyID09IE5VTEwpIHx8IChwTWItPnNsaWNlSWQgIT0gcE5laWdoYm91ci0+c2xpY2VJZCkgKQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2UwYWQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfTkVJR0hCT1VSX0gKLSNkZWZpbmUgSDI2NFNXREVDX05FSUdIQk9VUl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBNQl9BID0gMCwKLSAgICBNQl9CLAotICAgIE1CX0MsCi0gICAgTUJfRCwKLSAgICBNQl9DVVJSLAotICAgIE1CX05BID0gMHhGRgotfSBuZWlnaGJvdXJNYl9lOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgbmVpZ2hib3VyTWJfZSAgIG1iOwotICAgIHU4ICAgICAgICAgICAgIGluZGV4OwotfSBuZWlnaGJvdXJfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzKG1iU3RvcmFnZV90ICpwTWJTdG9yYWdlLCB1MzIgcGljV2lkdGgsCi0gICAgdTMyIHBpY1NpemVJbk1icyk7Ci0KLW1iU3RvcmFnZV90KiBoMjY0YnNkR2V0TmVpZ2hib3VyTWIobWJTdG9yYWdlX3QgKnBNYiwgbmVpZ2hib3VyTWJfZSBuZWlnaGJvdXIpOwotCi11MzIgaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKG1iU3RvcmFnZV90ICpwTWIsIG1iU3RvcmFnZV90ICpwTmVpZ2hib3VyKTsKLQotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EodTMyIGJsb2NrSW5kZXgpOwotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IodTMyIGJsb2NrSW5kZXgpOwotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0ModTMyIGJsb2NrSW5kZXgpOwotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QodTMyIGJsb2NrSW5kZXgpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ORUlHSEJPVVJfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyMzM1Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19vcmRlcl9jbnQuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVQaWNPcmRlckNudAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wdXRlIHBpY3R1cmUgb3JkZXIgY291bnQgZm9yIGEgcGljdHVyZS4gRnVuY3Rpb24gaW1wbGVtZW50cwotICAgICAgICAgICAgY29tcHV0YXRpb24gb2YgYWxsIFBPQyB0eXBlcyAoMCwgMSBhbmQgMiksIHR5cGUgaXMgb2J0YWluZWQgZnJvbQotICAgICAgICAgICAgc3BzLiBTZWUgc3RhbmRhcmQgZm9yIGRlc2NyaXB0aW9uIG9mIHRoZSBQT0MgdHlwZXMgYW5kIGhvdyBQT0MgaXMKLSAgICAgICAgICAgIGNvbXB1dGVkIGZvciBlYWNoIHR5cGUuCi0KLSAgICAgICAgICAgIEZ1bmN0aW9uIHJldHVybnMgdGhlIG1pbmltdW0gb2YgdG9wIGZpZWxkIGFuZCBib3R0b20gZmllbGQgcGljCi0gICAgICAgICAgICBvcmRlciBjb3VudHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcG9jICAgICAgICAgcG9pbnRlciB0byBwcmV2aW91cyByZXN1bHRzCi0gICAgICAgICAgICBzcHMgICAgICAgICBwb2ludGVyIHRvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKLSAgICAgICAgICAgIHNsaWNIZWFkZXIgIHBvaW50ZXIgdG8gY3VycmVudCBzbGljZSBoZWFkZXIsIGZyYW1lIG51bWJlciBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHBhcmFtcyBuZWVkZWQgZm9yIFBPQyBjb21wdXRhdGlvbgotICAgICAgICAgICAgcE5hbFVuaXQgICAgcG9pbnRlciB0byBjdXJyZW50IE5BTCB1bml0IHN0cnVjdHJ1ZSwgZnVuY3Rpb24gbmVlZHMKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIGtub3cgaWYgdGhpcyBpcyBhbiBJRFIgcGljdHVyZSBhbmQgYWxzbyBpZiB0aGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBhIHJlZmVyZW5jZSBwaWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBvYyAgICAgICAgIHJlc3VsdHMgc3RvcmVkIGhlcmUgZm9yIGNvbXB1dGF0aW9uIG9mIG5leHQgUE9DCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBpY3R1cmUgb3JkZXIgY291bnQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaTMyIGgyNjRic2REZWNvZGVQaWNPcmRlckNudChwb2NTdG9yYWdlX3QgKnBvYywgc2VxUGFyYW1TZXRfdCAqc3BzLAotICAgIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlciwgbmFsVW5pdF90ICpwTmFsVW5pdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICBpMzIgcGljT3JkZXJDbnQ7Ci0gICAgdTMyIGZyYW1lTnVtT2Zmc2V0LCBhYnNGcmFtZU51bSwgcGljT3JkZXJDbnRDeWNsZUNudDsKLSAgICB1MzIgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7Ci0gICAgaTMyIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlOwotICAgIHUzMiBjb250YWluc01tY281OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocG9jKTsKLSAgICBBU1NFUlQoc3BzKTsKLSAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKLSAgICBBU1NFUlQocE5hbFVuaXQpOwotICAgIEFTU0VSVChzcHMtPnBpY09yZGVyQ250VHlwZSA8PSAyKTsKLQotI2lmIDAKLSAgICAvKiBKYW5TYTogSSBkb24ndCB0aGluayB0aGlzIGlzIG5lY2Vzc2FyeSwgZG9uJ3Qgc2VlIGFueSByZWFzb24gdG8KLSAgICAgKiBpbmNyZW1lbnQgcHJldkZyYW1lTnVtIG9uZSBieSBvbmUgaW5zdGVhZCBvZiBvbmUgYmlnIGluY3JlbWVudC4KLSAgICAgKiBIb3dldmVyLCBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCB0aGlzIHNob3VsZCBiZSBkb25lIC0+IGlmIHNvbWVvbmUKLSAgICAgKiBmaWd1cmVzIG91dCBhbnkgY2FzZSB3aGVuIHRoZSBvdXRjb21lIHdvdWxkIGJlIGRpZmZlcmVudCBmb3Igc3RlcCBieQotICAgICAqIHN0ZXAgaW5jcmVtZW50LCB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgc2hvdWxkIGJlIGVuYWJsZWQgKi8KLQotICAgIC8qIGlmIHRoZXJlIHdhcyBhIGdhcCBpbiBmcmFtZSBudW1iZXJpbmcgYW5kIHBpY09yZGVyQ250VHlwZSBpcyAxIG9yIDIgLT4KLSAgICAgKiAiY29tcHV0ZSIgcGljIG9yZGVyIGNvdW50cyBmb3Igbm9uLWV4aXN0aW5nIGZyYW1lcy4gVGhlc2UgYXJlIG5vdAotICAgICAqIGFjdHVhbGx5IGNvbXB1dGVkLCBidXQgcHJvY2VzcyBuZWVkcyB0byBiZSBkb25lIHRvIHVwZGF0ZSB0aGUKLSAgICAgKiBwcmV2RnJhbWVOdW0gYW5kIHByZXZGcmFtZU51bU9mZnNldCAqLwotICAgIGlmICggc3BzLT5waWNPcmRlckNudFR5cGUgPiAwICYmCi0gICAgICAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtICE9IHBvYy0+cHJldkZyYW1lTnVtICYmCi0gICAgICAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtICE9ICgocG9jLT5wcmV2RnJhbWVOdW0gKyAxKSAlIHNwcy0+bWF4RnJhbWVOdW0pKQotICAgIHsKLQotICAgICAgICAvKiB1c2UgdmFyaWFibGUgaSBmb3IgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKi8KLSAgICAgICAgaSA9IChwb2MtPnByZXZGcmFtZU51bSArIDEpICUgc3BzLT5tYXhGcmFtZU51bTsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG9jLT5wcmV2RnJhbWVOdW0gPiBpKQotICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyBzcHMtPm1heEZyYW1lTnVtOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQ7Ci0KLSAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7Ci0gICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IGk7Ci0KLSAgICAgICAgICAgIGkgPSAoaSArIDEpICUgc3BzLT5tYXhGcmFtZU51bTsKLQotICAgICAgICB9IHdoaWxlIChpICE9IHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogY2hlY2sgaWYgY3VycmVudCBzbGljZSBpbmNsdWRlcyBtbWNvIGVxdWFsIHRvIDUgKi8KLSAgICBjb250YWluc01tY281ID0gSEFOVFJPX0ZBTFNFOwotICAgIGlmIChwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcuYWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCi0gICAgewotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5vcGVyYXRpb25baV0uCi0gICAgICAgICAgICBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5vcGVyYXRpb25baV0uCi0gICAgICAgICAgICAgICAgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24gPT0gNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250YWluc01tY281ID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3dpdGNoIChzcHMtPnBpY09yZGVyQ250VHlwZSkKLSAgICB7Ci0KLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgLyogc2V0IHByZXZQaWNPcmRlckNudCB2YWx1ZXMgZm9yIElEUiBmcmFtZSAqLwotICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOwotICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogY29tcHV0ZSBwaWNPcmRlckNudE1zYiAoc3RvcmVkIGluIHBpY09yZGVyQ250IHZhcmlhYmxlKSAqLwotICAgICAgICAgICAgaWYgKCAocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA8IHBvYy0+cHJldlBpY09yZGVyQ250THNiKSAmJgotICAgICAgICAgICAgICAgICgocG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgLSBwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiKSA+PQotICAgICAgICAgICAgICAgICBzcHMtPm1heFBpY09yZGVyQ250THNiLzIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiICsKLSAgICAgICAgICAgICAgICAgICAgKGkzMilzcHMtPm1heFBpY09yZGVyQ250THNiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPiBwb2MtPnByZXZQaWNPcmRlckNudExzYikgJiYKLSAgICAgICAgICAgICAgICAoKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgLSBwb2MtPnByZXZQaWNPcmRlckNudExzYikgPgotICAgICAgICAgICAgICAgICBzcHMtPm1heFBpY09yZGVyQ250THNiLzIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiIC0KLSAgICAgICAgICAgICAgICAgICAgKGkzMilzcHMtPm1heFBpY09yZGVyQ250THNiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gcG9jLT5wcmV2UGljT3JkZXJDbnRNc2I7Ci0KLSAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHByZXZQaWNPcmRlckNudE1zYiBpcyBmcm9tIHByZXZpb3VzCi0gICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgLT4gcmVwbGFjZSBvbGQgdmFsdWUgb25seSBpZiBjdXJyZW50IGZyYW1lIGlzCi0gICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjKQotICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250TXNiID0gcGljT3JkZXJDbnQ7Ci0KLSAgICAgICAgICAgIC8qIGNvbXB1dGUgdG9wIGZpZWxkIG9yZGVyIGNudCAoc3RvcmVkIGluIHBpY09yZGVyQ250KSAqLwotICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gKGkzMilwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiOwotCi0gICAgICAgICAgICAvKiBpZiBkZWx0YSBmb3IgYm90dG9tIGZpZWxkIGlzIG5lZ2F0aXZlIC0+IGJvdHRvbSB3aWxsIGJlIHRoZQotICAgICAgICAgICAgICogbWluaW11bSBwaWMgb3JkZXIgY291bnQgKi8KLSAgICAgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20gPCAwKQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbTsKLQotICAgICAgICAgICAgLyogc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgcHJldlBpY09yZGVyQ250THNiIGlzIGZyb20gcHJldmlvdXMKLSAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAtPiByZXBsYWNlIG9sZCB2YWx1ZSBvbmx5IGlmIGN1cnJlbnQgZnJhbWUgaXMKLSAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaWYgY3VycmVudCBmcmFtZSBjb250YWlucyBtbWNvNSAtPiBtb2RpZnkgdmFsdWVzIHRvIGJlCi0gICAgICAgICAgICAgICAgICogc3RvcmVkICovCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zTW1jbzUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudE1zYiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHByZXZQaWNPcmRlckNudExzYiBzaG91bGQgYmUgdGhlIHRvcCBmaWVsZCBwaWNPcmRlckNudAotICAgICAgICAgICAgICAgICAgICAgKiBpZiBwcmV2aW91cyBmcmFtZSBpbmNsdWRlZCBtbWNvNS4gVG9wIGZpZWxkIHBpY09yZGVyQ250Ci0gICAgICAgICAgICAgICAgICAgICAqIGZvciBmcmFtZXMgY29udGFpbmluZyBtbWNvNSBpcyBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZwotICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcGljT3JkZXJDbnQgZnJvbSBvcmlnaW5hbCB0b3AgZmllbGQgb3JkZXIgY291bnQgLT4KLSAgICAgICAgICAgICAgICAgICAgICogdmFsdWUgaXMgemVybyBpZiB0b3AgZmllbGQgd2FzIHRoZSBtaW5pbXVtLCBpLmUuIGRlbHRhCi0gICAgICAgICAgICAgICAgICAgICAqIGZvciBib3R0b20gd2FzIHBvc2l0aXZlLCBvdGhlcndpc2UgdmFsdWUgaXMKLSAgICAgICAgICAgICAgICAgICAgICogLWRlbHRhUGljT3JkZXJDbnRCb3R0b20gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoLXBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9IHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6Ci0KLSAgICAgICAgICAgIC8qIHN0ZXAgMSAoaW4gdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBzdGFuZGFyZCkgKi8KLSAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQotICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OwotCi0gICAgICAgICAgICAvKiBzdGVwIDIgKi8KLSAgICAgICAgICAgIGlmIChzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKLSAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSA9IGZyYW1lTnVtT2Zmc2V0ICsgcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDAgJiYgYWJzRnJhbWVOdW0gPiAwKQotICAgICAgICAgICAgICAgIGFic0ZyYW1lTnVtIC09IDE7Ci0KLSAgICAgICAgICAgIC8qIHN0ZXAgMyAqLwotICAgICAgICAgICAgaWYgKGFic0ZyYW1lTnVtID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudEN5Y2xlQ250ID0KLSAgICAgICAgICAgICAgICAgICAgKGFic0ZyYW1lTnVtIC0gMSkvc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7Ci0gICAgICAgICAgICAgICAgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUgPQotICAgICAgICAgICAgICAgICAgICAoYWJzRnJhbWVOdW0gLSAxKSVzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogc3RlcCA0ICovCi0gICAgICAgICAgICBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKLSAgICAgICAgICAgICAgICBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZSArPSBzcHMtPm9mZnNldEZvclJlZkZyYW1lW2ldOwotCi0gICAgICAgICAgICAvKiBzdGVwIDUgKHBpY09yZGVyQ250IHVzZWQgdG8gc3RvcmUgZXhwZWN0ZWRQaWNPcmRlckNudCkgKi8KLSAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQscGljT3JkZXJDbnRDeWNsZUNudCkgYWx3YXlzIGluaXRpYWxpemVkICovCi0gICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlKSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgIGlmIChhYnNGcmFtZU51bSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQotICAgICAgICAgICAgICAgICAgICAoaTMyKXBpY09yZGVyQ250Q3ljbGVDbnQgKiBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOwotCi0gICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwKQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yTm9uUmVmUGljOwotCi0gICAgICAgICAgICAvKiBzdGVwIDYgKHBpY09yZGVyQ250IGlzIHRvcCBmaWVsZCBvcmRlciBjbnQgaWYgZGVsdGEgZm9yIGJvdHRvbQotICAgICAgICAgICAgICogaXMgcG9zaXRpdmUsIG90aGVyd2lzZSBpdCBpcyBib3R0b20gZmllbGQgb3JkZXIgY250KSAqLwotICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdOwotCi0gICAgICAgICAgICBpZiAoIChzcHMtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgKwotICAgICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV0pIDwgMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gc3BzLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICsKLSAgICAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBpZiBjdXJyZW50IHBpY3R1cmUgY29udGFpbnMgbW1jbzUgLT4gc2V0IHByZXZGcmFtZU51bU9mZnNldCBhbmQKLSAgICAgICAgICAgICAqIHByZXZGcmFtZU51bSB0byAwIGZvciBjb21wdXRhdGlvbiBvZiBwaWNPcmRlckNudCBvZiBuZXh0Ci0gICAgICAgICAgICAgKiBmcmFtZSwgb3RoZXJ3aXNlIHN0b3JlIGZyYW1lTnVtIGFuZCBmcmFtZU51bU9mZnNldCB0byBwb2MKLSAgICAgICAgICAgICAqIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgaWYgKCFjb250YWluc01tY281KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSBwU2xpY2VIZWFkZXItPmZyYW1lTnVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IDA7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogY2FzZSAyICovCi0gICAgICAgICAgICAvKiBkZXJpdmUgZnJhbWVOdW1PZmZzZXQgKi8KLSAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQotICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OwotCi0gICAgICAgICAgICAvKiBkZXJpdmUgcGljT3JkZXJDbnQgKHR5cGUgMiBoYXMgc2FtZSB2YWx1ZSBmb3IgdG9wIGFuZCBib3R0b20KLSAgICAgICAgICAgICAqIGZpZWxkIG9yZGVyIGNudHMpICovCi0gICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDApCi0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQotICAgICAgICAgICAgICAgICAgICAyICogKGkzMikoZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKSAtIDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQotICAgICAgICAgICAgICAgICAgICAyICogKGkzMikoZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKTsKLQotICAgICAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIGNvbnRhaW5zIG1tY281IC0+IHNldCBwcmV2RnJhbWVOdW1PZmZzZXQgYW5kCi0gICAgICAgICAgICAgKiBwcmV2RnJhbWVOdW0gdG8gMCBmb3IgY29tcHV0YXRpb24gb2YgcGljT3JkZXJDbnQgb2YgbmV4dAotICAgICAgICAgICAgICogZnJhbWUsIG90aGVyd2lzZSBzdG9yZSBmcmFtZU51bSBhbmQgZnJhbWVOdW1PZmZzZXQgdG8gcG9jCi0gICAgICAgICAgICAgKiBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIGlmICghY29udGFpbnNNbWNvNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IGZyYW1lTnVtT2Zmc2V0OwotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSAwOwotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gICAgLypsaW50IC1lc3ltKDY0NCxwaWNPcmRlckNudCkgYWx3YXlzIGluaXRpYWxpemVkICovCi0gICAgcmV0dXJuKHBpY09yZGVyQ250KTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk3NDFlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19QSUNfT1JERVJfQ05UX0gKLSNkZWZpbmUgSDI2NFNXREVDX1BJQ19PUkRFUl9DTlRfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgaW5mb3JtYXRpb24gY29tcHV0ZWQgZm9yIHByZXZpb3VzIHBpY3R1cmUsIG5lZWRlZCBmb3IKLSAqIFBPQyBjb21wdXRhdGlvbiBvZiBhIHBpY3R1cmUuIFR3byBmaXJzdCBmaWVsZHMgZm9yIFBPQyB0eXBlIDAsIGxhc3QgdHdvCi0gKiBmb3IgdHlwZXMgMSBhbmQgMiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcHJldlBpY09yZGVyQ250THNiOwotICAgIGkzMiBwcmV2UGljT3JkZXJDbnRNc2I7Ci0gICAgdTMyIHByZXZGcmFtZU51bTsKLSAgICB1MzIgcHJldkZyYW1lTnVtT2Zmc2V0OwotfSBwb2NTdG9yYWdlX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaTMyIGgyNjRic2REZWNvZGVQaWNPcmRlckNudChwb2NTdG9yYWdlX3QgKnBvYywgc2VxUGFyYW1TZXRfdCAqc3BzLAotICAgIHNsaWNlSGVhZGVyX3QgKnNsaWNlSGVhZGVyLCBuYWxVbml0X3QgKnBOYWxVbml0KTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfUElDX09SREVSX0NOVF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDRkZWE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVQaWNQYXJhbVNldAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogbG9va3VwIHRhYmxlIGZvciBjZWlsKGxvZzIobnVtU2xpY2VHcm91cHMpKSwgaS5lLiBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8KLSAqIHJlcHJlc2VudCByYW5nZSBbMCwgbnVtU2xpY2VHcm91cHMpCi0gKgotICogTk9URTogaWYgTUFYX05VTV9TTElDRV9HUk9VUFMgaXMgaGlnaGVyIHRoYW4gOCB0aGlzIHRhYmxlIGhhcyB0byBiZSByZXNpemVkCi0gKiBhY2NvcmRpbmdseSAqLwotc3RhdGljIGNvbnN0IHUzMiBDZWlsTG9nMk51bVNsaWNlR3JvdXBzWzhdID0gezEsIDEsIDIsIDIsIDMsIDMsIDMsIDN9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgICAgIEZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yCi0gICAgICAgICAgICAgICAgLSBydW4gbGVuZ3RocyBpZiBzbGljZSBncm91cCBtYXAgdHlwZSBpcyAwCi0gICAgICAgICAgICAgICAgLSB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0IGFycmF5cyBpZiBtYXAgdHlwZSBpcyAyCi0gICAgICAgICAgICAgICAgLSBmb3Igc2xpY2UgZ3JvdXAgaWRzIGlmIG1hcCB0eXBlIGlzIDYKLQotICAgICAgICAgICAgVmFsaWRpdHkgb2Ygc29tZSBvZiB0aGUgc2xpY2UgZ3JvdXAgbWFwcGluZyBpbmZvcm1hdGlvbiBkZXBlbmRzCi0gICAgICAgICAgICBvbiB0aGUgaW1hZ2UgZGltZW5zaW9ucyB3aGljaCBhcmUgbm90IGtub3duIGhlcmUuIFRoZXJlZm9yZSB0aGUKLSAgICAgICAgICAgIHZhbGlkaXR5IGhhcyB0byBiZSBjaGVja2VkIGFmdGVyd2FyZHMsIGN1cnJlbnRseSBpbiB0aGUgcGFyYW1ldGVyCi0gICAgICAgICAgICBzZXQgYWN0aXZhdGlvbiBwaGFzZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIGRlY29kZWQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBpbnZhbGlkIGluZm9ybWF0aW9uIG9yIGVuZCBvZiBzdHJlYW0KLSAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVQaWNQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKLSAgICBpMzIgaXRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7Ci0KLQotICAgIEgyNjRTd0RlY01lbXNldChwUGljUGFyYW1TZXQsIDAsIHNpemVvZihwaWNQYXJhbVNldF90KSk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkID49IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpCi0gICAgewotICAgICAgICBFUFJJTlQoInBpY19wYXJhbWV0ZXJfc2V0X2lkIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkID49IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpCi0gICAgewotICAgICAgICBFUFJJTlQoInNlcV9wYXJhbV9zZXRfaWQiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZywgc2hhbGwgYmUgMCBmb3IgYmFzZWxpbmUgcHJvZmlsZSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIC8qIG51bV9zbGljZV9ncm91cHNfbWludXMxICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyA9IHZhbHVlICsgMTsKLSAgICBpZiAocFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyA+IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogZGVjb2RlIHNsaWNlIGdyb3VwIG1hcHBpbmcgaW5mb3JtYXRpb24gaWYgbW9yZSB0aGFuIG9uZSBzbGljZSBncm91cHMgKi8KLSAgICBpZiAocFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyA+IDEpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA+IDYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgic2xpY2VfZ3JvdXBfbWFwX3R5cGUiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+cnVuTGVuZ3RoLAotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMsIHUzMik7Ci0gICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5ydW5MZW5ndGggPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnJ1bkxlbmd0aFtpXSA9IHZhbHVlKzE7Ci0gICAgICAgICAgICAgICAgLyogcGFyYW0gdmFsdWVzIGNoZWNrZWQgaW4gQ2hlY2tQcHMoKSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgQUxMT0NBVEUocFBpY1BhcmFtU2V0LT50b3BMZWZ0LAotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgLSAxLCB1MzIpOwotICAgICAgICAgICAgQUxMT0NBVEUocFBpY1BhcmFtU2V0LT5ib3R0b21SaWdodCwKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMSwgdTMyKTsKLSAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnRvcExlZnQgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgLSAxOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT50b3BMZWZ0W2ldID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5ib3R0b21SaWdodFtpXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIC8qIHBhcmFtIHZhbHVlcyBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMykgfHwKLSAgICAgICAgICAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDQpIHx8Ci0gICAgICAgICAgICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyA9Ci0gICAgICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSA9IHZhbHVlICsgMTsKLSAgICAgICAgICAgIC8qIHBhcmFtIHZhbHVlIGNoZWNrZWQgaW4gQ2hlY2tQcHMoKSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNikKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5waWNTaXplSW5NYXBVbml0cyA9IHZhbHVlICsgMTsKLQotICAgICAgICAgICAgQUxMT0NBVEUocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWQsCi0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5waWNTaXplSW5NYXBVbml0cywgdTMyKTsKLSAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBJZCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICAgICAgICAgIC8qIGRldGVybWluZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHJhbmdlCi0gICAgICAgICAgICAgKiBbMCwgbnVtU2xpY2VHcm91cHMpICovCi0gICAgICAgICAgICB0bXAgPSBDZWlsTG9nMk51bVNsaWNlR3JvdXBzW3BQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMtMV07Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPnBpY1NpemVJbk1hcFVuaXRzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWRbaV0gPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHRtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKCBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBJZFtpXSA+PQotICAgICAgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2dyb3VwX2lkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHZhbHVlID4gMzEpCi0gICAgewotICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICBwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlID0gdmFsdWUgKyAxOwotCi0gICAgLyogbnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICh2YWx1ZSA+IDMxKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiB3ZWlnaHRlZF9wcmVkX2ZsYWcsIHRoaXMgc2hhbGwgYmUgMCBmb3IgYmFzZWxpbmUgcHJvZmlsZSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgid2VpZ2h0ZWRfcHJlZF9mbGFnIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiB3ZWlnaHRlZF9iaXByZWRfaWRjICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKLSAgICBpZiAodG1wID4gMikKLSAgICB7Ci0gICAgICAgIEVQUklOVCgid2VpZ2h0ZWRfYmlwcmVkX2lkYyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogcGljX2luaXRfcXBfbWludXMyNiAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICgoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkpCi0gICAgewotICAgICAgICBFUFJJTlQoInBpY19pbml0X3FwX21pbnVzMjYiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICBwUGljUGFyYW1TZXQtPnBpY0luaXRRcCA9ICh1MzIpKGl0bXAgKyAyNik7Ci0KLSAgICAvKiBwaWNfaW5pdF9xc19taW51czI2ICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKChpdG1wIDwgLTI2KSB8fCAoaXRtcCA+IDI1KSkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgicGljX2luaXRfcXNfbWludXMyNiIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKChpdG1wIDwgLTEyKSB8fCAoaXRtcCA+IDEyKSkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiY2hyb21hX3FwX2luZGV4X29mZnNldCIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIHBQaWNQYXJhbVNldC0+Y2hyb21hUXBJbmRleE9mZnNldCA9IGl0bXA7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBQaWNQYXJhbVNldC0+ZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZyA9Ci0gICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFBpY1BhcmFtU2V0LT5jb25zdHJhaW5lZEludHJhUHJlZEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHBTdHJtRGF0YSk7Ci0KLSAgICAvKiBpZ25vcmUgcG9zc2libGUgZXJyb3JzIGluIHRyYWlsaW5nIGJpdHMgb2YgcGFyYW1ldGVycyBzZXRzICovCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjg2MzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19QSUNfUEFSQU1fU0VUX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgUFBTIGluZm9ybWF0aW9uIGRlY29kZWQgZnJvbSB0aGUgc3RyZWFtICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwaWNQYXJhbWV0ZXJTZXRJZDsKLSAgICB1MzIgc2VxUGFyYW1ldGVyU2V0SWQ7Ci0gICAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWc7Ci0gICAgdTMyIG51bVNsaWNlR3JvdXBzOwotICAgIHUzMiBzbGljZUdyb3VwTWFwVHlwZTsKLSAgICB1MzIgKnJ1bkxlbmd0aDsKLSAgICB1MzIgKnRvcExlZnQ7Ci0gICAgdTMyICpib3R0b21SaWdodDsKLSAgICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0gICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VSYXRlOwotICAgIHUzMiBwaWNTaXplSW5NYXBVbml0czsKLSAgICB1MzIgKnNsaWNlR3JvdXBJZDsKLSAgICB1MzIgbnVtUmVmSWR4TDBBY3RpdmU7Ci0gICAgdTMyIHBpY0luaXRRcDsKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldDsKLSAgICB1MzIgZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZzsKLSAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnOwotICAgIHUzMiByZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZzsKLX0gcGljUGFyYW1TZXRfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19QSUNfUEFSQU1fU0VUX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOWEwNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9yZWNvbnN0cnVjdC5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgotICogSW5mbyA3MDE6IFNoaWZ0IGxlZnQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKi8KLS8qbGludCAtZTcwMSAtZTcwMiAqLwotCi0vKiBMdW1hIGZyYWN0aW9uYWwtc2FtcGxlIHBvc2l0aW9ucwotICoKLSAqICBHIGEgYiBjIEgKLSAqICBkIGUgZiBnCi0gKiAgaCBpIGogayBtCi0gKiAgbiBwIHEgcgotICogIE0gICBzICAgTgotICoKLSAqICBHLCBILCBNIGFuZCBOIGFyZSBpbnRlZ2VyIHNhbXBsZSBwb3NpdGlvbnMKLSAqICBhLXMgYXJlIGZyYWN0aW9uYWwgc2FtcGxlcyB0aGF0IG5lZWQgdG8gYmUgaW50ZXJwb2xhdGVkLgotICovCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLXN0YXRpYyBjb25zdCB1MzIgbHVtYUZyYWNQb3NbNF1bNF0gPSB7Ci0gIC8qIEcgIGQgIGggIG4gICAgYSAgZSAgaSAgcCAgICBiICBmICBqICAgcSAgICAgYyAgIGcgICBrICAgciAqLwotICAgIHswLCAxLCAyLCAzfSwgezQsIDUsIDYsIDd9LCB7OCwgOSwgMTAsIDExfSwgezEyLCAxMywgMTQsIDE1fX07Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKiBjbGlwcGluZyB0YWJsZSwgZGVmaW5lZCBpbiBoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyAqLwotZXh0ZXJuIGNvbnN0IHU4IGgyNjRic2RDbGlwW107Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRlcnBvbGF0aW9uIGluIGhvcml6b250YWwgZGlyZWN0aW9uLgotICAgICAgICAgIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZSBpbWFnZSAocFJlZikgaXMKLSAgICAgICAgICByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydCBpcyB3cml0dGVuIHRvCi0gICAgICAgICAgbWFjcm9ibG9jaydzIGNocm9taW5hbmNlIChwcmVkUGFydENocm9tYSkKLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBSZWYgICAgICAgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lIENiIHRvcC1sZWZ0IGNvcm5lcgotICAgICAgICAgIHgwICAgICAgICAgICAgICAgIGludGVnZXIgeC1jb29yZGluYXRlIGZvciBwcmVkaWN0aW9uCi0gICAgICAgICAgeTAgICAgICAgICAgICAgICAgaW50ZWdlciB5LWNvb3JkaW5hdGUgZm9yIHByZWRpY3Rpb24KLSAgICAgICAgICB3aWR0aCAgICAgICAgICAgICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGNocm9taW5hbmNlIGluIHBpeGVscwotICAgICAgICAgIGhlaWdodCAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGNocm9taW5hbmNlIGluIHBpeGVscwotICAgICAgICAgIHhGcmFjICAgICAgICAgICAgIGhvcml6b250YWwgZnJhY3Rpb24gZm9yIHByZWRpY3Rpb24gaW4gMS84IHBpeGVscwotICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCAgIHdpZHRoIG9mIHRoZSBwcmVkaWN0ZWQgcGFydCBpbiBwaXhlbHMKLSAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICBoZWlnaHQgb2YgdGhlIHByZWRpY3RlZCBwYXJ0IGluIHBpeGVscwotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHByZWRQYXJ0Q2hyb21hICAgIHBvaW50ZXIgd2hlcmUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX0FSTTExCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcigKLSAgdTggKnBSZWYsCi0gIHU4ICpwcmVkUGFydENocm9tYSwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHhGcmFjLAotICB1MzIgY2hyb21hUGFydFdpZHRoLAotICB1MzIgY2hyb21hUGFydEhlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgeCwgeSwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgYywgdmFsOwotICAgIHU4ICpwdHJBLCAqY2JyOwotICAgIHUzMiBjb21wOwotICAgIHU4IGJsb2NrWzkqOCoyXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHByZWRQYXJ0Q2hyb21hKTsKLSAgICBBU1NFUlQoY2hyb21hUGFydFdpZHRoKTsKLSAgICBBU1NFUlQoY2hyb21hUGFydEhlaWdodCk7Ci0gICAgQVNTRVJUKHhGcmFjIDwgOCk7Ci0gICAgQVNTRVJUKHBSZWYpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2Nocm9tYVBhcnRXaWR0aCsxID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2Nocm9tYVBhcnRIZWlnaHQgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhwUmVmLCBibG9jaywgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgY2hyb21hUGFydFdpZHRoICsgMSwgY2hyb21hUGFydEhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSk7Ci0gICAgICAgIHBSZWYgKz0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2sgKyAoY2hyb21hUGFydFdpZHRoKzEpKmNocm9tYVBhcnRIZWlnaHQsCi0gICAgICAgICAgICB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKLQotICAgICAgICBwUmVmID0gYmxvY2s7Ci0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICB3aWR0aCA9IGNocm9tYVBhcnRXaWR0aCsxOwotICAgICAgICBoZWlnaHQgPSBjaHJvbWFQYXJ0SGVpZ2h0OwotICAgIH0KLQotICAgIHZhbCA9IDggLSB4RnJhYzsKLQotICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPD0gMTsgY29tcCsrKQotICAgIHsKLQotICAgICAgICBwdHJBID0gcFJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOwotICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKLQotICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgICAgICAqIGJpbGluZWFyIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBmb3IgKHkgPSAoY2hyb21hUGFydEhlaWdodCA+PiAxKTsgeTsgeS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHggPSAoY2hyb21hUGFydFdpZHRoID4+IDEpOyB4OyB4LS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgICAgIHRtcDIgPSAqcHRyQSsrOwotICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXA0ID0gKnB0ckErKzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAxICsgeEZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMiArIHhGcmFjICogdG1wNCkgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOwotICAgICAgICAgICAgICAgIHRtcDEgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gKnB0ckE7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMyArIHhGcmFjICogdG1wMSkgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDQgKyB4RnJhYyAqIHRtcDIpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNiciArPSAyKjggLSBjaHJvbWFQYXJ0V2lkdGg7Ci0gICAgICAgICAgICBwdHJBICs9IDIqd2lkdGggLSBjaHJvbWFQYXJ0V2lkdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2hyb21hIGludGVycG9sYXRpb24gaW4gdmVydGljYWwgZGlyZWN0aW9uLgotICAgICAgICAgIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZSBpbWFnZSAocFJlZikgaXMKLSAgICAgICAgICByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydCBpcyB3cml0dGVuIHRvCi0gICAgICAgICAgbWFjcm9ibG9jaydzIGNocm9taW5hbmNlIChwcmVkUGFydENocm9tYSkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIoCi0gIHU4ICpwUmVmLAotICB1OCAqcHJlZFBhcnRDaHJvbWEsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiB5RnJhYywKLSAgdTMyIGNocm9tYVBhcnRXaWR0aCwKLSAgdTMyIGNocm9tYVBhcnRIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIGMsIHZhbDsKLSAgICB1OCAqcHRyQSwgKmNicjsKLSAgICB1MzIgY29tcDsKLSAgICB1OCBibG9ja1s5KjgqMl07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwcmVkUGFydENocm9tYSk7Ci0gICAgQVNTRVJUKGNocm9tYVBhcnRXaWR0aCk7Ci0gICAgQVNTRVJUKGNocm9tYVBhcnRIZWlnaHQpOwotICAgIEFTU0VSVCh5RnJhYyA8IDgpOwotICAgIEFTU0VSVChwUmVmKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGggPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArY2hyb21hUGFydEhlaWdodCsxID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2ssIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoLAotICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCArIDEsIGNocm9tYVBhcnRXaWR0aCk7Ci0gICAgICAgIHBSZWYgKz0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2sgKyBjaHJvbWFQYXJ0V2lkdGgqKGNocm9tYVBhcnRIZWlnaHQrMSksCi0gICAgICAgICAgICB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwKLSAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGgpOwotCi0gICAgICAgIHBSZWYgPSBibG9jazsKLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHdpZHRoID0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICBoZWlnaHQgPSBjaHJvbWFQYXJ0SGVpZ2h0KzE7Ci0gICAgfQotCi0gICAgdmFsID0gOCAtIHlGcmFjOwotCi0gICAgZm9yIChjb21wID0gMDsgY29tcCA8PSAxOyBjb21wKyspCi0gICAgewotCi0gICAgICAgIHB0ckEgPSBwUmVmICsgKGNvbXAgKiBoZWlnaHQgKyAodTMyKXkwKSAqIHdpZHRoICsgeDA7Ci0gICAgICAgIGNiciA9IHByZWRQYXJ0Q2hyb21hICsgY29tcCAqIDggKiA4OwotCi0gICAgICAgIC8qIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICAgICAgICogYmlsaW5lYXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBmb3IgKHkgPSAoY2hyb21hUGFydEhlaWdodCA+PiAxKTsgeTsgeS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHggPSAoY2hyb21hUGFydFdpZHRoID4+IDEpOyB4OyB4LS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGgqMl07Ci0gICAgICAgICAgICAgICAgdG1wMiA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgICAgIHRtcDEgPSAqcHRyQSsrOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDIgKyB5RnJhYyAqIHRtcDMpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAxICsgeUZyYWMgKiB0bXAyKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGgqMl07Ci0gICAgICAgICAgICAgICAgdG1wMiA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgICAgIHRtcDEgPSAqcHRyQSsrOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDIgKyB5RnJhYyAqIHRtcDMpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAxICsgeUZyYWMgKiB0bXAyKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRlcnBvbGF0aW9uIGluIGhvcml6b250YWwgYW5kCi0gICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKLSAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAotICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jaydzIGNocm9taW5hbmNlIChwcmVkUGFydENocm9tYSkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICpwcmVkUGFydENocm9tYSwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHhGcmFjLAotICB1MzIgeUZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KQotewotICAgIHU4IGJsb2NrWzkqOSoyXTsKLSAgICB1MzIgeCwgeSwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdmFsWCwgdmFsWSwgcGx1czMyID0gMzI7Ci0gICAgdTMyIGNvbXA7Ci0gICAgdTggKnB0ckEsICpjYnI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwcmVkUGFydENocm9tYSk7Ci0gICAgQVNTRVJUKGNocm9tYVBhcnRXaWR0aCk7Ci0gICAgQVNTRVJUKGNocm9tYVBhcnRIZWlnaHQpOwotICAgIEFTU0VSVCh4RnJhYyA8IDgpOwotICAgIEFTU0VSVCh5RnJhYyA8IDgpOwotICAgIEFTU0VSVChyZWYpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2Nocm9tYVBhcnRXaWR0aCsxID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2Nocm9tYVBhcnRIZWlnaHQrMSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgYmxvY2ssIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCArIDEsIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKLSAgICAgICAgcmVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgYmxvY2sgKyAoY2hyb21hUGFydFdpZHRoKzEpKihjaHJvbWFQYXJ0SGVpZ2h0KzEpLAotICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxLAotICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCArIDEsIGNocm9tYVBhcnRXaWR0aCArIDEpOwotCi0gICAgICAgIHJlZiA9IGJsb2NrOwotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgd2lkdGggPSBjaHJvbWFQYXJ0V2lkdGgrMTsKLSAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodCsxOwotICAgIH0KLQotICAgIHZhbFggPSA4IC0geEZyYWM7Ci0gICAgdmFsWSA9IDggLSB5RnJhYzsKLQotICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPD0gMTsgY29tcCsrKQotICAgIHsKLQotICAgICAgICBwdHJBID0gcmVmICsgKGNvbXAgKiBoZWlnaHQgKyAodTMyKXkwKSAqIHdpZHRoICsgeDA7Ci0gICAgICAgIGNiciA9IHByZWRQYXJ0Q2hyb21hICsgY29tcCAqIDggKiA4OwotCi0gICAgICAgIC8qIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICAgICAgICogYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBmb3IgKHkgPSAoY2hyb21hUGFydEhlaWdodCA+PiAxKTsgeTsgeS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckE7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICB0bXA1ID0gcHRyQVt3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDEgKj0gdmFsWTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMyAqIHlGcmFjOwotICAgICAgICAgICAgdG1wMyAqPSB2YWxZOwotICAgICAgICAgICAgdG1wMyArPSB0bXA1ICogeUZyYWM7Ci0gICAgICAgICAgICBmb3IgKHggPSAoY2hyb21hUGFydFdpZHRoID4+IDEpOyB4OyB4LS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICorK3B0ckE7Ci0gICAgICAgICAgICAgICAgdG1wNCA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgICAgIHRtcDYgPSBwdHJBW3dpZHRoKjJdOwotICAgICAgICAgICAgICAgIHRtcDIgKj0gdmFsWTsKLSAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDQgKiB5RnJhYzsKLSAgICAgICAgICAgICAgICB0bXA0ICo9IHZhbFk7Ci0gICAgICAgICAgICAgICAgdG1wNCArPSB0bXA2ICogeUZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IHRtcDEgKiB2YWxYICsgcGx1czMyOwotICAgICAgICAgICAgICAgIHRtcDMgPSB0bXAzICogdmFsWCArIHBsdXMzMjsKLSAgICAgICAgICAgICAgICB0bXAxICs9IHRtcDIgKiB4RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAxID4+PSA2OwotICAgICAgICAgICAgICAgIHRtcDMgKz0gdG1wNCAqIHhGcmFjOwotICAgICAgICAgICAgICAgIHRtcDMgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICAgICAgKmNicisrID0gKHU4KXRtcDE7Ci0KLSAgICAgICAgICAgICAgICB0bXAxID0gKisrcHRyQTsKLSAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wNSA9IHB0ckFbd2lkdGgqMl07Ci0gICAgICAgICAgICAgICAgdG1wMSAqPSB2YWxZOwotICAgICAgICAgICAgICAgIHRtcDEgKz0gdG1wMyAqIHlGcmFjOwotICAgICAgICAgICAgICAgIHRtcDMgKj0gdmFsWTsKLSAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDUgKiB5RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAyID0gdG1wMiAqIHZhbFggKyBwbHVzMzI7Ci0gICAgICAgICAgICAgICAgdG1wNCA9IHRtcDQgKiB2YWxYICsgcGx1czMyOwotICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wMSAqIHhGcmFjOwotICAgICAgICAgICAgICAgIHRtcDIgPj49IDY7Ci0gICAgICAgICAgICAgICAgdG1wNCArPSB0bXAzICogeEZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wNCA+Pj0gNjsKLSAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpdG1wNDsKLSAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpdG1wMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNiciArPSAyKjggLSBjaHJvbWFQYXJ0V2lkdGg7Ci0gICAgICAgICAgICBwdHJBICs9IDIqd2lkdGggLSBjaHJvbWFQYXJ0V2lkdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBQcmVkaWN0Q2hyb21hCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUb3AgbGV2ZWwgY2hyb21hIHByZWRpY3Rpb24gZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLiBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgUHJlZGljdENocm9tYSgKLSAgdTggKm1iUGFydENocm9tYSwKLSAgdTMyIHhBTCwKLSAgdTMyIHlBTCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIG12X3QgKm12LAotICBpbWFnZV90ICpyZWZQaWMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHhGcmFjLCB5RnJhYywgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0OwotICAgIGkzMiB4SW50LCB5SW50OwotICAgIHU4ICpyZWY7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtdik7Ci0gICAgQVNTRVJUKHJlZlBpYyk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+ZGF0YSk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+d2lkdGgpOwotICAgIEFTU0VSVChyZWZQaWMtPmhlaWdodCk7Ci0KLSAgICB3aWR0aCAgPSA4ICogcmVmUGljLT53aWR0aDsKLSAgICBoZWlnaHQgPSA4ICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICB4SW50ID0gKHhBTCA+PiAxKSArIChtdi0+aG9yID4+IDMpOwotICAgIHlJbnQgPSAoeUFMID4+IDEpICsgKG12LT52ZXIgPj4gMyk7Ci0gICAgeEZyYWMgPSBtdi0+aG9yICYgMHg3OwotICAgIHlGcmFjID0gbXYtPnZlciAmIDB4NzsKLQotICAgIGNocm9tYVBhcnRXaWR0aCAgPSBwYXJ0V2lkdGggPj4gMTsKLSAgICBjaHJvbWFQYXJ0SGVpZ2h0ID0gcGFydEhlaWdodCA+PiAxOwotICAgIHJlZiA9IHJlZlBpYy0+ZGF0YSArIDI1NiAqIHJlZlBpYy0+d2lkdGggKiByZWZQaWMtPmhlaWdodDsKLQotICAgIGlmICh4RnJhYyAmJiB5RnJhYykKLSAgICB7Ci0gICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcihyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsCi0gICAgICAgICAgICAgICAgaGVpZ2h0LCB4RnJhYywgeUZyYWMsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHhGcmFjKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yKHJlZiwgbWJQYXJ0Q2hyb21hLCB4SW50LCB5SW50LCB3aWR0aCwKLSAgICAgICAgICAgICAgICBoZWlnaHQsIHhGcmFjLCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQpOwotICAgIH0KLSAgICBlbHNlIGlmICh5RnJhYykKLSAgICB7Ci0gICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcihyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsCi0gICAgICAgICAgICAgICAgaGVpZ2h0LCB5RnJhYywgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCwgOCk7Ci0gICAgICAgIHJlZiArPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIG1iUGFydENocm9tYSArIDgqOCwgeEludCwgeUludCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCwgOCk7Ci0gICAgfQotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwgcG9zaXRpb24gJ2gnCi0gICAgICAgICAgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQotICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0Ci0gICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19BUk0xMQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KQotewotICAgIHUzMiBwMVsyMSoyMS80KzFdOwotICAgIHUzMiBpLCBqOwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICAgIHU4ICpwdHJDLCAqcHRyVjsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGg7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBwdHJDID0gcmVmICsgd2lkdGg7Ci0gICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOwotCi0gICAgLyogNCBwaXhlbHMgcGVyIGl0ZXJhdGlvbiwgaW50ZXJwb2xhdGUgdXNpbmcgNSB2ZXJ0aWNhbCBzYW1wbGVzICovCi0gICAgZm9yIChpID0gKHBhcnRIZWlnaHQgPj4gMik7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIC8qIGgxID0gKDE2ICsgQSArIDE2KEcrTSkgKyA0KEcrTSkgLSA0KEMrUikgLSAoQytSKSArIFQpID4+IDUgKi8KLSAgICAgICAgZm9yIChqID0gcGFydFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOwotICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDIgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj41XTsKLSAgICAgICAgICAgIHRtcDEgKz0gMTY7Ci0gICAgICAgICAgICBtYls0OF0gPSAodTgpdG1wMjsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OwotICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJDW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSArPSB0bXAyOwotICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxPj41XTsKLSAgICAgICAgICAgIHRtcDYgKz0gMTY7Ci0gICAgICAgICAgICBtYlszMl0gPSAodTgpdG1wMTsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKLSAgICAgICAgICAgIHRtcDUgKz0gMTY7Ci0gICAgICAgICAgICBtYlsxNl0gPSAodTgpdG1wNjsKLQotICAgICAgICAgICAgdG1wMSArPSB0bXA0OwotICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDU7Ci0gICAgICAgICAgICBwdHJDKys7Ci0gICAgICAgIH0KLSAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBwdHJWICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdkJwotICAgICAgICAgIG9yICduJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCi0gICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKLSAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiB2ZXJPZmZzZXQpICAgIC8qIDAgZm9yIHBpeGVsIGQsIDEgZm9yIHBpeGVsIG4gKi8KLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1MzIgaSwgajsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICB1OCAqcHRyQywgKnB0clYsICpwdHJJbnQ7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGggPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoOwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgcHRyQyA9IHJlZiArIHdpZHRoOwotICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKLQotICAgIC8qIFBvaW50ZXIgdG8gaW50ZWdlciBzYW1wbGUgcG9zaXRpb24sIGVpdGhlciBNIG9yIFIgKi8KLSAgICBwdHJJbnQgPSBwdHJDICsgKDIrdmVyT2Zmc2V0KSp3aWR0aDsKLQotICAgIC8qIDQgcGl4ZWxzIHBlciBpdGVyYXRpb24KLSAgICAgKiBpbnRlcnBvbGF0ZSB1c2luZyA1IHZlcnRpY2FsIHNhbXBsZXMgYW5kIGF2ZXJhZ2UgYmV0d2VlbgotICAgICAqIGludGVycG9sYXRlZCB2YWx1ZSBhbmQgaW50ZWdlciBzYW1wbGUgdmFsdWUgKi8KLSAgICBmb3IgKGkgPSAocGFydEhlaWdodCA+PiAyKTsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgLyogaDEgPSAoMTYgKyBBICsgMTYoRytNKSArIDQoRytNKSAtIDQoQytSKSAtIChDK1IpICsgVCkgPj4gNSAqLwotICAgICAgICBmb3IgKGogPSBwYXJ0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXAxID0gcHRyVlt3aWR0aF07Ci0gICAgICAgICAgICB0bXAyID0gcHRyVlt3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7Ci0gICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMiArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJDW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyICs9IHRtcDM7Ci0gICAgICAgICAgICB0bXAyID0gY2xwW3RtcDI+PjVdOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFt3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDEgKz0gMTY7Ci0gICAgICAgICAgICB0bXAyKys7Ci0gICAgICAgICAgICBtYls0OF0gPSAodTgpKCh0bXAyICsgdG1wNykgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7Ci0gICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMT4+NV07Ci0gICAgICAgICAgICB0bXA3ID0gcHRySW50W3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDYgKz0gMTY7Ci0gICAgICAgICAgICB0bXAxKys7Ci0gICAgICAgICAgICBtYlszMl0gPSAodTgpKCh0bXAxICsgdG1wNykgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07Ci0gICAgICAgICAgICB0bXA3ID0gKnB0ckludDsKLSAgICAgICAgICAgIHRtcDUgKz0gMTY7Ci0gICAgICAgICAgICB0bXA2Kys7Ci0gICAgICAgICAgICBtYlsxNl0gPSAodTgpKCh0bXA2ICsgdG1wNykgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07Ci0gICAgICAgICAgICB0bXA3ID0gcHRySW50Wy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDUrKzsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNSArIHRtcDcpID4+IDEpOwotICAgICAgICAgICAgcHRyQysrOwotICAgICAgICAgICAgcHRySW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBwdHJWICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIHB0ckludCArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdiJwotICAgICAgICAgIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKLSAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAotICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCkKLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1OCAqcHRySjsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVCgocGFydFdpZHRoJjB4MykgPT0gMCk7Ci0gICAgQVNTRVJUKChwYXJ0SGVpZ2h0JjB4MykgPT0gMCk7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0LCBwYXJ0V2lkdGgrNSk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoICsgNTsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIHB0ckogPSByZWYgKyA1OwotCi0gICAgZm9yICh5ID0gcGFydEhlaWdodDsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOwotICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7Ci0gICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKLSAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOwotICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7Ci0KLSAgICAgICAgLyogY2FsY3VsYXRlIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCi0gICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDYgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07Ci0gICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDUgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA2OwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOwotICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDQgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA1OwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA0IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA0ICs9IHRtcDU7Ci0gICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQ+PjVdOwotICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICB0bXAzICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNDsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMyAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMyArPSB0bXA0OwotICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzPj41XTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0OwotICAgICAgICAgICAgdG1wNCA9IHRtcDY7Ci0gICAgICAgICAgICB0bXA2ID0gdG1wMjsKLSAgICAgICAgICAgIHRtcDIgPSB0bXA3OwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wMzsKLSAgICAgICAgICAgIHRtcDMgPSB0bXA1OwotICAgICAgICAgICAgdG1wNSA9IHRtcDE7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGludGVycG9sYXRpb24gb2YgcGl4ZWwgcG9zaXRpb24gJ2EnCi0gICAgICAgICAgb3IgJ2MnIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKLSAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAotICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIGhvck9mZnNldCkgLyogMCBmb3IgcGl4ZWwgYSwgMSBmb3IgcGl4ZWwgYyAqLwotewotICAgIHUzMiBwMVsyMSoyMS80KzFdOwotICAgIHU4ICpwdHJKOwotICAgIHUzMiB4LCB5OwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0LCBwYXJ0V2lkdGgrNSk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoICsgNTsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIHB0ckogPSByZWYgKyA1OwotCi0gICAgZm9yICh5ID0gcGFydEhlaWdodDsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOwotICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7Ci0gICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKLSAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOwotICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7Ci0KLSAgICAgICAgLyogY2FsY3VsYXRlIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCi0gICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDYgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07Ci0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCi0gICAgICAgICAgICAgICAgdG1wNiArPSB0bXA0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRtcDYgKz0gdG1wMzsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNiArIDEpID4+IDEpOwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07Ci0gICAgICAgICAgICB0bXA0ICs9IDE2OwotICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCi0gICAgICAgICAgICAgICAgdG1wNSArPSB0bXAzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRtcDUgKz0gdG1wMjsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNSArIDEpID4+IDEpOwotICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKLSAgICAgICAgICAgIHRtcDMgKz0gMTY7Ci0gICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKLSAgICAgICAgICAgICAgICB0bXA0ICs9IHRtcDI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdG1wNCArPSB0bXAxOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA0ICsgMSkgPj4gMSk7Ci0gICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMyAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMyArPSB0bXA0OwotICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzPj41XTsKLSAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQotICAgICAgICAgICAgICAgIHRtcDMgKz0gdG1wMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDY7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDMgKyAxKSA+PiAxKTsKLSAgICAgICAgICAgIHRtcDMgPSB0bXA1OwotICAgICAgICAgICAgdG1wNSA9IHRtcDE7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgfQotICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBtYiArPSAxNiAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwKLSAgICAgICAgICBwb3NpdGlvbiAnZScsICdnJywgJ3AnIG9yICdyJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5Ci0gICAgICAgICAgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZAotICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgcGFydCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiBob3JWZXJPZmZzZXQpIC8qIDAgZm9yIHBpeGVsIGUsIDEgZm9yIHBpeGVsIGcsCi0gICAgICAgICAgICAgICAgICAgICAgIDIgZm9yIHBpeGVsIHAsIDMgZm9yIHBpeGVsIHIgKi8KLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1OCAqcHRyQywgKnB0ckosICpwdHJWOwotICAgIHUzMiB4LCB5OwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OwotICAgIH0KLQotICAgIC8qIFJlZiBwb2ludHMgdG8gRyArICgtMiwgLTIpICovCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICAvKiBwdHJKIHBvaW50cyB0byBlaXRoZXIgSiBvciBRLCBkZXBlbmRpbmcgb24gdmVydGljYWwgb2Zmc2V0ICovCi0gICAgcHRySiA9IHJlZiArICgoKGhvclZlck9mZnNldCAmIDB4MikgPj4gMSkgKyAyKSAqIHdpZHRoICsgNTsKLQotICAgIC8qIHB0ckMgcG9pbnRzIHRvIGVpdGhlciBDIG9yIEQsIGRlcGVuZGluZyBvbiBob3Jpem9udGFsIG9mZnNldCAqLwotICAgIHB0ckMgPSByZWYgKyB3aWR0aCArIDIgKyAoaG9yVmVyT2Zmc2V0ICYgMHgxKTsKLQotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotCi0gICAgICAgIC8qIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbiwgY2FsY3VsYXRlIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCi0gICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDYgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07Ci0gICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDUgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA2OwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOwotICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDQgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA1OwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA0IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA0ICs9IHRtcDU7Ci0gICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQ+PjVdOwotICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICB0bXAzICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNDsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMyAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMyArPSB0bXA0OwotICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzPj41XTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0OwotICAgICAgICAgICAgdG1wNCA9IHRtcDY7Ci0gICAgICAgICAgICB0bXA2ID0gdG1wMjsKLSAgICAgICAgICAgIHRtcDIgPSB0bXA3OwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wMzsKLSAgICAgICAgICAgIHRtcDMgPSB0bXA1OwotICAgICAgICAgICAgdG1wNSA9IHRtcDE7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi0gICAgbWIgLT0gMTYqcGFydEhlaWdodDsKLSAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7Ci0KLSAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgLyogVmVydGljYWwgaW50ZXJwb2xhdGlvbiBhbmQgYXZlcmFnaW5nLCA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSBwYXJ0V2lkdGg7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXAxID0gcHRyVlt3aWR0aF07Ci0gICAgICAgICAgICB0bXAyID0gcHRyVlt3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7Ci0gICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMiArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJDW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyICs9IHRtcDM7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDI+PjVdOwotICAgICAgICAgICAgdG1wMiA9IG1iWzQ4XTsKLSAgICAgICAgICAgIHRtcDEgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3Kys7Ci0gICAgICAgICAgICBtYls0OF0gPSAodTgpKCh0bXAyICsgdG1wNykgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7Ci0gICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wMT4+NV07Ci0gICAgICAgICAgICB0bXAxID0gbWJbMzJdOwotICAgICAgICAgICAgdG1wNiArPSAxNjsKLSAgICAgICAgICAgIHRtcDcrKzsKLSAgICAgICAgICAgIG1iWzMyXSA9ICh1OCkoKHRtcDEgKyB0bXA3KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wMSA9ICpwdHJDOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA2Pj41XTsKLSAgICAgICAgICAgIHRtcDYgPSBtYlsxNl07Ci0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgdG1wNysrOwotICAgICAgICAgICAgbWJbMTZdID0gKHU4KSgodG1wNiArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSB0bXAyOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDU+PjVdOwotICAgICAgICAgICAgdG1wNSA9ICptYjsKLSAgICAgICAgICAgIHRtcDcrKzsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNSArIHRtcDcpID4+IDEpOwotICAgICAgICAgICAgcHRyQysrOwotCi0gICAgICAgIH0KLSAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBwdHJWICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwKLSAgICAgICAgICBwb3NpdGlvbiAnaicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCi0gICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAotICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KQotewotICAgIHUzMiBwMVsyMSoyMS80KzFdOwotICAgIHUzMiB4LCB5OwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICAgIGkzMiAqcHRyQywgKnB0clYsICpiMTsKLSAgICB1OCAgKnB0cko7Ci0gICAgaTMyIHRhYmxlWzIxKjE2XTsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIGIxID0gdGFibGU7Ci0gICAgcHRySiA9IHJlZiArIDU7Ci0KLSAgICAvKiBGaXJzdCBzdGVwOiBjYWxjdWxhdGUgaW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IKLSAgICAgKiBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KLSAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0ICsgNTsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOwotICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7Ci0gICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKLSAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOwotICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7Ci0KLSAgICAgICAgLyogNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KLSAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDY7Ci0gICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgKmIxKysgPSB0bXA1OwotICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgKmIxKysgPSB0bXA0OwotICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgICpiMSsrID0gdG1wMzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0OwotICAgICAgICAgICAgdG1wNCA9IHRtcDY7Ci0gICAgICAgICAgICB0bXA2ID0gdG1wMjsKLSAgICAgICAgICAgIHRtcDIgPSB0bXA3OwotICAgICAgICAgICAgdG1wMyA9IHRtcDU7Ci0gICAgICAgICAgICB0bXA1ID0gdG1wMTsKLSAgICAgICAgfQotICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOwotICAgIH0KLQotICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLwotICAgIHB0ckMgPSB0YWJsZSArIHBhcnRXaWR0aDsKLSAgICBwdHJWID0gcHRyQyArIDUqcGFydFdpZHRoOwotICAgIGZvciAoeSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyB5OyB5LS0pCi0gICAgewotICAgICAgICAvKiA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSBwYXJ0V2lkdGg7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJWW3BhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAyID0gcHRyVltwYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOwotICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDIgKz0gNTEyOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OwotICAgICAgICAgICAgdG1wMyA9IHB0ckNbcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyICs9IHRtcDM7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDI+PjEwXTsKLSAgICAgICAgICAgIHRtcDEgKz0gNTEyOwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KXRtcDc7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7Ci0gICAgICAgICAgICB0bXAyID0gcHRyQ1twYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDE+PjEwXTsKLSAgICAgICAgICAgIHRtcDYgKz0gNTEyOwotICAgICAgICAgICAgbWJbMzJdID0gKHU4KXRtcDc7Ci0KLSAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNj4+MTBdOwotICAgICAgICAgICAgdG1wNSArPSA1MTI7Ci0gICAgICAgICAgICBtYlsxNl0gPSAodTgpdG1wNzsKLQotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNT4+MTBdOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNzsKLSAgICAgICAgICAgIHB0ckMrKzsKLSAgICAgICAgfQotICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOwotICAgICAgICBwdHJDICs9IDMqcGFydFdpZHRoOwotICAgICAgICBwdHJWICs9IDMqcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCi0gICAgICAgICAgcG9zaXRpb24gJ2YnIG9yICdxJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4KLSAgICAgICAgICBSZWZlcmVuY2UgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkCi0gICAgICAgICAgcGFydCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiB2ZXJPZmZzZXQpICAgIC8qIDAgZm9yIHBpeGVsIGYsIDEgZm9yIHBpeGVsIHEgKi8KLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBpMzIgKnB0ckMsICpwdHJWLCAqcHRySW50LCAqYjE7Ci0gICAgdTggICpwdHJKOwotICAgIGkzMiB0YWJsZVsyMSoxNl07Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBiMSA9IHRhYmxlOwotICAgIHB0ckogPSByZWYgKyA1OwotCi0gICAgLyogRmlyc3Qgc3RlcDogY2FsY3VsYXRlIGludGVybWVkaWF0ZSB2YWx1ZXMgZm9yCi0gICAgICogaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgZm9yICh5ID0gcGFydEhlaWdodCArIDU7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgICpiMSsrID0gdG1wNjsKLSAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDU7Ci0gICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA0IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA0ICs9IHRtcDU7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDQ7Ci0gICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMyAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMyArPSB0bXA0OwotICAgICAgICAgICAgKmIxKysgPSB0bXAzOwotICAgICAgICAgICAgdG1wNyA9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA0ID0gdG1wNjsKLSAgICAgICAgICAgIHRtcDYgPSB0bXAyOwotICAgICAgICAgICAgdG1wMiA9IHRtcDc7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICB9Ci0gICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi0gICAgLyogU2Vjb25kIHN0ZXA6IGNhbGN1bGF0ZSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGFuZCBhdmVyYWdlICovCi0gICAgcHRyQyA9IHRhYmxlICsgcGFydFdpZHRoOwotICAgIHB0clYgPSBwdHJDICsgNSpwYXJ0V2lkdGg7Ci0gICAgLyogUG9pbnRlciB0byBpbnRlZ2VyIHNhbXBsZSBwb3NpdGlvbiwgZWl0aGVyIE0gb3IgUiAqLwotICAgIHB0ckludCA9IHB0ckMgKyAoMit2ZXJPZmZzZXQpKnBhcnRXaWR0aDsKLSAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxID0gcHRyVltwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAyICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJDW3BhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFtwYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9IHRtcDM7Ci0gICAgICAgICAgICB0bXAyID0gY2xwW3RtcDI+PjEwXTsKLSAgICAgICAgICAgIHRtcDcgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDc+PjVdOwotICAgICAgICAgICAgdG1wMSArPSA1MTI7Ci0gICAgICAgICAgICB0bXAyKys7Ci0gICAgICAgICAgICBtYls0OF0gPSAodTgpKCh0bXA3ICsgdG1wMikgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7Ci0gICAgICAgICAgICB0bXAyID0gcHRyQ1twYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gcHRySW50W3BhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXAxID0gY2xwW3RtcDE+PjEwXTsKLSAgICAgICAgICAgIHRtcDcgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDc+PjVdOwotICAgICAgICAgICAgdG1wNiArPSA1MTI7Ci0gICAgICAgICAgICB0bXAxKys7Ci0gICAgICAgICAgICBtYlszMl0gPSAodTgpKCh0bXA3ICsgdG1wMSkgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSAqcHRySW50OwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj4xMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKLSAgICAgICAgICAgIHRtcDUgKz0gNTEyOwotICAgICAgICAgICAgdG1wNisrOwotICAgICAgICAgICAgbWJbMTZdID0gKHU4KSgodG1wNyArIHRtcDYpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMilwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSB0bXA0OwotICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFstKGkzMilwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj4xMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKLSAgICAgICAgICAgIHRtcDUrKzsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNyArIHRtcDUpID4+IDEpOwotICAgICAgICAgICAgcHRyQysrOwotICAgICAgICAgICAgcHRySW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyQyArPSAzKnBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSAzKnBhcnRXaWR0aDsKLSAgICAgICAgcHRySW50ICs9IDMqcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCi0gICAgICAgICAgcG9zaXRpb24gJ2knIG9yICdrJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4KLSAgICAgICAgICBSZWZlcmVuY2UgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkCi0gICAgICAgICAgcGFydCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiBob3JPZmZzZXQpICAgIC8qIDAgZm9yIHBpeGVsIGksIDEgZm9yIHBpeGVsIGsgKi8KLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBpMzIgKnB0ckosICpwdHJJbnQsICpoMTsKLSAgICB1OCAgKnB0ckMsICpwdHJWOwotICAgIGkzMiB0YWJsZVsyMSoxNl07Ci0gICAgaTMyIHRhYmxlV2lkdGggPSAoaTMyKXBhcnRXaWR0aCs1OwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgaDEgPSB0YWJsZSArIHRhYmxlV2lkdGg7Ci0gICAgcHRyQyA9IHJlZiArIHdpZHRoOwotICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKLQotICAgIC8qIEZpcnN0IHN0ZXA6IGNhbGN1bGF0ZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGZvcgotICAgICAqIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KLSAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gKHUzMil0YWJsZVdpZHRoOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOwotICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJDW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyICs9IHRtcDM7Ci0gICAgICAgICAgICBoMVt0YWJsZVdpZHRoKjJdID0gdG1wMjsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OwotICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJDW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSArPSB0bXAyOwotICAgICAgICAgICAgaDFbdGFibGVXaWR0aF0gPSB0bXAxOwotCi0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICAqaDEgPSB0bXA2OwotCi0gICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSB0bXAyOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICBoMVstdGFibGVXaWR0aF0gPSB0bXA1OwotICAgICAgICAgICAgaDErKzsKLSAgICAgICAgICAgIHB0ckMrKzsKLSAgICAgICAgfQotICAgICAgICBwdHJDICs9IDQqd2lkdGggLSBwYXJ0V2lkdGggLSA1OwotICAgICAgICBwdHJWICs9IDQqd2lkdGggLSBwYXJ0V2lkdGggLSA1OwotICAgICAgICBoMSArPSAzKnRhYmxlV2lkdGg7Ci0gICAgfQotCi0gICAgLyogU2Vjb25kIHN0ZXA6IGNhbGN1bGF0ZSBob3Jpem9udGFsIGludGVycG9sYXRpb24gYW5kIGF2ZXJhZ2UgKi8KLSAgICBwdHJKID0gdGFibGUgKyA1OwotICAgIC8qIFBvaW50ZXIgdG8gaW50ZWdlciBzYW1wbGUgcG9zaXRpb24sIGVpdGhlciBHIG9yIEggKi8KLSAgICBwdHJJbnQgPSB0YWJsZSArIDIgKyBob3JPZmZzZXQ7Ci0gICAgZm9yICh5ID0gcGFydEhlaWdodDsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOwotICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7Ci0gICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKLSAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOwotICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7Ci0gICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGg+PjIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA2ICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNiA+PiAxMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOwotICAgICAgICAgICAgdG1wNSArPSA1MTI7Ci0gICAgICAgICAgICB0bXA2Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDYgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gKnB0ckludCsrOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1ID4+IDEwXTsKLSAgICAgICAgICAgIHRtcDcgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDcgPj4gNV07Ci0gICAgICAgICAgICB0bXA0ICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDUrKzsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNSArIHRtcDcpID4+IDEpOwotICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKLSAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKLSAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wNCA+PiAxMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOwotICAgICAgICAgICAgdG1wMyArPSA1MTI7Ci0gICAgICAgICAgICB0bXA0Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDQgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAzIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gKnB0ckludCsrOwotICAgICAgICAgICAgdG1wMyArPSB0bXA0OwotICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzID4+IDEwXTsKLSAgICAgICAgICAgIHRtcDcgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDcgPj4gNV07Ci0gICAgICAgICAgICB0bXAzKys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDMgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIHRtcDMgPSB0bXA1OwotICAgICAgICAgICAgdG1wNSA9IHRtcDE7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgfQotICAgICAgICBwdHJKICs9IDU7Ci0gICAgICAgIHB0ckludCArPSA1OwotICAgICAgICBtYiArPSAxNiAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQcmVkaWN0U2FtcGxlcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiByZWNvbnN0cnVjdHMgYSBwcmVkaWN0aW9uIGZvciBhIG1hY3JvYmxvY2sgcGFydGl0aW9uLgotICAgICAgICAgIFRoZSBwcmVkaWN0aW9uIGlzIGVpdGhlciBjb3BpZWQgb3IgaW50ZXJwb2xhdGVkIHVzaW5nIHRoZSByZWZlcmVuY2UKLSAgICAgICAgICBmcmFtZSBhbmQgdGhlIG1vdGlvbiB2ZWN0b3IuIEJvdGggbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZSBwYXJ0cyBhcmUKLSAgICAgICAgICBwcmVkaWN0ZWQuIFRoZSBwcmVkaWN0aW9uIGlzIHN0b3JlZCBpbiBnaXZlbiBtYWNyb2Jsb2NrIGFycmF5IChkYXRhKS4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGFycmF5ICgzODQgYnl0ZXMpIGZvciBvdXRwdXQKLSAgICAgICAgICBtdiAgICAgICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciB1c2VkIGZvciBwcmVkaWN0aW9uCi0gICAgICAgICAgcmVmUGljICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBwaWN0dXJlIHN0cnVjdHVyZQotICAgICAgICAgIHhBICAgICAgICAgICAgeC1jb29yZGluYXRlIGZvciBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICB5QSAgICAgICAgICAgIHktY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgcGFydFggICAgICAgICB4LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKLSAgICAgICAgICBwYXJ0WSAgICAgICAgIHktb2Zmc2V0IGZvciBwYXJ0aXRpb24gaW4gbWFjcm9ibG9jawotICAgICAgICAgIHBhcnRXaWR0aCAgICAgd2lkdGggb2YgcGFydGl0aW9uCi0gICAgICAgICAgcGFydEhlaWdodCAgICBoZWlnaHQgb2YgcGFydGl0aW9uCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgZGF0YSAgICAgICAgICBtYWNyb2Jsb2NrIGFycmF5ICgxNngxNis4eDgrOHg4KSB3aGVyZSBwcmVkaWN0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiBpcyBzdG9yZWQgYXQgY29ycmVjdCBwb3NpdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKLSAgdTggKmRhdGEsCi0gIG12X3QgKm12LAotICBpbWFnZV90ICpyZWZQaWMsCi0gIHUzMiB4QSwKLSAgdTMyIHlBLAotICB1MzIgcGFydFgsCi0gIHUzMiBwYXJ0WSwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpCi0KLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgeEZyYWMsIHlGcmFjLCB3aWR0aCwgaGVpZ2h0OwotICAgIGkzMiB4SW50LCB5SW50OwotICAgIHU4ICpsdW1hUGFydERhdGE7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobXYpOwotICAgIEFTU0VSVChwYXJ0V2lkdGgpOwotICAgIEFTU0VSVChwYXJ0SGVpZ2h0KTsKLSAgICBBU1NFUlQocmVmUGljKTsKLSAgICBBU1NFUlQocmVmUGljLT5kYXRhKTsKLSAgICBBU1NFUlQocmVmUGljLT53aWR0aCk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+aGVpZ2h0KTsKLQotICAgIC8qIGx1bWEgKi8KLSAgICBsdW1hUGFydERhdGEgPSBkYXRhICsgMTYqcGFydFkgKyBwYXJ0WDsKLQotICAgIHhGcmFjID0gbXYtPmhvciAmIDB4MzsKLSAgICB5RnJhYyA9IG12LT52ZXIgJiAweDM7Ci0KLSAgICB3aWR0aCA9IDE2ICogcmVmUGljLT53aWR0aDsKLSAgICBoZWlnaHQgPSAxNiAqIHJlZlBpYy0+aGVpZ2h0OwotCi0gICAgeEludCA9IChpMzIpeEEgKyAoaTMyKXBhcnRYICsgKG12LT5ob3IgPj4gMik7Ci0gICAgeUludCA9IChpMzIpeUEgKyAoaTMyKXBhcnRZICsgKG12LT52ZXIgPj4gMik7Ci0KLSAgICBBU1NFUlQobHVtYUZyYWNQb3NbeEZyYWNdW3lGcmFjXSA8IDE2KTsKLQotICAgIHN3aXRjaCAobHVtYUZyYWNQb3NbeEZyYWNdW3lGcmFjXSkKLSAgICB7Ci0gICAgICAgIGNhc2UgMDogLyogRyAqLwotICAgICAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludCx5SW50LHdpZHRoLGhlaWdodCxwYXJ0V2lkdGgscGFydEhlaWdodCwxNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOiAvKiBkICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOiAvKiBoICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOiAvKiBuICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OiAvKiBhICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OiAvKiBlICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6IC8qIGkgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogLyogcCAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OiAvKiBiICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OiAvKiBmICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvKiBqICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOiAvKiBxICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAvKiBjICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLyogZyAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDogLyogayAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLyogY2FzZSAxNSwgciAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBjaHJvbWEgKi8KLSAgICBQcmVkaWN0Q2hyb21hKAotICAgICAgZGF0YSArIDE2KjE2ICsgKHBhcnRZPj4xKSo4ICsgKHBhcnRYPj4xKSwKLSAgICAgIHhBICsgcGFydFgsCi0gICAgICB5QSArIHBhcnRZLAotICAgICAgcGFydFdpZHRoLAotICAgICAgcGFydEhlaWdodCwKLSAgICAgIG12LAotICAgICAgcmVmUGljKTsKLQotfQotCi0jZWxzZSAvKiBIMjY0REVDX09NWERMICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQcmVkaWN0U2FtcGxlcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiByZWNvbnN0cnVjdHMgYSBwcmVkaWN0aW9uIGZvciBhIG1hY3JvYmxvY2sgcGFydGl0aW9uLgotICAgICAgICAgIFRoZSBwcmVkaWN0aW9uIGlzIGVpdGhlciBjb3BpZWQgb3IgaW50ZXJwb2xhdGVkIHVzaW5nIHRoZSByZWZlcmVuY2UKLSAgICAgICAgICBmcmFtZSBhbmQgdGhlIG1vdGlvbiB2ZWN0b3IuIEJvdGggbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZSBwYXJ0cyBhcmUKLSAgICAgICAgICBwcmVkaWN0ZWQuIFRoZSBwcmVkaWN0aW9uIGlzIHN0b3JlZCBpbiBnaXZlbiBtYWNyb2Jsb2NrIGFycmF5IChkYXRhKS4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGFycmF5ICgzODQgYnl0ZXMpIGZvciBvdXRwdXQKLSAgICAgICAgICBtdiAgICAgICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciB1c2VkIGZvciBwcmVkaWN0aW9uCi0gICAgICAgICAgcmVmUGljICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBwaWN0dXJlIHN0cnVjdHVyZQotICAgICAgICAgIHhBICAgICAgICAgICAgeC1jb29yZGluYXRlIGZvciBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICB5QSAgICAgICAgICAgIHktY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgcGFydFggICAgICAgICB4LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKLSAgICAgICAgICBwYXJ0WSAgICAgICAgIHktb2Zmc2V0IGZvciBwYXJ0aXRpb24gaW4gbWFjcm9ibG9jawotICAgICAgICAgIHBhcnRXaWR0aCAgICAgd2lkdGggb2YgcGFydGl0aW9uCi0gICAgICAgICAgcGFydEhlaWdodCAgICBoZWlnaHQgb2YgcGFydGl0aW9uCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgZGF0YSAgICAgICAgICBtYWNyb2Jsb2NrIGFycmF5ICgxNngxNis4eDgrOHg4KSB3aGVyZSBwcmVkaWN0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiBpcyBzdG9yZWQgYXQgY29ycmVjdCBwb3NpdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKmxpbnQgLWV7NTUwfSBTeW1ib2wgJ3Jlcycgbm90IGFjY2Vzc2VkICovCi12b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKLSAgdTggKmRhdGEsCi0gIG12X3QgKm12LAotICBpbWFnZV90ICpyZWZQaWMsCi0gIHUzMiBjb2xBbmRSb3csCi0gIHUzMiBwYXJ0LAotICB1OCAqcEZpbGwpCi0KLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgeEZyYWMsIHlGcmFjOwotICAgIHUzMiB3aWR0aCwgaGVpZ2h0OwotICAgIGkzMiB4SW50LCB5SW50LCB4MCwgeTA7Ci0gICAgdTggKnBhcnREYXRhLCAqcmVmOwotICAgIE9NWFNpemUgcm9pOwotICAgIHUzMiBmaWxsV2lkdGg7Ci0gICAgdTMyIGZpbGxIZWlnaHQ7Ci0gICAgT01YUmVzdWx0IHJlczsKLSAgICB1MzIgeEEsIHlBOwotICAgIHUzMiBwYXJ0WCwgcGFydFk7Ci0gICAgdTMyIHBhcnRXaWR0aCwgcGFydEhlaWdodDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChtdik7Ci0gICAgQVNTRVJUKHJlZlBpYyk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+ZGF0YSk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+d2lkdGgpOwotICAgIEFTU0VSVChyZWZQaWMtPmhlaWdodCk7Ci0KLSAgICB4QSA9IChjb2xBbmRSb3cgJiAweEZGRkYwMDAwKSA+PiAxNjsKLSAgICB5QSA9IChjb2xBbmRSb3cgJiAweDAwMDBGRkZGKTsKLQotICAgIHBhcnRYID0gKHBhcnQgJiAweEZGMDAwMDAwKSA+PiAyNDsKLSAgICBwYXJ0WSA9IChwYXJ0ICYgMHgwMEZGMDAwMCkgPj4gMTY7Ci0gICAgcGFydFdpZHRoID0gKHBhcnQgJiAweDAwMDBGRjAwKSA+PiA4OwotICAgIHBhcnRIZWlnaHQgPSAocGFydCAmIDB4MDAwMDAwRkYpOwotCi0gICAgQVNTRVJUKHBhcnRXaWR0aCk7Ci0gICAgQVNTRVJUKHBhcnRIZWlnaHQpOwotCi0gICAgLyogbHVtYSAqLwotICAgIHBhcnREYXRhID0gZGF0YSArIDE2KnBhcnRZICsgcGFydFg7Ci0KLSAgICB4RnJhYyA9IG12LT5ob3IgJiAweDM7Ci0gICAgeUZyYWMgPSBtdi0+dmVyICYgMHgzOwotCi0gICAgd2lkdGggPSAxNiAqIHJlZlBpYy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gMTYgKiByZWZQaWMtPmhlaWdodDsKLQotICAgIHhJbnQgPSAoaTMyKXhBICsgKGkzMilwYXJ0WCArIChtdi0+aG9yID4+IDIpOwotICAgIHlJbnQgPSAoaTMyKXlBICsgKGkzMilwYXJ0WSArIChtdi0+dmVyID4+IDIpOwotCi0gICAgeDAgPSAoeEZyYWMpID8geEludC0yIDogeEludDsKLSAgICB5MCA9ICh5RnJhYykgPyB5SW50LTIgOiB5SW50OwotCi0gICAgaWYgKHhGcmFjKQotICAgIHsKLSAgICAgICAgaWYgKHBhcnRXaWR0aCA9PSAxNikKLSAgICAgICAgICAgIGZpbGxXaWR0aCA9IDMyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmaWxsV2lkdGggPSAxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBmaWxsV2lkdGggPSAocGFydFdpZHRoKjIpOwotICAgIGlmICh5RnJhYykKLSAgICAgICAgZmlsbEhlaWdodCA9IHBhcnRIZWlnaHQrNTsKLSAgICBlbHNlCi0gICAgICAgIGZpbGxIZWlnaHQgPSBwYXJ0SGVpZ2h0OwotCi0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArZmlsbFdpZHRoID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2ZpbGxIZWlnaHQgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWZQaWMtPmRhdGEsICh1OCopcEZpbGwsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBmaWxsV2lkdGgsIGZpbGxIZWlnaHQsIGZpbGxXaWR0aCk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9IHBGaWxsOwotICAgICAgICB3aWR0aCA9IGZpbGxXaWR0aDsKLSAgICAgICAgaWYgKHlGcmFjKQotICAgICAgICAgICAgcmVmICs9IDIqd2lkdGg7Ci0gICAgICAgIGlmICh4RnJhYykKLSAgICAgICAgICAgIHJlZiArPSAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKmxpbnQgLS1lKDczNykgTG9zcyBvZiBzaWduICovCi0gICAgICAgIHJlZiA9IHJlZlBpYy0+ZGF0YSArIHlJbnQqd2lkdGggKyB4SW50OwotICAgIH0KLSAgICAvKiBMdW1hIGludGVycG9sYXRpb24gKi8KLSAgICByb2kud2lkdGggPSAoaTMyKXBhcnRXaWR0aDsKLSAgICByb2kuaGVpZ2h0ID0gKGkzMilwYXJ0SGVpZ2h0OwotCi0gICAgcmVzID0gb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEocmVmLCAoaTMyKXdpZHRoLCBwYXJ0RGF0YSwgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil4RnJhYywgKGkzMil5RnJhYywgcm9pKTsKLSAgICBBU1NFUlQocmVzID09IDApOwotCi0gICAgLyogQ2hyb21hICovCi0gICAgd2lkdGggID0gOCAqIHJlZlBpYy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gOCAqIHJlZlBpYy0+aGVpZ2h0OwotCi0gICAgeDAgPSAoKHhBICsgcGFydFgpID4+IDEpICsgKG12LT5ob3IgPj4gMyk7Ci0gICAgeTAgPSAoKHlBICsgcGFydFkpID4+IDEpICsgKG12LT52ZXIgPj4gMyk7Ci0gICAgeEZyYWMgPSBtdi0+aG9yICYgMHg3OwotICAgIHlGcmFjID0gbXYtPnZlciAmIDB4NzsKLQotICAgIHJlZiA9IHJlZlBpYy0+ZGF0YSArIDI1NiAqIHJlZlBpYy0+d2lkdGggKiByZWZQaWMtPmhlaWdodDsKLQotICAgIHJvaS53aWR0aCA9IChpMzIpKHBhcnRXaWR0aCA+PiAxKTsKLSAgICBmaWxsV2lkdGggPSAoKHBhcnRXaWR0aCA+PiAxKSArIDgpICYgfjB4NzsKLSAgICByb2kuaGVpZ2h0ID0gKGkzMikocGFydEhlaWdodCA+PiAxKTsKLSAgICBmaWxsSGVpZ2h0ID0gKHBhcnRIZWlnaHQgPj4gMSkgKyAxOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2ZpbGxXaWR0aCA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtmaWxsSGVpZ2h0ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBwRmlsbCwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgZmlsbFdpZHRoLCBmaWxsSGVpZ2h0LCBmaWxsV2lkdGgpOwotICAgICAgICByZWYgKz0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBwRmlsbCArIGZpbGxXaWR0aCpmaWxsSGVpZ2h0LAotICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBmaWxsV2lkdGgsCi0gICAgICAgICAgICBmaWxsSGVpZ2h0LCBmaWxsV2lkdGgpOwotCi0gICAgICAgIHJlZiA9IHBGaWxsOwotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgd2lkdGggPSBmaWxsV2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IGZpbGxIZWlnaHQ7Ci0gICAgfQotCi0gICAgcGFydERhdGEgPSBkYXRhICsgMTYqMTYgKyAocGFydFk+PjEpKjggKyAocGFydFg+PjEpOwotCi0gICAgLyogQ2hyb21hIGludGVycG9sYXRpb24gKi8KLSAgICAvKmxpbnQgLS1lKDczNykgTG9zcyBvZiBzaWduICovCi0gICAgcmVmICs9IHkwICogd2lkdGggKyB4MDsKLSAgICByZXMgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYShyZWYsIHdpZHRoLCBwYXJ0RGF0YSwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKXJvaS53aWR0aCwgKHUzMilyb2kuaGVpZ2h0LCB4RnJhYywgeUZyYWMpOwotICAgIEFTU0VSVChyZXMgPT0gMCk7Ci0gICAgcGFydERhdGEgKz0gOCAqIDg7Ci0gICAgcmVmICs9IGhlaWdodCAqIHdpZHRoOwotICAgIHJlcyA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKHJlZiwgd2lkdGgsIHBhcnREYXRhLCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpcm9pLndpZHRoLCAodTMyKXJvaS5oZWlnaHQsIHhGcmFjLCB5RnJhYyk7Ci0gICAgQVNTRVJUKHJlcyA9PSAwKTsKLQotfQotCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsbFJvdzEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJvdyBvZiByZWZlcmVuY2UgcGVscyBpbiBhICdub3JtYWwnIGNhc2Ugd2hlbiBubwotICAgICAgICAgIG92ZXJmaWxsaW5nIGlzIG5lY2Vzc2FyeS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgRmlsbFJvdzEoCi0gIHU4ICpyZWYsCi0gIHU4ICpmaWxsLAotICBpMzIgbGVmdCwKLSAgaTMyIGNlbnRlciwKLSAgaTMyIHJpZ2h0KQotewotICAgIFVOVVNFRChsZWZ0KTsKLSAgICBVTlVTRUQocmlnaHQpOwotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChmaWxsKTsKLQotICAgIEgyNjRTd0RlY01lbWNweShmaWxsLCByZWYsICh1MzIpY2VudGVyKTsKLQotICAgIC8qbGludCAtZSg3MTUpICovCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbFJvdzcKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJvdyBvZiByZWZlcmVuY2UgcGVscyB3aGVuIGhvcml6b250YWwgY29vcmRpbmF0ZQotICAgICAgICAgIGlzIHBhcnRseSBuZWdhdGl2ZSBvciBwYXJ0bHkgZ3JlYXRlciB0aGFuIHJlZmVyZW5jZSBwaWN0dXJlIHdpZHRoCi0gICAgICAgICAgKG92ZXJmaWxsaW5nIHNvbWUgcGVscyBvbiBsZWZ0IGFuZC9vciByaWdodCBlZGdlKS4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHJlZiAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBzYW1wbGVzCi0gICAgICAgICAgbGVmdCAgICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gb3ZlcmZpbGwgb24gbGVmdC1lZGdlCi0gICAgICAgICAgY2VudGVyICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gY29weQotICAgICAgICAgIHJpZ2h0ICAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIG92ZXJmaWxsIG9uIHJpZ2h0LWVkZ2UKLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBmaWxsICAgICAgcG9pbnRlciB3aGVyZSBzYW1wbGVzIGFyZSBzdG9yZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19ORU9OCi12b2lkIGgyNjRic2RGaWxsUm93NygKLSAgdTggKnJlZiwKLSAgdTggKmZpbGwsCi0gIGkzMiBsZWZ0LAotICBpMzIgY2VudGVyLAotICBpMzIgcmlnaHQpCi17Ci0gICAgdTggdG1wOwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKGZpbGwpOwotCi0gICAgaWYgKGxlZnQpCi0gICAgICAgIHRtcCA9ICpyZWY7Ci0KLSAgICBmb3IgKCA7IGxlZnQ7IGxlZnQtLSkKLSAgICAgICAgLypsaW50IC1lc3ltKDY0NCx0bXApICB0bXAgaXMgaW5pdGlhbGl6ZWQgaWYgdXNlZCAqLwotICAgICAgICAqZmlsbCsrID0gdG1wOwotCi0gICAgZm9yICggOyBjZW50ZXI7IGNlbnRlci0tKQotICAgICAgICAqZmlsbCsrID0gKnJlZisrOwotCi0gICAgaWYgKHJpZ2h0KQotICAgICAgICB0bXAgPSByZWZbLTFdOwotCi0gICAgZm9yICggOyByaWdodDsgcmlnaHQtLSkKLSAgICAgICAgLypsaW50IC1lc3ltKDY0NCx0bXApICB0bXAgaXMgaW5pdGlhbGl6ZWQgaWYgdXNlZCAqLwotICAgICAgICAqZmlsbCsrID0gdG1wOwotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGaWxsQmxvY2sKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIGJsb2NrIG9mIHJlZmVyZW5jZSBwZWxzLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICBvdmVyZmlsbGluZyBpcyBuZWVkZWQgb3Igbm90IGFuZCByZXBlYXRlZGx5IGNhbGxzIGFuIGFwcHJvcHJpYXRlCi0gICAgICAgICAgZnVuY3Rpb24gKGJ5IHVzaW5nIGEgZnVuY3Rpb24gcG9pbnRlcikgdGhhdCBmaWxscyBvbmUgcm93IHRoZSBibG9jay4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHJlZiAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lCi0gICAgICAgICAgeDAgICAgICAgICAgICAgICAgeC1jb29yZGluYXRlIGZvciBibG9jawotICAgICAgICAgIHkwICAgICAgICAgICAgICAgIHktY29vcmRpbmF0ZSBmb3IgYmxvY2sKLSAgICAgICAgICB3aWR0aCAgICAgICAgICAgICB3aWR0aCBvZiByZWZlcmVuY2UgZnJhbWUKLSAgICAgICAgICBoZWlnaHQgICAgICAgICAgICBoZWlnaHQgb2YgcmVmZXJlbmNlIGZyYW1lCi0gICAgICAgICAgYmxvY2tXaWR0aCAgICAgICAgd2lkdGggb2YgYmxvY2sKLSAgICAgICAgICBibG9ja0hlaWdodCAgICAgICBoZWlnaHQgb2YgYmxvY2sKLSAgICAgICAgICBmaWxsU2Nhbkxlbmd0aCAgICBsZW5ndGggb2YgYSBsaW5lIGluIG91dHB1dCBhcnJheSAocGl4ZWxzKQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGZpbGwgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYXJyYXkgd2hlcmUgb3V0cHV0IGJsb2NrIGlzIHdyaXR0ZW4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkRmlsbEJsb2NrKAotICB1OCAqcmVmLAotICB1OCAqZmlsbCwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIGJsb2NrV2lkdGgsCi0gIHUzMiBibG9ja0hlaWdodCwKLSAgdTMyIGZpbGxTY2FuTGVuZ3RoKQotCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIHhzdG9wLCB5c3RvcDsKLSAgICB2b2lkICgqZnApKHU4KiwgdTgqLCBpMzIsIGkzMiwgaTMyKTsKLSAgICBpMzIgbGVmdCwgeCwgcmlnaHQ7Ci0gICAgaTMyIHRvcCwgeSwgYm90dG9tOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQoZmlsbCk7Ci0gICAgQVNTRVJUKHdpZHRoKTsKLSAgICBBU1NFUlQoaGVpZ2h0KTsKLSAgICBBU1NFUlQoZmlsbCk7Ci0gICAgQVNTRVJUKGJsb2NrV2lkdGgpOwotICAgIEFTU0VSVChibG9ja0hlaWdodCk7Ci0KLSAgICB4c3RvcCA9IHgwICsgKGkzMilibG9ja1dpZHRoOwotICAgIHlzdG9wID0geTAgKyAoaTMyKWJsb2NrSGVpZ2h0OwotCi0gICAgLyogQ2hvb3NlIGNvcnJlY3QgZnVuY3Rpb24gd2hldGhlciBvdmVyZmlsbGluZyBvbiBsZWZ0LWVkZ2Ugb3IgcmlnaHQtZWRnZQotICAgICAqIGlzIG5lZWRlZCBvciBub3QgKi8KLSAgICBpZiAoeDAgPj0gMCAmJiB4c3RvcCA8PSAoaTMyKXdpZHRoKQotICAgICAgICBmcCA9IEZpbGxSb3cxOwotICAgIGVsc2UKLSAgICAgICAgZnAgPSBoMjY0YnNkRmlsbFJvdzc7Ci0KLSAgICBpZiAoeXN0b3AgPCAwKQotICAgICAgICB5MCA9IC0oaTMyKWJsb2NrSGVpZ2h0OwotCi0gICAgaWYgKHhzdG9wIDwgMCkKLSAgICAgICAgeDAgPSAtKGkzMilibG9ja1dpZHRoOwotCi0gICAgaWYgKHkwID4gKGkzMiloZWlnaHQpCi0gICAgICAgIHkwID0gKGkzMiloZWlnaHQ7Ci0KLSAgICBpZiAoeDAgPiAoaTMyKXdpZHRoKQotICAgICAgICB4MCA9IChpMzIpd2lkdGg7Ci0KLSAgICB4c3RvcCA9IHgwICsgKGkzMilibG9ja1dpZHRoOwotICAgIHlzdG9wID0geTAgKyAoaTMyKWJsb2NrSGVpZ2h0OwotCi0gICAgaWYgKHgwID4gMCkKLSAgICAgICAgcmVmICs9IHgwOwotCi0gICAgaWYgKHkwID4gMCkKLSAgICAgICAgcmVmICs9IHkwICogKGkzMil3aWR0aDsKLQotICAgIGxlZnQgPSB4MCA8IDAgPyAteDAgOiAwOwotICAgIHJpZ2h0ID0geHN0b3AgPiAoaTMyKXdpZHRoID8geHN0b3AgLSAoaTMyKXdpZHRoIDogMDsKLSAgICB4ID0gKGkzMilibG9ja1dpZHRoIC0gbGVmdCAtIHJpZ2h0OwotCi0gICAgdG9wID0geTAgPCAwID8gLXkwIDogMDsKLSAgICBib3R0b20gPSB5c3RvcCA+IChpMzIpaGVpZ2h0ID8geXN0b3AgLSAoaTMyKWhlaWdodCA6IDA7Ci0gICAgeSA9IChpMzIpYmxvY2tIZWlnaHQgLSB0b3AgLSBib3R0b207Ci0KLSAgICAvKiBUb3Atb3ZlcmZpbGxpbmcgKi8KLSAgICBmb3IgKCA7IHRvcDsgdG9wLS0gKQotICAgIHsKLSAgICAgICAgKCpmcCkocmVmLCBmaWxsLCBsZWZ0LCB4LCByaWdodCk7Ci0gICAgICAgIGZpbGwgKz0gZmlsbFNjYW5MZW5ndGg7Ci0gICAgfQotCi0gICAgLyogTGluZXMgaW5zaWRlIHJlZmVyZW5jZSBpbWFnZSAqLwotICAgIGZvciAoIDsgeTsgeS0tICkKLSAgICB7Ci0gICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOwotICAgICAgICByZWYgKz0gd2lkdGg7Ci0gICAgICAgIGZpbGwgKz0gZmlsbFNjYW5MZW5ndGg7Ci0gICAgfQotCi0gICAgcmVmIC09IHdpZHRoOwotCi0gICAgLyogQm90dG9tLW92ZXJmaWxsaW5nICovCi0gICAgZm9yICggOyBib3R0b207IGJvdHRvbS0tICkKLSAgICB7Ci0gICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOwotICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOwotICAgIH0KLX0KLQotLypsaW50ICtlNzAxICtlNzAyICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExYTE0MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1JFQ09OU1RSVUNUX0gKLSNkZWZpbmUgSDI2NFNXREVDX1JFQ09OU1RSVUNUX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLXZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAotICB1OCAqZGF0YSwKLSAgbXZfdCAqbXYsCi0gIGltYWdlX3QgKnJlZlBpYywKLSAgdTMyIHhBLAotICB1MzIgeUEsCi0gIHUzMiBwYXJ0WCwKLSAgdTMyIHBhcnRZLAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCk7Ci0jZWxzZQotdm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCi0gIHU4ICpkYXRhLAotICBtdl90ICptdiwKLSAgaW1hZ2VfdCAqcmVmUGljLAotICB1MzIgY29sQW5kUm93LC8qIHBhY2thZ2VkIGRhdGEgfCBjb2x1bW4gICAgfCByb3cgICAgICAgICAgICAgICAgfCovCi0gIHUzMiBwYXJ0LCAgICAgLyogcGFja2FnZWQgZGF0YSB8cGFydFh8cGFydFl8cGFydFdpZHRofHBhcnRIZWlnaHR8Ki8KLSAgdTggKnBGaWxsKTsKLSNlbmRpZgotCi12b2lkIGgyNjRic2RGaWxsQmxvY2soCi0gIHU4ICogcmVmLAotICB1OCAqIGZpbGwsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBibG9ja1dpZHRoLAotICB1MzIgYmxvY2tIZWlnaHQsCi0gIHUzMiBmaWxsU2Nhbkxlbmd0aCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yKAotICB1OCAqcFJlZiwKLSAgdTggKnByZWRQYXJ0Q2hyb21hLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgeEZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIoCi0gIHU4ICpwUmVmLAotICB1OCAqcHJlZFBhcnRDaHJvbWEsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiB5RnJhYywKLSAgdTMyIGNocm9tYVBhcnRXaWR0aCwKLSAgdTMyIGNocm9tYVBhcnRIZWlnaHQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcigKLSAgdTggKnJlZiwKLSAgdTggKnByZWRQYXJ0Q2hyb21hLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgeEZyYWMsCi0gIHUzMiB5RnJhYywKLSAgdTMyIGNocm9tYVBhcnRXaWR0aCwKLSAgdTMyIGNocm9tYVBhcnRIZWlnaHQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiB2ZXJPZmZzZXQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiBob3JPZmZzZXQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiBob3JWZXJPZmZzZXQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhhbGYoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiB2ZXJPZmZzZXQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiBob3JPZmZzZXQpOwotCi0KLXZvaWQgaDI2NGJzZEZpbGxSb3c3KAotICB1OCAqcmVmLAotICB1OCAqZmlsbCwKLSAgaTMyIGxlZnQsCi0gIGkzMiBjZW50ZXIsCi0gIGkzMiByaWdodCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1JFQ09OU1RSVUNUX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzU2YzQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlCi0gICAgICAgICAgRGVjb2RlQnVmZmVyaW5nUGVyaW9kCi0gICAgICAgICAgRGVjb2RlUGljdHVyZVRpbWluZwotICAgICAgICAgIERlY29kZVBhblNjYW5SZWN0YW5nbGUKLSAgICAgICAgICBEZWNvZGVGaWxsZXJQYXlsb2FkCi0gICAgICAgICAgRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNQotICAgICAgICAgIERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkCi0gICAgICAgICAgRGVjb2RlUmVjb3ZlcnlQb2ludAotICAgICAgICAgIERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uCi0gICAgICAgICAgRGVjb2RlU3BhcmVQaWMKLSAgICAgICAgICBEZWNvZGVTY2VuZUluZm8KLSAgICAgICAgICBEZWNvZGVTdWJTZXFJbmZvCi0gICAgICAgICAgRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MKLSAgICAgICAgICBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MKLSAgICAgICAgICBEZWNvZGVGdWxsRnJhbWVGcmVlemUKLSAgICAgICAgICBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdAotICAgICAgICAgIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydAotICAgICAgICAgIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQKLSAgICAgICAgICBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQKLSAgICAgICAgICBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3NlaS5oIgotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBjb25zdCB1MzIgbnVtQ2xvY2tUU1s5XSA9IHsxLDEsMSwyLDIsMywzLDIsM307Ci1zdGF0aWMgY29uc3QgdTMyIGNlaWxMb2cyTnVtU2xpY2VHcm91cHNbOV0gPSB7MCwxLDEsMiwyLDMsMywzLDN9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlQnVmZmVyaW5nUGVyaW9kKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaUJ1ZmZlcmluZ1BlcmlvZF90ICpwQnVmZmVyaW5nUGVyaW9kLAotICB1MzIgY3BiQ250LAotICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCwKLSAgdTMyIG5hbEhyZEJwUHJlc2VudEZsYWcsCi0gIHUzMiB2Y2xIcmRCcFByZXNlbnRGbGFnKTsKLQotc3RhdGljIHUzMiBEZWNvZGVQaWN0dXJlVGltaW5nKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVBpY1RpbWluZ190ICpwUGljVGltaW5nLAotICB1MzIgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAotICB1MzIgZHBiT3V0cHV0RGVsYXlMZW5ndGgsCi0gIHUzMiB0aW1lT2Zmc2V0TGVuZ3RoLAotICB1MzIgY3BiRHBiRGVsYXlzUHJlc2VudEZsYWcsCi0gIHUzMiBwaWNTdHJ1Y3RQcmVzZW50RmxhZyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUGFuU2NhblJlY3RhbmdsZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQYW5TY2FuUmVjdF90ICpwUGFuU2NhblJlY3RhbmdsZSk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlRmlsbGVyUGF5bG9hZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBwYXlsb2FkU2l6ZSk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3QgKnBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LAotICB1MzIgcGF5bG9hZFNpemUpOwotCi1zdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3QgKnBVc2VyRGF0YVVucmVnaXN0ZXJlZCwKLSAgdTMyIHBheWxvYWRTaXplKTsKLQotc3RhdGljIHUzMiBEZWNvZGVSZWNvdmVyeVBvaW50KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVJlY292ZXJ5UG9pbnRfdCAqcFJlY292ZXJ5UG9pbnQpOwotCi1zdGF0aWMgdTMyIERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3QgKnBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbiwKLSAgdTMyIG51bVJlZkZyYW1lcyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlU3BhcmVQaWMoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3BhcmVQaWNfdCAqcFNwYXJlUGljLAotICB1MzIgcGljU2l6ZUluTWFwVW5pdHMpOwotCi1zdGF0aWMgdTMyIERlY29kZVNjZW5lSW5mbygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTY2VuZUluZm9fdCAqcFNjZW5lSW5mbyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlU3ViU2VxSW5mbygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTdWJTZXFJbmZvX3QgKnBTdWJTZXFJbmZvKTsKLQotc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190ICpwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpOwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUNoYXJhY3RlcmlzdGljcyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lRnJlZXplKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaUZ1bGxGcmFtZUZyZWV6ZV90ICpwRnVsbEZyYW1lRnJlZXplKTsKLQotc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlGdWxsRnJhbWVTbmFwc2hvdF90ICpwRnVsbEZyYW1lU25hcHNob3QpOwotCi1zdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKTsKLQotc3RhdGljIHUzMiBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3QgKnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQsCi0gIHUzMiBudW1TbGljZUdyb3Vwcyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVJlc2VydmVkU2VpTWVzc2FnZV90ICpwUmVzZXJ2ZWRTZWlNZXNzYWdlLAotICB1MzIgcGF5bG9hZFNpemUpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVTZWlNZXNzYWdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNlaU1lc3NhZ2UoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBzZWlNZXNzYWdlX3QgKnBTZWlNZXNzYWdlLAotICB1MzIgbnVtU2xpY2VHcm91cHMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgcGF5bG9hZFR5cGUsIHBheWxvYWRTaXplLCBzdGF0dXM7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VpTWVzc2FnZSk7Ci0KLQotICAgIEgyNjRTd0RlY01lbXNldChwU2VpTWVzc2FnZSwgMCwgc2l6ZW9mKHNlaU1lc3NhZ2VfdCkpOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIHBheWxvYWRUeXBlID0gMDsKLSAgICAgICAgd2hpbGUoKHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCkpID09IDB4RkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBheWxvYWRUeXBlICs9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBheWxvYWRUeXBlICs9IHRtcDsKLQotICAgICAgICBwYXlsb2FkU2l6ZSA9IDA7Ci0gICAgICAgIHdoaWxlKCh0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpKSA9PSAweEZGKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXlsb2FkU2l6ZSArPSAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwYXlsb2FkU2l6ZSArPSB0bXA7Ci0KLSAgICAgICAgcFNlaU1lc3NhZ2UtPnBheWxvYWRUeXBlID0gcGF5bG9hZFR5cGU7Ci0KLSAgICAgICAgc3dpdGNoIChwYXlsb2FkVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+YnVmZmVyaW5nUGVyaW9kLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYkNudCwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KLSAgICAgICAgICAgICAgICAgIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZywKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUGljdHVyZVRpbWluZygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cGljVGltaW5nLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgICAgIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KLSAgICAgICAgICAgICAgICAgICAgICBkcGJPdXRwdXREZWxheUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KLSAgICAgICAgICAgICAgICAgICAgdGltZU9mZnNldExlbmd0aCwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnIHx8Ci0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyA/Ci0gICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+cGljU3RydWN0UHJlc2VudEZsYWcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUGFuU2NhblJlY3RhbmdsZSgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cGFuU2NhblJlY3QpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRmlsbGVyUGF5bG9hZChwU3RybURhdGEsIHBheWxvYWRTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUsCi0gICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+dXNlckRhdGFVbnJlZ2lzdGVyZWQsCi0gICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVSZWNvdmVyeVBvaW50KAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5yZWNvdmVyeVBvaW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5kZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbiwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVNwYXJlUGljKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zcGFyZVBpYywKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAqIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU2NlbmVJbmZvKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zY2VuZUluZm8pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVN1YlNlcUluZm8oCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnN1YlNlcUluZm8pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zdWJTZXFDaGFyYWN0ZXJpc3RpY3MpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZ1bGxGcmFtZUZyZWV6ZSgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+ZnVsbEZyYW1lRnJlZXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNDogLyogVGhpcyBTRUkgZG9lcyBub3QgY29udGFpbiBkYXRhLCB3aGF0IHRvIGRvID8/PyAqLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhBTlRST19PSzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+ZnVsbEZyYW1lU25hcHNob3QpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+bW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LAotICAgICAgICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oc3RhdHVzKTsKLQotICAgICAgICB3aGlsZSAoIWgyNjRic2RJc0J5dGVBbGlnbmVkKHBTdHJtRGF0YSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpICE9IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgd2hpbGUgKCFoMjY0YnNkSXNCeXRlQWxpZ25lZChwU3RybURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGgyNjRic2RNb3JlUmJzcERhdGEocFN0cm1EYXRhKSk7Ci0KLSAgICByZXR1cm4oaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMocFN0cm1EYXRhKSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVCdWZmZXJpbmdQZXJpb2QKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlQnVmZmVyaW5nUGVyaW9kKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaUJ1ZmZlcmluZ1BlcmlvZF90ICpwQnVmZmVyaW5nUGVyaW9kLAotICB1MzIgY3BiQ250LAotICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCwKLSAgdTMyIG5hbEhyZEJwUHJlc2VudEZsYWcsCi0gIHUzMiB2Y2xIcmRCcFByZXNlbnRGbGFnKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwQnVmZmVyaW5nUGVyaW9kKTsKLSAgICBBU1NFUlQoY3BiQ250KTsKLSAgICBBU1NFUlQoaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcEJ1ZmZlcmluZ1BlcmlvZC0+c2VxUGFyYW1ldGVyU2V0SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocEJ1ZmZlcmluZ1BlcmlvZC0+c2VxUGFyYW1ldGVyU2V0SWQgPiAzMSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgaWYgKG5hbEhyZEJwUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3BiQ250OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgaWYgKHRtcCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcEJ1ZmZlcmluZ1BlcmlvZC0+aW5pdGlhbENwYlJlbW92YWxEZWxheU9mZnNldFtpXSA9IHRtcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh2Y2xIcmRCcFByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwYkNudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcEJ1ZmZlcmluZ1BlcmlvZC0+aW5pdGlhbENwYlJlbW92YWxEZWxheU9mZnNldFtpXSA9IHRtcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUGljdHVyZVRpbWluZwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVQaWN0dXJlVGltaW5nKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVBpY1RpbWluZ190ICpwUGljVGltaW5nLAotICB1MzIgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAotICB1MzIgZHBiT3V0cHV0RGVsYXlMZW5ndGgsCi0gIHUzMiB0aW1lT2Zmc2V0TGVuZ3RoLAotICB1MzIgY3BiRHBiRGVsYXlzUHJlc2VudEZsYWcsCi0gIHUzMiBwaWNTdHJ1Y3RQcmVzZW50RmxhZykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotICAgIGkzMiBpdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFBpY1RpbWluZyk7Ci0KLQotICAgIGlmIChjcGJEcGJEZWxheXNQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwUGljVGltaW5nLT5jcGJSZW1vdmFsRGVsYXkgPSB0bXA7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBkcGJPdXRwdXREZWxheUxlbmd0aCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFBpY1RpbWluZy0+ZHBiT3V0cHV0RGVsYXkgPSB0bXA7Ci0gICAgfQotCi0gICAgaWYgKHBpY1N0cnVjdFByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA0KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBpZiAodG1wID4gOCkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFBpY1RpbWluZy0+cGljU3RydWN0ID0gdG1wOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DbG9ja1RTW3BQaWNUaW1pbmctPnBpY1N0cnVjdF07IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwUGljVGltaW5nLT5jbG9ja1RpbWVTdGFtcEZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPmNsb2NrVGltZVN0YW1wRmxhZ1tpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmN0VHlwZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bnVpdEZpZWxkQmFzZWRGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPiA2KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+Y291bnRpbmdUeXBlW2ldID0gdG1wOwotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5mdWxsVGltZVN0YW1wRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5kaXNjb250aW51aXR5RmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5jbnREcm9wcGVkRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5uRnJhbWVzW2ldID0gdG1wOwotCi0gICAgICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPmZ1bGxUaW1lU3RhbXBGbGFnW2ldKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnNlY29uZHNWYWx1ZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bWludXRlc1ZhbHVlW2ldID0gdG1wOwotCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDIzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5ob3Vyc1ZhbHVlW2ldID0gdG1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnNlY29uZHNGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPnNlY29uZHNGbGFnW2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzVmFsdWVbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bWludXRlc0ZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPm1pbnV0ZXNGbGFnW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bWludXRlc1ZhbHVlW2ldID0gdG1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5ob3Vyc0ZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5ob3Vyc0ZsYWdbaV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiAyMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNWYWx1ZVtpXSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVPZmZzZXRMZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHRpbWVPZmZzZXRMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIGl0bXAgPSAoaTMyKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nICJjb252ZXJ0cyIgdGltZU9mZnNldExlbmd0aC1iaXQgc2lnbmVkCi0gICAgICAgICAgICAgICAgICAgICAqIGludGVnZXIgaW50byBpMzIgKi8KLSAgICAgICAgICAgICAgICAgICAgLypsaW50IC1zYXZlIC1lNzAxIC1lNzAyICovCi0gICAgICAgICAgICAgICAgICAgIGl0bXAgPDw9ICgzMiAtIHRpbWVPZmZzZXRMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpdG1wID4+PSAoMzIgLSB0aW1lT2Zmc2V0TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgLypsaW50IC1yZXN0b3JlICovCi0gICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnRpbWVPZmZzZXRbaV0gPSBpdG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+dGltZU9mZnNldFtpXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVBhblNjYW5SZWN0YW5nbGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlUGFuU2NhblJlY3RhbmdsZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQYW5TY2FuUmVjdF90ICpwUGFuU2NhblJlY3RhbmdsZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFBhblNjYW5SZWN0YW5nbGUpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdENhbmNlbEZsYWcgPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKCFwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RDYW5jZWxGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQgPiAyKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCsrOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdExlZnRPZmZzZXRbaV0pOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmlnaHRPZmZzZXRbaV0pOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0VG9wT2Zmc2V0W2ldKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdEJvdHRvbU9mZnNldFtpXSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgfQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2QgPiAxNjM4NCkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgaWYgKHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250ID4gMSAmJgotICAgICAgICAgIHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2QgPiAxKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUZpbGxlclBheWxvYWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlRmlsbGVyUGF5bG9hZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBwYXlsb2FkU2l6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotCi0KLSAgICBpZiAocGF5bG9hZFNpemUpCi0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgOCAqIHBheWxvYWRTaXplKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90ICpwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSwKLSAgdTMyIHBheWxvYWRTaXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIGo7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSk7Ci0gICAgQVNTRVJUKHBheWxvYWRTaXplKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1Q291bnRyeUNvZGUgPSB0bXA7Ci0KLSAgICBpZiAocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVDb3VudHJ5Q29kZSAhPSAweEZGKQotICAgICAgICBpID0gMTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1Q291bnRyeUNvZGVFeHRlbnNpb25CeXRlID0gdG1wOwotICAgICAgICBpID0gMjsKLSAgICB9Ci0KLSAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KLSAgICBBTExPQ0FURShwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlLHBheWxvYWRTaXplLWksdTgpOwotICAgIHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5udW1QYXlsb2FkQnl0ZXMgPSBwYXlsb2FkU2l6ZSAtIGk7Ci0gICAgaWYgKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1UGF5bG9hZEJ5dGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLQotICAgIGogPSAwOwotICAgIGRvCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1UGF5bG9hZEJ5dGVbal0gPSAodTgpdG1wOwotICAgICAgICBpKys7Ci0gICAgICAgIGorKzsKLSAgICB9IHdoaWxlIChpIDwgcGF5bG9hZFNpemUpOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90ICpwVXNlckRhdGFVbnJlZ2lzdGVyZWQsCi0gIHUzMiBwYXlsb2FkU2l6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFVzZXJEYXRhVW5yZWdpc3RlcmVkKTsKLQotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+dXVpZElzb0llYzExNTc4W2ldID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLwotICAgIEFMTE9DQVRFKHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+dXNlckRhdGFQYXlsb2FkQnl0ZSwgcGF5bG9hZFNpemUgLSAxNiwgdTgpOwotICAgIGlmIChwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLQotICAgIHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemUgLSAxNjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkU2l6ZSAtIDE2OyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+dXNlckRhdGFQYXlsb2FkQnl0ZVtpXSA9ICh1OCl0bXA7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVSZWNvdmVyeVBvaW50Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVJlY292ZXJ5UG9pbnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUmVjb3ZlcnlQb2ludF90ICpwUmVjb3ZlcnlQb2ludCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFJlY292ZXJ5UG9pbnQpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFJlY292ZXJ5UG9pbnQtPnJlY292ZXJ5RnJhbWVDbnQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFJlY292ZXJ5UG9pbnQtPmV4YWN0TWF0Y2hGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFJlY292ZXJ5UG9pbnQtPmJyb2tlbkxpbmtGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgaWYgKHRtcCA+IDIpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUmVjb3ZlcnlQb2ludC0+Y2hhbmdpbmdTbGljZUdyb3VwSWRjID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90ICpwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCi0gIHUzMiBudW1SZWZGcmFtZXMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbik7Ci0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5vcmlnaW5hbElkckZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24tPm9yaWdpbmFsRnJhbWVOdW0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGZyYW1lX21ic19vbmx5X2ZsYWcgYXNzdW1lZCBhbHdheXMgdHJ1ZSBzbyBzb21lIGZpZWxkIHJlbGF0ZWQgc3ludGF4Ci0gICAgICogZWxlbWVudHMgYXJlIHNraXBwZWQsIHNlZSBILjI2NCBzdGFuZGFyZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNSZWZQaWNNYXJraW5nKHBTdHJtRGF0YSwKLSAgICAgICZwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24tPmRlY1JlZlBpY01hcmtpbmcsIE5BTF9TRUksIG51bVJlZkZyYW1lcyk7Ci0KLSAgICByZXR1cm4odG1wKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVNwYXJlUGljCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVNwYXJlUGljKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVNwYXJlUGljX3QgKnBTcGFyZVBpYywKLSAgdTMyIHBpY1NpemVJbk1hcFVuaXRzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIGosIG1hcFVuaXRDbnQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3BhcmVQaWMpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFNwYXJlUGljLT50YXJnZXRGcmFtZU51bSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU3BhcmVQaWMtPnNwYXJlRmllbGRGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICAvKiBkbyBub3QgYWNjZXB0IGZpZWxkcyAqLwotICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlRmllbGRGbGFnKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcFNwYXJlUGljLT5udW1TcGFyZVBpY3MpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU3BhcmVQaWMtPm51bVNwYXJlUGljcysrOwotICAgIGlmIChwU3BhcmVQaWMtPm51bVNwYXJlUGljcyA+IE1BWF9OVU1fU1BBUkVfUElDUykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzOyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwU3BhcmVQaWMtPmRlbHRhU3BhcmVGcmFtZU51bVtpXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSA+IDIpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgaWYgKHBTcGFyZVBpYy0+c3BhcmVBcmVhSWRjW2ldID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLwotICAgICAgICAgICAgQUxMT0NBVEUocFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldLCBwaWNTaXplSW5NYXBVbml0cywgdTMyKTsKLSAgICAgICAgICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgICAgICAgICAgcFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldID0gTlVMTDsKLQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBpY1NpemVJbk1hcFVuaXRzOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV1bal0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KLSAgICAgICAgICAgIEFMTE9DQVRFKHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSwgcGljU2l6ZUluTWFwVW5pdHMsIHUzMik7Ci0gICAgICAgICAgICBpZiAocFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgICAgIHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDAsIG1hcFVuaXRDbnQgPSAwOyBtYXBVbml0Q250IDwgcGljU2l6ZUluTWFwVW5pdHM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXVtqXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIG1hcFVuaXRDbnQgKz0gcFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldW2pdICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHNldCByZXN0IHRvIG51bGwgKi8KLSAgICBmb3IgKGkgPSBwU3BhcmVQaWMtPm51bVNwYXJlUGljczsgaSA8IE1BWF9OVU1fU1BBUkVfUElDUzsgaSsrKQotICAgIHsKLSAgICAgICAgcFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldID0gTlVMTDsKLSAgICAgICAgcFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVNjZW5lSW5mbwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVTY2VuZUluZm8oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU2NlbmVJbmZvX3QgKnBTY2VuZUluZm8pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTY2VuZUluZm8pOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTY2VuZUluZm8tPnNjZW5lSW5mb1ByZXNlbnRGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwU2NlbmVJbmZvLT5zY2VuZUluZm9QcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZwU2NlbmVJbmZvLT5zY2VuZUlkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwU2NlbmVJbmZvLT5zY2VuZVRyYW5zaXRpb25UeXBlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBTY2VuZUluZm8tPnNjZW5lVHJhbnNpdGlvblR5cGUgPiA2KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmIChwU2NlbmVJbmZvLT5zY2VuZVRyYW5zaXRpb25UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgICAmcFNjZW5lSW5mby0+c2Vjb25kU2NlbmVJZCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJTZXFJbmZvCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlU3ViU2VxSW5mbygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTdWJTZXFJbmZvX3QgKnBTdWJTZXFJbmZvKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3ViU2VxSW5mbyk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwU3ViU2VxSW5mby0+c3ViU2VxTGF5ZXJOdW0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFN1YlNlcUluZm8tPnN1YlNlcUxheWVyTnVtID4gMjU1KQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcFN1YlNlcUluZm8tPnN1YlNlcUlkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTdWJTZXFJbmZvLT5zdWJTZXFJZCA+IDY1NTM1KQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTdWJTZXFJbmZvLT5maXJzdFJlZlBpY0ZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU3ViU2VxSW5mby0+bGVhZGluZ05vblJlZlBpY0ZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU3ViU2VxSW5mby0+bGFzdFBpY0ZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU3ViU2VxSW5mby0+c3ViU2VxRnJhbWVOdW1GbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwU3ViU2VxSW5mby0+c3ViU2VxRnJhbWVOdW1GbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU3ViU2VxSW5mby0+c3ViU2VxRnJhbWVOdW0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5udW1TdWJTZXFMYXllcnMrKzsKLSAgICBpZiAocFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5udW1TdWJTZXFMYXllcnMgPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5udW1TdWJTZXFMYXllcnM7IGkrKykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5hY2N1cmF0ZVN0YXRpc3RpY3NGbGFnW2ldID0KLSAgICAgICAgICAgIHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlQml0UmF0ZVtpXSA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VGcmFtZVJhdGVbaV0gPSB0bXA7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190ICpwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFMYXllck51bSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFMYXllck51bSA+IE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMtMSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUlkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUlkID4gNjU1MzUpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+ZHVyYXRpb25GbGFnID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmR1cmF0aW9uRmxhZykKLSAgICB7Ci0gICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUR1cmF0aW9uID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZVJhdGVGbGFnID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VSYXRlRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YWNjdXJhdGVTdGF0aXN0aWNzRmxhZyA9Ci0gICAgICAgICAgICB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VCaXRSYXRlID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VGcmFtZVJhdGUgPSB0bXA7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5udW1SZWZlcmVuY2VkU3Vic2Vxcyk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5udW1SZWZlcmVuY2VkU3Vic2VxcyA+IE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMtMSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPm51bVJlZmVyZW5jZWRTdWJzZXFzOyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5yZWZTdWJTZXFMYXllck51bVtpXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+cmVmU3ViU2VxSWRbaV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+cmVmU3ViU2VxRGlyZWN0aW9uW2ldID0gdG1wOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlRnVsbEZyYW1lRnJlZXplCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZUZyZWV6ZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlGdWxsRnJhbWVGcmVlemVfdCAqcEZ1bGxGcmFtZUZyZWV6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocEZ1bGxGcmFtZUZyZWV6ZSk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcEZ1bGxGcmFtZUZyZWV6ZS0+ZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwRnVsbEZyYW1lRnJlZXplLT5mdWxsRnJhbWVGcmVlemVSZXBldGl0aW9uUGVyaW9kID4gMTYzODQpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlRnVsbEZyYW1lU25hcHNob3QKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCAqcEZ1bGxGcmFtZVNuYXBzaG90KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwRnVsbEZyYW1lU25hcHNob3QpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcEZ1bGxGcmFtZVNuYXBzaG90LT5zbmFwU2hvdElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQtPnByb2dyZXNzaXZlUmVmaW5lbWVudElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQtPm51bVJlZmluZW1lbnRTdGVwcyk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQtPm51bVJlZmluZW1lbnRTdGVwcysrOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kLT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90ICpwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LAotICB1MzIgbnVtU2xpY2VHcm91cHMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCxpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCk7Ci0gICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzIDwgTUFYX05VTV9TTElDRV9HUk9VUFMpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0Kys7Ci0gICAgaWYgKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQgPiBudW1TbGljZUdyb3VwcykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwKLSAgICAgICAgICAgIGNlaWxMb2cyTnVtU2xpY2VHcm91cHNbbnVtU2xpY2VHcm91cHNdKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5zbGljZUdyb3VwSWRbaV0gPSB0bXA7Ci0gICAgICAgIGlmIChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5zbGljZUdyb3VwSWRbaV0gPgotICAgICAgICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQtMSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPmV4YWN0U2FtcGxlVmFsdWVNYXRjaEZsYWcgPQotICAgICAgICB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5wYW5TY2FuUmVjdEZsYWcgPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+cGFuU2NhblJlY3RGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+cGFuU2NhblJlY3RJZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVJlc2VydmVkU2VpTWVzc2FnZV90ICpwUmVzZXJ2ZWRTZWlNZXNzYWdlLAotICB1MzIgcGF5bG9hZFNpemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBSZXNlcnZlZFNlaU1lc3NhZ2UpOwotCi0KLSAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KLSAgICBBTExPQ0FURShwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZSxwYXlsb2FkU2l6ZSx1OCk7Ci0gICAgaWYgKHBSZXNlcnZlZFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlID09IE5VTEwpCi0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICBwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5udW1QYXlsb2FkQnl0ZXMgPSBwYXlsb2FkU2l6ZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLDgpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBSZXNlcnZlZFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlW2ldID0gKHU4KXRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTU0M2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU0VJX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NFSV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfUEFOX1NDQU5fQ05UIDMyCi0jZGVmaW5lIE1BWF9OVU1fU1BBUkVfUElDUyAxNgotI2RlZmluZSBNQVhfTlVNX0NMT0NLX1RTIDMKLSNkZWZpbmUgTUFYX05VTV9TVUJfU0VRX0xBWUVSUyAyNTYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKLSAgICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheVtNQVhfQ1BCX0NOVF07Ci0gICAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbTUFYX0NQQl9DTlRdOwotfSBzZWlCdWZmZXJpbmdQZXJpb2RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgY3BiUmVtb3ZhbERlbGF5OwotICAgIHUzMiBkcGJPdXRwdXREZWxheTsKLSAgICB1MzIgcGljU3RydWN0OwotICAgIHUzMiBjbG9ja1RpbWVTdGFtcEZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGNsb2NrVGltZVN0YW1wW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBjdFR5cGVbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIG51aXRGaWVsZEJhc2VkRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgY291bnRpbmdUeXBlW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBmdWxsVGltZVN0YW1wRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgZGlzY29udGludWl0eUZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGNudERyb3BwZWRGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBuRnJhbWVzW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBzZWNvbmRzRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgc2Vjb25kc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBtaW51dGVzRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgbWludXRlc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBob3Vyc0ZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGhvdXJzVmFsdWVbTUFYX05VTV9DTE9DS19UU107Ci0gICAgaTMyIHRpbWVPZmZzZXRbTUFYX05VTV9DTE9DS19UU107Ci19IHNlaVBpY1RpbWluZ190OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwYW5TY2FuUmVjdElkOwotICAgIHUzMiBwYW5TY2FuUmVjdENhbmNlbEZsYWc7Ci0gICAgdTMyIHBhblNjYW5DbnQ7Ci0gICAgaTMyIHBhblNjYW5SZWN0TGVmdE9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKLSAgICBpMzIgcGFuU2NhblJlY3RSaWdodE9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKLSAgICBpMzIgcGFuU2NhblJlY3RUb3BPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07Ci0gICAgaTMyIHBhblNjYW5SZWN0Qm90dG9tT2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOwotICAgIHUzMiBwYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2Q7Ci19IHNlaVBhblNjYW5SZWN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGl0dVRUMzVDb3VudHJ5Q29kZTsKLSAgICB1MzIgaXR1VFQzNUNvdW50cnlDb2RlRXh0ZW5zaW9uQnl0ZTsKLSAgICB1OCAqaXR1VFQzNVBheWxvYWRCeXRlOwotICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Ci19IHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgdXVpZElzb0llYzExNTc4WzRdOwotICAgIHU4ICp1c2VyRGF0YVBheWxvYWRCeXRlOwotICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Ci19IHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHJlY292ZXJ5RnJhbWVDbnQ7Ci0gICAgdTMyIGV4YWN0TWF0Y2hGbGFnOwotICAgIHUzMiBicm9rZW5MaW5rRmxhZzsKLSAgICB1MzIgY2hhbmdpbmdTbGljZUdyb3VwSWRjOwotfSBzZWlSZWNvdmVyeVBvaW50X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIG9yaWdpbmFsSWRyRmxhZzsKLSAgICB1MzIgb3JpZ2luYWxGcmFtZU51bTsKLSAgICBkZWNSZWZQaWNNYXJraW5nX3QgZGVjUmVmUGljTWFya2luZzsKLX0gc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgdGFyZ2V0RnJhbWVOdW07Ci0gICAgdTMyIHNwYXJlRmllbGRGbGFnOwotICAgIHUzMiB0YXJnZXRCb3R0b21GaWVsZEZsYWc7Ci0gICAgdTMyIG51bVNwYXJlUGljczsKLSAgICB1MzIgZGVsdGFTcGFyZUZyYW1lTnVtW01BWF9OVU1fU1BBUkVfUElDU107Ci0gICAgdTMyIHNwYXJlQm90dG9tRmllbGRGbGFnW01BWF9OVU1fU1BBUkVfUElDU107Ci0gICAgdTMyIHNwYXJlQXJlYUlkY1tNQVhfTlVNX1NQQVJFX1BJQ1NdOwotICAgIHUzMiAqc3BhcmVVbml0RmxhZ1tNQVhfTlVNX1NQQVJFX1BJQ1NdOwotICAgIHUzMiAqemVyb1J1bkxlbmd0aFtNQVhfTlVNX1NQQVJFX1BJQ1NdOwotfSBzZWlTcGFyZVBpY190OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBzY2VuZUluZm9QcmVzZW50RmxhZzsKLSAgICB1MzIgc2NlbmVJZDsKLSAgICB1MzIgc2NlbmVUcmFuc2l0aW9uVHlwZTsKLSAgICB1MzIgc2Vjb25kU2NlbmVJZDsKLX0gc2VpU2NlbmVJbmZvX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHN1YlNlcUxheWVyTnVtOwotICAgIHUzMiBzdWJTZXFJZDsKLSAgICB1MzIgZmlyc3RSZWZQaWNGbGFnOwotICAgIHUzMiBsZWFkaW5nTm9uUmVmUGljRmxhZzsKLSAgICB1MzIgbGFzdFBpY0ZsYWc7Ci0gICAgdTMyIHN1YlNlcUZyYW1lTnVtRmxhZzsKLSAgICB1MzIgc3ViU2VxRnJhbWVOdW07Ci19IHNlaVN1YlNlcUluZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgbnVtU3ViU2VxTGF5ZXJzOwotICAgIHUzMiBhY2N1cmF0ZVN0YXRpc3RpY3NGbGFnW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOwotICAgIHUzMiBhdmVyYWdlQml0UmF0ZVtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKLSAgICB1MzIgYXZlcmFnZUZyYW1lUmF0ZVtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKLX0gc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgc3ViU2VxTGF5ZXJOdW07Ci0gICAgdTMyIHN1YlNlcUlkOwotICAgIHUzMiBkdXJhdGlvbkZsYWc7Ci0gICAgdTMyIHN1YlNlcUR1cmF0aW9uOwotICAgIHUzMiBhdmVyYWdlUmF0ZUZsYWc7Ci0gICAgdTMyIGFjY3VyYXRlU3RhdGlzdGljc0ZsYWc7Ci0gICAgdTMyIGF2ZXJhZ2VCaXRSYXRlOwotICAgIHUzMiBhdmVyYWdlRnJhbWVSYXRlOwotICAgIHUzMiBudW1SZWZlcmVuY2VkU3Vic2VxczsKLSAgICB1MzIgcmVmU3ViU2VxTGF5ZXJOdW1bTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Ci0gICAgdTMyIHJlZlN1YlNlcUlkW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOwotICAgIHUzMiByZWZTdWJTZXFEaXJlY3Rpb25bTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Ci19IHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBmdWxsRnJhbWVGcmVlemVSZXBldGl0aW9uUGVyaW9kOwotfSBzZWlGdWxsRnJhbWVGcmVlemVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgc25hcFNob3RJZDsKLX0gc2VpRnVsbEZyYW1lU25hcHNob3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQ7Ci0gICAgdTMyIG51bVJlZmluZW1lbnRTdGVwczsKLX0gc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHByb2dyZXNzaXZlUmVmaW5lbWVudElkOwotfSBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIG51bVNsaWNlR3JvdXBzSW5TZXQ7Ci0gICAgdTMyIHNsaWNlR3JvdXBJZFtNQVhfTlVNX1NMSUNFX0dST1VQU107Ci0gICAgdTMyIGV4YWN0U2FtcGxlVmFsdWVNYXRjaEZsYWc7Ci0gICAgdTMyIHBhblNjYW5SZWN0RmxhZzsKLSAgICB1MzIgcGFuU2NhblJlY3RJZDsKLX0gc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTggKnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlOwotICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Ci19IHNlaVJlc2VydmVkU2VpTWVzc2FnZV90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwYXlsb2FkVHlwZTsKLSAgICBzZWlCdWZmZXJpbmdQZXJpb2RfdCBidWZmZXJpbmdQZXJpb2Q7Ci0gICAgc2VpUGljVGltaW5nX3QgcGljVGltaW5nOwotICAgIHNlaVBhblNjYW5SZWN0X3QgcGFuU2NhblJlY3Q7Ci0gICAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90IHVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzU7Ci0gICAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCB1c2VyRGF0YVVucmVnaXN0ZXJlZDsKLSAgICBzZWlSZWNvdmVyeVBvaW50X3QgcmVjb3ZlcnlQb2ludDsKLSAgICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90IGRlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uOwotICAgIHNlaVNwYXJlUGljX3Qgc3BhcmVQaWM7Ci0gICAgc2VpU2NlbmVJbmZvX3Qgc2NlbmVJbmZvOwotICAgIHNlaVN1YlNlcUluZm9fdCBzdWJTZXFJbmZvOwotICAgIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3Qgc3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3M7Ci0gICAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3Qgc3ViU2VxQ2hhcmFjdGVyaXN0aWNzOwotICAgIHNlaUZ1bGxGcmFtZUZyZWV6ZV90IGZ1bGxGcmFtZUZyZWV6ZTsKLSAgICBzZWlGdWxsRnJhbWVTbmFwc2hvdF90IGZ1bGxGcmFtZVNuYXBzaG90OwotICAgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90IHByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydDsKLSAgICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3QgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZDsKLSAgICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCBtb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQ7Ci0gICAgc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3QgcmVzZXJ2ZWRTZWlNZXNzYWdlOwotfSBzZWlNZXNzYWdlX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgc2VpTWVzc2FnZV90ICpwU2VpTWVzc2FnZSwKLSAgdTMyIG51bVNsaWNlR3JvdXBzKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0VJX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MTA1MWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0Ci0gICAgICAgICAgR2V0RHBiU2l6ZQotICAgICAgICAgIGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3Z1aS5oIgotI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGVudW1lcmF0aW9uIHRvIGluZGljYXRlIGludmFsaWQgcmV0dXJuIHZhbHVlIGZyb20gdGhlIEdldERwYlNpemUgZnVuY3Rpb24gKi8KLWVudW0ge0lOVkFMSURfRFBCX1NJWkUgPSAweDdGRkZGRkZGfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIEdldERwYlNpemUodTMyIHBpY1NpemVJbk1icywgdTMyIGxldmVsSWRjKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVTZXFQYXJhbVNldAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgICAgIEZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIG9mZnNldEZvclJlZkZyYW1lIGFycmF5IGlmCi0gICAgICAgICAgICBwaWN0dXJlIG9yZGVyIGNvdW50IHR5cGUgaXMgMSBhbmQgbnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlCi0gICAgICAgICAgICBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIGRlY29kZWQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBpbnZhbGlkIGluZm9ybWF0aW9uIG9yIGVuZCBvZiBzdHJlYW0KLSAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgdmFsdWU7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotCi0gICAgSDI2NFN3RGVjTWVtc2V0KHBTZXFQYXJhbVNldCwgMCwgc2l6ZW9mKHNlcVBhcmFtU2V0X3QpKTsKLQotICAgIC8qIHByb2ZpbGVfaWRjICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBpZiAodG1wICE9IDY2KQotICAgIHsKLSAgICAgICAgREVCVUcoKCJOT1QgQkFTRUxJTkUgUFJPRklMRSAlZFxuIiwgdG1wKSk7Ci0gICAgfQotICAgIHBTZXFQYXJhbVNldC0+cHJvZmlsZUlkYyA9IHRtcDsKLQotICAgIC8qIGNvbnN0cmFpbmVkX3NldDBfZmxhZyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgLyogY29uc3RyYWluZWRfc2V0MV9mbGFnICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAvKiBjb25zdHJhaW5lZF9zZXQyX2ZsYWcgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotCi0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiByZXNlcnZlZF96ZXJvXzViaXRzLCB2YWx1ZXMgb2YgdGhlc2UgYml0cyBzaGFsbCBiZSBpZ25vcmVkICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNlcVBhcmFtU2V0LT5sZXZlbElkYyA9IHRtcDsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPj0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgic2VxX3BhcmFtX3NldF9pZCIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICh2YWx1ZSA+IDEyKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJsb2cyX21heF9mcmFtZV9udW1fbWludXM0Iik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgLyogbWF4RnJhbWVOdW0gPSAyXihsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCkgKi8KLSAgICBwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID0gMSA8PCAodmFsdWUrNCk7Ci0KLSAgICAvKiB2YWxpZCBQT0MgdHlwZXMgYXJlIDAsIDEgYW5kIDIgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAodmFsdWUgPiAyKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJwaWNfb3JkZXJfY250X3R5cGUiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICBwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9IHZhbHVlOwotCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgewotICAgICAgICAvKiBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHZhbHVlID4gMTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgibG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Iik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogbWF4UGljT3JkZXJDbnRMc2IgPSAyXihsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KSAqLwotICAgICAgICBwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID0gMSA8PCAodmFsdWUrNCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JOb25SZWZQaWMpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSA+IDI1NSkKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE5PVEU6IFRoaXMgaGFzIHRvIGJlIGZyZWVkIHNvbWV3aGVyZSEgKi8KLSAgICAgICAgICAgIEFMTE9DQVRFKHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSwgaTMyKTsKLSAgICAgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lICsgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgPiBNQVhfTlVNX1JFRl9QSUNTKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJudW1fcmVmX2ZyYW1lcyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU2VxUGFyYW1TZXQtPmdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzID0gdmFsdWUgKyAxOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1icyA9IHZhbHVlICsgMTsKLQotICAgIC8qIGZyYW1lX21ic19vbmx5X2ZsYWcsIHNoYWxsIGJlIDEgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGlmICghdG1wKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJmcmFtZV9tYnNfb25seV9mbGFnIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BwaW5nRmxhZyA9ICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcHBpbmdGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcExlZnRPZmZzZXQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wVG9wT2Zmc2V0KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgLyogY2hlY2sgdGhhdCBmcmFtZSBjcm9wcGluZyBwYXJhbXMgYXJlIHZhbGlkLCBwYXJhbWV0ZXJzIHNoYWxsCi0gICAgICAgICAqIHNwZWNpZnkgbm9uLW5lZ2F0aXZlIGFyZWEgd2l0aGluIHRoZSBvcmlnaW5hbCBwaWN0dXJlICovCi0gICAgICAgIGlmICggKCAoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wTGVmdE9mZnNldCA+Ci0gICAgICAgICAgICAgICAoIDggKiAoaTMyKXBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAtCi0gICAgICAgICAgICAgICAgICgoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQgKyAxKSApICkgfHwKLSAgICAgICAgICAgICAoIChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BUb3BPZmZzZXQgPgotICAgICAgICAgICAgICAgKCA4ICogKGkzMilwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzIC0KLSAgICAgICAgICAgICAgICAgKChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BCb3R0b21PZmZzZXQgKyAxKSApICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoImZyYW1lX2Nyb3BwaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGF0IGltYWdlIGRpbWVuc2lvbnMgYW5kIGxldmVsSWRjIG1hdGNoICovCi0gICAgdG1wID0gcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzICogcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1iczsKLSAgICB2YWx1ZSA9IEdldERwYlNpemUodG1wLCBwU2VxUGFyYW1TZXQtPmxldmVsSWRjKTsKLSAgICBpZiAodmFsdWUgPT0gSU5WQUxJRF9EUEJfU0laRSB8fCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyA+IHZhbHVlKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJXQVJOSU5HISBJbnZhbGlkIERQQiBzaXplIGJhc2VkIG9uIFNQUyBMZXZlbCFcbiIpKTsKLSAgICAgICAgREVCVUcoKCJXQVJOSU5HISBVc2luZyBudW1fcmVmX2ZyYW1lcyA9JWQgZm9yIERQQiBzaXplIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKSk7Ci0gICAgICAgIHZhbHVlID0gcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXM7Ci0gICAgfQotICAgIHBTZXFQYXJhbVNldC0+bWF4RHBiU2l6ZSA9IHZhbHVlOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIC8qIFZVSSAqLwotICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIEFMTE9DQVRFKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycywgMSwgdnVpUGFyYW1ldGVyc190KTsKLSAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMocFN0cm1EYXRhLAotICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgLyogY2hlY2sgbnVtUmVvcmRlckZyYW1lcyBhbmQgbWF4RGVjRnJhbWVCdWZmZXJpbmcgKi8KLSAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzID4KLSAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyB8fAotICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgPAotICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyB8fAotICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgPgotICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heERwYlNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBzdGFuZGFyZCBzYXlzIHRoYXQgInRoZSBzZXF1ZW5jZSBzaGFsbCBub3QgcmVxdWlyZSBhIERQQiB3aXRoCi0gICAgICAgICAgICAgKiBzaXplIG9mIG1vcmUgdGhhbiBtYXgoMSwgbWF4RGVjRnJhbWVCdWZmZXJpbmcpICovCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heERwYlNpemUgPQotICAgICAgICAgICAgICAgIE1BWCgxLCBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHBTdHJtRGF0YSk7Ci0KLSAgICAvKiBpZ25vcmUgcG9zc2libGUgZXJyb3JzIGluIHRyYWlsaW5nIGJpdHMgb2YgcGFyYW1ldGVycyBzZXRzICovCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXREcGJTaXplCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBzaXplIG9mIHRoZSBEUEIgaW4gZnJhbWVzLiBTaXplIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlCi0gICAgICAgICAgICBwaWN0dXJlIHNpemUgYW5kIE1heERQQiBmb3IgdGhlIHNwZWNpZmllZCBsZXZlbC4gVGhlc2UgZGV0ZXJtaW5lCi0gICAgICAgICAgICBob3cgbWFueSBwaWN0dXJlcyBtYXkgZml0IGludG8gdG8gdGhlIGJ1ZmZlci4gSG93ZXZlciwgdGhlIHNpemUKLSAgICAgICAgICAgIGlzIGFsc28gbGltaXRlZCB0byBhIG1heGltdW0gb2YgMTYgZnJhbWVzIGFuZCB0aGVyZWZvcmUgZnVuY3Rpb24KLSAgICAgICAgICAgIHJldHVybnMgdGhlIG1pbmltdW0gb2YgdGhlIGRldGVybWluZWQgc2l6ZSBhbmQgMTYuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBpbiB0aGUgcGljdHVyZQotICAgICAgICAgICAgbGV2ZWxJZGMgICAgICAgIGluZGljYXRlcyB0aGUgbGV2ZWwKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBzaXplIG9mIHRoZSBEUEIgaW4gZnJhbWVzCi0gICAgICAgICAgICBJTlZBTElEX0RQQl9TSVpFIHdoZW4gaW52YWxpZCBsZXZlbElkYyBzcGVjaWZpZWQgb3IgcGljU2l6ZUluTWJzCi0gICAgICAgICAgICBpcyBoaWdoZXIgdGhhbiBzdXBwb3J0ZWQgYnkgdGhlIGxldmVsIGluIHF1ZXN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBHZXREcGJTaXplKHUzMiBwaWNTaXplSW5NYnMsIHUzMiBsZXZlbElkYykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotICAgIHUzMiBtYXhQaWNTaXplSW5NYnM7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOwotCi0gICAgLyogdXNlIHRtcCBhcyB0aGUgc2l6ZSBvZiB0aGUgRFBCIGluIGJ5dGVzLCBjb21wdXRlcyBhcyAxMDI0ICogTWF4RFBCCi0gICAgICogKGZyb20gdGFibGUgQS0xIGluIEFubmV4IEEpICovCi0gICAgc3dpdGNoIChsZXZlbElkYykKLSAgICB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICB0bXAgPSAxNTIwNjQ7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA5OTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICB0bXAgPSAzNDU2MDA7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgdG1wID0gOTEyMzg0OwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgIHRtcCA9IDkxMjM4NDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICB0bXAgPSA5MTIzODQ7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgdG1wID0gMTgyNDc2ODsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDc5MjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICB0bXAgPSAzMTEwNDAwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMTYyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICB0bXAgPSAzMTEwNDAwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMTYyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICB0bXAgPSA2OTEyMDAwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzYwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICB0bXAgPSA3ODY0MzIwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gNTEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICB0bXAgPSAxMjU4MjkxMjsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDgxOTI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgdG1wID0gMTI1ODI5MTI7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA4MTkyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgIHRtcCA9IDM0ODE2KjM4NDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDg3MDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgLyogc3RhbmRhcmQgc2F5cyA0MjMwMTQ0MCBoZXJlLCBidXQgY29ycmlnZW5kdW0gImNvcnJlY3RzIiB0aGlzIHRvCi0gICAgICAgICAgICAgKiA0MjM5MzYwMCAqLwotICAgICAgICAgICAgdG1wID0gNDIzOTM2MDA7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAyMjA4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICB0bXAgPSA3MDc3ODg4MDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM2ODY0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybihJTlZBTElEX0RQQl9TSVpFKTsKLSAgICB9Ci0KLSAgICAvKiB0aGlzIGlzIG5vdCAiY29ycmVjdCIgcmV0dXJuIHZhbHVlISBIb3dldmVyLCBpdCByZXN1bHRzIGluIGVycm9yIGluCi0gICAgICogZGVjb2RpbmcgYW5kIHRoaXMgd2FzIGVhc2llc3QgcGxhY2UgdG8gY2hlY2sgcGljdHVyZSBzaXplICovCi0gICAgaWYgKHBpY1NpemVJbk1icyA+IG1heFBpY1NpemVJbk1icykKLSAgICAgICAgcmV0dXJuKElOVkFMSURfRFBCX1NJWkUpOwotCi0gICAgdG1wIC89IChwaWNTaXplSW5NYnMqMzg0KTsKLQotICAgIHJldHVybihNSU4odG1wLCAxNikpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wYXJlIHR3byBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3BzMSAgIHBvaW50ZXIgdG8gYSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgICAgICBwU3BzMiAgIHBvaW50ZXIgdG8gYW5vdGhlciBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIDAgICAgICAgc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMgYXJlIGVxdWFsCi0gICAgICAgICAgICAxICAgICAgIG90aGVyd2lzZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMoc2VxUGFyYW1TZXRfdCAqcFNwczEsIHNlcVBhcmFtU2V0X3QgKnBTcHMyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFNwczEpOwotICAgIEFTU0VSVChwU3BzMik7Ci0KLSAgICAvKiBmaXJzdCBjb21wYXJlIHBhcmFtZXRlcnMgd2hvc2UgZXhpc3RlbmNlIGRvZXMgbm90IGRlcGVuZCBvbiBvdGhlcgotICAgICAqIHBhcmFtZXRlcnMgYW5kIG9ubHkgY29tcGFyZSB0aGUgcmVzdCBvZiB0aGUgcGFyYW1zIGlmIHRoZXNlIGFyZSBlcXVhbCAqLwotICAgIGlmIChwU3BzMS0+cHJvZmlsZUlkYyAgICAgICAgPT0gcFNwczItPnByb2ZpbGVJZGMgJiYKLSAgICAgICAgcFNwczEtPmxldmVsSWRjICAgICAgICAgID09IHBTcHMyLT5sZXZlbElkYyAmJgotICAgICAgICBwU3BzMS0+bWF4RnJhbWVOdW0gICAgICAgPT0gcFNwczItPm1heEZyYW1lTnVtICYmCi0gICAgICAgIHBTcHMxLT5waWNPcmRlckNudFR5cGUgICA9PSBwU3BzMi0+cGljT3JkZXJDbnRUeXBlICYmCi0gICAgICAgIHBTcHMxLT5udW1SZWZGcmFtZXMgICAgICA9PSBwU3BzMi0+bnVtUmVmRnJhbWVzICYmCi0gICAgICAgIHBTcHMxLT5nYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcgPT0KLSAgICAgICAgICAgIHBTcHMyLT5nYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcgJiYKLSAgICAgICAgcFNwczEtPnBpY1dpZHRoSW5NYnMgICAgID09IHBTcHMyLT5waWNXaWR0aEluTWJzICYmCi0gICAgICAgIHBTcHMxLT5waWNIZWlnaHRJbk1icyAgICA9PSBwU3BzMi0+cGljSGVpZ2h0SW5NYnMgJiYKLSAgICAgICAgcFNwczEtPmZyYW1lQ3JvcHBpbmdGbGFnID09IHBTcHMyLT5mcmFtZUNyb3BwaW5nRmxhZyAmJgotICAgICAgICBwU3BzMS0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnID09IHBTcHMyLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICBpZiAocFNwczEtPnBpY09yZGVyQ250VHlwZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFNwczEtPm1heFBpY09yZGVyQ250THNiICE9IHBTcHMyLT5tYXhQaWNPcmRlckNudExzYikKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwU3BzMS0+cGljT3JkZXJDbnRUeXBlID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU3BzMS0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnICE9Ci0gICAgICAgICAgICAgICAgICAgIHBTcHMyLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+b2Zmc2V0Rm9yTm9uUmVmUGljICE9IHBTcHMyLT5vZmZzZXRGb3JOb25SZWZQaWMgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCAhPQotICAgICAgICAgICAgICAgICAgICBwU3BzMi0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCB8fAotICAgICAgICAgICAgICAgIHBTcHMxLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgcFNwczItPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNwczEtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsgaSsrKQotICAgICAgICAgICAgICAgICAgICBpZiAocFNwczEtPm9mZnNldEZvclJlZkZyYW1lW2ldICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3BzMi0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTcHMxLT5mcmFtZUNyb3BwaW5nRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTcHMxLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ICAgIT0gcFNwczItPmZyYW1lQ3JvcExlZnRPZmZzZXQgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQgICE9IHBTcHMyLT5mcmFtZUNyb3BSaWdodE9mZnNldCB8fAotICAgICAgICAgICAgICAgIHBTcHMxLT5mcmFtZUNyb3BUb3BPZmZzZXQgICAgIT0gcFNwczItPmZyYW1lQ3JvcFRvcE9mZnNldCB8fAotICAgICAgICAgICAgICAgIHBTcHMxLT5mcmFtZUNyb3BCb3R0b21PZmZzZXQgIT0gcFNwczItPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4ZGY5NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NFUV9QQVJBTV9TRVRfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3Z1aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGluZm9ybWF0aW9uIGRlY29kZWQgZnJvbSB0aGUKLSAqIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcHJvZmlsZUlkYzsKLSAgICB1MzIgbGV2ZWxJZGM7Ci0gICAgdTMyIHNlcVBhcmFtZXRlclNldElkOwotICAgIHUzMiBtYXhGcmFtZU51bTsKLSAgICB1MzIgcGljT3JkZXJDbnRUeXBlOwotICAgIHUzMiBtYXhQaWNPcmRlckNudExzYjsKLSAgICB1MzIgZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnOwotICAgIGkzMiBvZmZzZXRGb3JOb25SZWZQaWM7Ci0gICAgaTMyIG9mZnNldEZvclRvcFRvQm90dG9tRmllbGQ7Ci0gICAgdTMyIG51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsKLSAgICBpMzIgKm9mZnNldEZvclJlZkZyYW1lOwotICAgIHUzMiBudW1SZWZGcmFtZXM7Ci0gICAgdTMyIGdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZzsKLSAgICB1MzIgcGljV2lkdGhJbk1iczsKLSAgICB1MzIgcGljSGVpZ2h0SW5NYnM7Ci0gICAgdTMyIGZyYW1lQ3JvcHBpbmdGbGFnOwotICAgIHUzMiBmcmFtZUNyb3BMZWZ0T2Zmc2V0OwotICAgIHUzMiBmcmFtZUNyb3BSaWdodE9mZnNldDsKLSAgICB1MzIgZnJhbWVDcm9wVG9wT2Zmc2V0OwotICAgIHUzMiBmcmFtZUNyb3BCb3R0b21PZmZzZXQ7Ci0gICAgdTMyIHZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZzsKLSAgICB2dWlQYXJhbWV0ZXJzX3QgKnZ1aVBhcmFtZXRlcnM7Ci0gICAgdTMyIG1heERwYlNpemU7Ci19IHNlcVBhcmFtU2V0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTZXFQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KTsKLQotdTMyIGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzKHNlcVBhcmFtU2V0X3QgKnBTcHMxLCBzZXFQYXJhbVNldF90ICpwU3BzMik7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NFUV9QQVJBTV9TRVRfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4OGQ0Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhCi0gICAgICAgICAgU2V0TWJQYXJhbXMKLSAgICAgICAgICBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9kYXRhLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBTZXRNYlBhcmFtcyhtYlN0b3JhZ2VfdCAqcE1iLCBzbGljZUhlYWRlcl90ICpwU2xpY2UsIHUzMiBzbGljZUlkLAotICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4xICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBvbmUgc2xpY2UuIEZ1bmN0aW9uIGRlY29kZXMgc3RyZWFtIGRhdGEsIGkuZS4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIGFuZCBwb3NzaWJsZSBza2lwX3J1biBmaWVsZHMuIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrIGZ1bmN0aW9uIGlzCi0gICAgICAgICAgICBjYWxsZWQgdG8gaGFuZGxlIGFsbCBvdGhlciBtYWNyb2Jsb2NrIHJlbGF0ZWQgcHJvY2Vzc2luZy4KLSAgICAgICAgICAgIE1hY3JvYmxvY2sgdG8gc2xpY2UgZ3JvdXAgbWFwcGluZyBpcyBjb25zaWRlcmVkIHdoZW4gbmV4dAotICAgICAgICAgICAgbWFjcm9ibG9jayB0byBwcm9jZXNzIGlzIGRldGVybWluZWQgKGgyNjRic2ROZXh0TWJBZGRyZXNzIGZ1bmN0aW9uKQotICAgICAgICAgICAgbWFwCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBwcm9jZXNzZWQgcGljdHVyZSwgbmVlZGVkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJhIHByZWRpY3Rpb24gb2YgdGhlIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwU2xpY2VIZWFkZXIgICAgcG9pbnRlciB0byBzbGljZSBoZWFkZXIgb2YgdGhlIGN1cnJlbnQgc2xpY2UKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHByb2Nlc3NlZCBtYWNyb2Jsb2NrcyBhcmUgd3JpdHRlbiB0byBjdXJyZW50IGltYWdlCi0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgbWJTdG9yYWdlIHN0cnVjdHVyZSBvZiBlYWNoIHByb2Nlc3NlZCBtYWNyb2Jsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdXBkYXRlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNsaWNlRGF0YShzdHJtRGF0YV90ICpwU3RybURhdGEsIHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCi0gICAgaW1hZ2VfdCAqY3VyckltYWdlLCBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTggbWJEYXRhWzM4NCArIDE1ICsgMzJdOwotICAgIHU4ICpkYXRhOwotICAgIHUzMiB0bXA7Ci0gICAgdTMyIHNraXBSdW47Ci0gICAgdTMyIHByZXZTa2lwcGVkOwotICAgIHUzMiBjdXJyTWJBZGRyOwotICAgIHUzMiBtb3JlTWJzOwotICAgIHUzMiBtYkNvdW50OwotICAgIGkzMiBxcFk7Ci0gICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2xpY2VIZWFkZXIpOwotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0gICAgQVNTRVJUKHBTbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKTsKLQotICAgIC8qIGVuc3VyZSAxNi1ieXRlIGFsaWdubWVudCAqLwotICAgIGRhdGEgPSAodTgqKUFMSUdOKG1iRGF0YSwgMTYpOwotCi0gICAgbWJMYXllciA9IHBTdG9yYWdlLT5tYkxheWVyOwotCi0gICAgY3Vyck1iQWRkciA9IHBTbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2U7Ci0gICAgc2tpcFJ1biA9IDA7Ci0gICAgcHJldlNraXBwZWQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICAvKiBpbmNyZW1lbnQgc2xpY2UgaW5kZXgsIHdpbGwgYmUgb25lIGZvciBkZWNvZGluZyBvZiB0aGUgZmlyc3Qgc2xpY2Ugb2YKLSAgICAgKiB0aGUgcGljdHVyZSAqLwotICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCsrOwotCi0gICAgLyogbGFzdE1iQWRkciBzdG9yZXMgYWRkcmVzcyBvZiB0aGUgbWFjcm9ibG9jayB0aGF0IHdhcyBsYXN0IHN1Y2Nlc3NmdWxseQotICAgICAqIGRlY29kZWQsIG5lZWRlZCBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgPSAwOwotCi0gICAgbWJDb3VudCA9IDA7Ci0gICAgLyogaW5pdGlhbCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciB0aGUgc2xpY2UgaXMgb2J0YWluZWQgYXMgdGhlIHN1bSBvZgotICAgICAqIGluaXRpYWwgUVAgZm9yIHRoZSBwaWN0dXJlIGFuZCBzbGljZVFwRGVsdGEgZm9yIHRoZSBjdXJyZW50IHNsaWNlICovCi0gICAgcXBZID0gKGkzMilwU3RvcmFnZS0+YWN0aXZlUHBzLT5waWNJbml0UXAgKyBwU2xpY2VIZWFkZXItPnNsaWNlUXBEZWx0YTsKLSAgICBkbwotICAgIHsKLSAgICAgICAgLyogcHJpbWFyeSBwaWN0dXJlIGFuZCBhbHJlYWR5IGRlY29kZWQgbWFjcm9ibG9jayAtPiBlcnJvciAqLwotICAgICAgICBpZiAoIXBTbGljZUhlYWRlci0+cmVkdW5kYW50UGljQ250ICYmIHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoIlByaW1hcnkgYW5kIGFscmVhZHkgZGVjb2RlZCIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0TWJQYXJhbXMocFN0b3JhZ2UtPm1iICsgY3Vyck1iQWRkciwgcFNsaWNlSGVhZGVyLAotICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkLCBwU3RvcmFnZS0+YWN0aXZlUHBzLT5jaHJvbWFRcEluZGV4T2Zmc2V0KTsKLQotICAgICAgICBpZiAoIUlTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXByZXZTa2lwcGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZza2lwUnVuKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgLyogc2tpcF9ydW4gc2hhbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG51bWJlciBvZgotICAgICAgICAgICAgICAgICAqIG1hY3JvYmxvY2tzIGxlZnQgKi8KLSAgICAgICAgICAgICAgICBpZiAoc2tpcFJ1biA+IChwU3RvcmFnZS0+cGljU2l6ZUluTWJzIC0gY3Vyck1iQWRkcikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoInNraXBfcnVuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNraXBSdW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcmV2U2tpcHBlZCA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoJm1iTGF5ZXItPm1iUHJlZCwgMCwgc2l6ZW9mKG1iUHJlZF90KSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG1hcmsgY3VycmVudCBtYWNyb2Jsb2NrIHNraXBwZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgbWJMYXllci0+bWJUeXBlID0gUF9Ta2lwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChza2lwUnVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIlNraXBwaW5nIG1hY3JvYmxvY2sgJWRcbiIsIGN1cnJNYkFkZHIpKTsKLSAgICAgICAgICAgIHNraXBSdW4tLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZXZTa2lwcGVkID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihwU3RybURhdGEsIG1iTGF5ZXIsCi0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm1iICsgY3Vyck1iQWRkciwgcFNsaWNlSGVhZGVyLT5zbGljZVR5cGUsCi0gICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoIm1hY3JvYmxvY2tfbGF5ZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIG1iTGF5ZXIsCi0gICAgICAgICAgICBjdXJySW1hZ2UsIHBTdG9yYWdlLT5kcGIsICZxcFksIGN1cnJNYkFkZHIsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLT5jb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIGRhdGEpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJNQUNST19CTE9DSyIpOwotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpbmNyZW1lbnQgbWFjcm9ibG9jayBjb3VudCBvbmx5IGZvciBtYWNyb2Jsb2NrcyB0aGF0IHdlcmUgZGVjb2RlZAotICAgICAgICAgKiBmb3IgdGhlIGZpcnN0IHRpbWUgKHJlZHVuZGFudCBzbGljZXMpICovCi0gICAgICAgIGlmIChwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZCA9PSAxKQotICAgICAgICAgICAgbWJDb3VudCsrOwotCi0gICAgICAgIC8qIGtlZXAgb24gcHJvY2Vzc2luZyBhcyBsb25nIGFzIHRoZXJlIGlzIHN0cmVhbSBkYXRhIGxlZnQgb3IKLSAgICAgICAgICogcHJvY2Vzc2luZyBvZiBtYWNyb2Jsb2NrcyB0byBiZSBza2lwcGVkIGJhc2VkIG9uIHRoZSBsYXN0IHNraXBSdW4gaXMKLSAgICAgICAgICogbm90IGZpbmlzaGVkICovCi0gICAgICAgIG1vcmVNYnMgPSAoaDI2NGJzZE1vcmVSYnNwRGF0YShwU3RybURhdGEpIHx8IHNraXBSdW4pID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAvKiBsYXN0TWJBZGRyIGlzIG9ubHkgdXBkYXRlZCBmb3IgaW50cmEgc2xpY2VzIChhbGwgbWFjcm9ibG9ja3Mgb2YKLSAgICAgICAgICogaW50ZXIgc2xpY2VzIHdpbGwgYmUgbG9zdCBpbiBjYXNlIG9mIGFuIGVycm9yKSAqLwotICAgICAgICBpZiAoSVNfSV9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCi0gICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgPSBjdXJyTWJBZGRyOwotCi0gICAgICAgIGN1cnJNYkFkZHIgPSBoMjY0YnNkTmV4dE1iQWRkcmVzcyhwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIGN1cnJNYkFkZHIpOwotICAgICAgICAvKiBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciBidXQgbm8gbW9yZSBtYWNyb2Jsb2NrcyBmb3IgY3VycmVudCBzbGljZQotICAgICAgICAgKiBncm91cCAtPiBlcnJvciAqLwotICAgICAgICBpZiAobW9yZU1icyAmJiAhY3Vyck1iQWRkcikKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJOZXh0IG1iIGFkZHJlc3MiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotCi0gICAgfSB3aGlsZSAobW9yZU1icyk7Ci0KLSAgICBpZiAoKHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyArIG1iQ291bnQpID4gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiTnVtIGRlY29kZWQgbWJzIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICBwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgKz0gbWJDb3VudDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMiAgRnVuY3Rpb246IFNldE1iUGFyYW1zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFNldCBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgdGhhdCByZW1haW4gY29uc3RhbnQgZm9yIHRoaXMgc2xpY2UKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU2xpY2UgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgc2xpY2UgaGVhZGVyCi0gICAgICAgICAgICBzbGljZUlkICAgICBpZCBvZiB0aGUgY3VycmVudCBzbGljZQotICAgICAgICAgICAgY2hyb21hUXBJbmRleE9mZnNldAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwTWIgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3RydWN0dXJlIHdoaWNoIGlzIHVwZGF0ZWQKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIFNldE1iUGFyYW1zKG1iU3RvcmFnZV90ICpwTWIsIHNsaWNlSGVhZGVyX3QgKnBTbGljZSwgdTMyIHNsaWNlSWQsCi0gICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotICAgIHUzMiB0bXAxOwotICAgIGkzMiB0bXAyLCB0bXAzOwotCi0vKiBDb2RlICovCi0KLSAgICB0bXAxID0gcFNsaWNlLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYzsKLSAgICB0bXAyID0gcFNsaWNlLT5zbGljZUFscGhhQzBPZmZzZXQ7Ci0gICAgdG1wMyA9IHBTbGljZS0+c2xpY2VCZXRhT2Zmc2V0OwotICAgIHBNYi0+c2xpY2VJZCA9IHNsaWNlSWQ7Ci0gICAgcE1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IHRtcDE7Ci0gICAgcE1iLT5maWx0ZXJPZmZzZXRBID0gdG1wMjsKLSAgICBwTWItPmZpbHRlck9mZnNldEIgPSB0bXAzOwotICAgIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCA9IGNocm9tYVFwSW5kZXhPZmZzZXQ7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4zICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIE1hcmsgbWFjcm9ibG9ja3Mgb2YgdGhlIHNsaWNlIGNvcnJ1cHRlZC4gSWYgbGFzdE1iQWRkciBpbiB0aGUgc2xpY2UKLSAgICAgICAgICAgIHN0b3JhZ2UgaXMgc2V0IC0+IHBpY1dpZGh0SW5NYnMgKG9yIGF0IGxlYXN0IDEwKSBtYWNyb2Jsb2NrcyBiYWNrCi0gICAgICAgICAgICBmcm9tICB0aGUgbGFzdE1iQWRkciBhcmUgbWFya2VkIGNvcnJ1cHRlZC4gSG93ZXZlciwgaWYgbGFzdE1iQWRkcgotICAgICAgICAgICAgaXMgbm90IHNldCAtPiBhbGwgbWFjcm9ibG9ja3Mgb2YgdGhlIHNsaWNlIGFyZSBtYXJrZWQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGZpcnN0TWJJblNsaWNlICBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtYWNyb2Jsb2NrIGluIHRoZSBzbGljZSwgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXMgdGhlIHNsaWNlIHRvIGJlIG1hcmtlZCBjb3JydXB0ZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIG1iU3RvcmFnZSBmb3IgdGhlIGNvcnJ1cHRlZCBtYWNyb2Jsb2NrcyB1cGRhdGVkCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBmaXJzdE1iSW5TbGljZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotICAgIHUzMiBzbGljZUlkOwotICAgIHUzMiBjdXJyTWJBZGRyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChmaXJzdE1iSW5TbGljZSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOwotCi0gICAgY3Vyck1iQWRkciA9IGZpcnN0TWJJblNsaWNlOwotCi0gICAgc2xpY2VJZCA9IHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZDsKLQotICAgIC8qIERlY29kZVNsaWNlRGF0YSBzZXRzIGxhc3RNYkFkZHIgZm9yIEkgc2xpY2VzIC0+IGlmIGl0IHdhcyBzZXQsIGdvIGJhY2sKLSAgICAgKiBNQVgocGljV2lkdGhJbk1icywgMTApIG1hY3JvYmxvY2tzIGFuZCBzdGFydCBtYXJraW5nIGZyb20gdGhlcmUgKi8KLSAgICBpZiAocFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyKQotICAgIHsKLSAgICAgICAgQVNTRVJUKHBTdG9yYWdlLT5tYltwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHJdLnNsaWNlSWQgPT0gc2xpY2VJZCk7Ci0gICAgICAgIGkgPSBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgLSAxOwotICAgICAgICB0bXAgPSAwOwotICAgICAgICB3aGlsZSAoaSA+IGN1cnJNYkFkZHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+bWJbaV0uc2xpY2VJZCA9PSBzbGljZUlkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPj0gTUFYKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMsIDEwKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgIH0KLSAgICAgICAgY3Vyck1iQWRkciA9IGk7Ci0gICAgfQotCi0gICAgZG8KLSAgICB7Ci0KLSAgICAgICAgaWYgKCAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLnNsaWNlSWQgPT0gc2xpY2VJZCkgJiYKLSAgICAgICAgICAgICAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQpICkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY3Vyck1iQWRkciA9IGgyNjRic2ROZXh0TWJBZGRyZXNzKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLAotICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgY3Vyck1iQWRkcik7Ci0KLSAgICB9IHdoaWxlIChjdXJyTWJBZGRyKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzZDQ5ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9EQVRBX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NMSUNFX0RBVEFfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNsaWNlRGF0YShzdHJtRGF0YV90ICpwU3RybURhdGEsIHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCi0gICAgaW1hZ2VfdCAqY3VyckltYWdlLCBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIpOwotCi12b2lkIGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIGZpcnN0TWJJblNsaWNlKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0xJQ0VfREFUQV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiYjUzNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIERlY29kZUludGVybGVhdmVkTWFwCi0gICAgICAgICAgRGVjb2RlRGlzcGVyc2VkTWFwCi0gICAgICAgICAgRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwCi0gICAgICAgICAgRGVjb2RlQm94T3V0TWFwCi0gICAgICAgICAgRGVjb2RlUmFzdGVyU2Nhbk1hcAotICAgICAgICAgIERlY29kZVdpcGVNYXAKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgotI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIERlY29kZUludGVybGVhdmVkTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzLAotICB1MzIgKnJ1bkxlbmd0aCwKLSAgdTMyIHBpY1NpemUpOwotCi1zdGF0aWMgdm9pZCBEZWNvZGVEaXNwZXJzZWRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCk7Ci0KLXN0YXRpYyB2b2lkIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBudW1TbGljZUdyb3VwcywKLSAgdTMyICp0b3BMZWZ0LAotICB1MzIgKmJvdHRvbVJpZ2h0LAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi1zdGF0aWMgdm9pZCBEZWNvZGVCb3hPdXRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gIHUzMiB1bml0c0luU2xpY2VHcm91cDAsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCk7Ci0KLXN0YXRpYyB2b2lkIERlY29kZVJhc3RlclNjYW5NYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gIHUzMiBzaXplT2ZVcHBlckxlZnRHcm91cCwKLSAgdTMyIHBpY1NpemUpOwotCi1zdGF0aWMgdm9pZCBEZWNvZGVXaXBlTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlSW50ZXJsZWF2ZWRNYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGludGVybGVhdmVkIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlCi0gICAgICAgICAgICBncm91cCBtYXAgdHlwZSAwLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKLSAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzICBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCi0gICAgICAgICAgICBydW5MZW5ndGggICAgICAgcnVuX2xlbmd0aFtdIHZhbHVlcyBmb3IgZWFjaCBzbGljZSBncm91cAotICAgICAgICAgICAgcGljU2l6ZSAgICAgICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVJbnRlcmxlYXZlZE1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBudW1TbGljZUdyb3VwcywKLSAgdTMyICpydW5MZW5ndGgsCi0gIHUzMiBwaWNTaXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLGosIGdyb3VwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMgPj0gMSAmJiBudW1TbGljZUdyb3VwcyA8PSBNQVhfTlVNX1NMSUNFX0dST1VQUyk7Ci0gICAgQVNTRVJUKHJ1bkxlbmd0aCk7Ci0KLSAgICBpID0gMDsKLQotICAgIGRvIHsKLSAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgbnVtU2xpY2VHcm91cHMgJiYgaSA8IHBpY1NpemU7Ci0gICAgICAgICAgaSArPSBydW5MZW5ndGhbZ3JvdXArK10pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChydW5MZW5ndGhbZ3JvdXBdIDw9IHBpY1NpemUpOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJ1bkxlbmd0aFtncm91cF0gJiYgaSArIGogPCBwaWNTaXplOyBqKyspCi0gICAgICAgICAgICAgICAgbWFwW2kral0gPSBncm91cDsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGkgPCBwaWNTaXplKTsKLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlRGlzcGVyc2VkTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBkaXNwZXJzZWQgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UKLSAgICAgICAgICAgIGdyb3VwIG1hcCB0eXBlIDEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCi0gICAgICAgICAgICBudW1TbGljZUdyb3VwcyAgICBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCi0gICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIERlY29kZURpc3BlcnNlZE1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBudW1TbGljZUdyb3VwcywKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBwaWNTaXplOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMgPj0gMSAmJiBudW1TbGljZUdyb3VwcyA8PSBNQVhfTlVNX1NMSUNFX0dST1VQUyk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoKTsKLSAgICBBU1NFUlQocGljSGVpZ2h0KTsKLQotICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIHBpY0hlaWdodDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCi0gICAgICAgIG1hcFtpXSA9ICgoaSAlIHBpY1dpZHRoKSArICgoKGkgLyBwaWNXaWR0aCkgKiBudW1TbGljZUdyb3VwcykgPj4gMSkpICUKLSAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzOwotCi0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGZvcmVncm91bmQgd2l0aCBsZWZ0LW92ZXIgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsCi0gICAgICAgICAgICBpLmUuIHNsaWNlIGdyb3VwIG1hcCB0eXBlIDIuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCi0gICAgICAgICAgICBudW1TbGljZUdyb3VwcyAgICBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCi0gICAgICAgICAgICB0b3BMZWZ0ICAgICAgICAgICB0b3BfbGVmdFtdIHZhbHVlcwotICAgICAgICAgICAgYm90dG9tUmlnaHQgICAgICAgYm90dG9tX3JpZ2h0W10gdmFsdWVzCi0gICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBudW1TbGljZUdyb3VwcywKLSAgdTMyICp0b3BMZWZ0LAotICB1MzIgKmJvdHRvbVJpZ2h0LAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGkseSx4LHlUb3BMZWZ0LHlCb3R0b21SaWdodCx4VG9wTGVmdCx4Qm90dG9tUmlnaHQsIHBpY1NpemU7Ci0gICAgdTMyIGdyb3VwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMgPj0gMSAmJiBudW1TbGljZUdyb3VwcyA8PSBNQVhfTlVNX1NMSUNFX0dST1VQUyk7Ci0gICAgQVNTRVJUKHRvcExlZnQpOwotICAgIEFTU0VSVChib3R0b21SaWdodCk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoKTsKLSAgICBBU1NFUlQocGljSGVpZ2h0KTsKLQotICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIHBpY0hlaWdodDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCi0gICAgICAgIG1hcFtpXSA9IG51bVNsaWNlR3JvdXBzIC0gMTsKLQotICAgIGZvciAoZ3JvdXAgPSBudW1TbGljZUdyb3VwcyAtIDE7IGdyb3VwLS07ICkKLSAgICB7Ci0gICAgICAgIEFTU0VSVCggdG9wTGVmdFtncm91cF0gPD0gYm90dG9tUmlnaHRbZ3JvdXBdICYmCi0gICAgICAgICAgICAgICAgYm90dG9tUmlnaHRbZ3JvdXBdIDwgcGljU2l6ZSApOwotICAgICAgICB5VG9wTGVmdCA9IHRvcExlZnRbZ3JvdXBdIC8gcGljV2lkdGg7Ci0gICAgICAgIHhUb3BMZWZ0ID0gdG9wTGVmdFtncm91cF0gJSBwaWNXaWR0aDsKLSAgICAgICAgeUJvdHRvbVJpZ2h0ID0gYm90dG9tUmlnaHRbZ3JvdXBdIC8gcGljV2lkdGg7Ci0gICAgICAgIHhCb3R0b21SaWdodCA9IGJvdHRvbVJpZ2h0W2dyb3VwXSAlIHBpY1dpZHRoOwotICAgICAgICBBU1NFUlQoeFRvcExlZnQgPD0geEJvdHRvbVJpZ2h0KTsKLQotICAgICAgICBmb3IgKHkgPSB5VG9wTGVmdDsgeSA8PSB5Qm90dG9tUmlnaHQ7IHkrKykKLSAgICAgICAgICAgIGZvciAoeCA9IHhUb3BMZWZ0OyB4IDw9IHhCb3R0b21SaWdodDsgeCsrKQotICAgICAgICAgICAgICAgIG1hcFsgeSAqIHBpY1dpZHRoICsgeCBdID0gZ3JvdXA7Ci0gICAgfQotCi0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVCb3hPdXRNYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGJveC1vdXQgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UgZ3JvdXAKLSAgICAgICAgICAgIG1hcCB0eXBlIDMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAotICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZwotICAgICAgICAgICAgdW5pdHNJblNsaWNlR3JvdXAwICAgICAgICAgICAgICAgIG1icyBvbiBzbGljZSBncm91cCAwCi0gICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIERlY29kZUJveE91dE1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgdTMyIHVuaXRzSW5TbGljZUdyb3VwMCwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBrLCBwaWNTaXplOwotICAgIGkzMiB4LCB5LCB4RGlyLCB5RGlyLCBsZWZ0Qm91bmQsIHRvcEJvdW5kLCByaWdodEJvdW5kLCBib3R0b21Cb3VuZDsKLSAgICB1MzIgbWFwVW5pdFZhY2FudDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoKTsKLSAgICBBU1NFUlQocGljSGVpZ2h0KTsKLQotICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIHBpY0hlaWdodDsKLSAgICBBU1NFUlQodW5pdHNJblNsaWNlR3JvdXAwIDw9IHBpY1NpemUpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKLSAgICAgICAgbWFwW2ldID0gMTsKLQotICAgIHggPSAocGljV2lkdGggLSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnKSA+PiAxOwotICAgIHkgPSAocGljSGVpZ2h0IC0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZykgPj4gMTsKLQotICAgIGxlZnRCb3VuZCA9IHg7Ci0gICAgdG9wQm91bmQgPSB5OwotCi0gICAgcmlnaHRCb3VuZCA9IHg7Ci0gICAgYm90dG9tQm91bmQgPSB5OwotCi0gICAgeERpciA9IChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgLSAxOwotICAgIHlEaXIgPSAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotCi0gICAgZm9yIChrID0gMDsgayA8IHVuaXRzSW5TbGljZUdyb3VwMDsgayArPSBtYXBVbml0VmFjYW50ID8gMSA6IDApCi0gICAgewotICAgICAgICBtYXBVbml0VmFjYW50ID0gKG1hcFsgKHUzMil5ICogcGljV2lkdGggKyAodTMyKXggXSA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgaWYgKG1hcFVuaXRWYWNhbnQpCi0gICAgICAgICAgICBtYXBbICh1MzIpeSAqIHBpY1dpZHRoICsgKHUzMil4IF0gPSAwOwotCi0gICAgICAgIGlmICh4RGlyID09IC0xICYmIHggPT0gbGVmdEJvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZWZ0Qm91bmQgPSBNQVgobGVmdEJvdW5kIC0gMSwgMCk7Ci0gICAgICAgICAgICB4ID0gbGVmdEJvdW5kOwotICAgICAgICAgICAgeERpciA9IDA7Ci0gICAgICAgICAgICB5RGlyID0gMiAqIChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgLSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHhEaXIgPT0gMSAmJiB4ID09IHJpZ2h0Qm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJpZ2h0Qm91bmQgPSBNSU4ocmlnaHRCb3VuZCArIDEsIChpMzIpcGljV2lkdGggLSAxKTsKLSAgICAgICAgICAgIHggPSByaWdodEJvdW5kOwotICAgICAgICAgICAgeERpciA9IDA7Ci0gICAgICAgICAgICB5RGlyID0gMSAtIDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHlEaXIgPT0gLTEgJiYgeSA9PSB0b3BCb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgdG9wQm91bmQgPSBNQVgodG9wQm91bmQgLSAxLCAwKTsKLSAgICAgICAgICAgIHkgPSB0b3BCb3VuZDsKLSAgICAgICAgICAgIHhEaXIgPSAxIC0gMiAqIChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0gICAgICAgICAgICB5RGlyID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh5RGlyID09IDEgJiYgeSA9PSBib3R0b21Cb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgYm90dG9tQm91bmQgPSBNSU4oYm90dG9tQm91bmQgKyAxLCAoaTMyKXBpY0hlaWdodCAtIDEpOwotICAgICAgICAgICAgeSA9IGJvdHRvbUJvdW5kOwotICAgICAgICAgICAgeERpciA9IDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKLSAgICAgICAgICAgIHlEaXIgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgeCArPSB4RGlyOwotICAgICAgICAgICAgeSArPSB5RGlyOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVSYXN0ZXJTY2FuTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSByYXN0ZXIgc2NhbiBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZQotICAgICAgICAgICAgZ3JvdXAgbWFwIHR5cGUgNC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCi0gICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnCi0gICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCAgICAgICAgICAgICAgbWJzIGluIHVwcGVyTGVmdEdyb3VwCi0gICAgICAgICAgICBwaWNTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIERlY29kZVJhc3RlclNjYW5NYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gIHUzMiBzaXplT2ZVcHBlckxlZnRHcm91cCwKLSAgdTMyIHBpY1NpemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYXApOwotICAgIEFTU0VSVChwaWNTaXplKTsKLSAgICBBU1NFUlQoc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPD0gcGljU2l6ZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQotICAgICAgICBpZiAoaSA8IHNpemVPZlVwcGVyTGVmdEdyb3VwKQotICAgICAgICAgICAgbWFwW2ldID0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWFwW2ldID0gMSAtICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVdpcGVNYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIHdpcGUgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UgZ3JvdXAgbWFwCi0gICAgICAgICAgICB0eXBlIDUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZwotICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgICAgICAgICAgICAgIG1icyBpbiB1cHBlckxlZnRHcm91cAotICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVXaXBlTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSxqLGs7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYXApOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY0hlaWdodCk7Ci0gICAgQVNTRVJUKHNpemVPZlVwcGVyTGVmdEdyb3VwIDw9IHBpY1dpZHRoICogcGljSGVpZ2h0KTsKLQotICAgIGsgPSAwOwotICAgIGZvciAoaiA9IDA7IGogPCBwaWNXaWR0aDsgaisrKQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGljSGVpZ2h0OyBpKyspCi0gICAgICAgICAgICBpZiAoaysrIDwgc2l6ZU9mVXBwZXJMZWZ0R3JvdXApCi0gICAgICAgICAgICAgICAgbWFwWyBpICogcGljV2lkdGggKyBqIF0gPSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1hcFsgaSAqIHBpY1dpZHRoICsgaiBdID0gMSAtCi0gICAgICAgICAgICAgICAgICAgICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBtYWNyb2Jsb2NrIHRvIHNsaWNlIGdyb3VwIG1hcC4gQ29uc3RydWN0aW9uCi0gICAgICAgICAgICBvZiBkaWZmZXJlbnQgc2xpY2UgZ3JvdXAgbWFwIHR5cGVzIGlzIGhhbmRsZWQgYnkgc2VwYXJhdGUKLSAgICAgICAgICAgIGZ1bmN0aW9ucyBkZWZpbmVkIGFib3ZlLiBTZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMgaG93IHNsaWNlIGdyb3VwCi0gICAgICAgICAgICBtYXBzIGFyZSBjb21wdXRlZC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwcHMgICAgICAgICAgICAgICAgICAgICBhY3RpdmUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUgICBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUKLSAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAoCi0gIHUzMiAqbWFwLAotICBwaWNQYXJhbVNldF90ICpwcHMsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgcGljU2l6ZSwgdW5pdHNJblNsaWNlR3JvdXAwID0gMCwgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPSAwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQocHBzKTsKLSAgICBBU1NFUlQocGljV2lkdGgpOwotICAgIEFTU0VSVChwaWNIZWlnaHQpOwotICAgIEFTU0VSVChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlIDwgNyk7Ci0KLSAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7Ci0KLSAgICAvKiBqdXN0IG9uZSBzbGljZSBncm91cCAtPiBhbGwgbWFjcm9ibG9ja3MgYmVsb25nIHRvIGdyb3VwIDAgKi8KLSAgICBpZiAocHBzLT5udW1TbGljZUdyb3VwcyA9PSAxKQotICAgIHsKLSAgICAgICAgSDI2NFN3RGVjTWVtc2V0KG1hcCwgMCwgcGljU2l6ZSAqIHNpemVvZih1MzIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID4gMiAmJiBwcHMtPnNsaWNlR3JvdXBNYXBUeXBlIDwgNikKLSAgICB7Ci0gICAgICAgIEFTU0VSVChwcHMtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlICYmCi0gICAgICAgICAgICAgICBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlIDw9IHBpY1NpemUpOwotCi0gICAgICAgIHVuaXRzSW5TbGljZUdyb3VwMCA9Ci0gICAgICAgICAgICBNSU4oc2xpY2VHcm91cENoYW5nZUN5Y2xlICogcHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSwgcGljU2l6ZSk7Ci0KLSAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNCB8fCBwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDUpCi0gICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCA9IHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgPwotICAgICAgICAgICAgICAgIChwaWNTaXplIC0gdW5pdHNJblNsaWNlR3JvdXAwKSA6IHVuaXRzSW5TbGljZUdyb3VwMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUpCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBEZWNvZGVJbnRlcmxlYXZlZE1hcChtYXAsIHBwcy0+bnVtU2xpY2VHcm91cHMsCi0gICAgICAgICAgICAgIHBwcy0+cnVuTGVuZ3RoLCBwaWNTaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIERlY29kZURpc3BlcnNlZE1hcChtYXAsIHBwcy0+bnVtU2xpY2VHcm91cHMsIHBpY1dpZHRoLAotICAgICAgICAgICAgICBwaWNIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwKG1hcCwgcHBzLT5udW1TbGljZUdyb3VwcywKLSAgICAgICAgICAgICAgcHBzLT50b3BMZWZ0LCBwcHMtPmJvdHRvbVJpZ2h0LCBwaWNXaWR0aCwgcGljSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIERlY29kZUJveE91dE1hcChtYXAsIHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gICAgICAgICAgICAgIHVuaXRzSW5TbGljZUdyb3VwMCwgcGljV2lkdGgsIHBpY0hlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBEZWNvZGVSYXN0ZXJTY2FuTWFwKG1hcCwKLSAgICAgICAgICAgICAgcHBzLT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCi0gICAgICAgICAgICAgIHBpY1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgRGVjb2RlV2lwZU1hcChtYXAsIHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gICAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwLCBwaWNXaWR0aCwgcGljSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwSWQpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwSWRbaV0gPCBwcHMtPm51bVNsaWNlR3JvdXBzKTsKLSAgICAgICAgICAgICAgICBtYXBbaV0gPSBwcHMtPnNsaWNlR3JvdXBJZFtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiY2I2ZjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9HUk9VUF9NQVBfSAotI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfR1JPVVBfTUFQX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAoCi0gIHUzMiAqbWFwLAotICBwaWNQYXJhbVNldF90ICpwcHMsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NMSUNFX0dST1VQX01BUF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0MDFjNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIKLSAgICAgICAgICBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzCi0gICAgICAgICAgUmVmUGljTGlzdFJlb3JkZXJpbmcKLSAgICAgICAgICBEZWNSZWZQaWNNYXJraW5nCi0gICAgICAgICAgQ2hlY2tQcHNJZAotICAgICAgICAgIENoZWNrRnJhbWVOdW0KLSAgICAgICAgICBDaGVja0lkclBpY0lkCi0gICAgICAgICAgQ2hlY2tQaWNPcmRlckNudExzYgotICAgICAgICAgIENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbQotICAgICAgICAgIENoZWNrRGVsdGFQaWNPcmRlckNudAotICAgICAgICAgIENoZWNrUmVkdW5kYW50UGljQ250Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIFJlZlBpY0xpc3RSZW9yZGVyaW5nKHN0cm1EYXRhX3QgKiwgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqLAotICAgIHUzMiwgdTMyKTsKLQotc3RhdGljIHUzMiBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzKHUzMiBwaWNTaXplSW5NYnMsCi0gICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKTsKLQotc3RhdGljIHUzMiBEZWNSZWZQaWNNYXJraW5nKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICBkZWNSZWZQaWNNYXJraW5nX3QgKnBEZWNSZWZQaWNNYXJraW5nLCBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICAgIHUzMiBudW1SZWZGcmFtZXMpOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHNsaWNlIGhlYWRlciBkYXRhIGZyb20gdGhlIHN0cmVhbS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgICAgICBwTmFsVW5pdCAgICAgICAgcG9pbnRlciB0byBjdXJyZW50IE5BTCB1bml0IHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwU2xpY2VIZWFkZXIgICAgZGVjb2RlZCBkYXRhIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YSBvciBlbmQgb2Ygc3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIsCi0gICAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCi0gICAgbmFsVW5pdF90ICpwTmFsVW5pdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKLSAgICBpMzIgaXRtcDsKLSAgICB1MzIgcGljU2l6ZUluTWJzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKLSAgICBBU1NFUlQoIHBOYWxVbml0LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0UgfHwKLSAgICAgICAgICAgIHBOYWxVbml0LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSICk7Ci0KLQotICAgIEgyNjRTd0RlY01lbXNldChwU2xpY2VIZWFkZXIsIDAsIHNpemVvZihzbGljZUhlYWRlcl90KSk7Ci0KLSAgICBwaWNTaXplSW5NYnMgPSBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzOwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UgPSB2YWx1ZTsKLSAgICBpZiAodmFsdWUgPj0gcGljU2l6ZUluTWJzKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJmaXJzdF9tYl9pbl9zbGljZSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNsaWNlSGVhZGVyLT5zbGljZVR5cGUgPSB2YWx1ZTsKLSAgICAvKiBzbGljZSB0eXBlIGhhcyB0byBiZSBlaXRoZXIgSSBvciBQIHNsaWNlLiBQIHNsaWNlIGlzIG5vdCBhbGxvd2VkIHdoZW4KLSAgICAgKiBjdXJyZW50IE5BTCB1bml0IGlzIGFuIElEUiBOQUwgdW5pdCBvciBudW1fcmVmX2ZyYW1lcyBpcyAwICovCi0gICAgaWYgKCAhSVNfSV9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkgJiYKLSAgICAgICAgICggIUlTX1BfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpIHx8Ci0gICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgfHwKLSAgICAgICAgICAgIXBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzICkgKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJzbGljZV90eXBlIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU2xpY2VIZWFkZXItPnBpY1BhcmFtZXRlclNldElkID0gdmFsdWU7Ci0gICAgaWYgKHBTbGljZUhlYWRlci0+cGljUGFyYW1ldGVyU2V0SWQgIT0gcFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgicGljX3BhcmFtZXRlcl9zZXRfaWQiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSAmJiB0bXAgIT0gMCkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiZnJhbWVfbnVtIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSA9IHRtcDsKLQotICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgcFNsaWNlSGVhZGVyLT5pZHJQaWNJZCA9IHZhbHVlOwotICAgICAgICBpZiAodmFsdWUgPiA2NTUzNSkKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJpZHJfcGljX2lkIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaS0tOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA9IHRtcDsKLQotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20gPSBpdG1wOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY2hlY2sgdGhhdCBwaWNPcmRlckNudCBmb3IgSURSIHBpY3R1cmUgd2lsbCBiZSB6ZXJvLiBTZWUKLSAgICAgICAgICogRGVjb2RlUGljT3JkZXJDbnQgZnVuY3Rpb24gdG8gdW5kZXJzdGFuZCB0aGUgbG9naWMgaGVyZSAqLwotICAgICAgICBpZiAoIElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgJiYKLSAgICAgICAgICAgICAoIChwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiID4KLSAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiLzIpIHx8Ci0gICAgICAgICAgICAgICAgTUlOKChpMzIpcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiwKLSAgICAgICAgICAgICAgICAgICAgKGkzMilwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiICsKLSAgICAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tKSAhPSAwICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKSAmJgotICAgICAgICAgIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnICkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXSA9IGl0bXA7Ci0KLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdID0gaXRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNoZWNrIHRoYXQgcGljT3JkZXJDbnQgZm9yIElEUiBwaWN0dXJlIHdpbGwgYmUgemVyby4gU2VlCi0gICAgICAgICAqIERlY29kZVBpY09yZGVyQ250IGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIGhlcmUgKi8KLSAgICAgICAgaWYgKCBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpICYmCi0gICAgICAgICAgICAgTUlOKHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXSwKLSAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdICsKLSAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICsKLSAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+cmVkdW5kYW50UGljQ250ID0gdmFsdWU7Ci0gICAgICAgIGlmICh2YWx1ZSA+IDEyNykKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJyZWR1bmRhbnRfcGljX2NudCIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKElTX1BfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEFjdGl2ZU92ZXJyaWRlRmxhZyA9IHRtcDsKLQotICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5udW1SZWZJZHhBY3RpdmVPdmVycmlkZUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA+IDE1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSIpOwotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUgPSB2YWx1ZSArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogc2V0IG51bVJlZklkeEwwQWN0aXZlIGZyb20gcGljIHBhcmFtIHNldCAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGlmIHZhbHVlIChtaW51czEpIGluIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBleGNlZWRzIDE1IGl0IHNob3VsZAotICAgICAgICAgICAgICogaGF2ZSBiZWVuIG92ZXJyaWRkZW4gaGVyZSAqLwotICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtUmVmSWR4TDBBY3RpdmUgPiAxNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSA9IHBQaWNQYXJhbVNldC0+bnVtUmVmSWR4TDBBY3RpdmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoSVNfUF9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCi0gICAgewotICAgICAgICB0bXAgPSBSZWZQaWNMaXN0UmVvcmRlcmluZyhwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNsaWNlSGVhZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZywKLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUsCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyAhPSAwKQotICAgIHsKLSAgICAgICAgdG1wID0gRGVjUmVmUGljTWFya2luZyhwU3RybURhdGEsICZwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcsCi0gICAgICAgICAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUsIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICAvKiBkZWNvZGUgc2xpY2VRcERlbHRhIGFuZCBjaGVjayB0aGF0IGluaXRpYWwgUVAgZm9yIHRoZSBzbGljZSB3aWxsIGJlIG9uCi0gICAgICogdGhlIHJhbmdlIFswLCA1MV0gKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU2xpY2VIZWFkZXItPnNsaWNlUXBEZWx0YSA9IGl0bXA7Ci0gICAgaXRtcCArPSAoaTMyKXBQaWNQYXJhbVNldC0+cGljSW5pdFFwOwotICAgIGlmICggKGl0bXAgPCAwKSB8fCAoaXRtcCA+IDUxKSApCi0gICAgewotICAgICAgICBFUFJJTlQoInNsaWNlX3FwX2RlbHRhIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICBpZiAocFBpY1BhcmFtU2V0LT5kZWJsb2NraW5nRmlsdGVyQ29udHJvbFByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgcFNsaWNlSGVhZGVyLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IHZhbHVlOwotICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA+IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIGlmICggKGl0bXAgPCAtNikgfHwgKGl0bXAgPiA2KSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyIik7Ci0gICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPnNsaWNlQWxwaGFDME9mZnNldCA9IGl0bXAgKiAyOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBpZiAoIChpdG1wIDwgLTYpIHx8IChpdG1wID4gNikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9iZXRhX29mZnNldF9kaXYyIik7Ci0gICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPnNsaWNlQmV0YU9mZnNldCA9IGl0bXAgKiAyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAocFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyA+IDEpICYmCi0gICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA+PSAzKSAmJgotICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPD0gNSkgKQotICAgIHsKLSAgICAgICAgLyogc2V0IHRtcCB0byBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHJlcHJlc2VudCBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUKLSAgICAgICAgICogaW4gdGhlIHN0cmVhbSAqLwotICAgICAgICB0bXAgPSBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzKHBpY1NpemVJbk1icywKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGUpOwotICAgICAgICB2YWx1ZSA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgdG1wKTsKLSAgICAgICAgaWYgKHZhbHVlID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+c2xpY2VHcm91cENoYW5nZUN5Y2xlID0gdmFsdWU7Ci0KLSAgICAgICAgLyogY29ycmVzcG9uZHMgdG8gdG1wID0gQ2VpbChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkgKi8KLSAgICAgICAgdG1wID0gKHBpY1NpemVJbk1icyArIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGUgLSAxKSAvCi0gICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGU7Ci0gICAgICAgIGlmIChwU2xpY2VIZWFkZXItPnNsaWNlR3JvdXBDaGFuZ2VDeWNsZSA+IHRtcCkKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZXRlcm1pbmUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudAotICAgICAgICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIGluIHRoZSBzdHJlYW0uIFRoZSBzdGFuZGFyZCBzdGF0ZXMgdGhhdAotICAgICAgICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIGlzIHJlcHJlc2VudGVkIGJ5Ci0gICAgICAgICAgICAgICAgQ2VpbCggTG9nMiggKHBpY1NpemVJbk1icyAvIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKSArIDEpICkKLQotICAgICAgICAgICAgYml0cy4gRGl2aXNpb24gIi8iIGluIHRoZSBlcXVhdGlvbiBpcyBub24tdHJ1bmNhdGluZyBkaXZpc2lvbi4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgICAgICAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VSYXRlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbnVtYmVyIG9mIGJpdHMgbmVlZGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzKHUzMiBwaWNTaXplSW5NYnMsIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLG51bUJpdHMsbWFzazsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBpY1NpemVJbk1icyk7Ci0gICAgQVNTRVJUKHNsaWNlR3JvdXBDaGFuZ2VSYXRlKTsKLSAgICBBU1NFUlQoc2xpY2VHcm91cENoYW5nZVJhdGUgPD0gcGljU2l6ZUluTWJzKTsKLQotICAgIC8qIGNvbXB1dGUgKHBpY1NpemVJbk1icyAvIHNsaWNlR3JvdXBDaGFuZ2VSYXRlICsgMSksIHJvdW5kZWQgdXAgKi8KLSAgICBpZiAocGljU2l6ZUluTWJzICUgc2xpY2VHcm91cENoYW5nZVJhdGUpCi0gICAgICAgIHRtcCA9IDIgKyBwaWNTaXplSW5NYnMvc2xpY2VHcm91cENoYW5nZVJhdGU7Ci0gICAgZWxzZQotICAgICAgICB0bXAgPSAxICsgcGljU2l6ZUluTWJzL3NsaWNlR3JvdXBDaGFuZ2VSYXRlOwotCi0gICAgbnVtQml0cyA9IDA7Ci0gICAgbWFzayA9IH4wVTsKLQotICAgIC8qIHNldCBudW1CaXRzIHRvIHBvc2l0aW9uIG9mIHJpZ2h0LW1vc3Qgbm9uLXplcm8gYml0ICovCi0gICAgd2hpbGUgKHRtcCAmIChtYXNrPDwrK251bUJpdHMpKQotICAgICAgICA7Ci0gICAgbnVtQml0cy0tOwotCi0gICAgLyogYWRkIG9uZSBtb3JlIGJpdCBpZiB2YWx1ZSBncmVhdGVyIHRoYW4gMl5udW1CaXRzICovCi0gICAgaWYgKHRtcCAmICgoMTw8bnVtQml0cyktMSkpCi0gICAgICAgIG51bUJpdHMrKzsKLQotICAgIHJldHVybihudW1CaXRzKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFJlZlBpY0xpc3RSZW9yZGVyaW5nCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgc3ludGF4IGVsZW1lbnRzIGZyb20KLSAgICAgICAgICAgIHRoZSBzdHJlYW0uIE1heCBudW1iZXIgb2YgcmVvcmRlcmluZyBjb21tYW5kcyBpcyBudW1SZWZJZHhBY3RpdmUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBudW1SZWZJZHhBY3RpdmUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2UgaW5kaWNlcyB0byBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgc2xpY2UKLSAgICAgICAgICAgIG1heFBpY051bSAgICAgICBtYXhGcmFtZU51bSBmcm9tIHRoZSBhY3RpdmUgU1BTCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZyAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIFJlZlBpY0xpc3RSZW9yZGVyaW5nKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICByZWZQaWNMaXN0UmVvcmRlcmluZ190ICpwUmVmUGljTGlzdFJlb3JkZXJpbmcsIHUzMiBudW1SZWZJZHhBY3RpdmUsCi0gICAgdTMyIG1heFBpY051bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICB1MzIgY29tbWFuZDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBSZWZQaWNMaXN0UmVvcmRlcmluZyk7Ci0gICAgQVNTRVJUKG51bVJlZklkeEFjdGl2ZSk7Ci0gICAgQVNTRVJUKG1heFBpY051bSk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwID0gdG1wOwotCi0gICAgaWYgKHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+cmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDApCi0gICAgewotICAgICAgICBpID0gMDsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IG51bVJlZklkeEFjdGl2ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoIlRvbyBtYW55IHJlb3JkZXJpbmcgY29tbWFuZHMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZjb21tYW5kKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPiAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVQUklOVCgicmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjID0gY29tbWFuZDsKLQotICAgICAgICAgICAgaWYgKChjb21tYW5kID09IDApIHx8IChjb21tYW5kID09IDEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+PSBtYXhQaWNOdW0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoImFic19kaWZmX3BpY19udW1fbWludXMxIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5jb21tYW5kW2ldLmFic0RpZmZQaWNOdW0gPSB2YWx1ZSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY29tbWFuZCA9PSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+Y29tbWFuZFtpXS5sb25nVGVybVBpY051bSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfSB3aGlsZSAoY29tbWFuZCAhPSAzKTsKLQotICAgICAgICAvKiB0aGVyZSBzaGFsbCBiZSBhdCBsZWFzdCBvbmUgcmVvcmRlcmluZyBjb21tYW5kIGlmCi0gICAgICAgICAqIHJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwIHdhcyBzZXQgKi8KLSAgICAgICAgaWYgKGkgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJyZWZfcGljX2xpc3RfcmVvcmRlcmluZyIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNSZWZQaWNNYXJraW5nCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBkZWNvZGVkIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgc3ludGF4IGVsZW1lbnRzIGZyb20KLSAgICAgICAgICAgIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAotICAgICAgICAgICAgbnVtUmVmRnJhbWVzICAgIG1heCBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lcyBmcm9tIHRoZSBhY3RpdmUgU1BTCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nICAgZGVjb2RlZCBkYXRhIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjUmVmUGljTWFya2luZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgZGVjUmVmUGljTWFya2luZ190ICpwRGVjUmVmUGljTWFya2luZywgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgICB1MzIgbnVtUmVmRnJhbWVzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlOwotICAgIHUzMiBpOwotICAgIHUzMiBvcGVyYXRpb247Ci0gICAgLyogdmFyaWFibGVzIGZvciBlcnJvciBjaGVja2luZyBwdXJwb3Nlcywgc3RvcmUgbnVtYmVyIG9mIG1lbW9yeQotICAgICAqIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyBvZiBjZXJ0YWluIHR5cGUgKi8KLSAgICB1MzIgbnVtNCA9IDAsIG51bTUgPSAwLCBudW02ID0gMCwgbnVtMXRvMyA9IDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCggbmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiB8fAotICAgICAgICAgICAgbmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFIHx8Ci0gICAgICAgICAgICBuYWxVbml0VHlwZSA9PSBOQUxfU0VJICk7Ci0KLQotICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+bm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSB0bXA7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+bG9uZ1Rlcm1SZWZlcmVuY2VGbGFnID0gdG1wOwotICAgICAgICBpZiAoIW51bVJlZkZyYW1lcyAmJiBwRGVjUmVmUGljTWFya2luZy0+bG9uZ1Rlcm1SZWZlcmVuY2VGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoImxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnID0gdG1wOwotICAgICAgICBpZiAocERlY1JlZlBpY01hcmtpbmctPmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2VlIGV4cGxhbmF0aW9uIG9mIHRoZSBNQVhfTlVNX01NQ19PUEVSQVRJT05TIGluCi0gICAgICAgICAgICAgICAgICogc2xpY2VfaGVhZGVyLmggKi8KLSAgICAgICAgICAgICAgICBpZiAoaSA+ICgyICogbnVtUmVmRnJhbWVzICsgMikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlRvbyBtYW55IG1hbmFnZW1lbnQgb3BlcmF0aW9ucyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJm9wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPiA2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS4KLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKChvcGVyYXRpb24gPT0gMSkgfHwgKG9wZXJhdGlvbiA9PSAzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uZGlmZmVyZW5jZU9mUGljTnVtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1QaWNOdW0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChvcGVyYXRpb24gPT0gMykgfHwgKG9wZXJhdGlvbiA9PSA2KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1GcmFtZUlkeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICAgICAgLyogdmFsdWUgc2hhbGwgYmUgaW4gcmFuZ2UgWzAsIG51bVJlZkZyYW1lc10gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gbnVtUmVmRnJhbWVzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIm1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TG9uZ1Rlcm1GcmFtZUlkeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExvbmdUZXJtRnJhbWVJZHggPSB2YWx1ZSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnVtNCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBudW01Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gJiYgb3BlcmF0aW9uIDw9IDMpCi0gICAgICAgICAgICAgICAgICAgIG51bTF0bzMrKzsKLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDYpCi0gICAgICAgICAgICAgICAgICAgIG51bTYrKzsKLQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0gd2hpbGUgKG9wZXJhdGlvbiAhPSAwKTsKLQotICAgICAgICAgICAgLyogZXJyb3IgY2hlY2tpbmcgKi8KLSAgICAgICAgICAgIGlmIChudW00ID4gMSB8fCBudW01ID4gMSB8fCBudW02ID4gMSB8fCAobnVtMXRvMyAmJiBudW01KSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENoZWNrUHBzSWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBwaWNfcGFyYW1ldGVyX3NldF9pZCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uCi0gICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbQotICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZwotICAgICAgICAgICAgc3RyZWFtIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBpY1BhcmFtU2V0SWQgICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja1Bwc0lkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICpwaWNQYXJhbVNldElkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHZhbHVlID49IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICpwaWNQYXJhbVNldElkID0gdmFsdWU7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0ZyYW1lTnVtCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgZnJhbWVfbnVtIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24gZG9lcyBub3QKLSAgICAgICAgICAgIG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtIGRhdGEKLSAgICAgICAgICAgIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nIHN0cmVhbQotICAgICAgICAgICAgZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG1heEZyYW1lTnVtCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGZyYW1lTnVtICAgICAgICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja0ZyYW1lTnVtKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyICpmcmFtZU51bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQobWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChmcmFtZU51bSk7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChtYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICpmcmFtZU51bSA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrSWRyUGljSWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBpZHJfcGljX2lkIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24gZG9lcyBub3QKLSAgICAgICAgICAgIG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtIGRhdGEKLSAgICAgICAgICAgIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nIHN0cmVhbQotICAgICAgICAgICAgZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG1heEZyYW1lTnVtICAgICBtYXggZnJhbWUgbnVtYmVyIGZyb20gYWN0aXZlIFNQUwotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgaWRyUGljSWQgICAgICAgIHZhbHVlIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrSWRyUGljSWQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgdTMyIG1heEZyYW1lTnVtLAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICB1MzIgKmlkclBpY0lkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChtYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKGlkclBpY0lkKTsKLQotICAgIC8qIG5hbFVuaXRUeXBlIG11c3QgYmUgZXF1YWwgdG8gNSBiZWNhdXNlIG90aGVyd2lzZSBpZHJQaWNJZCBpcyBub3QKLSAgICAgKiBwcmVzZW50ICovCi0gICAgaWYgKG5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKG1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBza2lwIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIGlkcl9waWNfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsIGlkclBpY0lkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgcGljX29yZGVyX2NudF9sc2IgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbgotICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0KLSAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgICAgICAgIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUwotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcGljT3JkZXJDbnRMc2IgIHZhbHVlIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2IoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICB1MzIgKnBpY09yZGVyQ250THNiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChwaWNPcmRlckNudExzYik7Ci0KLSAgICAvKiBwaWNPcmRlckNudFR5cGUgbXVzdCBiZSBlcXVhbCB0byAwICovCi0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYik7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBza2lwIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLwotICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAqcGljT3JkZXJDbnRMc2IgPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSBmcm9tIHRoZSBzbGljZSBoZWFkZXIuCi0gICAgICAgICAgICBGdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlCi0gICAgICAgICAgICBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlCi0gICAgICAgICAgICBhY2Nlc3Npbmcgc3RyZWFtIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICBpMzIgKmRlbHRhUGljT3JkZXJDbnRCb3R0b20pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKGRlbHRhUGljT3JkZXJDbnRCb3R0b20pOwotCi0gICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMCBhbmQgcGljT3JkZXJQcmVzZW50RmxhZyBtdXN0IGJlIFRSVUUKLSAgICAgKiAqLwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IpOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KLSAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWVzIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gYW5kIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0KLSAgICAgICAgICAgIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtCi0gICAgICAgICAgICBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgICAgICAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICAgICAgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLSAgICAgICAgICAgIHBpY09yZGVyUHJlc2VudEZsYWcgICAgIGZsYWcgaW5kaWNhdGluZyBpZiBkZWx0YV9waWNfb3JkZXJfY250WzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBwcmVzZW50IGluIHRoZSBzdHJlYW0KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudCAgICAgICAgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICAgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWcsCi0gIGkzMiAqZGVsdGFQaWNPcmRlckNudCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICBBU1NFUlQoZGVsdGFQaWNPcmRlckNudCk7Ci0KLSAgICAvKiBwaWNPcmRlckNudFR5cGUgbXVzdCBiZSBlcXVhbCB0byAxIGFuZCBkZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgbXVzdAotICAgICAqIGJlIEZBTFNFICovCi0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEpOwotICAgIEFTU0VSVCghcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgLyogZGVsdGFfcGljX29yZGVyX2NudFswXSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZkZWx0YVBpY09yZGVyQ250WzBdKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250WzFdIGlmIHByZXNlbnQgKi8KLSAgICBpZiAocGljT3JkZXJQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZkZWx0YVBpY09yZGVyQ250WzFdKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1JlZHVuZGFudFBpY0NudAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIHJlZHVuZGFudF9waWNfY250IGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24KLSAgICAgICAgICAgIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtCi0gICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nCi0gICAgICAgICAgICBzdHJlYW0gZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBQUFMKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHJlZHVuZGFudFBpY0NudCB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja1JlZHVuZGFudFBpY0NudCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICpyZWR1bmRhbnRQaWNDbnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgaTMyIGl2YWx1ZTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKLSAgICBBU1NFUlQocmVkdW5kYW50UGljQ250KTsKLQotICAgIC8qIHJlZHVuZGFudF9waWNfY250X2ZsYWcgbXVzdCBiZSBUUlVFICovCi0gICAgQVNTRVJUKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPiAwIHx8Ci0gICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IpOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KLSAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaS0tOwotCi0gICAgICAgIC8qIHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gKi8KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSAmJgotICAgICAgIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKQotICAgIHsKLSAgICAgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFswXSAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250WzFdIGlmIHByZXNlbnQgKi8KLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlZHVuZGFudF9waWNfY250ICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCByZWR1bmRhbnRQaWNDbnQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2Ygbm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyBmcm9tIHRoZSBzbGljZSBoZWFkZXIuCi0gICAgICAgICAgICBGdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMKLSAgICAgICAgICAgIHRoZSBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlCi0gICAgICAgICAgICBhY2Nlc3Npbmcgc3RyZWFtIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCi0gICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgUFBTCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub091dHB1dE9mUHJpb3JQaWNzRmxhZyB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qbGludCAtZTcxNSBkaXNhYmxlIGxpbnQgaW5mbyBuYWxVbml0VHlwZSBub3QgcmVmZXJlbmNlZCAqLwotdTMyIGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcodTMyICogbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJtRGF0YV90ICogcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VxUGFyYW1TZXRfdCAqIHBTZXFQYXJhbVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpY1BhcmFtU2V0X3QgKiBwUGljUGFyYW1TZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlKQotewotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBpMzIgaXZhbHVlOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0gICAgVU5VU0VEKG5hbFVuaXRUeXBlKTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7Ci0gICAgQVNTRVJUKG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnKTsKLQotICAgIC8qIG11c3QgYmUgSURSIGxzaWNlICovCi0gICAgQVNTRVJUKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybiAodG1wKTsKLQotICAgIC8qIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuICh0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4gKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBza2lwIGlkcl9waWNfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuICh0bXApOwotCi0gICAgaWYocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQotICAgICAgICAgICAgaSsrOwotICAgICAgICBpLS07Ci0KLSAgICAgICAgLyogc2tpcCBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgICAgIGlmKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZihwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gKi8KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOwotICAgICAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxICYmCi0gICAgICAgIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKQotICAgIHsKLSAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250WzBdICovCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOwotICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuICh0bXApOwotCi0gICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCi0gICAgICAgIGlmKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7Ci0gICAgICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHNraXAgcmVkdW5kYW50X3BpY19jbnQgKi8KLSAgICBpZihwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuICh0bXApOwotICAgIH0KLQotICAgICpub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCAxKTsKLSAgICBpZigqbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLQotICAgIHJldHVybiAoSEFOVFJPX09LKTsKLQotfQotLypsaW50ICtlNzE1ICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg4OThhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1NMSUNFX0hFQURFUl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TTElDRV9IRUFERVJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZW51bSB7Ci0gICAgUF9TTElDRSA9IDAsCi0gICAgSV9TTElDRSA9IDIKLX07Ci0KLWVudW0ge05PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTID0gMHhGRkZGfTsKLQotLyogbWFjcm8gdG8gZGV0ZXJtaW5lIGlmIHNsaWNlIGlzIGFuIGludGVyIHNsaWNlLCBzbGljZVR5cGVzIDAgYW5kIDUgKi8KLSNkZWZpbmUgSVNfUF9TTElDRShzbGljZVR5cGUpICgoKHNsaWNlVHlwZSkgPT0gUF9TTElDRSkgfHwgXAotICAgICgoc2xpY2VUeXBlKSA9PSBQX1NMSUNFICsgNSkpCi0KLS8qIG1hY3JvIHRvIGRldGVybWluZSBpZiBzbGljZSBpcyBhbiBpbnRyYSBzbGljZSwgc2xpY2VUeXBlcyAyIGFuZCA3ICovCi0jZGVmaW5lIElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSAoKChzbGljZVR5cGUpID09IElfU0xJQ0UpIHx8IFwKLSAgICAoKHNsaWNlVHlwZSkgPT0gSV9TTElDRSArIDUpKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBkYXRhIG9mIG9uZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgb3BlcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiByZW9yZGVyaW5nT2ZQaWNOdW1zSWRjOwotICAgIHUzMiBhYnNEaWZmUGljTnVtOwotICAgIHUzMiBsb25nVGVybVBpY051bTsKLX0gcmVmUGljTGlzdFJlb3JkZXJpbmdPcGVyYXRpb25fdDsKLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBvcGVyYXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiByZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMDsKLSAgICByZWZQaWNMaXN0UmVvcmRlcmluZ09wZXJhdGlvbl90IGNvbW1hbmRbTUFYX05VTV9SRUZfUElDUysxXTsKLX0gcmVmUGljTGlzdFJlb3JkZXJpbmdfdDsKLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIGRhdGEgb2Ygb25lIERQQiBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb247Ci0gICAgdTMyIGRpZmZlcmVuY2VPZlBpY051bXM7Ci0gICAgdTMyIGxvbmdUZXJtUGljTnVtOwotICAgIHUzMiBsb25nVGVybUZyYW1lSWR4OwotICAgIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4OwotfSBtZW1vcnlNYW5hZ2VtZW50T3BlcmF0aW9uX3Q7Ci0KLS8qIHdvcnN0IGNhc2Ugc2NlbmFyaW86IGFsbCBNQVhfTlVNX1JFRl9QSUNTIHBpY3R1cmVzIGluIHRoZSBidWZmZXIgYXJlCi0gKiBzaG9ydCB0ZXJtIHBpY3R1cmVzLCBlYWNoIG9uZSBvZiB0aGVtIGlzIGZpcnN0IG1hcmtlZCBhcyBsb25nIHRlcm0KLSAqIHJlZmVyZW5jZSBwaWN0dXJlIHdoaWNoIGlzIHRoZW4gbWFya2VkIGFzIHVudXNlZCBmb3IgcmVmZXJlbmNlLgotICogQWRkaXRpb25hbGx5LCBtYXggbG9uZy10ZXJtIGZyYW1lIGluZGV4IGlzIHNldCBhbmQgY3VycmVudCBwaWN0dXJlIGlzCi0gKiBtYXJrZWQgYXMgbG9uZyB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlLiBMYXN0IHBvc2l0aW9uIHJlc2VydmVkIGZvcgotICogZW5kIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGNvbW1hbmQgKi8KLSNkZWZpbmUgTUFYX05VTV9NTUNfT1BFUkFUSU9OUyAoMipNQVhfTlVNX1JFRl9QSUNTKzIrMSkKLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIGRlY29kZWQgcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBkYXRhICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBub091dHB1dE9mUHJpb3JQaWNzRmxhZzsKLSAgICB1MzIgbG9uZ1Rlcm1SZWZlcmVuY2VGbGFnOwotICAgIHUzMiBhZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZzsKLSAgICBtZW1vcnlNYW5hZ2VtZW50T3BlcmF0aW9uX3Qgb3BlcmF0aW9uW01BWF9OVU1fTU1DX09QRVJBVElPTlNdOwotfSBkZWNSZWZQaWNNYXJraW5nX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBzbGljZSBoZWFkZXIgZGF0YSBkZWNvZGVkIGZyb20gdGhlIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgZmlyc3RNYkluU2xpY2U7Ci0gICAgdTMyIHNsaWNlVHlwZTsKLSAgICB1MzIgcGljUGFyYW1ldGVyU2V0SWQ7Ci0gICAgdTMyIGZyYW1lTnVtOwotICAgIHUzMiBpZHJQaWNJZDsKLSAgICB1MzIgcGljT3JkZXJDbnRMc2I7Ci0gICAgaTMyIGRlbHRhUGljT3JkZXJDbnRCb3R0b207Ci0gICAgaTMyIGRlbHRhUGljT3JkZXJDbnRbMl07Ci0gICAgdTMyIHJlZHVuZGFudFBpY0NudDsKLSAgICB1MzIgbnVtUmVmSWR4QWN0aXZlT3ZlcnJpZGVGbGFnOwotICAgIHUzMiBudW1SZWZJZHhMMEFjdGl2ZTsKLSAgICBpMzIgc2xpY2VRcERlbHRhOwotICAgIHUzMiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYzsKLSAgICBpMzIgc2xpY2VBbHBoYUMwT2Zmc2V0OwotICAgIGkzMiBzbGljZUJldGFPZmZzZXQ7Ci0gICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZTsKLSAgICByZWZQaWNMaXN0UmVvcmRlcmluZ190IHJlZlBpY0xpc3RSZW9yZGVyaW5nOwotICAgIGRlY1JlZlBpY01hcmtpbmdfdCBkZWNSZWZQaWNNYXJraW5nOwotfSBzbGljZUhlYWRlcl90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAotICBuYWxVbml0X3QgKnBOYWxVbml0KTsKLQotdTMyIGgyNjRic2RDaGVja1Bwc0lkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICpwcHNJZCk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tGcmFtZU51bSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIHUzMiAqZnJhbWVOdW0pOwotCi11MzIgaDI2NGJzZENoZWNrSWRyUGljSWQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgdTMyIG1heEZyYW1lTnVtLAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICB1MzIgKmlkclBpY0lkKTsKLQotdTMyIGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICpwaWNPcmRlckNudExzYik7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgaTMyICpkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKLQotdTMyIGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICB1MzIgcGljT3JkZXJQcmVzZW50RmxhZywKLSAgaTMyICpkZWx0YVBpY09yZGVyQ250KTsKLQotdTMyIGgyNjRic2RDaGVja1JlZHVuZGFudFBpY0NudCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICpyZWR1bmRhbnRQaWNDbnQpOwotCi11MzIgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZyh1MzIgKiBub091dHB1dE9mUHJpb3JQaWNzRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cm1EYXRhX3QgKiBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXFQYXJhbVNldF90ICogcFNlcVBhcmFtU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGljUGFyYW1TZXRfdCAqIHBQaWNQYXJhbVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TTElDRV9IRUFERVJfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3YTQyYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkSW5pdFN0b3JhZ2UKLSAgICAgICAgICBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldAotICAgICAgICAgIGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0Ci0gICAgICAgICAgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzCi0gICAgICAgICAgaDI2NGJzZFJlc2V0U3RvcmFnZQotICAgICAgICAgIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlCi0gICAgICAgICAgaDI2NGJzZElzRW5kT2ZQaWN0dXJlCi0gICAgICAgICAgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwCi0gICAgICAgICAgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5Ci0gICAgICAgICAgQ2hlY2tQcHMKLSAgICAgICAgICBoMjY0YnNkVmFsaWRQYXJhbVNldHMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBVSU5UMzJfTUFYCi0jZGVmaW5lIFVJTlQzMl9NQVggICAgICAgKDQyOTQ5NjcyOTVVKQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBDaGVja1BwcyhwaWNQYXJhbVNldF90ICpwcHMsIHNlcVBhcmFtU2V0X3QgKnNwcyk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkSW5pdFN0b3JhZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgSW5pdGlhbGl6ZSBzdG9yYWdlIHN0cnVjdHVyZS4gU2V0cyBjb250ZW50cyBvZiB0aGUgc3RvcmFnZSB0byAnMCcKLSAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGhlIGFjdGl2ZSBwYXJhbWV0ZXIgc2V0IGlkcywgd2hpY2ggYXJlIGluaXRpYWxpemVkCi0gICAgICAgICAgICB0byBpbnZhbGlkIHZhbHVlcy4KLQotICAgICAgICBJbnB1dHM6Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIGluaXRpYWxpemVkIGRhdGEgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbml0U3RvcmFnZShzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIEgyNjRTd0RlY01lbXNldChwU3RvcmFnZSwgMCwgc2l6ZW9mKHN0b3JhZ2VfdCkpOwotCi0gICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUzsKLSAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOwotCi0gICAgcFN0b3JhZ2UtPmF1Yi0+Zmlyc3RDYWxsRmxhZyA9IEhBTlRST19UUlVFOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFN0b3JlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgaW50byB0aGUgc3RvcmFnZS4gSWYgYWN0aXZlIFNQUyBpcwotICAgICAgICAgICAgb3ZlcndyaXR0ZW4gLT4gY2hlY2sgaWYgY29udGVudHMgY2hhbmdlcyBhbmQgaWYgaXQgZG9lcywgc2V0Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzIHRvIGZvcmNlIHJlYWN0aXZhdGlvbiBvZiBwYXJhbWV0ZXIgc2V0cwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBwYXJhbSBzZXQgdG8gYmUgc3RvcmVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SICBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaWQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKTsKLQotICAgIGlkID0gcFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZDsKLQotICAgIC8qIHNlcSBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgbm90IHVzZWQgYmVmb3JlIC0+IGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGlmIChwU3RvcmFnZS0+c3BzW2lkXSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPnNwc1tpZF0sIDEsIHNlcVBhcmFtU2V0X3QpOwotICAgICAgICBpZiAocFN0b3JhZ2UtPnNwc1tpZF0gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgfQotICAgIC8qIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBlcXVhbCB0byBpZCBvZiBhY3RpdmUgc3BzICovCi0gICAgZWxzZSBpZiAoaWQgPT0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkKQotICAgIHsKLSAgICAgICAgLyogaWYgc2VxIHBhcmFtZXRlciBzZXQgY29udGVudHMgY2hhbmdlcwotICAgICAgICAgKiAgICAtPiBvdmVyd3JpdGUgYW5kIHJlLWFjdGl2YXRlIHdoZW4gbmV4dCBJRFIgcGljdHVyZSBkZWNvZGVkCi0gICAgICAgICAqICAgIGlkcyBvZiBhY3RpdmUgcGFyYW0gc2V0cyBzZXQgdG8gaW52YWxpZCB2YWx1ZXMgdG8gZm9yY2UKLSAgICAgICAgICogICAgcmUtYWN0aXZhdGlvbi4gTWVtb3JpZXMgYWxsb2NhdGVkIGZvciBvbGQgc3BzIGZyZWVkCi0gICAgICAgICAqIG90aGVyd2lzZSBmcmVlIG1lbWVyaWVzIGFsbG9jYXRlZCBmb3IganVzdCBkZWNvZGVkIHNwcyBhbmQKLSAgICAgICAgICogY29udGludWUgKi8KLSAgICAgICAgaWYgKGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzKHBTZXFQYXJhbVNldCwgcFN0b3JhZ2UtPmFjdGl2ZVNwcykgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+b2Zmc2V0Rm9yUmVmRnJhbWUpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+dnVpUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTICsgMTsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgKyAxOwotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IE5VTEw7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZSRUUocFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSk7Ci0gICAgICAgICAgICBGUkVFKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBvdmVyd3JpdGUgc2VxIHBhcmFtIHNldCBvdGhlciB0aGFuIGFjdGl2ZSBvbmUgLT4gZnJlZSBtZW1vcmllcwotICAgICAqIGFsbG9jYXRlZCBmb3Igb2xkIHBhcmFtIHNldCAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPm9mZnNldEZvclJlZkZyYW1lKTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+dnVpUGFyYW1ldGVycyk7Ci0gICAgfQotCi0gICAgKnBTdG9yYWdlLT5zcHNbaWRdID0gKnBTZXFQYXJhbVNldDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU3RvcmUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGludG8gdGhlIHN0b3JhZ2UuIElmIGFjdGl2ZSBQUFMgaXMKLSAgICAgICAgICAgIG92ZXJ3cml0dGVuIC0+IGNoZWNrIGlmIGFjdGl2ZSBTUFMgY2hhbmdlcyBhbmQgaWYgaXQgZG9lcyAtPiBzZXQKLSAgICAgICAgICAgIHBhcmFtZXRlcnMgdG8gZm9yY2UgcmVhY3RpdmF0aW9uIG9mIHBhcmFtZXRlciBzZXRzCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBwb2ludGVyIHRvIHBhcmFtIHNldCB0byBiZSBzdG9yZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaWQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKTsKLSAgICBBU1NFUlQocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpOwotCi0gICAgaWQgPSBwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkOwotCi0gICAgLyogcGljIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBub3QgdXNlZCBiZWZvcmUgLT4gYWxsb2NhdGUgbWVtb3J5ICovCi0gICAgaWYgKHBTdG9yYWdlLT5wcHNbaWRdID09IE5VTEwpCi0gICAgewotICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+cHBzW2lkXSwgMSwgcGljUGFyYW1TZXRfdCk7Ci0gICAgICAgIGlmIChwU3RvcmFnZS0+cHBzW2lkXSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICB9Ci0gICAgLyogcGljdHVyZSBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgZXF1YWwgdG8gaWQgb2YgYWN0aXZlIHBwcyAqLwotICAgIGVsc2UgaWYgKGlkID09IHBTdG9yYWdlLT5hY3RpdmVQcHNJZCkKLSAgICB7Ci0gICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgc2VxIHBhcmFtIHNldCBjaGFuZ2VzLCBmb3JjZSByZS1hY3RpdmF0aW9uIG9mCi0gICAgICAgICAqIHBhcmFtIHNldCBpZiBpdCBkb2VzLiBTZXQgYWN0aXZlU3BzSWQgdG8gaW52YWxpZCB2YWx1ZSB0bwotICAgICAgICAgKiBhY2NvbXBsaXNoIHRoaXMgKi8KLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgIT0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTICsgMTsKLSAgICAgICAgfQotICAgICAgICAvKiBmcmVlIG1lbW9yaWVzIGFsbG9jYXRlZCBmb3Igb2xkIHBhcmFtIHNldCAqLwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ydW5MZW5ndGgpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT50b3BMZWZ0KTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+Ym90dG9tUmlnaHQpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5zbGljZUdyb3VwSWQpOwotICAgIH0KLSAgICAvKiBvdmVyd3JpdGUgcGljIHBhcmFtIHNldCBvdGhlciB0aGFuIGFjdGl2ZSBvbmUgLT4gZnJlZSBtZW1vcmllcwotICAgICAqIGFsbG9jYXRlZCBmb3Igb2xkIHBhcmFtIHNldCAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnJ1bkxlbmd0aCk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnRvcExlZnQpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ib3R0b21SaWdodCk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnNsaWNlR3JvdXBJZCk7Ci0gICAgfQotCi0gICAgKnBTdG9yYWdlLT5wcHNbaWRdID0gKnBQaWNQYXJhbVNldDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEFjdGl2YXRlIGNlcnRhaW4gU1BTL1BQUyBjb21iaW5hdGlvbi4gVGhpcyBmdW5jdGlvbiBzaGFsbCBiZQotICAgICAgICAgICAgY2FsbGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwaWN0dXJlLiBQaWN0dXJlIHBhcmFtZXRlciBzZXQKLSAgICAgICAgICAgIGNhbiBiZSBjaGFuZ2VkIGFzIHdhbnRlZCwgYnV0IHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgbWF5IG9ubHkgYmUKLSAgICAgICAgICAgIGNoYW5nZWQgd2hlbiB0aGUgc3RhcnRpbmcgcGljdHVyZSBpcyBhbiBJRFIgcGljdHVyZS4KLQotICAgICAgICAgICAgV2hlbiBuZXcgU1BTIGlzIGFjdGl2YXRlZCB0aGUgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IKLSAgICAgICAgICAgIG1hY3JvYmxvY2sgc3RvcmFnZXMgYW5kIHNsaWNlIGdyb3VwIG1hcCBhbmQgKHJlLSlpbml0aWFsaXplcyB0aGUKLSAgICAgICAgICAgIGRlY29kZWQgcGljdHVyZSBidWZmZXIuIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBhY3RpdmF0aW9uIHRoZSBvbGQKLSAgICAgICAgICAgIGFsbG9jYXRpb25zIGFyZSBmcmVlZCBhbmQgRnJlZURwYiBjYWxsZWQgYmVmb3JlIG5ldyBhbGxvY2F0aW9ucy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwcHNJZCAgICAgICAgICAgaWRlbnRpZmllcyB0aGUgUFBTIHRvIGJlIGFjdGl2YXRlZCwgU1BTIGlkIG9idGFpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgUFBTCi0gICAgICAgICAgICBpc0lkciAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgcGljdHVyZSBpcyBhbiBJRFIgcGljdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgbm9uLWV4aXN0aW5nIG9yIGludmFsaWQgcGFyYW0gc2V0IGNvbWJpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeWluZyB0byBjaGFuZ2UgU1BTIHdpdGggbm9uLUlEUiBwaWN0dXJlCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAgICAgZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBwcHNJZCwgdTMyIGlzSWRyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0gICAgdTMyIGZsYWc7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0gICAgQVNTRVJUKHBwc0lkIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUyk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHBwcyBhbmQgY29ycmVzcG9uZGluZyBzcHMgZXhpc3QgKi8KLSAgICBpZiAoIChwU3RvcmFnZS0+cHBzW3Bwc0lkXSA9PSBOVUxMKSB8fAotICAgICAgICAgKHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkXSA9PSBOVUxMKSApCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgdGhhdCBwcHMgcGFyYW1ldGVycyBkbyBub3QgdmlvbGF0ZSBwaWN0dXJlIHNpemUgY29uc3RyYWludHMgKi8KLSAgICB0bXAgPSBDaGVja1BwcyhwU3RvcmFnZS0+cHBzW3Bwc0lkXSwKLSAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbcHBzSWRdLT5zZXFQYXJhbWV0ZXJTZXRJZF0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGZpcnN0IGFjdGl2YXRpb24gcGFydDEgKi8KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID09IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpCi0gICAgewotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBwcHNJZDsKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOwotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBwU3RvcmFnZS0+YWN0aXZlUHBzLT5zZXFQYXJhbWV0ZXJTZXRJZDsKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkXTsKLQotICAgICAgICAvKiByZXBvcnQgZXJyb3IgYmVmb3JlIG11bHRpcGxpY2F0aW9uIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdyAqLwotICAgICAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyA+Ci0gICAgICAgICAgICAgICAgIFVJTlQzMl9NQVggLyBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyA9Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAqCi0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7Ci0gICAgICAgIH0KLQotICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT53aWR0aCA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnM7Ci0gICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPmhlaWdodCA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOwotCi0gICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19UUlVFOwotICAgIH0KLSAgICAvKiBmaXJzdCBhY3RpdmF0aW9uIHBhcnQyICovCi0gICAgZWxzZSBpZiAocFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uKQotICAgIHsKLSAgICAgICAgcFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIEZSRUUocFN0b3JhZ2UtPm1iKTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCk7Ci0KLSAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPm1iLCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCBtYlN0b3JhZ2VfdCk7Ci0gICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCB1MzIpOwotICAgICAgICBpZiAocFN0b3JhZ2UtPm1iID09IE5VTEwgfHwgcFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICAgICAgSDI2NFN3RGVjTWVtc2V0KHBTdG9yYWdlLT5tYiwgMCwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMgKiBzaXplb2YobWJTdG9yYWdlX3QpKTsKLQotICAgICAgICBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycyhwU3RvcmFnZS0+bWIsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLAotICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyk7Ci0KLSAgICAgICAgLyogZHBiIG91dHB1dCByZW9yZGVyaW5nIGRpc2FibGVkIGlmCi0gICAgICAgICAqIDEpIGFwcGxpY2F0aW9uIHNldCBub1Jlb3JkZXJpbmcgZmxhZwotICAgICAgICAgKiAyKSBQT0MgdHlwZSBlcXVhbCB0byAyCi0gICAgICAgICAqIDMpIG51bV9yZW9yZGVyX2ZyYW1lcyBpbiB2dWkgZXF1YWwgdG8gMCAqLwotICAgICAgICBpZiAoIHBTdG9yYWdlLT5ub1Jlb3JkZXJpbmcgfHwKLSAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNPcmRlckNudFR5cGUgPT0gMiB8fAotICAgICAgICAgICAgIChwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKLSAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnICYmCi0gICAgICAgICAgICAgICFwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzKSApCi0gICAgICAgICAgICBmbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZsYWcgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZFJlc2V0RHBiKHBTdG9yYWdlLT5kcGIsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzICoKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+bWF4RHBiU2l6ZSwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPm51bVJlZkZyYW1lcywKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPm1heEZyYW1lTnVtLAotICAgICAgICAgICAgZmxhZyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBwc0lkICE9IHBTdG9yYWdlLT5hY3RpdmVQcHNJZCkKLSAgICB7Ci0gICAgICAgIC8qIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgc2hhbGwgbm90IGNoYW5nZSBidXQgYmVmb3JlIGFuIElEUiBwaWN0dXJlICovCi0gICAgICAgIGlmIChwU3RvcmFnZS0+cHBzW3Bwc0lkXS0+c2VxUGFyYW1ldGVyU2V0SWQgIT0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIlNFUSBQQVJBTSBTRVQgQ0hBTkdJTkcuLi5cbiIpKTsKLSAgICAgICAgICAgIGlmIChpc0lkcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBwcHNJZDsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gcFN0b3JhZ2UtPnBwc1twcHNJZF07Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+c2VxUGFyYW1ldGVyU2V0SWQ7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkXTsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzID0KLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAqCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOwotCi0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+d2lkdGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPmhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOwotCi0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJUUllJTkcgVE8gQ0hBTkdFIFNQUyBJTiBOT04tSURSIFNMSUNFXG4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gcFN0b3JhZ2UtPnBwc1twcHNJZF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RSZXNldFN0b3JhZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUmVzZXQgY29udGVudHMgb2YgdGhlIHN0b3JhZ2UuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUKLSAgICAgICAgICAgIHByb2Nlc3Npbmcgb2YgbmV3IGltYWdlIGlzIHN0YXJ0ZWQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RSZXNldFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyA9IDA7Ci0gICAgcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCi0gICAgewotICAgICAgICBwU3RvcmFnZS0+bWJbaV0uc2xpY2VJZCA9IDA7Ci0gICAgICAgIHBTdG9yYWdlLT5tYltpXS5kZWNvZGVkID0gMDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNTdGFydE9mUGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZXRlcm1pbmUgaWYgdGhlIGRlY29kZXIgaXMgaW4gdGhlIHN0YXJ0IG9mIGEgcGljdHVyZS4gVGhpcwotICAgICAgICAgICAgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGRlY2lkZSBpZiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMgYW5kCi0gICAgICAgICAgICBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bSBmdW5jdGlvbnMgc2hvdWxkIGJlIGNhbGxlZC4gRnVuY3Rpb24KLSAgICAgICAgICAgIGNvbnNpZGVycyB0aGF0IG5ldyBwaWN0dXJlIGlzIHN0YXJ0aW5nIGlmIG5vIHNsaWNlIGhlYWRlcnMKLSAgICAgICAgICAgIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBmb3IgdGhlIGN1cnJlbnQgYWNjZXNzIHVuaXQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19UUlVFICAgICAgICBuZXcgcGljdHVyZSBpcyBzdGFydGluZwotICAgICAgICAgICAgSEFOVFJPX0ZBTFNFICAgICAgIG5vdCBzdGFydGluZwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgaWYgKHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID09IEhBTlRST19GQUxTRSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZElzRW5kT2ZQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERldGVybWluZSBpZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgZW5kIG9mIGEgcGljdHVyZS4gVGhpcwotICAgICAgICAgICAgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGRldGVybWluZSB3aGVuIGRlYmxvY2tpbmcgZmlsdGVyaW5nCi0gICAgICAgICAgICBhbmQgcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBwcm9jZXNzZXMgc2hvdWxkIGJlIHBlcmZvcm1lZC4KLQotICAgICAgICAgICAgSWYgdGhlIGRlY29kZXIgaXMgcHJvY2Vzc2luZyBwcmltYXJ5IHNsaWNlcyB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgICBpcyBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZSB2YWx1ZSBvZiBudW1EZWNvZGVkTWJzIGluIHRoZQotICAgICAgICAgICAgc3RvcmFnZS4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBkZWNvZGVyIGlzIHByb2Nlc3NpbmcKLSAgICAgICAgICAgIHJlZHVuZGFudCBzbGljZXMgdGhlIG51bURlY29kZWRNYnMgbWF5IG5vdCBjb250YWluIHZhbGlkCi0gICAgICAgICAgICBpbmZvcm1hdGlvbmEgYW5kIGVhY2ggbWFjcm9ibG9jayBoYXMgdG8gYmUgY2hlY2tlZCBzZXBhcmF0ZWx5LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fVFJVRSAgICAgICAgZW5kIG9mIHBpY3R1cmUKLSAgICAgICAgICAgIEhBTlRST19GQUxTRSAgICAgICBub3VwCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSXNFbmRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICAvKiBwcmltYXJ5IHBpY3R1cmUgKi8KLSAgICBpZiAoIXBTdG9yYWdlLT5zbGljZUhlYWRlclswXS5yZWR1bmRhbnRQaWNDbnQpCi0gICAgewotICAgICAgICBpZiAocFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzID09IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsgaSsrKQotICAgICAgICAgICAgdG1wICs9IHBTdG9yYWdlLT5tYltpXS5kZWNvZGVkID8gMSA6IDA7Ci0KLSAgICAgICAgaWYgKHRtcCA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wdXRlIHNsaWNlIGdyb3VwIG1hcC4gSnVzdCBjYWxsIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwIHdpdGgKLSAgICAgICAgICAgIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgICAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZUN5Y2xlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcChwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMsIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgaWYgbmV4dCBOQUwgdW5pdCBzdGFydHMgYSBuZXcgYWNjZXNzIHVuaXQuIEZvbGxvd2luZwotICAgICAgICAgICAgY29uZGl0aW9ucyBzcGVjaWZ5IHN0YXJ0IG9mIGEgbmV3IGFjY2VzcyB1bml0OgotCi0gICAgICAgICAgICAgICAgLU5BTCB1bml0IHR5cGVzIDYtMTEsIDEzLTE4IChlLmcuIFNQUywgUFBTKQotCi0gICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGNoZWNrZWQgb25seSBmb3Igc2xpY2UgTkFMIHVuaXRzLCB2YWx1ZXMKLSAgICAgICAgICAgY29tcGFyZWQgdG8gb25lcyBvYnRhaW5lZCBmcm9tIHByZXZpb3VzIHNsaWNlOgotCi0gICAgICAgICAgICAgICAgLU5BTCB1bml0IHR5cGUgZGlmZmVycyAoc2xpY2UgLyBJRFIgc2xpY2UpCi0gICAgICAgICAgICAgICAgLWZyYW1lX251bSBkaWZmZXJzCi0gICAgICAgICAgICAgICAgLW5hbF9yZWZfaWRjIGRpZmZlcnMgYW5kIG9uZSBvZiB0aGUgdmFsdWVzIGlzIDAKLSAgICAgICAgICAgICAgICAtUE9DIGluZm9ybWF0aW9uIGRpZmZlcnMKLSAgICAgICAgICAgICAgICAtYm90aCBhcmUgSURSIHNsaWNlcyBhbmQgaWRyX3BpY19pZCBkaWZmZXJzCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgc3RybSAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG51TmV4dCAgICAgIHBvaW50ZXIgdG8gTkFMIHVuaXQgc3RydWN0dXJlCi0gICAgICAgICAgICBzdG9yYWdlICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgIHRoZSByZXN1bHQgaXMgc3RvcmVkIGhlcmUsIFRSVUUgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgdW5pdCBib3VuZGFyeSwgRkFMU0Ugb3RoZXJ3aXNlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgICBmYWlsdXJlLCBpbnZhbGlkIHN0cmVhbSBkYXRhCi0gICAgICAgICAgICBQQVJBTV9TRVRfRVJST1IgICAgIGludmFsaWQgcGFyYW0gc2V0IHVzYWdlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkoCi0gIHN0cm1EYXRhX3QgKnN0cm0sCi0gIG5hbFVuaXRfdCAqbnVOZXh0LAotICBzdG9yYWdlX3QgKnN0b3JhZ2UsCi0gIHUzMiAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBwcHNJZCwgZnJhbWVOdW0sIGlkclBpY0lkLCBwaWNPcmRlckNudExzYjsKLSAgICBpMzIgZGVsdGFQaWNPcmRlckNudEJvdHRvbSwgZGVsdGFQaWNPcmRlckNudFsyXTsKLSAgICBzZXFQYXJhbVNldF90ICpzcHM7Ci0gICAgcGljUGFyYW1TZXRfdCAqcHBzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoc3RybSk7Ci0gICAgQVNTRVJUKG51TmV4dCk7Ci0gICAgQVNTRVJUKHN0b3JhZ2UpOwotICAgIEFTU0VSVChzdG9yYWdlLT5zcHMpOwotICAgIEFTU0VSVChzdG9yYWdlLT5wcHMpOwotCi0gICAgLyogaW5pdGlhbGl6ZSBkZWZhdWx0IG91dHB1dCB0byBGQUxTRSAqLwotICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKCAoIChudU5leHQtPm5hbFVuaXRUeXBlID4gNSkgJiYgKG51TmV4dC0+bmFsVW5pdFR5cGUgPCAxMikgKSB8fAotICAgICAgICAgKCAobnVOZXh0LT5uYWxVbml0VHlwZSA+IDEyKSAmJiAobnVOZXh0LT5uYWxVbml0VHlwZSA8PSAxOCkgKSApCi0gICAgewotICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFICYmCi0gICAgICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUiApCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBpZiB0aGlzIGlzIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiAqLwotICAgIGlmIChzdG9yYWdlLT5hdWItPmZpcnN0Q2FsbEZsYWcpCi0gICAgewotICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICBzdG9yYWdlLT5hdWItPmZpcnN0Q2FsbEZsYWcgPSBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgLyogZ2V0IHBpY3R1cmUgcGFyYW1ldGVyIHNldCBpZCAqLwotICAgIHRtcCA9IGgyNjRic2RDaGVja1Bwc0lkKHN0cm0sICZwcHNJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc3RvcmUgc3BzIGFuZCBwcHMgaW4gc2VwYXJhdGUgcG9pbnRlcnMganVzdCB0byBtYWtlIG5hbWVzIHNob3J0ZXIgKi8KLSAgICBwcHMgPSBzdG9yYWdlLT5wcHNbcHBzSWRdOwotICAgIGlmICggcHBzID09IE5VTEwgfHwgc3RvcmFnZS0+c3BzW3Bwcy0+c2VxUGFyYW1ldGVyU2V0SWRdID09IE5VTEwgIHx8Ci0gICAgICAgICAoc3RvcmFnZS0+YWN0aXZlU3BzSWQgIT0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUyAmJgotICAgICAgICAgIHBwcy0+c2VxUGFyYW1ldGVyU2V0SWQgIT0gc3RvcmFnZS0+YWN0aXZlU3BzSWQgJiYKLSAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIpICkKLSAgICAgICAgcmV0dXJuKFBBUkFNX1NFVF9FUlJPUik7Ci0gICAgc3BzID0gc3RvcmFnZS0+c3BzW3Bwcy0+c2VxUGFyYW1ldGVyU2V0SWRdOwotCi0gICAgaWYgKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxSZWZJZGMgIT0gbnVOZXh0LT5uYWxSZWZJZGMgJiYKLSAgICAgIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsUmVmSWRjID09IDAgfHwgbnVOZXh0LT5uYWxSZWZJZGMgPT0gMCkpCi0gICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0KLSAgICBpZiAoKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSICYmCi0gICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKSB8fAotICAgICAgKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSICYmCi0gICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKSkKLSAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLQotICAgIHRtcCA9IGgyNjRic2RDaGVja0ZyYW1lTnVtKHN0cm0sIHNwcy0+bWF4RnJhbWVOdW0sICZmcmFtZU51bSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZGcmFtZU51bSAhPSBmcmFtZU51bSkKLSAgICB7Ci0gICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkZyYW1lTnVtID0gZnJhbWVOdW07Ci0gICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotCi0gICAgaWYgKG51TmV4dC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RDaGVja0lkclBpY0lkKHN0cm0sIHNwcy0+bWF4RnJhbWVOdW0sIG51TmV4dC0+bmFsVW5pdFR5cGUsCi0gICAgICAgICAgJmlkclBpY0lkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSICYmCi0gICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2SWRyUGljSWQgIT0gaWRyUGljSWQpCi0gICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotCi0gICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldklkclBpY0lkID0gaWRyUGljSWQ7Ci0gICAgfQotCi0gICAgaWYgKHNwcy0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYihzdHJtLCBzcHMsIG51TmV4dC0+bmFsVW5pdFR5cGUsCi0gICAgICAgICAgJnBpY09yZGVyQ250THNiKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldlBpY09yZGVyQ250THNiICE9IHBpY09yZGVyQ250THNiKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZQaWNPcmRlckNudExzYiA9IHBpY09yZGVyQ250THNiOwotICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20oc3RybSwgc3BzLAotICAgICAgICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUsICZkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudEJvdHRvbSAhPQotICAgICAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnRCb3R0b20pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudEJvdHRvbSA9Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnRCb3R0b207Ci0gICAgICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzcHMtPnBpY09yZGVyQ250VHlwZSA9PSAxICYmICFzcHMtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnQoc3RybSwgc3BzLCBudU5leHQtPm5hbFVuaXRUeXBlLAotICAgICAgICAgIHBwcy0+cGljT3JkZXJQcmVzZW50RmxhZywgZGVsdGFQaWNPcmRlckNudCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMF0gIT0gZGVsdGFQaWNPcmRlckNudFswXSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFswXSA9IGRlbHRhUGljT3JkZXJDbnRbMF07Ci0gICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBwcy0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzFdICE9IGRlbHRhUGljT3JkZXJDbnRbMV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFsxXSA9IGRlbHRhUGljT3JkZXJDbnRbMV07Ci0gICAgICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAqc3RvcmFnZS0+YXViLT5udVByZXYgPSAqbnVOZXh0OwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBDaGVja1BwcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBwaWN0dXJlIHBhcmFtZXRlciBzZXQuIENvbnRlbnRzIG9mIHRoZSBwaWN0dXJlIHBhcmFtZXRlcgotICAgICAgICAgICAgc2V0IGluZm9ybWF0aW9uIHRoYXQgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBpcyBjaGVja2VkCi0gICAgICAgICAgICBhZ2FpbnN0IHRoZSBkaW1lbnNpb25zIGluIHRoZSBzcHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcHBzICAgICBwb2ludGVyIHRvIHBpY3R1cmUgcGFyYW10ZXIgc2V0Ci0gICAgICAgICAgICBzcHMgICAgIHBvaW50ZXIgdG8gc2VxdWVuY2UgcGFyYW1ldGVyIHNldAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIGV2ZXJ5dGhpbmcgb2sKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGludmFsaWQgZGF0YSBpbiBwaWN0dXJlIHBhcmFtZXRlciBzZXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBDaGVja1BwcyhwaWNQYXJhbVNldF90ICpwcHMsIHNlcVBhcmFtU2V0X3QgKnNwcykKLXsKLQotICAgIHUzMiBpOwotICAgIHUzMiBwaWNTaXplOwotCi0gICAgcGljU2l6ZSA9IHNwcy0+cGljV2lkdGhJbk1icyAqIHNwcy0+cGljSGVpZ2h0SW5NYnM7Ci0KLSAgICAvKiBjaGVjayBzbGljZSBncm91cCBwYXJhbXMgKi8KLSAgICBpZiAocHBzLT5udW1TbGljZUdyb3VwcyA+IDEpCi0gICAgewotICAgICAgICBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQocHBzLT5ydW5MZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtU2xpY2VHcm91cHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHBzLT5ydW5MZW5ndGhbaV0gPiBwaWNTaXplKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQocHBzLT50b3BMZWZ0KTsKLSAgICAgICAgICAgIEFTU0VSVChwcHMtPmJvdHRvbVJpZ2h0KTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bVNsaWNlR3JvdXBzLTE7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHBzLT50b3BMZWZ0W2ldID4gcHBzLT5ib3R0b21SaWdodFtpXSB8fAotICAgICAgICAgICAgICAgICAgICBwcHMtPmJvdHRvbVJpZ2h0W2ldID49IHBpY1NpemUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAgICAgICAgIGlmICggKHBwcy0+dG9wTGVmdFtpXSAlIHNwcy0+cGljV2lkdGhJbk1icykgPgotICAgICAgICAgICAgICAgICAgICAgKHBwcy0+Ym90dG9tUmlnaHRbaV0gJSBzcHMtPnBpY1dpZHRoSW5NYnMpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPiAyICYmIHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPCA2KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSA+IHBpY1NpemUpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNiAmJgotICAgICAgICAgICAgICAgICBwcHMtPnBpY1NpemVJbk1hcFVuaXRzIDwgcGljU2l6ZSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkVmFsaWRQYXJhbVNldHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgaWYgYW55IHZhbGlkIFNQUy9QUFMgY29tYmluYXRpb24gZXhpc3RzIGluIHRoZSBzdG9yYWdlLgotICAgICAgICAgICAgRnVuY3Rpb24gdHJpZXMgZWFjaCBQUFMgaW4gdGhlIGJ1ZmZlciBhbmQgY2hlY2tzIGlmIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgIFNQUyBleGlzdHMgYW5kIGNhbGxzIENoZWNrUHBzIHRvIGRldGVybWluZSBpZiB0aGUgUFBTIGNvbmZvcm1zCi0gICAgICAgICAgICB0byBpbWFnZSBkaW1lbnNpb25zIG9mIHRoZSBTUFMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdmFsaWQgY29tYmluYXRpb24KLSAgICAgICAgICAgIEhBTlRST19OT0sgIG5vIHZhbGlkIGNvbWJpbmF0aW9ucyBmb3VuZAotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOyBpKyspCi0gICAgewotICAgICAgICBpZiAoIHBTdG9yYWdlLT5wcHNbaV0gJiYKLSAgICAgICAgICAgICBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbaV0tPnNlcVBhcmFtZXRlclNldElkXSAmJgotICAgICAgICAgICAgIENoZWNrUHBzKHBTdG9yYWdlLT5wcHNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW2ldLT5zZXFQYXJhbWV0ZXJTZXRJZF0pID09Ci0gICAgICAgICAgICAgICAgIEhBTlRST19PSykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2IyZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1NUT1JBR0VfSAotI2RlZmluZSBIMjY0U1dERUNfU1RPUkFHRV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfb3JkZXJfY250LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgc2xpY2VJZDsKLSAgICB1MzIgbnVtRGVjb2RlZE1iczsKLSAgICB1MzIgbGFzdE1iQWRkcjsKLX0gc2xpY2VTdG9yYWdlX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBwYXJhbWV0ZXJzIG5lZWRlZCBmb3IgYWNjZXNzIHVuaXQgYm91bmRhcnkgY2hlY2tpbmcgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgbmFsVW5pdF90IG51UHJldlsxXTsKLSAgICB1MzIgcHJldkZyYW1lTnVtOwotICAgIHUzMiBwcmV2SWRyUGljSWQ7Ci0gICAgdTMyIHByZXZQaWNPcmRlckNudExzYjsKLSAgICBpMzIgcHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b207Ci0gICAgaTMyIHByZXZEZWx0YVBpY09yZGVyQ250WzJdOwotICAgIHUzMiBmaXJzdENhbGxGbGFnOwotfSBhdWJDaGVja190OwotCi0vKiBzdG9yYWdlIGRhdGEgc3RydWN0dXJlLCBob2xkcyBhbGwgZGF0YSBvZiBhIGRlY29kZXIgaW5zdGFuY2UgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogYWN0aXZlIHBhcmFtZXQgc2V0IGlkcyBhbmQgcG9pbnRlcnMgKi8KLSAgICB1MzIgb2xkU3BzSWQ7Ci0gICAgdTMyIGFjdGl2ZVBwc0lkOwotICAgIHUzMiBhY3RpdmVTcHNJZDsKLSAgICBwaWNQYXJhbVNldF90ICphY3RpdmVQcHM7Ci0gICAgc2VxUGFyYW1TZXRfdCAqYWN0aXZlU3BzOwotICAgIHNlcVBhcmFtU2V0X3QgKnNwc1tNQVhfTlVNX1NFUV9QQVJBTV9TRVRTXTsKLSAgICBwaWNQYXJhbVNldF90ICpwcHNbTUFYX05VTV9QSUNfUEFSQU1fU0VUU107Ci0KLSAgICAvKiBjdXJyZW50IHNsaWNlIGdyb3VwIG1hcCwgcmVjb21wdXRlZCBmb3IgZWFjaCBzbGljZSAqLwotICAgIHUzMiAqc2xpY2VHcm91cE1hcDsKLQotICAgIHUzMiBwaWNTaXplSW5NYnM7Ci0KLSAgICAvKiB0aGlzIGZsYWcgaXMgc2V0IGFmdGVyIGFsbCBtYWNyb2Jsb2NrcyBvZiBhIHBpY3R1cmUgc3VjY2Vzc2Z1bGx5Ci0gICAgICogZGVjb2RlZCAtPiByZWR1bmRhbnQgc2xpY2VzIG5vdCBkZWNvZGVkICovCi0gICAgdTMyIHNraXBSZWR1bmRhbnRTbGljZXM7Ci0gICAgdTMyIHBpY1N0YXJ0ZWQ7Ci0KLSAgICAvKiBmbGFnIHRvIGluZGljYXRlIGlmIGN1cnJlbnQgYWNjZXNzIHVuaXQgY29udGFpbnMgYW55IHZhbGlkIHNsaWNlcyAqLwotICAgIHUzMiB2YWxpZFNsaWNlSW5BY2Nlc3NVbml0OwotCi0gICAgLyogc3RvcmUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBoYW5kbGluZyBvZiBzbGljZSBkZWNvZGluZyAqLwotICAgIHNsaWNlU3RvcmFnZV90IHNsaWNlWzFdOwotCi0gICAgLyogbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgY3VycmVudCBpbWFnZSAqLwotICAgIHUzMiBudW1Db25jZWFsZWRNYnM7Ci0KLSAgICAvKiBwaWNJZCBnaXZlbiBieSBhcHBsaWNhdGlvbiAqLwotICAgIHUzMiBjdXJyZW50UGljSWQ7Ci0KLSAgICAvKiBtYWNyb2Jsb2NrIHNwZWNpZmljIHN0b3JhZ2VzLCBzaXplIGRldGVybWluZWQgYnkgaW1hZ2UgZGltZW5zaW9ucyAqLwotICAgIG1iU3RvcmFnZV90ICptYjsKLQotICAgIC8qIGZsYWcgdG8gc3RvcmUgbm9PdXRwdXRSZW9yZGVyaW5nIGZsYWcgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiAqLwotICAgIHUzMiBub1Jlb3JkZXJpbmc7Ci0KLSAgICAvKiBEUEIgKi8KLSAgICBkcGJTdG9yYWdlX3QgZHBiWzFdOwotCi0gICAgLyogc3RydWN0dXJlIHRvIHN0b3JlIHBpY3R1cmUgb3JkZXIgY291bnQgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLwotICAgIHBvY1N0b3JhZ2VfdCBwb2NbMV07Ci0KLSAgICAvKiBhY2Nlc3MgdW5pdCBib3VuZGFyeSBjaGVja2luZyByZWxhdGVkIGRhdGEgKi8KLSAgICBhdWJDaGVja190IGF1YlsxXTsKLQotICAgIC8qIGN1cnJlbnQgcHJvY2Vzc2VkIGltYWdlICovCi0gICAgaW1hZ2VfdCBjdXJySW1hZ2VbMV07Ci0KLSAgICAvKiBsYXN0IHZhbGlkIE5BTCB1bml0IGhlYWRlciBpcyBzdG9yZWQgaGVyZSAqLwotICAgIG5hbFVuaXRfdCBwcmV2TmFsVW5pdFsxXTsKLQotICAgIC8qIHNsaWNlIGhlYWRlciwgc2Vjb25kIHN0cnVjdHVyZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2Ugd2hpbGUKLSAgICAgKiBkZWNvZGluZyBzbGljZSBoZWFkZXIsIGZpcnN0IG9uZSBzdG9yZXMgbGFzdCBzdWNjZXNzZnVsbHkgZGVjb2RlZAotICAgICAqIHNsaWNlIGhlYWRlciAqLwotICAgIHNsaWNlSGVhZGVyX3Qgc2xpY2VIZWFkZXJbMl07Ci0KLSAgICAvKiBmaWVsZHMgdG8gc3RvcmUgb2xkIHN0cmVhbSBidWZmZXIgcG9pbnRlcnMsIG5lZWRlZCB3aGVuIG9ubHkgcGFydCBvZgotICAgICAqIGEgc3RyZWFtIGJ1ZmZlciBpcyBwcm9jZXNzZWQgYnkgaDI2NGJzZERlY29kZSBmdW5jdGlvbiAqLwotICAgIHUzMiBwcmV2QnVmTm90RmluaXNoZWQ7Ci0gICAgdTggKnByZXZCdWZQb2ludGVyOwotICAgIHUzMiBwcmV2Qnl0ZXNDb25zdW1lZDsKLSAgICBzdHJtRGF0YV90IHN0cm1bMV07Ci0KLSAgICAvKiBtYWNyb2Jsb2NrIGxheWVyIHN0cnVjdHVyZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSB0aGlzIGJ1dCBpdAotICAgICAqIHdvdWxkIGhhdmUgaW5jcmVhc2VkIHRoZSBzdGFjayBzaXplIGV4Y2Vzc2l2ZWx5IGFuZCBuZWVkZWQgdG8gYmUKLSAgICAgKiBhbGxvY2F0ZWQgZnJvbSBoZWFkIC0+IGVhc2llc3QgdG8gcHV0IGl0IGhlcmUgKi8KLSAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllcjsKLQotICAgIHUzMiBwZW5kaW5nQWN0aXZhdGlvbjsgLyogQWN0aXZhdGUgcGFyYW1ldGVyIHNldHMgYWZ0ZXIgcmV0dXJuaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJTX1JEWSB0byB0aGUgdXNlciAqLwotICAgIHUzMiBpbnRyYUNvbmNlYWxtZW50RmxhZzsgLyogMCBncmF5IHBpY3R1cmUgZm9yIGNvcnJ1cHRlZCBpbnRyYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBwcmV2aW91cyBmcmFtZSB1c2VkIGlmIGF2YWlsYWJsZSAqLwotfSBzdG9yYWdlX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW5pdFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci12b2lkIGgyNjRic2RSZXNldFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci11MzIgaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci11MzIgaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCk7Ci11MzIgaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KTsKLXUzMiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHBwc0lkLCB1MzIgaXNJZHIpOwotdm9pZCBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAoc3RvcmFnZV90ICpwU3RvcmFnZSwKLSAgICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlKTsKLQotdTMyIGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKLSAgc3RybURhdGFfdCAqc3RybSwKLSAgbmFsVW5pdF90ICpudU5leHQsCi0gIHN0b3JhZ2VfdCAqc3RvcmFnZSwKLSAgdTMyICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnKTsKLQotdTMyIGgyNjRic2RWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU1RPUkFHRV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMTA4My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RHZXRCaXRzCi0gICAgICAgICAgaDI2NGJzZFNob3dCaXRzMzIKLSAgICAgICAgICBoMjY0YnNkRmx1c2hCaXRzCi0gICAgICAgICAgaDI2NGJzZElzQnl0ZUFsaWduZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEdldEJpdHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUmVhZCBhbmQgcmVtb3ZlIGJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlci4KLQotICAgICAgICBJbnB1dDoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBudW1CaXRzICAgICBudW1iZXIgb2YgYml0cyB0byByZWFkCi0KLSAgICAgICAgT3V0cHV0OgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBiaXRzIHJlYWQgZnJvbSBzdHJlYW0KLSAgICAgICAgICAgIEVORF9PRl9TVFJFQU0gaWYgbm90IGVub3VnaCBiaXRzIGxlZnQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RHZXRCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpCi17Ci0KLSAgICB1MzIgb3V0OwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKG51bUJpdHMgPCAzMik7Ci0KLSAgICBvdXQgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpID4+ICgzMiAtIG51bUJpdHMpOwotCi0gICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCBudW1CaXRzKSA9PSBIQU5UUk9fT0spCi0gICAgewotICAgICAgICByZXR1cm4ob3V0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuKEVORF9PRl9TVFJFQU0pOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RTaG93Qml0czMyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJlYWQgMzIgYml0cyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyLiBCdWZmZXIgaXMgbGVmdCBhcyBpdCBpcywgaS5lLgotICAgICAgICAgICAgbm8gYml0cyBhcmUgcmVtb3ZlZC4gRmlyc3QgYml0IHJlYWQgZnJvbSB0aGUgc3RyZWFtIGlzIHRoZSBNU0Igb2YKLSAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggYml0cyBpbiB0aGUgYnVmZmVyIC0+Ci0gICAgICAgICAgICBiaXRzIGJleW9uZyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gYXJlIHNldCB0byAnMCcgaW4gdGhlIHJldHVybgotICAgICAgICAgICAgdmFsdWUuCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dDoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgYml0cyByZWFkIGZyb20gc3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkU2hvd0JpdHMzMihzdHJtRGF0YV90ICpwU3RybURhdGEpCi17Ci0KLSAgICBpMzIgYml0cywgc2hpZnQ7Ci0gICAgdTMyIG91dDsKLSAgICB1OCAqcFN0cm07Ci0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpOwotICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA8IDgpOwotICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA9PQotICAgICAgICAgICAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICYgMHg3KSk7Ci0KLSAgICBwU3RybSA9IHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zOwotCi0gICAgLyogbnVtYmVyIG9mIGJpdHMgbGVmdCBpbiB0aGUgYnVmZmVyICovCi0gICAgYml0cyA9IChpMzIpcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUqOCAtIChpMzIpcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzOwotCi0gICAgLyogYXQgbGVhc3QgMzItYml0cyBpbiB0aGUgYnVmZmVyICovCi0gICAgaWYgKGJpdHMgPj0gMzIpCi0gICAgewotICAgICAgICB1MzIgYml0UG9zSW5Xb3JkID0gcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQ7Ci0gICAgICAgIG91dCA9ICgodTMyKXBTdHJtWzBdIDw8IDI0KSB8ICgodTMyKXBTdHJtWzFdIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICgodTMyKXBTdHJtWzJdIDw8ICA4KSB8ICgodTMyKXBTdHJtWzNdKTsKLQotICAgICAgICBpZiAoYml0UG9zSW5Xb3JkKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgYnl0ZSA9ICh1MzIpcFN0cm1bNF07Ci0gICAgICAgICAgICB1MzIgdG1wID0gKDgtYml0UG9zSW5Xb3JkKTsKLSAgICAgICAgICAgIG91dCA8PD0gYml0UG9zSW5Xb3JkOwotICAgICAgICAgICAgb3V0IHw9IGJ5dGU+PnRtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKG91dCk7Ci0gICAgfQotICAgIC8qIGF0IGxlYXN0IG9uZSBiaXQgaW4gdGhlIGJ1ZmZlciAqLwotICAgIGVsc2UgaWYgKGJpdHMgPiAwKQotICAgIHsKLSAgICAgICAgc2hpZnQgPSAoaTMyKSgyNCArIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKTsKLSAgICAgICAgb3V0ID0gKHUzMikoKnBTdHJtKyspIDw8IHNoaWZ0OwotICAgICAgICBiaXRzIC09IChpMzIpKDggLSBwU3RybURhdGEtPmJpdFBvc0luV29yZCk7Ci0gICAgICAgIHdoaWxlIChiaXRzID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc2hpZnQgLT0gODsKLSAgICAgICAgICAgIG91dCB8PSAodTMyKSgqcFN0cm0rKykgPDwgc2hpZnQ7Ci0gICAgICAgICAgICBiaXRzIC09IDg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChvdXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAoMCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCaXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJlbW92ZSBiaXRzIGZyb20gdGhlIHN0cmVhbSBidWZmZXIKLQotICAgICAgICBJbnB1dDoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbnVtQml0cyAgICAgICAgIG51bWJlciBvZiBiaXRzIHRvIHJlbW92ZQotCi0gICAgICAgIE91dHB1dDoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEVORF9PRl9TVFJFQU0gICBub3QgZW5vdWdoIGJpdHMgbGVmdAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX05FT04KLXUzMiBoMjY0YnNkRmx1c2hCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpCi17Ci0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPCA4KTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPT0gKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAmIDB4NykpOwotCi0gICAgcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICs9IG51bUJpdHM7Ci0gICAgcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPSBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgJiAweDc7Ci0gICAgaWYgKCAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICkgPD0gKDgqcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUpICkKLSAgICB7Ci0gICAgICAgIHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCArCi0gICAgICAgICAgICAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzID4+IDMpOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oRU5EX09GX1NUUkVBTSk7Ci0KLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNCeXRlQWxpZ25lZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBpZiBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiBpcyBieXRlIGFsaWduZWQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBUUlVFICAgICAgICBzdHJlYW0gaXMgYnl0ZSBhbGlnbmVkCi0gICAgICAgICAgICBGQUxTRSAgICAgICBzdHJlYW0gaXMgbm90IGJ5dGUgYWxpZ25lZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZElzQnl0ZUFsaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgaWYgKCFwU3RybURhdGEtPmJpdFBvc0luV29yZCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNGI2Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1NUUkVBTV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TVFJFQU1fSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1OCAgKnBTdHJtQnVmZlN0YXJ0OyAgICAvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIHN0cmVhbSBidWZmZXIgKi8KLSAgICB1OCAgKnBTdHJtQ3VyclBvczsgICAgICAvKiBjdXJyZW50IHJlYWQgYWRkcmVzcyBpbiBzdHJlYW0gYnVmZmVyICovCi0gICAgdTMyICBiaXRQb3NJbldvcmQ7ICAgICAgLyogYml0IHBvc2l0aW9uIGluIHN0cmVhbSBidWZmZXIgYnl0ZSAqLwotICAgIHUzMiAgc3RybUJ1ZmZTaXplOyAgICAgIC8qIHNpemUgb2Ygc3RyZWFtIGJ1ZmZlciAoYnl0ZXMpICovCi0gICAgdTMyICBzdHJtQnVmZlJlYWRCaXRzOyAgLyogbnVtYmVyIG9mIGJpdHMgcmVhZCBmcm9tIHN0cmVhbSBidWZmZXIgKi8KLX0gc3RybURhdGFfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEdldEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cyk7Ci0KLXUzMiBoMjY0YnNkU2hvd0JpdHMzMihzdHJtRGF0YV90ICpwU3RybURhdGEpOwotCi11MzIgaDI2NGJzZEZsdXNoQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKTsKLQotdTMyIGgyNjRic2RJc0J5dGVBbGlnbmVkKHN0cm1EYXRhX3QgKik7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NUUkVBTV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViNmRkMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RQcm9jZXNzQmxvY2sKLSAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0x1bWFEYwotICAgICAgICAgIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6Ci0gKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKLSAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKLSAqLwotLypsaW50IC1lNzAxIC1lNzAyICovCi0KLS8qIExldmVsU2NhbGUgZnVuY3Rpb24gKi8KLXN0YXRpYyBjb25zdCBpMzIgbGV2ZWxTY2FsZVs2XVszXSA9IHsKLSAgICB7MTAsMTMsMTZ9LCB7MTEsMTQsMTh9LCB7MTMsMTYsMjB9LCB7MTQsMTgsMjN9LCB7MTYsMjAsMjV9LCB7MTgsMjMsMjl9fTsKLQotLyogcXAgJSA2IGFzIGEgZnVuY3Rpb24gb2YgcXAgKi8KLXN0YXRpYyBjb25zdCB1OCBxcE1vZDZbNTJdID0gezAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LAotICAgIDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDN9OwotCi0vKiBxcCAvIDYgYXMgYSBmdW5jdGlvbiBvZiBxcCAqLwotc3RhdGljIGNvbnN0IHU4IHFwRGl2Nls1Ml0gPSB7MCwwLDAsMCwwLDAsMSwxLDEsMSwxLDEsMiwyLDIsMiwyLDIsMywzLDMsMywzLDMsCi0gICAgNCw0LDQsNCw0LDQsNSw1LDUsNSw1LDUsNiw2LDYsNiw2LDYsNyw3LDcsNyw3LDcsOCw4LDgsOH07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0Jsb2NrCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgemlnLXphZyBzY2FuLCBpbnZlcnNlIHNjYWxpbmcgYW5kCi0gICAgICAgICAgICBpbnZlcnNlIHRyYW5zZm9ybSBmb3IgYSBsdW1hIG9yIGEgY2hyb21hIHJlc2lkdWFsIGJsb2NrCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgICAgIHFwICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gICAgICAgICAgICBza2lwICAgICAgICAgICAgc2tpcCBwcm9jZXNzaW5nIG9mIGRhdGFbMF0sIHNldCB0byBub24temVybyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRjIGNvZWZmIGhhbmxlZCBzZXBhcmF0ZWx5Ci0gICAgICAgICAgICBjb2VmZk1hcCAgICAgICAgMTYgbHNiJ3MgaW5kaWNhdGUgd2hpY2ggY29lZmZzIGFyZSBub24temVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAobHNiKSBmb3IgY29lZmYgMCwgYml0IDEgZm9yIGNvZWZmIDEgZXRjLgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgICAgICAgICAgcHJvY2Vzc2VkIGRhdGEKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBwcm9jZXNzZWQgZGF0YSBub3QgaW4gdmFsaWQgcmFuZ2UgWy01MTIsIDUxMV0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBoMjY0YnNkUHJvY2Vzc0Jsb2NrKGkzMiAqZGF0YSwgdTMyIHFwLCB1MzIgc2tpcCwgdTMyIGNvZWZmTWFwKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwotICAgIGkzMiBkMSwgZDIsIGQzOwotICAgIHUzMiByb3csY29sOwotICAgIHUzMiBxcERpdjsKLSAgICBpMzIgKnB0cjsKLQotLyogQ29kZSAqLwotCi0gICAgcXBEaXYgPSBxcERpdjZbcXBdOwotICAgIHRtcDEgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzBdIDw8IHFwRGl2OwotICAgIHRtcDIgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzFdIDw8IHFwRGl2OwotICAgIHRtcDMgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzJdIDw8IHFwRGl2OwotCi0gICAgaWYgKCFza2lwKQotICAgICAgICBkYXRhWzBdID0gKGRhdGFbMF0gKiB0bXAxKTsKLQotICAgIC8qIGF0IGxlYXN0IG9uZSBvZiB0aGUgcm93cyAxLCAyIG9yIDMgY29udGFpbiBub24temVybyBjb2VmZnMsIG1hc2sgdGFrZXMKLSAgICAgKiB0aGUgc2Nhbm5pbmcgb3JkZXIgaW50byBhY2NvdW50ICovCi0gICAgaWYgKGNvZWZmTWFwICYgMHhGRjlDKQotICAgIHsKLSAgICAgICAgLyogZG8gdGhlIHppZy16YWcgc2NhbiBhbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gKi8KLSAgICAgICAgZDEgPSBkYXRhWzFdOwotICAgICAgICBkMiA9IGRhdGFbMTRdOwotICAgICAgICBkMyA9IGRhdGFbMTVdOwotICAgICAgICBkYXRhWzFdID0gKGQxICogdG1wMik7Ci0gICAgICAgIGRhdGFbMTRdID0gKGQyICogdG1wMik7Ci0gICAgICAgIGRhdGFbMTVdID0gKGQzICogdG1wMyk7Ci0KLSAgICAgICAgZDEgPSBkYXRhWzJdOwotICAgICAgICBkMiA9IGRhdGFbNV07Ci0gICAgICAgIGQzID0gZGF0YVs0XTsKLSAgICAgICAgZGF0YVs0XSA9IChkMSAqIHRtcDIpOwotICAgICAgICBkYXRhWzJdICA9IChkMiAqIHRtcDEpOwotICAgICAgICBkYXRhWzVdID0gKGQzICogdG1wMyk7Ci0KLSAgICAgICAgZDEgPSBkYXRhWzhdOwotICAgICAgICBkMiA9IGRhdGFbM107Ci0gICAgICAgIGQzID0gZGF0YVs2XTsKLSAgICAgICAgdG1wMCA9IChkMSAqIHRtcDIpOwotICAgICAgICBkYXRhWzhdID0gKGQyICogdG1wMSk7Ci0gICAgICAgIGRhdGFbM10gID0gKGQzICogdG1wMik7Ci0gICAgICAgIGQxID0gZGF0YVs3XTsKLSAgICAgICAgZDIgPSBkYXRhWzEyXTsKLSAgICAgICAgZDMgPSBkYXRhWzldOwotICAgICAgICBkYXRhWzZdICA9IChkMSAqIHRtcDIpOwotICAgICAgICBkYXRhWzddICA9IChkMiAqIHRtcDMpOwotICAgICAgICBkYXRhWzEyXSA9IChkMyAqIHRtcDIpOwotICAgICAgICBkYXRhWzldICA9IHRtcDA7Ci0KLSAgICAgICAgZDEgPSBkYXRhWzEwXTsKLSAgICAgICAgZDIgPSBkYXRhWzExXTsKLSAgICAgICAgZDMgPSBkYXRhWzEzXTsKLSAgICAgICAgZGF0YVsxM10gPSAoZDEgKiB0bXAzKTsKLSAgICAgICAgZGF0YVsxMF0gPSAoZDIgKiB0bXAxKTsKLSAgICAgICAgZGF0YVsxMV0gPSAoZDMgKiB0bXAyKTsKLQotICAgICAgICAvKiBob3Jpem9udGFsIHRyYW5zZm9ybSAqLwotICAgICAgICBmb3IgKHJvdyA9IDQsIHB0ciA9IGRhdGE7IHJvdy0tOyBwdHIgKz0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMCA9IHB0clswXSArIHB0clsyXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJbMF0gLSBwdHJbMl07Ci0gICAgICAgICAgICB0bXAyID0gKHB0clsxXSA+PiAxKSAtIHB0clszXTsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJbMV0gKyAocHRyWzNdID4+IDEpOwotICAgICAgICAgICAgcHRyWzBdID0gdG1wMCArIHRtcDM7Ci0gICAgICAgICAgICBwdHJbMV0gPSB0bXAxICsgdG1wMjsKLSAgICAgICAgICAgIHB0clsyXSA9IHRtcDEgLSB0bXAyOwotICAgICAgICAgICAgcHRyWzNdID0gdG1wMCAtIHRtcDM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKmxpbnQgK2U2NjEgK2U2NjIqLwotICAgICAgICAvKiB0aGVuIHZlcnRpY2FsIHRyYW5zZm9ybSAqLwotICAgICAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVs4XTsKLSAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVs4XTsKLSAgICAgICAgICAgIHRtcDIgPSAoZGF0YVs0XSA+PiAxKSAtIGRhdGFbMTJdOwotICAgICAgICAgICAgdG1wMyA9IGRhdGFbNF0gKyAoZGF0YVsxMl0gPj4gMSk7Ci0gICAgICAgICAgICBkYXRhWzAgXSA9ICh0bXAwICsgdG1wMyArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbNCBdID0gKHRtcDEgKyB0bXAyICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVs4IF0gPSAodG1wMSAtIHRtcDIgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzEyXSA9ICh0bXAwIC0gdG1wMyArIDMyKT4+NjsKLSAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgZWFjaCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy01MTIsNTExXSAqLwotICAgICAgICAgICAgaWYgKCgodTMyKShkYXRhWzBdICsgNTEyKSA+IDEwMjMpIHx8Ci0gICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbNF0gKyA1MTIpID4gMTAyMykgfHwKLSAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVs4XSArIDUxMikgPiAxMDIzKSB8fAotICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzEyXSArIDUxMikgPiAxMDIzKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogcm93cyAxLCAyIGFuZCAzIGFyZSB6ZXJvICovCi0gICAgewotICAgICAgICAvKiBvbmx5IGRjLWNvZWZmIGlzIG5vbi16ZXJvLCBpLmUuIGNvZWZmcyBhdCBvcmlnaW5hbCBwb3NpdGlvbnMKLSAgICAgICAgICogMSwgNSBhbmQgNiBhcmUgemVybyAqLwotICAgICAgICBpZiAoKGNvZWZmTWFwICYgMHg2MikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMCA9IChkYXRhWzBdICsgMzIpID4+IDY7Ci0gICAgICAgICAgICAvKiBjaGVjayB0aGF0IHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTUxMiw1MTFdICovCi0gICAgICAgICAgICBpZiAoKHUzMikodG1wMCArIDUxMikgPiAxMDIzKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIGRhdGFbMF0gPSBkYXRhWzFdICA9IGRhdGFbMl0gID0gZGF0YVszXSAgPSBkYXRhWzRdICA9IGRhdGFbNV0gID0KLSAgICAgICAgICAgICAgICAgICAgICBkYXRhWzZdICA9IGRhdGFbN10gID0gZGF0YVs4XSAgPSBkYXRhWzldICA9IGRhdGFbMTBdID0KLSAgICAgICAgICAgICAgICAgICAgICBkYXRhWzExXSA9IGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0KLSAgICAgICAgICAgICAgICAgICAgICB0bXAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogYXQgbGVhc3Qgb25lIG9mIHRoZSBjb2VmZnMgMSwgNSBvciA2IGlzIG5vbi16ZXJvICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFbMV0gPSAoZGF0YVsxXSAqIHRtcDIpOwotICAgICAgICAgICAgZGF0YVsyXSA9IChkYXRhWzVdICogdG1wMSk7Ci0gICAgICAgICAgICBkYXRhWzNdID0gKGRhdGFbNl0gKiB0bXAyKTsKLSAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVsyXTsKLSAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVsyXTsKLSAgICAgICAgICAgIHRtcDIgPSAoZGF0YVsxXSA+PiAxKSAtIGRhdGFbM107Ci0gICAgICAgICAgICB0bXAzID0gZGF0YVsxXSArIChkYXRhWzNdID4+IDEpOwotICAgICAgICAgICAgZGF0YVswXSA9ICh0bXAwICsgdG1wMyArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbMV0gPSAodG1wMSArIHRtcDIgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzJdID0gKHRtcDEgLSB0bXAyICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVszXSA9ICh0bXAwIC0gdG1wMyArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbNF0gPSBkYXRhWzhdID0gZGF0YVsxMl0gPSBkYXRhWzBdOwotICAgICAgICAgICAgZGF0YVs1XSA9IGRhdGFbOV0gPSBkYXRhWzEzXSA9IGRhdGFbMV07Ci0gICAgICAgICAgICBkYXRhWzZdID0gZGF0YVsxMF0gPSBkYXRhWzE0XSA9IGRhdGFbMl07Ci0gICAgICAgICAgICBkYXRhWzddID0gZGF0YVsxMV0gPSBkYXRhWzE1XSA9IGRhdGFbM107Ci0gICAgICAgICAgICAvKiBjaGVjayB0aGF0IGVhY2ggdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstNTEyLDUxMV0gKi8KLSAgICAgICAgICAgIGlmICgoKHUzMikoZGF0YVswXSArIDUxMikgPiAxMDIzKSB8fAotICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzFdICsgNTEyKSA+IDEwMjMpIHx8Ci0gICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbMl0gKyA1MTIpID4gMTAyMykgfHwKLSAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVszXSArIDUxMikgPiAxMDIzKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0x1bWFEYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIHppZy16YWcgc2NhbiwgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kCi0gICAgICAgICAgICBpbnZlcnNlIHNjYWxpbmcgZm9yIGEgbHVtYSBEQyBjb2VmZmljaWVudHMgYmxvY2sKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgICAgICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIHByb2Nlc3NlZAotICAgICAgICAgICAgcXAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaDI2NGJzZFByb2Nlc3NMdW1hRGMoaTMyICpkYXRhLCB1MzIgcXApCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7Ci0gICAgdTMyIHJvdyxjb2w7Ci0gICAgdTMyIHFwTW9kLCBxcERpdjsKLSAgICBpMzIgbGV2U2NhbGU7Ci0gICAgaTMyICpwdHI7Ci0KLS8qIENvZGUgKi8KLQotICAgIHFwTW9kID0gcXBNb2Q2W3FwXTsKLSAgICBxcERpdiA9IHFwRGl2NltxcF07Ci0KLSAgICAvKiB6aWctemFnIHNjYW4gKi8KLSAgICB0bXAwID0gZGF0YVsyXTsKLSAgICBkYXRhWzJdICA9IGRhdGFbNV07Ci0gICAgZGF0YVs1XSA9IGRhdGFbNF07Ci0gICAgZGF0YVs0XSA9IHRtcDA7Ci0KLSAgICB0bXAwID0gZGF0YVs4XTsKLSAgICBkYXRhWzhdID0gZGF0YVszXTsKLSAgICBkYXRhWzNdICA9IGRhdGFbNl07Ci0gICAgZGF0YVs2XSAgPSBkYXRhWzddOwotICAgIGRhdGFbN10gID0gZGF0YVsxMl07Ci0gICAgZGF0YVsxMl0gPSBkYXRhWzldOwotICAgIGRhdGFbOV0gID0gdG1wMDsKLQotICAgIHRtcDAgPSBkYXRhWzEwXTsKLSAgICBkYXRhWzEwXSA9IGRhdGFbMTFdOwotICAgIGRhdGFbMTFdID0gZGF0YVsxM107Ci0gICAgZGF0YVsxM10gPSB0bXAwOwotCi0gICAgLyogaG9yaXpvbnRhbCB0cmFuc2Zvcm0gKi8KLSAgICBmb3IgKHJvdyA9IDQsIHB0ciA9IGRhdGE7IHJvdy0tOyBwdHIgKz0gNCkKLSAgICB7Ci0gICAgICAgIHRtcDAgPSBwdHJbMF0gKyBwdHJbMl07Ci0gICAgICAgIHRtcDEgPSBwdHJbMF0gLSBwdHJbMl07Ci0gICAgICAgIHRtcDIgPSBwdHJbMV0gLSBwdHJbM107Ci0gICAgICAgIHRtcDMgPSBwdHJbMV0gKyBwdHJbM107Ci0gICAgICAgIHB0clswXSA9IHRtcDAgKyB0bXAzOwotICAgICAgICBwdHJbMV0gPSB0bXAxICsgdG1wMjsKLSAgICAgICAgcHRyWzJdID0gdG1wMSAtIHRtcDI7Ci0gICAgICAgIHB0clszXSA9IHRtcDAgLSB0bXAzOwotICAgIH0KLQotICAgIC8qbGludCArZTY2MSArZTY2MiovCi0gICAgLyogdGhlbiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gYW5kIGludmVyc2Ugc2NhbGluZyAqLwotICAgIGxldlNjYWxlID0gbGV2ZWxTY2FsZVsgcXBNb2QgXVswXTsKLSAgICBpZiAocXAgPj0gMTIpCi0gICAgewotICAgICAgICBsZXZTY2FsZSA8PD0gKHFwRGl2LTIpOwotICAgICAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVs4IF07Ci0gICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbOCBdOwotICAgICAgICAgICAgdG1wMiA9IGRhdGFbNF0gLSBkYXRhWzEyXTsKLSAgICAgICAgICAgIHRtcDMgPSBkYXRhWzRdICsgZGF0YVsxMl07Ci0gICAgICAgICAgICBkYXRhWzAgXSA9ICgodG1wMCArIHRtcDMpKmxldlNjYWxlKTsKLSAgICAgICAgICAgIGRhdGFbNCBdID0gKCh0bXAxICsgdG1wMikqbGV2U2NhbGUpOwotICAgICAgICAgICAgZGF0YVs4IF0gPSAoKHRtcDEgLSB0bXAyKSpsZXZTY2FsZSk7Ci0gICAgICAgICAgICBkYXRhWzEyXSA9ICgodG1wMCAtIHRtcDMpKmxldlNjYWxlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpMzIgdG1wOwotICAgICAgICB0bXAgPSAoKDEgLSBxcERpdikgPT0gMCkgPyAxIDogMjsKLSAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOCBdOwotICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzggXTsKLSAgICAgICAgICAgIHRtcDIgPSBkYXRhWzRdIC0gZGF0YVsxMl07Ci0gICAgICAgICAgICB0bXAzID0gZGF0YVs0XSArIGRhdGFbMTJdOwotICAgICAgICAgICAgZGF0YVswIF0gPSAoKHRtcDAgKyB0bXAzKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKLSAgICAgICAgICAgIGRhdGFbNCBdID0gKCh0bXAxICsgdG1wMikqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7Ci0gICAgICAgICAgICBkYXRhWzggXSA9ICgodG1wMSAtIHRtcDIpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOwotICAgICAgICAgICAgZGF0YVsxMl0gPSAoKHRtcDAgLSB0bXAzKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQcm9jZXNzQ2hyb21hRGMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kIGludmVyc2Ugc2NhbGluZyBmb3IgYQotICAgICAgICAgICAgY2hyb21hIERDIGNvZWZmaWNpZW50cyBibG9jawotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgICAgICBxcCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlcgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgICAgICAgICAgcHJvY2Vzc2VkIGRhdGEKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKGkzMiAqZGF0YSwgdTMyIHFwKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwotICAgIHUzMiBxcERpdjsKLSAgICBpMzIgbGV2U2NhbGU7Ci0gICAgdTMyIGxldlNoaWZ0OwotCi0vKiBDb2RlICovCi0KLSAgICBxcERpdiA9IHFwRGl2NltxcF07Ci0gICAgbGV2U2NhbGUgPSBsZXZlbFNjYWxlWyBxcE1vZDZbcXBdIF1bMF07Ci0KLSAgICBpZiAocXAgPj0gNikKLSAgICB7Ci0gICAgICAgIGxldlNjYWxlIDw8PSAocXBEaXYtMSk7Ci0gICAgICAgIGxldlNoaWZ0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbGV2U2hpZnQgPSAxOwotICAgIH0KLQotICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVsyXTsKLSAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbMl07Ci0gICAgdG1wMiA9IGRhdGFbMV0gLSBkYXRhWzNdOwotICAgIHRtcDMgPSBkYXRhWzFdICsgZGF0YVszXTsKLSAgICBkYXRhWzBdID0gKCh0bXAwICsgdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgZGF0YVsxXSA9ICgodG1wMCAtIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIGRhdGFbMl0gPSAoKHRtcDEgKyB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICBkYXRhWzNdID0gKCh0bXAxIC0gdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgdG1wMCA9IGRhdGFbNF0gKyBkYXRhWzZdOwotICAgIHRtcDEgPSBkYXRhWzRdIC0gZGF0YVs2XTsKLSAgICB0bXAyID0gZGF0YVs1XSAtIGRhdGFbN107Ci0gICAgdG1wMyA9IGRhdGFbNV0gKyBkYXRhWzddOwotICAgIGRhdGFbNF0gPSAoKHRtcDAgKyB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICBkYXRhWzVdID0gKCh0bXAwIC0gdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgZGF0YVs2XSA9ICgodG1wMSArIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIGRhdGFbN10gPSAoKHRtcDEgLSB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLQotfQotCi0vKmxpbnQgK2U3MDEgK2U3MDIgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNDFhMjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19UUkFOU0ZPUk1fSAotI2RlZmluZSBIMjY0U1dERUNfVFJBTlNGT1JNX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RQcm9jZXNzQmxvY2soaTMyICpkYXRhLCB1MzIgcXAsIHUzMiBza2lwLCB1MzIgY29lZmZNYXApOwotdm9pZCBoMjY0YnNkUHJvY2Vzc0x1bWFEYyhpMzIgKmRhdGEsIHUzMiBxcCk7Ci12b2lkIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMoaTMyICpkYXRhLCB1MzIgcXApOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19UUkFOU0ZPUk1fSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5N2EyOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKLSAgICAgICAgICBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cwotICAgICAgICAgIGgyNjRic2RNb3JlUmJzcERhdGEKLSAgICAgICAgICBoMjY0YnNkTmV4dE1iQWRkcmVzcwotICAgICAgICAgIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGxvb2stdXAgdGFibGUgZm9yIGV4cGVjdGVkIHZhbHVlcyBvZiBzdHVmZmluZyBiaXRzICovCi1zdGF0aWMgY29uc3QgdTMyIHN0dWZmaW5nVGFibGVbOF0gPSB7MHgxLDB4MiwweDQsMHg4LDB4MTAsMHgyMCwweDQwLDB4ODB9OwotCi0vKiBsb29rLXVwIHRhYmxlIGZvciBjaHJvbWEgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhcyBhIGZ1bmN0aW9uIG9mIGx1bWEgUVAgKi8KLWNvbnN0IHUzMiBoMjY0YnNkUXBDWzUyXSA9IHswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LAotICAgIDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDI5LDMwLDMxLDMyLDMyLDMzLDM0LDM0LDM1LDM1LDM2LDM2LDM3LDM3LDM3LAotICAgIDM4LDM4LDM4LDM5LDM5LDM5LDM5fTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjEgIEZ1bmN0aW9uOiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ291bnQgbGVhZGluZyB6ZXJvcyBpbiBhIGNvZGUgd29yZC4gQ29kZSB3b3JkIGlzIGFzc3VtZWQgdG8gYmUKLSAgICAgICAgICAgIHJpZ2h0LWFsaWduZWQsIGxhc3QgYml0IG9mIHRoZSBjb2RlIHdvcmQgaW4gdGhlIGxzYiBvZiB0aGUgdmFsdWUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgdmFsdWUgICBjb2RlIHdvcmQKLSAgICAgICAgICAgIGxlbmd0aCAgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvZGUgd29yZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG51bWJlciBvZiBsZWFkaW5nIHplcm9zIGluIHRoZSBjb2RlIHdvcmQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19ORU9OCi11MzIgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKHUzMiB2YWx1ZSwgdTMyIGxlbmd0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgemVyb3MgPSAwOwotICAgIHUzMiBtYXNrID0gMSA8PCAobGVuZ3RoIC0gMSk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChsZW5ndGggPD0gMzIpOwotCi0gICAgd2hpbGUgKG1hc2sgJiYgISh2YWx1ZSAmIG1hc2spKQotICAgIHsKLSAgICAgICAgemVyb3MrKzsKLSAgICAgICAgbWFzayA+Pj0gMTsKLSAgICB9Ci0gICAgcmV0dXJuKHplcm9zKTsKLQotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjIgIEZ1bmN0aW9uOiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBSYXcgQnl0ZSBTdHJlYW0gUGF5bG9hZCAoUkJTUCkgdHJhaWxpbmcgYml0cywgaS5lLiBzdHVmZmluZy4KLSAgICAgICAgICAgIFJlc3Qgb2YgdGhlIGN1cnJlbnQgYnl0ZSAod2hvbGUgYnl0ZSBpZiBhbGxyZWFkeSBieXRlIGFsaWduZWQpCi0gICAgICAgICAgICBpbiB0aGUgc3RyZWFtIGJ1ZmZlciBzaGFsbCBjb250YWluIGEgJzEnIGJpdCBmb2xsb3dlZCBieSB6ZXJvIG9yCi0gICAgICAgICAgICBtb3JlICcwJyBiaXRzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgUkJTUCB0cmFpbGluZyBiaXRzIGZvdW5kCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBvdGhlcndpc2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgc3R1ZmZpbmc7Ci0gICAgdTMyIHN0dWZmaW5nTGVuZ3RoOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPCA4KTsKLQotICAgIHN0dWZmaW5nTGVuZ3RoID0gOCAtIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkOwotCi0gICAgc3R1ZmZpbmcgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHN0dWZmaW5nTGVuZ3RoKTsKLSAgICBpZiAoc3R1ZmZpbmcgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgaWYgKHN0dWZmaW5nICE9IHN0dWZmaW5nVGFibGVbc3R1ZmZpbmdMZW5ndGggLSAxXSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4zICBGdW5jdGlvbjogaDI2NGJzZE1vcmVSYnNwRGF0YQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgaW4gdGhlIGN1cnJlbnQgUkJTUC4gVGhlIHN0YW5kYXJkCi0gICAgICAgICAgICBkZWZpbmVzIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB0aGVyZSBpcyBtb3JlIGRhdGEgaWYKLSAgICAgICAgICAgICAgICAtbW9yZSB0aGFuIDggYml0cyBsZWZ0IG9yCi0gICAgICAgICAgICAgICAgLWxhc3QgYml0cyBhcmUgbm90IFJCU1AgdHJhaWxpbmcgYml0cwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX1RSVUUgICAgdGhlcmUgaXMgbW9yZSBkYXRhCi0gICAgICAgICAgICBIQU5UUk9fRkFMU0UgICBubyBtb3JlIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RNb3JlUmJzcERhdGEoc3RybURhdGFfdCAqcFN0cm1EYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBiaXRzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzIDw9IDggKiBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSk7Ci0KLSAgICBiaXRzID0gcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUgKiA4IC0gcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzOwotCi0gICAgaWYgKGJpdHMgPT0gMCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLSAgICBpZiAoIChiaXRzID4gOCkgfHwKLSAgICAgICAgICgoaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKT4+KDMyLWJpdHMpKSAhPSAoMXVsIDw8IChiaXRzLTEpKSkgKQotICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS40ICBGdW5jdGlvbjogaDI2NGJzZE5leHRNYkFkZHJlc3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGFkZHJlc3Mgb2YgdGhlIG5leHQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBzbGljZSBncm91cC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU2xpY2VHcm91cE1hcCAgICAgIHNsaWNlIGdyb3VwIGZvciBlYWNoIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICAgICAgc2l6ZSBvZiB0aGUgcGljdHVyZQotICAgICAgICAgICAgY3Vyck1iQWRkciAgICAgICAgICB3aGVyZSB0byBzdGFydAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIG5leHQgbWFjcm9ibG9jawotICAgICAgICAgICAgMCAgIGlmIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBtYWNyb2Jsb2NrcyBiZWxvbmcgdG8gc2FtZSBzbGljZQotICAgICAgICAgICAgICAgIGdyb3VwIGFzIGN1cnJNYkFkZHIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2ROZXh0TWJBZGRyZXNzKHUzMiAqcFNsaWNlR3JvdXBNYXAsIHUzMiBwaWNTaXplSW5NYnMsIHUzMiBjdXJyTWJBZGRyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBzbGljZUdyb3VwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFNsaWNlR3JvdXBNYXApOwotICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOwotICAgIEFTU0VSVChjdXJyTWJBZGRyIDwgcGljU2l6ZUluTWJzKTsKLQotICAgIHNsaWNlR3JvdXAgPSBwU2xpY2VHcm91cE1hcFtjdXJyTWJBZGRyXTsKLQotICAgIGkgPSBjdXJyTWJBZGRyICsgMTsKLSAgICB3aGlsZSAoKGkgPCBwaWNTaXplSW5NYnMpICYmIChwU2xpY2VHcm91cE1hcFtpXSAhPSBzbGljZUdyb3VwKSkKLSAgICB7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0KLSAgICBpZiAoaSA9PSBwaWNTaXplSW5NYnMpCi0gICAgICAgIGkgPSAwOwotCi0gICAgcmV0dXJuKGkpOwotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS41ICBGdW5jdGlvbjogaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU2V0IGx1bWEgYW5kIGNocm9tYSBwb2ludGVycyBpbiBpbWFnZV90IGZvciBjdXJyZW50IE1CCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgaW1hZ2UgICAgICAgQ3VycmVudCBpbWFnZQotICAgICAgICAgICAgbWJOdW0gICAgICAgbnVtYmVyIG9mIGN1cnJlbnQgTUIKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtKQotewotICAgIHUzMiB3aWR0aCwgaGVpZ2h0OwotICAgIHUzMiBwaWNTaXplOwotICAgIHUzMiByb3csIGNvbDsKLSAgICB1MzIgdG1wOwotCi0gICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodDsKLSAgICByb3cgPSBtYk51bSAvIHdpZHRoOwotICAgIGNvbCA9IG1iTnVtICUgd2lkdGg7Ci0KLSAgICB0bXAgPSByb3cgKiB3aWR0aDsKLSAgICBwaWNTaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0KLSAgICBpbWFnZS0+bHVtYSA9ICh1OCopKGltYWdlLT5kYXRhICsgY29sICogMTYgKyB0bXAgKiAyNTYpOwotICAgIGltYWdlLT5jYiA9ICh1OCopKGltYWdlLT5kYXRhICsgcGljU2l6ZSAqIDI1NiArIHRtcCAqIDY0ICsgY29sICogOCk7Ci0gICAgaW1hZ2UtPmNyID0gKHU4KikoaW1hZ2UtPmNiICsgcGljU2l6ZSAqIDY0KTsKLX0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzY2Y4Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfVVRJTF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19VVElMX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBfQVNTRVJUX1VTRUQKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCi0KLSNpZiBkZWZpbmVkKF9SQU5HRV9DSEVDSykgfHwgZGVmaW5lZChfREVCVUdfUFJJTlQpIHx8IGRlZmluZWQoX0VSUk9SX1BSSU5UKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgSEFOVFJPX09LICAgMAotI2RlZmluZSBIQU5UUk9fTk9LICAxCi0KLSNkZWZpbmUgSEFOVFJPX1RSVUUgICAgICgxKQotI2RlZmluZSBIQU5UUk9fRkFMU0UgICAgKDApCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0jZGVmaW5lIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SIDB4RkZGRgotI2RlZmluZSBQQVJBTV9TRVRfRVJST1IgMHhGRkYwCi0KLS8qIHZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IEdldEJpdHMgaWYgc3RyZWFtIGJ1ZmZlciBpcyBlbXB0eSAqLwotI2RlZmluZSBFTkRfT0ZfU1RSRUFNIDB4RkZGRkZGRkZVCi0KLSNkZWZpbmUgRU1QVFlfUkVTSURVQUxfSU5ESUNBVE9SIDB4RkZGRkZGCi0KLS8qIG1hY3JvIHRvIG1hcmsgYSByZXNpZHVhbCBibG9jayBlbXB0eSwgaS5lLiBjb250YWluIHplcm8gY29lZmZpY2llbnRzICovCi0jZGVmaW5lIE1BUktfUkVTSURVQUxfRU1QVFkocmVzaWR1YWwpICgocmVzaWR1YWwpWzBdID0gRU1QVFlfUkVTSURVQUxfSU5ESUNBVE9SKQotLyogbWFjcm8gdG8gY2hlY2sgaWYgcmVzaWR1YWwgYmxvY2sgaXMgZW1wdHkgKi8KLSNkZWZpbmUgSVNfUkVTSURVQUxfRU1QVFkocmVzaWR1YWwpICgocmVzaWR1YWwpWzBdID09IEVNUFRZX1JFU0lEVUFMX0lORElDQVRPUikKLQotLyogbWFjcm8gZm9yIGFzc2VydGlvbiwgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX0FTU0VSVF9VU0VEIGlzIGRlZmluZWQgKi8KLSNpZmRlZiBfQVNTRVJUX1VTRUQKLSNkZWZpbmUgQVNTRVJUKGV4cHIpIGFzc2VydChleHByKQotI2Vsc2UKLSNkZWZpbmUgQVNTRVJUKGV4cHIpCi0jZW5kaWYKLQotLyogbWFjcm8gZm9yIHJhbmdlIGNoZWNraW5nIGFuIHZhbHVlLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfUkFOR0VfQ0hFQ0sKLSAqIGlzIGRlZmluZWQgKi8KLSNpZmRlZiBfUkFOR0VfQ0hFQ0sKLSNkZWZpbmUgUkFOR0VfQ0hFQ0sodmFsdWUsIG1pbkJvdW5kLCBtYXhCb3VuZCkgXAoteyBcCi0gICAgaWYgKCh2YWx1ZSkgPCAobWluQm91bmQpIHx8ICh2YWx1ZSkgPiAobWF4Qm91bmQpKSBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogVmFsdWUgZXhjZWVkcyBnaXZlbiBsaW1pdChzKSFcbiIpOyBcCi19Ci0jZWxzZQotI2RlZmluZSBSQU5HRV9DSEVDSyh2YWx1ZSwgbWluQm91bmQsIG1heEJvdW5kKQotI2VuZGlmCi0KLS8qIG1hY3JvIGZvciByYW5nZSBjaGVja2luZyBhbiBhcnJheSwgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX1JBTkdFX0NIRUNLCi0gKiBpcyBkZWZpbmVkICovCi0jaWZkZWYgX1JBTkdFX0NIRUNLCi0jZGVmaW5lIFJBTkdFX0NIRUNLX0FSUkFZKGFycmF5LCBtaW5Cb3VuZCwgbWF4Qm91bmQsIGxlbmd0aCkgXAoteyBcCi0gICAgaTMyIGk7IFwKLSAgICBmb3IgKGkgPSAwOyBpIDwgKGxlbmd0aCk7IGkrKykgXAotICAgICAgICBpZiAoKGFycmF5KVtpXSA8IChtaW5Cb3VuZCkgfHwgKGFycmF5KVtpXSA+IChtYXhCb3VuZCkpIFwKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiBWYWx1ZSBbJWRdIGV4Y2VlZHMgZ2l2ZW4gbGltaXQocykhXG4iLGkpOyBcCi19Ci0jZWxzZQotI2RlZmluZSBSQU5HRV9DSEVDS19BUlJBWShhcnJheSwgbWluQm91bmQsIG1heEJvdW5kLCBsZW5ndGgpCi0jZW5kaWYKLQotLyogbWFjcm8gZm9yIGRlYnVnIHByaW50aW5nLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfREVCVUdfUFJJTlQgaXMKLSAqIGRlZmluZWQgKi8KLSNpZmRlZiBfREVCVUdfUFJJTlQKLSNkZWZpbmUgREVCVUcoYXJncykgcHJpbnRmIGFyZ3MKLSNlbHNlCi0jZGVmaW5lIERFQlVHKGFyZ3MpCi0jZW5kaWYKLQotLyogbWFjcm8gZm9yIGVycm9yIHByaW50aW5nLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfRVJST1JfUFJJTlQgaXMKLSAqIGRlZmluZWQgKi8KLSNpZmRlZiBfRVJST1JfUFJJTlQKLSNkZWZpbmUgRVBSSU5UKG1zZykgZnByaW50ZihzdGRlcnIsIkVSUk9SOiAlc1xuIixtc2cpCi0jZWxzZQotI2RlZmluZSBFUFJJTlQobXNnKQotI2VuZGlmCi0KLS8qIG1hY3JvIHRvIGdldCBzbWFsbGVyIG9mIHR3byB2YWx1ZXMgKi8KLSNkZWZpbmUgTUlOKGEsIGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKLQotLyogbWFjcm8gdG8gZ2V0IGdyZWF0ZXIgb2YgdHdvIHZhbHVlcyAqLwotI2RlZmluZSBNQVgoYSwgYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQotCi0vKiBtYWNybyB0byBnZXQgYWJzb2x1dGUgdmFsdWUgKi8KLSNkZWZpbmUgQUJTKGEpICgoKGEpIDwgMCkgPyAtKGEpIDogKGEpKQotCi0vKiBtYWNybyB0byBjbGlwIGEgdmFsdWUgeiwgc28gdGhhdCB4IDw9IHogPTwgeSAqLwotI2RlZmluZSBDTElQMyh4LHkseikgKCgoeikgPCAoeCkpID8gKHgpIDogKCgoeikgPiAoeSkpID8gKHkpIDogKHopKSkKLQotLyogbWFjcm8gdG8gY2xpcCBhIHZhbHVlIHosIHNvIHRoYXQgMCA8PSB6ID08IDI1NSAqLwotI2RlZmluZSBDTElQMSh6KSAoKCh6KSA8IDApID8gMCA6ICgoKHopID4gMjU1KSA/IDI1NSA6ICh6KSkpCi0KLS8qIG1hY3JvIHRvIGFsbG9jYXRlIG1lbW9yeSAqLwotI2RlZmluZSBBTExPQ0FURShwdHIsIGNvdW50LCB0eXBlKSBcCi17IFwKLSAgICAocHRyKSA9IEgyNjRTd0RlY01hbGxvYyhzaXplb2YodHlwZSksIChjb3VudCkpOyBcCi19Ci0KLS8qIG1hY3JvIHRvIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLwotI2RlZmluZSBGUkVFKHB0cikgXAoteyBcCi0gICAgSDI2NFN3RGVjRnJlZSgocHRyKSk7IChwdHIpID0gTlVMTDsgXAotfQotCi0jZGVmaW5lIEFMSUdOKHB0ciwgYnl0ZVBvcykgXAotICAgICAgICAoKHB0cikgKyAoICgoKGJ5dGVQb3MpIC0gKHVpbnRwdHJfdCkocHRyKSkgJiAoKGJ5dGVQb3MpIC0gMSkpIC8gc2l6ZW9mKCoocHRyKSkgKSkKLQotZXh0ZXJuIGNvbnN0IHUzMiBoMjY0YnNkUXBDWzUyXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfTkVPTgotdTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUsIHUzMiBsZW5ndGgpOwotI2Vsc2UKLXUzMiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3ModTMyIHZhbHVlKTsKLSNlbmRpZgotdTMyIGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHN0cm1EYXRhX3QgKnN0cm1EYXRhKTsKLQotdTMyIGgyNjRic2RNb3JlUmJzcERhdGEoc3RybURhdGFfdCAqc3RybURhdGEpOwotCi11MzIgaDI2NGJzZE5leHRNYkFkZHJlc3ModTMyICpwU2xpY2VHcm91cE1hcCwgdTMyIHBpY1NpemVJbk1icywgdTMyIGN1cnJNYkFkZHIpOwotCi12b2lkIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0pOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19VVElMX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBmMzVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkCi0gICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZAotICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGRlZmluaXRpb24gb2Ygc3BlY2lhbCBjb2RlIG51bSwgdGhpcyBhbG9uZyB3aXRoIHRoZSByZXR1cm4gdmFsdWUgaXMgdXNlZAotICogdG8gaGFuZGxlIGNvZGUgbnVtIGluIHRoZSByYW5nZSBbMCwgMl4zMl0gaW4gdGhlIERlY29kZUV4cEdvbG9tYlVuc2lnbmVkCi0gKiBmdW5jdGlvbiAqLwotI2RlZmluZSBCSUdfQ09ERV9OVU0gMHhGRkZGRkZGRlUKLQotLyogTWFwcGluZyB0YWJsZXMgZm9yIGNvZGVkX2Jsb2NrX3BhdHRlcm4sIHVzZWQgZm9yIGRlY29kaW5nIG9mIG1hcHBlZAotICogRXhwLUdvbG9tYiBjb2RlcyAqLwotc3RhdGljIGNvbnN0IHU4IGNvZGVkQmxvY2tQYXR0ZXJuSW50cmE0eDRbNDhdID0gewotICAgIDQ3LDMxLDE1LDAsMjMsMjcsMjksMzAsNywxMSwxMywxNCwzOSw0Myw0NSw0NiwxNiwzLDUsMTAsMTIsMTksMjEsMjYsMjgsMzUsCi0gICAgMzcsNDIsNDQsMSwyLDQsOCwxNywxOCwyMCwyNCw2LDksMjIsMjUsMzIsMzMsMzQsMzYsNDAsMzgsNDF9OwotCi1zdGF0aWMgY29uc3QgdTggY29kZWRCbG9ja1BhdHRlcm5JbnRlcls0OF0gPSB7Ci0gICAgMCwxNiwxLDIsNCw4LDMyLDMsNSwxMCwxMiwxNSw0Nyw3LDExLDEzLDE0LDYsOSwzMSwzNSwzNyw0Miw0NCwzMywzNCwzNiw0MCwKLSAgICAzOSw0Myw0NSw0NiwxNywxOCwyMCwyNCwxOSwyMSwyNiwyOCwyMywyNywyOSwzMCwyMiwyNSwzOCw0MX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4xICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSB1bnNpZ25lZCBFeHAtR29sb21iIGNvZGUuIFRoaXMgaXMgdGhlIHNhbWUgYXMgY29kZU51bSB1c2VkCi0gICAgICAgICAgICBpbiBvdGhlciBFeHAtR29sb21iIGNvZGUgbWFwcGluZ3MuIENvZGUgbnVtIChpLmUuIHRoZSBkZWNvZGVkCi0gICAgICAgICAgICBzeW1ib2wpIGlzIGRldGVybWluZWQgYXMKLQotICAgICAgICAgICAgICAgIGNvZGVOdW0gPSAyXmxlYWRpbmdaZXJvcyAtIDEgKyBHZXRCaXRzKGxlYWRpbmdaZXJvcykKLQotICAgICAgICAgICAgTm9ybWFsIGRlY29kZWQgc3ltYm9scyBhcmUgaW4gdGhlIHJhbmdlIFswLCAyXjMyIC0gMl0uIFN5bWJvbAotICAgICAgICAgICAgMl4zMi0xIGlzIGluZGljYXRlZCBieSBCSUdfQ09ERV9OVU0gd2l0aCByZXR1cm4gdmFsdWUgSEFOVFJPX09LCi0gICAgICAgICAgICB3aGlsZSBzeW1ib2wgMl4zMiAgaXMgaW5kaWNhdGVkIGJ5IEJJR19DT0RFX05VTSB3aXRoIHJldHVybiB2YWx1ZQotICAgICAgICAgICAgSEFOVFJPX05PSy4gIFRoZXNlIHR3byBzeW1ib2xzIGFyZSBzcGVjaWFsIGNhc2VzIHdpdGggY29kZSBsZW5ndGgKLSAgICAgICAgICAgIG9mIDY1LCBpLmUuICAzMiAnMCcgYml0cywgYSAnMScgYml0LCBhbmQgZWl0aGVyIDAgb3IgMSByZXByZXNlbnRlZAotICAgICAgICAgICAgYnkgMzIgYml0cy4KLQotICAgICAgICAgICAgU3ltYm9sIDJeMzIgaXMgb3V0IG9mIHVuc2lnbmVkIDMyLWJpdCByYW5nZSBidXQgaXMgbmVlZGVkIGZvcgotICAgICAgICAgICAgRGVjb2RlRXhwR29sb21iU2lnbmVkIHRvIGV4cHJlc3MgdmFsdWUgLTJeMzEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGNvZGVOdW0gICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZCwgbm90ZSBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEJJR19DT0RFX05VTQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICpjb2RlTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBiaXRzLCBudW1aZXJvczsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKGNvZGVOdW0pOwotCi0gICAgYml0cyA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0KLSAgICAvKiBmaXJzdCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCAxICovCi0gICAgaWYgKGJpdHMgPj0gMHg4MDAwMDAwMCkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgKmNvZGVOdW0gPSAwOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgLyogc2Vjb25kIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDMgKi8KLSAgICBlbHNlIGlmIChiaXRzID49IDB4NDAwMDAwMDApCi0gICAgewotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICpjb2RlTnVtID0gMSArICgoYml0cyA+PiAyOSkgJiAweDEpOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgLyogdGhpcmQgYml0IGlzIDEgLT4gY29kZSBsZW5ndGggNSAqLwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyMDAwMDAwMCkKLSAgICB7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgNSkgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgKmNvZGVOdW0gPSAzICsgKChiaXRzID4+IDI3KSAmIDB4Myk7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICAvKiBmb3VydGggYml0IGlzIDEgLT4gY29kZSBsZW5ndGggNyAqLwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgxMDAwMDAwMCkKLSAgICB7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgNykgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgKmNvZGVOdW0gPSA3ICsgKChiaXRzID4+IDI1KSAmIDB4Nyk7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICAvKiBvdGhlciBjb2RlIGxlbmd0aHMgKi8KLSAgICBlbHNlCi0gICAgewotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgbnVtWmVyb3MgPSA0ICsgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKGJpdHMsIDI4KTsKLSNlbHNlCi0gICAgICAgIG51bVplcm9zID0gaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKGJpdHMpOwotI2VuZGlmCi0gICAgICAgIC8qIGFsbCAzMiBiaXRzIGFyZSB6ZXJvICovCi0gICAgICAgIGlmIChudW1aZXJvcyA9PSAzMikKLSAgICAgICAgewotICAgICAgICAgICAgKmNvZGVOdW0gPSAwOwotICAgICAgICAgICAgaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzIpOwotICAgICAgICAgICAgYml0cyA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAvKiBjaGVjayAzM3JkIGJpdCwgbXVzdCBiZSAxICovCi0gICAgICAgICAgICBpZiAoYml0cyA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNhbm5vdCB1c2UgaDI2NGJzZEdldEJpdHMsIGxpbWl0ZWQgdG8gMzEgYml0cyAqLwotICAgICAgICAgICAgICAgIGJpdHMgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzIpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAvKiBjb2RlIG51bSAyXjMyIC0gMSwgbmVlZGVkIGZvciB1bnNpZ25lZCBtYXBwaW5nICovCi0gICAgICAgICAgICAgICAgaWYgKGJpdHMgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpjb2RlTnVtID0gQklHX0NPREVfTlVNOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogY29kZSBudW0gMl4zMiwgbmVlZGVkIGZvciB1bnNpZ25lZCBtYXBwaW5nCi0gICAgICAgICAgICAgICAgICogKHJlc3VsdHMgaW4gLTJeMzEpICovCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKmNvZGVOdW0gPSBCSUdfQ09ERV9OVU07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBpZiBtb3JlIHplcm9zIHRoYW4gMzIsIGl0IGlzIGFuIGVycm9yICovCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsbnVtWmVyb3MrMSk7Ci0KLSAgICAgICAgYml0cyA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgbnVtWmVyb3MpOwotICAgICAgICBpZiAoYml0cyA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgICpjb2RlTnVtID0gKDEgPDwgbnVtWmVyb3MpIC0gMSArIGJpdHM7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjIgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBzaWduZWQgRXhwLUdvbG9tYiBjb2RlLiBDb2RlIG51bSBpcyBkZXRlcm1pbmVkIGJ5Ci0gICAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQgYW5kIHRoZW4gbWFwcGVkIHRvIHNpZ25lZAotICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gYXMKLQotICAgICAgICAgICAgICAgIHN5bWJvbCA9ICgtMSleKGNvZGVOdW0rMSkgKiAoY29kZU51bSsxKS8yCi0KLSAgICAgICAgICAgIFNpZ25lZCBzeW1ib2xzIHNoYWxsIGJlIGluIHRoZSByYW5nZSBbLTJeMzEsIDJeMzEgLSAxXS4gU3ltYm9sCi0gICAgICAgICAgICAtMl4zMSBpcyBvYnRhaW5lZCB3aGVuIGNvZGVOdW0gaXMgMl4zMiwgd2hpY2ggY2Fubm90IGJlIGV4cHJlc3NlZAotICAgICAgICAgICAgYnkgdW5zaWduZWQgMzItYml0IHZhbHVlLiBUaGlzIGlzIHNpZ25hbGVkIGFzIGEgc3BlY2lhbCBjYXNlIGZyb20KLSAgICAgICAgICAgIHRoZSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQgYnkgc2V0dGluZyBjb2RlTnVtIHRvCi0gICAgICAgICAgICBCSUdfQ09ERV9OVU0gYW5kIHJldHVybmluZyBIQU5UUk9fTk9LIHN0YXR1cy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgaTMyICp2YWx1ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgc3RhdHVzLCBjb2RlTnVtID0gMDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHZhbHVlKTsKLQotICAgIHN0YXR1cyA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZjb2RlTnVtKTsKLQotICAgIGlmIChjb2RlTnVtID09IEJJR19DT0RFX05VTSkKLSAgICB7Ci0gICAgICAgIC8qIEJJR19DT0RFX05VTSBhbmQgSEFOVFJPX09LIHN0YXR1cyBtZWFucyBjb2RlTnVtIDJeMzItMSB3aGljaCB3b3VsZAotICAgICAgICAgKiByZXN1bHQgaW4gc2lnbmVkIGludGVnZXIgdmFsdWVkIDJeMzEgKGkuZS4gb3V0IG9mIDMyLWJpdCBzaWduZWQKLSAgICAgICAgICogaW50ZWdlciByYW5nZSkgKi8KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIC8qIEJJR19DT0RFX05VTSBhbmQgSEFOVFJPX05PSyBzdGF0dXMgbWVhbnMgY29kZU51bSAyXjMyIHdoaWNoIHJlc3VsdHMKLSAgICAgICAgICogaW4gc2lnbmVkIGludGVnZXIgdmFsdWVkIC0yXjMxICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnZhbHVlID0gKGkzMikoMjE0NzQ4MzY0OFUpOwotICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fT0spOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBIQU5UUk9fT0spCi0gICAgewotICAgICAgICAvKiAoLTEpXihjb2RlTnVtKzEpIHJlc3VsdHMgaW4gcG9zaXRpdmUgc2lnbiBpZiBjb2RlTnVtIGlzIG9kZCwKLSAgICAgICAgICogbmVnYXRpdmUgd2hlbiBpdCBpcyBldmVuLiAoY29kZU51bSsxKS8yIGlzIG9idGFpbmVkIGFzCi0gICAgICAgICAqIChjb2RlTnVtKzEpPj4xIHdoZW4gdmFsdWUgaXMgcG9zaXRpdmUgYW5kIGFzICgtY29kZU51bSk+PjEgZm9yCi0gICAgICAgICAqIG5lZ2F0aXZlIHZhbHVlICovCi0gICAgICAgIC8qbGludCAtZTcwMiAqLwotICAgICAgICAqdmFsdWUgPSAoY29kZU51bSAmIDB4MSkgPyAoaTMyKSgoY29kZU51bSArIDEpID4+IDEpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKGkzMikoKGNvZGVOdW0gKyAxKSA+PiAxKTsKLSAgICAgICAgLypsaW50ICtlNzAyICovCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjMgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBtYXBwZWQgRXhwLUdvbG9tYiBjb2RlLiBDb2RlIG51bSBpcyBkZXRlcm1pbmVkIGJ5Ci0gICAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQgYW5kIHRoZW4gbWFwcGVkIHRvIGNvZGVkQmxvY2tQYXR0ZXJuCi0gICAgICAgICAgICBlaXRoZXIgZm9yIGludHJhIG9yIGludGVyIG1hY3JvYmxvY2suIFRoZSBtYXBwaW5nIGlzIGltcGxlbWVudGVkIGJ5Ci0gICAgICAgICAgICBsb29rLXVwIHRhYmxlcyBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBpc0ludHJhICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiBpbnRyYSBvciBpbnRlciBtYXBwaW5nIGlzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnZhbHVlLAotICAgIHUzMiBpc0ludHJhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBzdGF0dXMsIGNvZGVOdW07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVCh2YWx1ZSk7Ci0KLSAgICBzdGF0dXMgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29kZU51bSk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiByYW5nZSBvZiB2YWxpZCBjb2RlTnVtcyBbMCw0N10gKi8KLSAgICAgICAgaWYgKGNvZGVOdW0gPiA0NykKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgICAgIGlmIChpc0ludHJhKQotICAgICAgICAgICAgKnZhbHVlID0gY29kZWRCbG9ja1BhdHRlcm5JbnRyYTR4NFtjb2RlTnVtXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKnZhbHVlID0gY29kZWRCbG9ja1BhdHRlcm5JbnRlcltjb2RlTnVtXTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuNCAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHRydW5jYXRlZCBFeHAtR29sb21iIGNvZGUuIGdyZWF0ZXJUaGFuT25lIGZsYWcgaW5kaWNhdGVzCi0gICAgICAgICAgICB0aGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbCB0byBiZSBkZWNvZGVkIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICAgICAgRkFMU0UgICAtPiAgWzAsMV0KLSAgICAgICAgICAgICAgICBUUlVFICAgIC0+ICBbMCwyXjMyLTFdCi0KLSAgICAgICAgICAgIElmIGZsYWcgaXMgZmFsc2UgdGhlIGRlY29kaW5nIGlzIHBlcmZvcm1lZCBieSByZWFkaW5nIG9uZSBiaXQKLSAgICAgICAgICAgIGZyb20gdGhlIHN0cmVhbSB3aXRoIGgyNjRic2RHZXRCaXRzIGFuZCBtYXBwaW5nIHRoaXMgdG8gZGVjb2RlZAotICAgICAgICAgICAgc3ltYm9sIGFzCi0gICAgICAgICAgICAgICAgc3ltYm9sID0gYml0ID8gMCA6IDEKLQotICAgICAgICAgICAgT3RoZXJ3aXNlLCBpLmUuIHdoZW4gZmxhZyBpcyBUUlVFLCBjb2RlIG51bSBpcyBkZXRlcm1pbmVkIGJ5Ci0gICAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQgYW5kIHRoaXMgaXMgdXNlZCBhcyB0aGUgZGVjb2RlZAotICAgICAgICAgICAgc3ltYm9sLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgZ3JlYXRlclRoYW5PbmUgIGZsYWcgdG8gaW5kaWNhdGUgaWYgcmFuZ2UgaXMgd2lkZXIgdGhhbiBbMCwxXQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgdTMyICp2YWx1ZSwKLSAgdTMyIGdyZWF0ZXJUaGFuT25lKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHZhbHVlKTsKLQotICAgIGlmIChncmVhdGVyVGhhbk9uZSkKLSAgICB7Ci0gICAgICAgIHJldHVybihoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCB2YWx1ZSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqdmFsdWUgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsMSk7Ci0gICAgICAgIGlmICgqdmFsdWUgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgICAgICp2YWx1ZSBePSAweDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIChIQU5UUk9fT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxNjc3My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1ZMQ19ICi0jZGVmaW5lIEgyNjRTV0RFQ19WTENfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3RyYW5zZm9ybS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSk7Ci0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgaTMyICp2YWx1ZSk7Ci0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKLSAgICB1MzIgaXNJbnRyYSk7Ci0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKLSAgICB1MzIgZ3JlYXRlclRoYW5PbmUpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19WTENfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOTMzNWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycwotICAgICAgICAgIERlY29kZUhyZFBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3Z1aS5oIgotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE1BWF9EUEJfU0laRSAxNgotI2RlZmluZSBNQVhfQlIgICAgICAgMjQwMDAwIC8qIGZvciBsZXZlbCA1LjEgKi8KLSNkZWZpbmUgTUFYX0NQQiAgICAgIDI0MDAwMCAvKiBmb3IgbGV2ZWwgNS4xICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVIcmRQYXJhbWV0ZXJzKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIGhyZFBhcmFtZXRlcnNfdCAqcEhyZFBhcmFtZXRlcnMpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBWVUkgcGFyYW1ldGVycyBmcm9tIHRoZSBzdHJlYW0uIFNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMgIGRlY29kZWQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhIG9yIGVuZCBvZiBzdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICB2dWlQYXJhbWV0ZXJzX3QgKnBWdWlQYXJhbWV0ZXJzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwVnVpUGFyYW1ldGVycyk7Ci0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFZ1aVBhcmFtZXRlcnMsIDAsIHNpemVvZih2dWlQYXJhbWV0ZXJzX3QpKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb0lkYyA9IHRtcDsKLQotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjID09IEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5zYXJXaWR0aCA9IHRtcDsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnNhckhlaWdodCA9IHRtcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPm92ZXJzY2FuSW5mb1ByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5vdmVyc2NhbkluZm9QcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm92ZXJzY2FuQXBwcm9wcmlhdGVGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMyk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvRm9ybWF0ID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvRnVsbFJhbmdlRmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnID0KLSAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91clByaW1hcmllcyA9IHRtcDsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+dHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSB0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1hdHJpeENvZWZmaWNpZW50cyA9IHRtcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJQcmltYXJpZXMgICAgICAgICA9IDI7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+dHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSAyOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1hdHJpeENvZWZmaWNpZW50cyAgICAgID0gMjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9Gb3JtYXQgICAgICAgICAgICAgPSA1OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyUHJpbWFyaWVzICAgICAgICAgPSAyOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSAyOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzICAgICAgPSAyOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPmNocm9tYUxvY0luZm9QcmVzZW50RmxhZyA9Ci0gICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y2hyb21hTG9jSW5mb1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZVRvcEZpZWxkID4gNSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlQm90dG9tRmllbGQgPiA1KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPnRpbWluZ0luZm9QcmVzZW50RmxhZyA9Ci0gICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+dGltaW5nSW5mb1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzMikgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgaWYgKHRtcCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bnVtVW5pdHNJblRpY2sgPSB0bXA7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzMikgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgaWYgKHRtcCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dGltZVNjYWxlID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmZpeGVkRnJhbWVSYXRlRmxhZyA9Ci0gICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnID0KLSAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBEZWNvZGVIcmRQYXJhbWV0ZXJzKHBTdHJtRGF0YSwgJnBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuY3BiQ250ICAgICAgICAgID0gMTsKLSAgICAgICAgLyogTWF4QlIgYW5kIE1heENQQiBzaG91bGQgYmUgdGhlIHZhbHVlcyBjb3JyZXNwb25kaWcgdG8gdGhlIGxldmVsSWRjCi0gICAgICAgICAqIGluIHRoZSBTUFMgY29udGFpbmluZyB0aGVzZSBWVUkgcGFyYW1ldGVycy4gSG93ZXZlciwgdGhlc2UgdmFsdWVzCi0gICAgICAgICAqIGFyZSBub3QgdXNlZCBhbnl3aGVyZSBhbmQgbWF4aW11bSBmb3IgYW55IGxldmVsIHdpbGwgYmUgdXNlZCBoZXJlICovCi0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmJpdFJhdGVWYWx1ZVswXSA9IDEyMDAgKiBNQVhfQlIgKyAxOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5jcGJTaXplVmFsdWVbMF0gPSAxMjAwICogTUFYX0NQQiArIDE7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGggPSAyNDsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuY3BiUmVtb3ZhbERlbGF5TGVuZ3RoICAgICAgICA9IDI0OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5kcGJPdXRwdXREZWxheUxlbmd0aCAgICAgICAgID0gMjQ7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLnRpbWVPZmZzZXRMZW5ndGggICAgICAgICAgICAgPSAyNDsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IERlY29kZUhyZFBhcmFtZXRlcnMocFN0cm1EYXRhLCAmcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJDbnQgICAgICAgICAgPSAxOwotICAgICAgICAvKiBNYXhCUiBhbmQgTWF4Q1BCIHNob3VsZCBiZSB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpZyB0byB0aGUgbGV2ZWxJZGMKLSAgICAgICAgICogaW4gdGhlIFNQUyBjb250YWluaW5nIHRoZXNlIFZVSSBwYXJhbWV0ZXJzLiBIb3dldmVyLCB0aGVzZSB2YWx1ZXMKLSAgICAgICAgICogYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFuZCBtYXhpbXVtIGZvciBhbnkgbGV2ZWwgd2lsbCBiZSB1c2VkIGhlcmUgKi8KLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuYml0UmF0ZVZhbHVlWzBdID0gMTAwMCAqIE1BWF9CUiArIDE7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYlNpemVWYWx1ZVswXSA9IDEwMDAgKiBNQVhfQ1BCICsgMTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCA9IDI0OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJSZW1vdmFsRGVsYXlMZW5ndGggICAgICAgID0gMjQ7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmRwYk91dHB1dERlbGF5TGVuZ3RoICAgICAgICAgPSAyNDsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMudGltZU9mZnNldExlbmd0aCAgICAgICAgICAgICA9IDI0OwotICAgIH0KLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnIHx8Ci0gICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bG93RGVsYXlIcmRGbGFnID0KLSAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5waWNTdHJ1Y3RQcmVzZW50RmxhZyA9Ci0gICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZyA9Ci0gICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZyA9Ci0gICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm1heEJ5dGVzUGVyUGljRGVub20pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm1heEJ5dGVzUGVyUGljRGVub20gPiAxNikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bWF4Qml0c1Blck1iRGVub20pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm1heEJpdHNQZXJNYkRlbm9tID4gMTYpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aEhvcml6b250YWwpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aEhvcml6b250YWwgPiAxNikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoVmVydGljYWwpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsID4gMTYpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tb3Rpb25WZWN0b3JzT3ZlclBpY0JvdW5kYXJpZXNGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXhCeXRlc1BlclBpY0Rlbm9tICAgICAgID0gMjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1heEJpdHNQZXJNYkRlbm9tICAgICAgICAgPSAxOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbCA9IDE2OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoVmVydGljYWwgICA9IDE2OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcyAgICAgICAgICA9IE1BWF9EUEJfU0laRTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nICAgICAgPSBNQVhfRFBCX1NJWkU7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVIcmRQYXJhbWV0ZXJzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBIUkQgcGFyYW1ldGVycyBmcm9tIHRoZSBzdHJlYW0uIFNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcEhyZFBhcmFtZXRlcnMgIGRlY29kZWQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlSHJkUGFyYW1ldGVycygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBocmRQYXJhbWV0ZXJzX3QgKnBIcmRQYXJhbWV0ZXJzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwSHJkUGFyYW1ldGVycyk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZwSHJkUGFyYW1ldGVycy0+Y3BiQ250KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgLyogY3BiQ291bnQgPSBjcGJfY250X21pbnVzMSArIDEgKi8KLSAgICBwSHJkUGFyYW1ldGVycy0+Y3BiQ250Kys7Ci0gICAgaWYgKHBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQgPiBNQVhfQ1BCX0NOVCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA0KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVNjYWxlID0gdG1wOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA0KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVNjYWxlID0gdG1wOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQ7IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIGJpdF9yYXRlX3ZhbHVlX21pbnVzMSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzIgLSAyXSAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0gPiA0Mjk0OTY3Mjk0VSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSsrOwotICAgICAgICAvKiB0aGlzIG1heSByZXN1bHQgaW4gb3ZlcmZsb3csIGJ1dCB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIGZvcgotICAgICAgICAgKiBhbnl0aGluZyAqLwotICAgICAgICBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldICo9Ci0gICAgICAgICAgICAxIDw8ICg2ICsgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVTY2FsZSk7Ci0KLSAgICAgICAgLyogY3BiX3NpemVfdmFsdWVfbWludXMxIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdICovCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSA+IDQyOTQ5NjcyOTRVKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldKys7Ci0gICAgICAgIC8qIHRoaXMgbWF5IHJlc3VsdCBpbiBvdmVyZmxvdywgYnV0IHRoaXMgdmFsdWUgaXMgbm90IHVzZWQgZm9yCi0gICAgICAgICAqIGFueXRoaW5nICovCi0gICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0gKj0KLSAgICAgICAgICAgIDEgPDwgKDQgKyBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVNjYWxlKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5jYnJGbGFnW2ldID0gKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGggPSB0bXAgKyAxOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwSHJkUGFyYW1ldGVycy0+Y3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gdG1wICsgMTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPmRwYk91dHB1dERlbGF5TGVuZ3RoID0gdG1wICsgMTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPnRpbWVPZmZzZXRMZW5ndGggPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZDUyYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfVlVJX0gKLSNkZWZpbmUgSDI2NFNXREVDX1ZVSV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE1BWF9DUEJfQ05UIDMyCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZW51bWVyYXRlZCBzYW1wbGUgYXNwZWN0IHJhdGlvcywgQVNQRUNUX1JBVElPX01fTiBtZWFucyBNOk4gKi8KLWVudW0KLXsKLSAgICBBU1BFQ1RfUkFUSU9fVU5TUEVDSUZJRUQgPSAwLAotICAgIEFTUEVDVF9SQVRJT18xXzEsCi0gICAgQVNQRUNUX1JBVElPXzEyXzExLAotICAgIEFTUEVDVF9SQVRJT18xMF8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fMTZfMTEsCi0gICAgQVNQRUNUX1JBVElPXzQwXzMzLAotICAgIEFTUEVDVF9SQVRJT18yNF8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fMjBfMTEsCi0gICAgQVNQRUNUX1JBVElPXzMyXzExLAotICAgIEFTUEVDVF9SQVRJT184MF8zMywKLSAgICBBU1BFQ1RfUkFUSU9fMThfMTEsCi0gICAgQVNQRUNUX1JBVElPXzE1XzExLAotICAgIEFTUEVDVF9SQVRJT182NF8zMywKLSAgICBBU1BFQ1RfUkFUSU9fMTYwXzk5LAotICAgIEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVIgPSAyNTUKLX07Ci0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBIeXBvdGhldGljYWwgUmVmZXJlbmNlIERlY29kZXIgKEhSRCkgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgY3BiQ250OwotICAgIHUzMiBiaXRSYXRlU2NhbGU7Ci0gICAgdTMyIGNwYlNpemVTY2FsZTsKLSAgICB1MzIgYml0UmF0ZVZhbHVlW01BWF9DUEJfQ05UXTsKLSAgICB1MzIgY3BiU2l6ZVZhbHVlW01BWF9DUEJfQ05UXTsKLSAgICB1MzIgY2JyRmxhZ1tNQVhfQ1BCX0NOVF07Ci0gICAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGg7Ci0gICAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aDsKLSAgICB1MzIgZHBiT3V0cHV0RGVsYXlMZW5ndGg7Ci0gICAgdTMyIHRpbWVPZmZzZXRMZW5ndGg7Ci19IGhyZFBhcmFtZXRlcnNfdDsKLQotLyogc3RvcmFnZSBmb3IgVlVJIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGFzcGVjdFJhdGlvUHJlc2VudEZsYWc7Ci0gICAgdTMyIGFzcGVjdFJhdGlvSWRjOwotICAgIHUzMiBzYXJXaWR0aDsKLSAgICB1MzIgc2FySGVpZ2h0OwotICAgIHUzMiBvdmVyc2NhbkluZm9QcmVzZW50RmxhZzsKLSAgICB1MzIgb3ZlcnNjYW5BcHByb3ByaWF0ZUZsYWc7Ci0gICAgdTMyIHZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnOwotICAgIHUzMiB2aWRlb0Zvcm1hdDsKLSAgICB1MzIgdmlkZW9GdWxsUmFuZ2VGbGFnOwotICAgIHUzMiBjb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnOwotICAgIHUzMiBjb2xvdXJQcmltYXJpZXM7Ci0gICAgdTMyIHRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzOwotICAgIHUzMiBtYXRyaXhDb2VmZmljaWVudHM7Ci0gICAgdTMyIGNocm9tYUxvY0luZm9QcmVzZW50RmxhZzsKLSAgICB1MzIgY2hyb21hU2FtcGxlTG9jVHlwZVRvcEZpZWxkOwotICAgIHUzMiBjaHJvbWFTYW1wbGVMb2NUeXBlQm90dG9tRmllbGQ7Ci0gICAgdTMyIHRpbWluZ0luZm9QcmVzZW50RmxhZzsKLSAgICB1MzIgbnVtVW5pdHNJblRpY2s7Ci0gICAgdTMyIHRpbWVTY2FsZTsKLSAgICB1MzIgZml4ZWRGcmFtZVJhdGVGbGFnOwotICAgIHUzMiBuYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWc7Ci0gICAgaHJkUGFyYW1ldGVyc190IG5hbEhyZFBhcmFtZXRlcnM7Ci0gICAgdTMyIHZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZzsKLSAgICBocmRQYXJhbWV0ZXJzX3QgdmNsSHJkUGFyYW1ldGVyczsKLSAgICB1MzIgbG93RGVsYXlIcmRGbGFnOwotICAgIHUzMiBwaWNTdHJ1Y3RQcmVzZW50RmxhZzsKLSAgICB1MzIgYml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnOwotICAgIHUzMiBtb3Rpb25WZWN0b3JzT3ZlclBpY0JvdW5kYXJpZXNGbGFnOwotICAgIHUzMiBtYXhCeXRlc1BlclBpY0Rlbm9tOwotICAgIHUzMiBtYXhCaXRzUGVyTWJEZW5vbTsKLSAgICB1MzIgbG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbDsKLSAgICB1MzIgbG9nMk1heE12TGVuZ3RoVmVydGljYWw7Ci0gICAgdTMyIG51bVJlb3JkZXJGcmFtZXM7Ci0gICAgdTMyIG1heERlY0ZyYW1lQnVmZmVyaW5nOwotfSB2dWlQYXJhbWV0ZXJzX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICB2dWlQYXJhbWV0ZXJzX3QgKnBWdWlQYXJhbWV0ZXJzKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVlVJX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAppbmRleCBiNDk4YzkxLi5iYWM4ZmE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaApAQCAtODIsNiArODIsMTAgQEAKIE1BS0VfQ09NUEFSQVRPUihMVCw8KQogTUFLRV9DT01QQVJBVE9SKEdULD4pCiAKKyNpZmRlZiBDSEVDS19PUAorI3VuZGVmIENIRUNLX09QCisjZW5kaWYKKwogI2RlZmluZSBDSEVDS19PUCh4LHksc3VmZml4LG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBBU3RyaW5nIF9fX3JlcyA9IENvbXBhcmVfIyNzdWZmaXgoeCwgeSk7ICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyZTkwNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0VuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFBQ19FTkNPREVSX0gKLSNkZWZpbmUgQUFDX0VOQ09ERVJfSAotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1zdHJ1Y3QgVk9fQVVESU9fQ09ERUNBUEk7Ci1zdHJ1Y3QgVk9fTUVNX09QRVJBVE9SOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyR3JvdXA7Ci0KLWNsYXNzIEFBQ0VuY29kZXI6IHB1YmxpYyBCbk1lZGlhU291cmNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEFBQ0VuY29kZXIoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7Ci0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+QUFDRW5jb2RlcigpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3A8SU1lZGlhU291cmNlPiAgIG1Tb3VyY2U7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiAgICAgIG1NZXRhOwotICAgICAgICBib29sICAgICAgICAgICAgICBtU3RhcnRlZDsKLSAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqbUJ1ZmZlckdyb3VwOwotICAgICAgICBNZWRpYUJ1ZmZlciAgICAgICptSW5wdXRCdWZmZXI7Ci0gICAgICAgIHN0YXR1c190ICAgICAgICAgIG1Jbml0Q2hlY2s7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgIG1TYW1wbGVSYXRlOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICBtQ2hhbm5lbHM7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgIG1CaXRSYXRlOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICBtRnJhbWVDb3VudDsKLQotICAgICAgICBpbnQ2NF90ICAgICAgICAgICBtQW5jaG9yVGltZVVzOwotICAgICAgICBpbnQ2NF90ICAgICAgICAgICBtTnVtSW5wdXRTYW1wbGVzOwotCi0gICAgICAgIGVudW0gewotICAgICAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZSA9IDEwMjQsCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50MTZfdCAgICAgICAgICAgKm1JbnB1dEZyYW1lOwotCi0gICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YVsyXTsgLy8gYXVpZG8gc3BlY2lmaWMgZGF0YQotICAgICAgICB2b2lkICAgICAgICAgICAgICptRW5jb2RlckhhbmRsZTsKLSAgICAgICAgVk9fQVVESU9fQ09ERUNBUEkgKm1BcGlIYW5kbGU7Ci0gICAgICAgIFZPX01FTV9PUEVSQVRPUiAgKm1NZW1PcGVyYXRvcjsKLQotICAgICAgICBzdGF0dXNfdCBzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpOwotICAgICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgICAgICBBQUNFbmNvZGVyJiBvcGVyYXRvcj0oY29uc3QgQUFDRW5jb2RlciAmcmhzKTsKLSAgICAgICAgQUFDRW5jb2Rlcihjb25zdCBBQUNFbmNvZGVyJiBjb3B5KTsKLQotfTsKLQotfQotCi0jZW5kaWYgIC8vI2lmbmRlZiBBQUNfRU5DT0RFUl9ICi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAppbmRleCBjOWQ3ZGRlLi4yMTRhM2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCkBAIC04Niw2ICs4Niw5IEBACiAgICAgICAgIHNwPFNhbXBsZVRhYmxlPiBzYW1wbGVUYWJsZTsKICAgICAgICAgYm9vbCBpbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7CiAgICAgICAgIGJvb2wgc2tpcFRyYWNrOworICAgICAgICBib29sIGhhc19lbHN0OworICAgICAgICBpbnQ2NF90IGVsc3RfbWVkaWFfdGltZTsKKyAgICAgICAgdWludDY0X3QgZWxzdF9zZWdtZW50X2R1cmF0aW9uOwogICAgIH07CiAKICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeEVudHJpZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVcmlTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVyaVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjIzYzA2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVyaVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgREFUQV9VUklfU09VUkNFX0hfCi0KLSNkZWZpbmUgREFUQV9VUklfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGF0YVVyaVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKLXB1YmxpYzoKLSAgICBEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Jbml0ZWQ7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICAgICAgaWYgKG1Jbml0ZWQgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5pdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgKnNpemUgPSBtRGF0YS5zaXplKCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCkgewotICAgICAgICByZXR1cm4gbURhdGFVcmk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU1pbWVUeXBlOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRhdGFVcmlTb3VyY2UoKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZGVsZXRlLgotICAgIH0KLQotcHJpdmF0ZToKLSAgICBjb25zdCBTdHJpbmc4IG1EYXRhVXJpOwotCi0gICAgU3RyaW5nOCBtTWltZVR5cGU7Ci0gICAgLy8gVXNlIEFTdHJpbmcgYmVjYXVzZSBpbmRpdmlkdWFsIGJ5dGVzIG1heSBub3QgYmUgdmFsaWQgVVRGOCBjaGFycy4KLSAgICBBU3RyaW5nIG1EYXRhOwotICAgIHN0YXR1c190IG1Jbml0ZWQ7Ci0KLSAgICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ24uCi0gICAgRGF0YVVyaVNvdXJjZShjb25zdCBEYXRhVXJpU291cmNlICYpOwotICAgIERhdGFVcmlTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhVXJpU291cmNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBEQVRBX1VSSV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCA4MTNhMjU3Li40NjJlZmY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC0xNDAsNiArMTQwLDcgQEAKICAgICBlbnVtIFR5cGUgewogICAgICAgICBBVkMsCiAgICAgICAgIEFBQywKKyAgICAgICAgSEVWQywKICAgICAgICAgT1RIRVIKICAgICB9OwogCkBAIC0xNDgsNyArMTQ5LDcgQEAKICAgICBUeXBlIG1UeXBlOwogICAgIGJvb2wgbUlzQXVkaW87CiAgICAgQmxvY2tJdGVyYXRvciBtQmxvY2tJdGVyOwotICAgIHNzaXplX3QgbU5BTFNpemVMZW47ICAvLyBmb3IgdHlwZSBBVkMKKyAgICBzc2l6ZV90IG1OQUxTaXplTGVuOyAgLy8gZm9yIHR5cGUgQVZDIG9yIEhFVkMKIAogICAgIExpc3Q8TWVkaWFCdWZmZXIgKj4gbVBlbmRpbmdGcmFtZXM7CiAKQEAgLTI0NCw2ICsyNDUsMTkgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICBtVHlwZSA9IEhFVkM7CisKKyAgICAgICAgdWludDMyX3QgZHVtbXk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmh2Y2M7CisgICAgICAgIHNpemVfdCBodmNjU2l6ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmZHVtbXksIChjb25zdCB2b2lkICoqKSZodmNjLCAmaHZjY1NpemUpCisgICAgICAgICAgICAgICAgJiYgaHZjY1NpemUgPj0gMjJ1KSB7CisgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoaHZjY1sxNCs3XSAmIDMpOworICAgICAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXp1IiwgbU5BTFNpemVMZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgbVR5cGUgPSBBQUM7CiAgICAgfQpAQCAtNjkyLDcgKzcwNiw3IEBACiAgICAgTWVkaWFCdWZmZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CiAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CiAKLSAgICBpZiAobVR5cGUgIT0gQVZDIHx8IG1OQUxTaXplTGVuID09IDApIHsKKyAgICBpZiAoKG1UeXBlICE9IEFWQyAmJiBtVHlwZSAhPSBIRVZDKSB8fCBtTkFMU2l6ZUxlbiA9PSAwKSB7CiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKSB7CiAgICAgICAgICAgICBmcmFtZS0+bWV0YV9kYXRhKCktPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKQEAgLTEyOTMsNiArMTMwNywxNCBAQAogICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BVkMiLCBjb2RlY0lEKSkgewogICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFR0gvSVNPL0hFVkMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkhFVkMgaXMgZGV0ZWN0ZWQsIGJ1dCBkb2VzIG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVNQIiwgY29kZWNJRCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKApAQCAtMTQxMiw2ICsxNDM0LDE0IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorICAgICAgICBjb25zdCBjaGFyICpsYW5ndWFnZSA9IHRyYWNrLT5HZXRMYW5ndWFnZSgpOworICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICBjaGFyIGxhbmdbNF07CisgICAgICAgICAgIHN0cm5jcHkobGFuZywgbGFuZ3VhZ2UsIDMpOworICAgICAgICAgICBsYW5nWzNdID0gJ1wwJzsKKyAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZyk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgic2tpcHBpbmcgdHJhY2ssIGNvZGVjIHNwZWNpZmljIGRhdGEgd2FzIG1hbGZvcm1lZC4iKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAppbmRleCBkNGNkZjY5Li5iZDNjMWM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icApAQCAtMTI0LDYgKzEyNCw3IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCA4N2MyNDExLi4xYmE1ODUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC00NTgsNyArNDU4LDEyIEBACiAgICAgICAgIHN0YXRlID0gT01YX1N0YXRlTG9hZGVkOwogICAgIH0KIAotICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KW1UYXJnZXRTdGF0ZSk7CisgICAgaWYgKG1TdGF0ZSAhPSBtVGFyZ2V0U3RhdGUpIHsKKyAgICAgICAgQUxPR0UoIlN0YXRlIGNoYW5nZSB0byBzdGF0ZSAlZCByZXF1ZXN0ZWQgd2hpbGUgc3RpbGwgdHJhbnNpdGlvbmluZyBmcm9tIHN0YXRlICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICBzdGF0ZSwgbVN0YXRlLCBtVGFyZ2V0U3RhdGUpOworICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIE9NWF9TdGF0ZUxvYWRlZDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCmluZGV4IDU3NmEwYTQuLjQ4MjdjZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcApAQCAtNDMsNyArNDMsMTAgQEAKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCiAgICAgOiBtSUQoaWQpLAogICAgICAgbUhpZ2hlc3RTZXFOdW1iZXIoMCksCisgICAgICBtUHJldkV4cGVjdGVkKDApLAorICAgICAgbUJhc2VTZXFOdW1iZXIoMCksCiAgICAgICBtTnVtQnVmZmVyc1JlY2VpdmVkKDApLAorICAgICAgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQoMCksCiAgICAgICBtTGFzdE5UUFRpbWUoMCksCiAgICAgICBtTGFzdE5UUFRpbWVVcGRhdGVVcygwKSwKICAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzKGZhbHNlKSwKQEAgLTEwNyw2ICsxMTAsNyBAQAogCiAgICAgaWYgKG1OdW1CdWZmZXJzUmVjZWl2ZWQrKyA9PSAwKSB7CiAgICAgICAgIG1IaWdoZXN0U2VxTnVtYmVyID0gc2VxTnVtOworICAgICAgICBtQmFzZVNlcU51bWJlciA9IHNlcU51bTsKICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0yMjYsNiArMjMwLDIyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICB1aW50OF90IGZyYWN0aW9uID0gMDsKKworICAgIC8vIEFjY29yZGluZyB0byBhcHBlbmRpeCBBLjMgaW4gUkZDIDM1NTAKKyAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOworICAgIGludDY0X3QgaW50ZXJ2YWxFeHBlY3RlZCA9IGV4cGVjdGVkIC0gbVByZXZFeHBlY3RlZDsKKyAgICBpbnQ2NF90IGludGVydmFsUmVjZWl2ZWQgPSBtTnVtQnVmZmVyc1JlY2VpdmVkIC0gbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBpbnRlcnZhbFBhY2tldExvc3QgPSBpbnRlcnZhbEV4cGVjdGVkIC0gaW50ZXJ2YWxSZWNlaXZlZDsKKworICAgIGlmIChpbnRlcnZhbEV4cGVjdGVkID4gMCAmJiBpbnRlcnZhbFBhY2tldExvc3QgPiAwKSB7CisgICAgICAgIGZyYWN0aW9uID0gKGludGVydmFsUGFja2V0TG9zdCA8PCA4KSAvIGludGVydmFsRXhwZWN0ZWQ7CisgICAgfQorCisgICAgbVByZXZFeHBlY3RlZCA9IGV4cGVjdGVkOworICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICBpbnQzMl90IGN1bXVsYXRpdmVQYWNrZXRMb3N0ID0gKGludDMyX3QpZXhwZWN0ZWQgLSBtTnVtQnVmZmVyc1JlY2VpdmVkOworCiAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CiAKICAgICBkYXRhWzBdID0gMHg4MCB8IDE7CkBAIC0yNDIsMTEgKzI2MiwxMSBAQAogICAgIGRhdGFbMTBdID0gKG1JRCA+PiA4KSAmIDB4ZmY7CiAgICAgZGF0YVsxMV0gPSBtSUQgJiAweGZmOwogCi0gICAgZGF0YVsxMl0gPSAweDAwOyAgLy8gZnJhY3Rpb24gbG9zdAorICAgIGRhdGFbMTJdID0gZnJhY3Rpb247ICAvLyBmcmFjdGlvbiBsb3N0CiAKLSAgICBkYXRhWzEzXSA9IDB4MDA7ICAvLyBjdW11bGF0aXZlIGxvc3QKLSAgICBkYXRhWzE0XSA9IDB4MDA7Ci0gICAgZGF0YVsxNV0gPSAweDAwOworICAgIGRhdGFbMTNdID0gY3VtdWxhdGl2ZVBhY2tldExvc3QgPj4gMTY7ICAvLyBjdW11bGF0aXZlIGxvc3QKKyAgICBkYXRhWzE0XSA9IChjdW11bGF0aXZlUGFja2V0TG9zdCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxNV0gPSBjdW11bGF0aXZlUGFja2V0TG9zdCAmIDB4ZmY7CiAKICAgICBkYXRhWzE2XSA9IG1IaWdoZXN0U2VxTnVtYmVyID4+IDI0OwogICAgIGRhdGFbMTddID0gKG1IaWdoZXN0U2VxTnVtYmVyID4+IDE2KSAmIDB4ZmY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCmluZGV4IGI3MGY5NGUuLmY0NGU4M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCkBAIC00OSw3ICs0OSwxMCBAQAogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtSUQ7CiAgICAgdWludDMyX3QgbUhpZ2hlc3RTZXFOdW1iZXI7CisgICAgdWludDMyX3QgbVByZXZFeHBlY3RlZDsKKyAgICB1aW50MzJfdCBtQmFzZVNlcU51bWJlcjsKICAgICBpbnQzMl90IG1OdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50MzJfdCBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZDsKIAogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtUXVldWU7CiAgICAgc3A8QVJUUEFzc2VtYmxlcj4gbUFzc2VtYmxlcjsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLmJwIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKaW5kZXggNWQ1YWU0OS4uYWNlYTM3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKQEAgLTE3LDEzICsxNywxNCBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtdHAiLAogICAgIHNyY3M6IFsKLSAgICAgICAgIkFzeW5jSU8uY3BwIiwKICAgICAgICAgIk10cERhdGFQYWNrZXQuY3BwIiwKICAgICAgICAgIk10cERlYnVnLmNwcCIsCisgICAgICAgICJNdHBEZXNjcmlwdG9ycy5jcHAiLAogICAgICAgICAiTXRwRGV2SGFuZGxlLmNwcCIsCiAgICAgICAgICJNdHBEZXZpY2UuY3BwIiwKICAgICAgICAgIk10cERldmljZUluZm8uY3BwIiwKICAgICAgICAgIk10cEV2ZW50UGFja2V0LmNwcCIsCisgICAgICAgICJNdHBGZnNDb21wYXRIYW5kbGUuY3BwIiwKICAgICAgICAgIk10cEZmc0hhbmRsZS5jcHAiLAogICAgICAgICAiTXRwT2JqZWN0SW5mby5jcHAiLAogICAgICAgICAiTXRwUGFja2V0LmNwcCIsCkBAIC0zNSw2ICszNiw3IEBACiAgICAgICAgICJNdHBTdG9yYWdlSW5mby5jcHAiLAogICAgICAgICAiTXRwU3RyaW5nQnVmZmVyLmNwcCIsCiAgICAgICAgICJNdHBVdGlscy5jcHAiLAorICAgICAgICAiUG9zaXhBc3luY0lPLmNwcCIsCiAgICAgXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKICAgICBjZmxhZ3M6IFsKQEAgLTQ1LDYgKzQ3LDcgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFzeW5jaW8iLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FzeW5jSU8uY3BwIGIvbWVkaWEvbXRwL0FzeW5jSU8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIwN2RjLi4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9Bc3luY0lPLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgIkFzeW5jSU8uaCIKLQotbmFtZXNwYWNlIHsKLQotdm9pZCByZWFkX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChhaW9jYnAtPmFpb19maWxkZXMsCi0gICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi12b2lkIHdyaXRlX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwd3JpdGUoYWlvY2JwLT5haW9fZmlsZGVzLAotICAgICAgICAgICAgICAgIGFpb2NicC0+YWlvX2J1ZiwgYWlvY2JwLT5haW9fbmJ5dGVzLCBhaW9jYnAtPmFpb19vZmZzZXQpKTsKLSAgICBpZiAoYWlvY2JwLT5yZXQgPT0gLTEpIGFpb2NicC0+ZXJyb3IgPSBlcnJubzsKLX0KLQotdm9pZCBzcGxpY2VfcmVhZF9mdW5jKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgbG9mZl90IGxvbmdfb2Zmc2V0ID0gYWlvY2JwLT5haW9fb2Zmc2V0OwotICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHNwbGljZShhaW9jYnAtPmFpb19maWxkZXMsCi0gICAgICAgICAgICAgICAgJmxvbmdfb2Zmc2V0LCBhaW9jYnAtPmFpb19zaW5rLAotICAgICAgICAgICAgICAgIE5VTEwsIGFpb2NicC0+YWlvX25ieXRlcywgMCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi12b2lkIHNwbGljZV93cml0ZV9mdW5jKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgbG9mZl90IGxvbmdfb2Zmc2V0ID0gYWlvY2JwLT5haW9fb2Zmc2V0OwotICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHNwbGljZShhaW9jYnAtPmFpb19maWxkZXMsIE5VTEwsCi0gICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fc2luaywgJmxvbmdfb2Zmc2V0LAotICAgICAgICAgICAgICAgIGFpb2NicC0+YWlvX25ieXRlcywgMCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi1zdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+PiBxdWV1ZTsKLXN0ZDo6bXV0ZXggcXVldWVfbG9jazsKLXN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIHF1ZXVlX2NvbmQ7Ci1zdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSB3cml0ZV9jb25kOwotaW50IGRvbmUgPSAxOwotdm9pZCBzcGxpY2Vfd3JpdGVfcG9vbF9mdW5jKGludCkgewotICAgIHdoaWxlKDEpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICAgICAgcXVldWVfY29uZC53YWl0KGxrLCBbXXtyZXR1cm4gIXF1ZXVlLmVtcHR5KCkgfHwgZG9uZTt9KTsKLSAgICAgICAgaWYgKHF1ZXVlLmVtcHR5KCkgJiYgZG9uZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+IGFpb2NicCA9IHN0ZDo6bW92ZShxdWV1ZS5mcm9udCgpKTsKLSAgICAgICAgcXVldWUucG9wKCk7Ci0gICAgICAgIGxrLnVubG9jaygpOwotICAgICAgICB3cml0ZV9jb25kLm5vdGlmeV9vbmUoKTsKLSAgICAgICAgc3BsaWNlX3dyaXRlX2Z1bmMoYWlvY2JwLmdldCgpKTsKLSAgICAgICAgY2xvc2UoYWlvY2JwLT5haW9fZmlsZGVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgd3JpdGVfcG9vbF9mdW5jKGludCkgewotICAgIHdoaWxlKDEpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICAgICAgcXVldWVfY29uZC53YWl0KGxrLCBbXXtyZXR1cm4gIXF1ZXVlLmVtcHR5KCkgfHwgZG9uZTt9KTsKLSAgICAgICAgaWYgKHF1ZXVlLmVtcHR5KCkgJiYgZG9uZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+IGFpb2NicCA9IHN0ZDo6bW92ZShxdWV1ZS5mcm9udCgpKTsKLSAgICAgICAgcXVldWUucG9wKCk7Ci0gICAgICAgIGxrLnVubG9jaygpOwotICAgICAgICB3cml0ZV9jb25kLm5vdGlmeV9vbmUoKTsKLSAgICAgICAgYWlvY2JwLT5yZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkocHdyaXRlKGFpb2NicC0+YWlvX2ZpbGRlcywKLSAgICAgICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fcG9vbF9idWYuZ2V0KCksIGFpb2NicC0+YWlvX25ieXRlcywgYWlvY2JwLT5haW9fb2Zmc2V0KSk7Ci0gICAgICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotICAgIH0KLX0KLQotY29uc3RleHByIGludCBOVU1fVEhSRUFEUyA9IDE7Ci1jb25zdGV4cHIgaW50IE1BWF9RVUVVRV9TSVpFID0gMTA7Ci1zdGQ6OnRocmVhZCBwb29sW05VTV9USFJFQURTXTsKLQotfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQotCi1haW9jYjo6fmFpb2NiKCkgewotICAgIENIRUNLKCF0aHJlYWQuam9pbmFibGUoKSk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfaW5pdCh2b2lkKGYpKGludCkpIHsKLSAgICBDSEVDSyhkb25lID09IDEpOwotICAgIGRvbmUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgewotICAgICAgICBwb29sW2ldID0gc3RkOjp0aHJlYWQoZiwgaSk7Ci0gICAgfQotfQotCi12b2lkIGFpb19wb29sX3NwbGljZV9pbml0KCkgewotICAgIGFpb19wb29sX2luaXQoc3BsaWNlX3dyaXRlX3Bvb2xfZnVuYyk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfd3JpdGVfaW5pdCgpIHsKLSAgICBhaW9fcG9vbF9pbml0KHdyaXRlX3Bvb2xfZnVuYyk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfZW5kKCkgewotICAgIGRvbmUgPSAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKHF1ZXVlX2xvY2spOwotICAgICAgICBsay51bmxvY2soKTsKLSAgICAgICAgcXVldWVfY29uZC5ub3RpZnlfb25lKCk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEhSRUFEUzsgaSsrKSB7Ci0gICAgICAgIHBvb2xbaV0uam9pbigpOwotICAgIH0KLX0KLQotLy8gdXNlZCBmb3IgYm90aCB3cml0ZXMgYW5kIHNwbGljZXMgZGVwZW5kaW5nIG9uIHdoaWNoIGluaXQgd2FzIHVzZWQgYmVmb3JlLgotaW50IGFpb19wb29sX3dyaXRlKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICB3cml0ZV9jb25kLndhaXQobGssIFtde3JldHVybiBxdWV1ZS5zaXplKCkgPCBNQVhfUVVFVUVfU0laRTt9KTsKLSAgICBxdWV1ZS5wdXNoKHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+KGFpb2NicCkpOwotICAgIGxrLnVubG9jaygpOwotICAgIHF1ZXVlX2NvbmQubm90aWZ5X29uZSgpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgYWlvX3JlYWQoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHJlYWRfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb193cml0ZShzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIGFpb2NicC0+dGhyZWFkID0gc3RkOjp0aHJlYWQod3JpdGVfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb19zcGxpY2VfcmVhZChzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIGFpb2NicC0+dGhyZWFkID0gc3RkOjp0aHJlYWQoc3BsaWNlX3JlYWRfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb19zcGxpY2Vfd3JpdGUoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHNwbGljZV93cml0ZV9mdW5jLCBhaW9jYnApOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgYWlvX2Vycm9yKGNvbnN0IHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgcmV0dXJuIGFpb2NicC0+ZXJyb3I7Ci19Ci0KLXNzaXplX3QgYWlvX3JldHVybihzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIHJldHVybiBhaW9jYnAtPnJldDsKLX0KLQotaW50IGFpb19zdXNwZW5kKHN0cnVjdCBhaW9jYiAqYWlvY2JwW10sIGludCBuLAotICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGFpb2NicFtpXS0+dGhyZWFkLmpvaW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBhaW9fY2FuY2VsKGludCwgc3RydWN0IGFpb2NiICopIHsKLSAgICAvLyBOb3QgaW1wbGVtZW50ZWQKLSAgICByZXR1cm4gLTE7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9Bc3luY0lPLmggYi9tZWRpYS9tdHAvQXN5bmNJTy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDgwODI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9Bc3luY0lPLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQVNZTkNJT19ICi0jZGVmaW5lIF9BU1lOQ0lPX0gKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKioKLSAqIFByb3ZpZGVzIGEgc3Vic2V0IG9mIFBPU0lYIGFpbyBvcGVyYXRpb25zLCBhcyB3ZWxsCi0gKiBhcyBzaW1pbGFyIG9wZXJhdGlvbnMgd2l0aCBzcGxpY2UgYW5kIHRocmVhZHBvb2xzLgotICovCi0KLXN0cnVjdCBhaW9jYiB7Ci0gICAgaW50IGFpb19maWxkZXM7ICAgICAvLyBBc3N1bWVkIHRvIGJlIHRoZSBzb3VyY2UgZm9yIHNwbGljZXMKLSAgICB2b2lkICphaW9fYnVmOyAgICAgIC8vIFVudXNlZCBmb3Igc3BsaWNlcwotCi0gICAgLy8gVXNlZCBmb3IgdGhyZWFkcG9vbCBvcGVyYXRpb25zIG9ubHksIGZyZWVkIGF1dG9tYXRpY2FsbHkKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBhaW9fcG9vbF9idWY7Ci0KLSAgICBvZmZfdCBhaW9fb2Zmc2V0OwotICAgIHNpemVfdCBhaW9fbmJ5dGVzOwotCi0gICAgaW50IGFpb19zaW5rOyAgICAgICAvLyBVbnVzZWQgZm9yIG5vbiBzcGxpY2Ugci93Ci0KLSAgICAvLyBVc2VkIGludGVybmFsbHkKLSAgICBzdGQ6OnRocmVhZCB0aHJlYWQ7Ci0gICAgc3NpemVfdCByZXQ7Ci0gICAgaW50IGVycm9yOwotCi0gICAgfmFpb2NiKCk7Ci19OwotCi0vLyBTdWJtaXQgYSByZXF1ZXN0IGZvciBJTyB0byBiZSBjb21wbGV0ZWQKLWludCBhaW9fcmVhZChzdHJ1Y3QgYWlvY2IgKik7Ci1pbnQgYWlvX3dyaXRlKHN0cnVjdCBhaW9jYiAqKTsKLWludCBhaW9fc3BsaWNlX3JlYWQoc3RydWN0IGFpb2NiICopOwotaW50IGFpb19zcGxpY2Vfd3JpdGUoc3RydWN0IGFpb2NiICopOwotCi0vLyBTdXNwZW5kIGN1cnJlbnQgdGhyZWFkIHVudGlsIGdpdmVuIElPIGlzIGNvbXBsZXRlLCBhdCB3aGljaCBwb2ludAotLy8gaXRzIHJldHVybiB2YWx1ZSBhbmQgYW55IGVycm9ycyBjYW4gYmUgYWNjZXNzZWQKLS8vIEFsbCBzdWJtaXR0ZWQgcmVxdWVzdHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdXNwZW5kLgotLy8gYWlvY2ItPmFpb19idWYgbXVzdCByZWZlciB0byB2YWxpZCBtZW1vcnkgdW50aWwgYWZ0ZXIgdGhlIHN1c3BlbmQgY2FsbAotaW50IGFpb19zdXNwZW5kKHN0cnVjdCBhaW9jYiAqW10sIGludCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICopOwotaW50IGFpb19lcnJvcihjb25zdCBzdHJ1Y3QgYWlvY2IgKik7Ci1zc2l6ZV90IGFpb19yZXR1cm4oc3RydWN0IGFpb2NiICopOwotCi0vLyAoQ3VycmVudGx5IHVuaW1wbGVtZW50ZWQpCi1pbnQgYWlvX2NhbmNlbChpbnQsIHN0cnVjdCBhaW9jYiAqKTsKLQotLy8gSW5pdGlhbGl6ZSBhIHRocmVhZHBvb2wgdG8gcGVyZm9ybSBJTy4gT25seSBvbmUgcG9vbCBjYW4gYmUKLS8vIHJ1bm5pbmcgYXQgYSB0aW1lLgotdm9pZCBhaW9fcG9vbF93cml0ZV9pbml0KCk7Ci12b2lkIGFpb19wb29sX3NwbGljZV9pbml0KCk7Ci0vLyBTdXNwZW5kIGN1cnJlbnQgdGhyZWFkIHVudGlsIGFsbCBxdWV1ZWQgd29yayBpcyBjb21wbGV0ZSwgdGhlbiBlbmRzIHRoZSB0aHJlYWRwb29sCi12b2lkIGFpb19wb29sX2VuZCgpOwotLy8gU3VibWl0IElPIHdvcmsgZm9yIHRoZSB0aHJlYWRwb29sIHRvIGNvbXBsZXRlLiBNZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB3b3JrIGlzCi0vLyBmcmVlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGUuCi1pbnQgYWlvX3Bvb2xfd3JpdGUoc3RydWN0IGFpb2NiICopOwotCi0jZW5kaWYgLy8gQVNZTkNJT19ICi0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9JTXRwSGFuZGxlLmggYi9tZWRpYS9tdHAvSU10cEhhbmRsZS5oCmluZGV4IDA1NTc1OTYuLmM2NWJkZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9JTXRwSGFuZGxlLmgKKysrIGIvbWVkaWEvbXRwL0lNdHBIYW5kbGUuaApAQCAtMTgsMTMgKzE4LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KIAotY29uc3RleHByIGNoYXIgRkZTX01UUF9FUDBbXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMCI7CituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElNdHBIYW5kbGUgewogcHVibGljOgogICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZC93cml0dGVuLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0Ci0gICAgdmlydHVhbCBpbnQgcmVhZCh2b2lkICpkYXRhLCBpbnQgbGVuKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQgd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikgPSAwOworICAgIHZpcnR1YWwgaW50IHJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgPSAwOworICAgIHZpcnR1YWwgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pID0gMDsKIAogICAgIC8vIFJldHVybiAwIGlmIHNlbmQvcmVjZWl2ZSBpcyBzdWNjZXNzZnVsLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0CiAgICAgdmlydHVhbCBpbnQgcmVjZWl2ZUZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyLCBib29sIHplcm9fcGFja2V0KSA9IDA7CkBAIC00MCw4ICs0MCw3IEBACiAgICAgdmlydHVhbCB+SU10cEhhbmRsZSgpIHt9CiB9OwogCi1JTXRwSGFuZGxlICpnZXRfZmZzX2hhbmRsZSgpOwotSU10cEhhbmRsZSAqZ2V0X210cF9oYW5kbGUoKTsKK30KIAogI2VuZGlmIC8vIF9JTVRQX0hBTkRMRV9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCmluZGV4IGE0NDlkNmYuLjFkZGI4MjEgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKKysrIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaApAQCAtMjAsMTIgKzIwLDEyIEBACiAjaW5jbHVkZSAiTXRwUGFja2V0LmgiCiAjaW5jbHVkZSAibXRwLmgiCiAKLWNsYXNzIElNdHBIYW5kbGU7CiBzdHJ1Y3QgdXNiX2RldmljZTsKIHN0cnVjdCB1c2JfcmVxdWVzdDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBJTXRwSGFuZGxlOwogY2xhc3MgTXRwU3RyaW5nQnVmZmVyOwogCiBjbGFzcyBNdHBEYXRhUGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCmluZGV4IDRlNmFjN2EuLmYzZjk3MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCisrKyBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCkBAIC00NSw2ICs0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGRvU2NhbkRpcmVjdG9yeShjb25zdCBjaGFyKiBwYXRoKSA9IDA7CisKICAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOwpAQCAtMTAzLDYgKzEwNSw5IEBACiAKICAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BlcnR5RGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgPSAwOwogCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBtb3ZlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZSBuZXdQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlLCBNdHBTdHJpbmcmIG5ld1BhdGgpID0gMDsKKwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0YXJ0ZWQoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHNlc3Npb25FbmRlZCgpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5jcHAgYi9tZWRpYS9tdHAvTXRwRGVzY3JpcHRvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjYwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGVzY3JpcHRvcnMuY3BwCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERlc2NyaXB0b3JzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBtdHBfaW50ZXJmYWNlX2Rlc2MgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfSU5URVJGQUNFX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCisgICAgLmJJbnRlcmZhY2VOdW1iZXIgPSAwLAorICAgIC5iTnVtRW5kcG9pbnRzID0gMywKKyAgICAuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFLAorICAgIC5iSW50ZXJmYWNlU3ViQ2xhc3MgPSAxLAorICAgIC5iSW50ZXJmYWNlUHJvdG9jb2wgPSAxLAorICAgIC5pSW50ZXJmYWNlID0gMSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgcHRwX2ludGVyZmFjZV9kZXNjID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0lOVEVSRkFDRV9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSU5URVJGQUNFLAorICAgIC5iSW50ZXJmYWNlTnVtYmVyID0gMCwKKyAgICAuYk51bUVuZHBvaW50cyA9IDMsCisgICAgLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19TVElMTF9JTUFHRSwKKyAgICAuYkludGVyZmFjZVN1YkNsYXNzID0gMSwKKyAgICAuYkludGVyZmFjZVByb3RvY29sID0gMSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zaW5rID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKKyAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDEgfCBVU0JfRElSX0lOLAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zb3VyY2UgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMiB8IFVTQl9ESVJfT1VULAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKKyAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDMgfCBVU0JfRElSX0lOLAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0VWLAorICAgIC5iSW50ZXJ2YWwgPSA2LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NpbmsgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NvdXJjZSA9IHsKKyAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCisgICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX3NpbmsgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX1NTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX3NvdXJjZSA9IHsKKyAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCisgICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX1NTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3Nfc2lua19jb21wID0geworICAgIC5iTGVuZ3RoID0gc2l6ZW9mKHNzX3NpbmtfY29tcCksCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAorICAgIC5iTWF4QnVyc3QgPSA2LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3Nfc291cmNlX2NvbXAgPSB7CisgICAgLmJMZW5ndGggPSBzaXplb2Yoc3Nfc291cmNlX2NvbXApLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKKyAgICAuYk1heEJ1cnN0ID0gNiwKK307CisKK2NvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2ludHJfY29tcCA9IHsKKyAgICAuYkxlbmd0aCA9IHNpemVvZihzc19pbnRyX2NvbXApLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKK307CisKK2NvbnN0IHN0cnVjdCBmdW5jX2Rlc2MgbXRwX2ZzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gZnNfc2luaywKKyAgICAuc291cmNlID0gZnNfc291cmNlLAorICAgIC5pbnRyID0gaW50ciwKK307CisKK2NvbnN0IHN0cnVjdCBmdW5jX2Rlc2MgbXRwX2hzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gaHNfc2luaywKKyAgICAuc291cmNlID0gaHNfc291cmNlLAorICAgIC5pbnRyID0gaW50ciwKK307CisKK2NvbnN0IHN0cnVjdCBzc19mdW5jX2Rlc2MgbXRwX3NzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gc3Nfc2luaywKKyAgICAuc2lua19jb21wID0gc3Nfc2lua19jb21wLAorICAgIC5zb3VyY2UgPSBzc19zb3VyY2UsCisgICAgLnNvdXJjZV9jb21wID0gc3Nfc291cmNlX2NvbXAsCisgICAgLmludHIgPSBpbnRyLAorICAgIC5pbnRyX2NvbXAgPSBzc19pbnRyX2NvbXAsCit9OworCitjb25zdCBzdHJ1Y3QgZnVuY19kZXNjIHB0cF9mc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IGZzX3NpbmssCisgICAgLnNvdXJjZSA9IGZzX3NvdXJjZSwKKyAgICAuaW50ciA9IGludHIsCit9OworCitjb25zdCBzdHJ1Y3QgZnVuY19kZXNjIHB0cF9oc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IGhzX3NpbmssCisgICAgLnNvdXJjZSA9IGhzX3NvdXJjZSwKKyAgICAuaW50ciA9IGludHIsCit9OworCitjb25zdCBzdHJ1Y3Qgc3NfZnVuY19kZXNjIHB0cF9zc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IHNzX3NpbmssCisgICAgLnNpbmtfY29tcCA9IHNzX3NpbmtfY29tcCwKKyAgICAuc291cmNlID0gc3Nfc291cmNlLAorICAgIC5zb3VyY2VfY29tcCA9IHNzX3NvdXJjZV9jb21wLAorICAgIC5pbnRyID0gaW50ciwKKyAgICAuaW50cl9jb21wID0gc3NfaW50cl9jb21wLAorfTsKKworY29uc3Qgc3RydWN0IGZ1bmN0aW9uZnNfc3RyaW5ncyBtdHBfc3RyaW5ncyA9IHsKKyAgICAuaGVhZGVyID0geworICAgICAgICAubWFnaWMgPSBodG9sZTMyKEZVTkNUSU9ORlNfU1RSSU5HU19NQUdJQyksCisgICAgICAgIC5sZW5ndGggPSBodG9sZTMyKHNpemVvZihtdHBfc3RyaW5ncykpLAorICAgICAgICAuc3RyX2NvdW50ID0gaHRvbGUzMigxKSwKKyAgICAgICAgLmxhbmdfY291bnQgPSBodG9sZTMyKDEpLAorICAgIH0sCisgICAgLmxhbmcwID0geworICAgICAgICAuY29kZSA9IGh0b2xlMTYoMHgwNDA5KSwKKyAgICAgICAgLnN0cjEgPSBTVFJfSU5URVJGQUNFLAorICAgIH0sCit9OworCitjb25zdCBzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG10cF9vc19kZXNjX2hlYWRlciA9IHsKKyAgICAuaW50ZXJmYWNlID0gaHRvbGUzMigxKSwKKyAgICAuZHdMZW5ndGggPSBodG9sZTMyKHNpemVvZih1c2Jfb3NfZGVzY19oZWFkZXIpICsgc2l6ZW9mKHVzYl9leHRfY29tcGF0X2Rlc2MpKSwKKyAgICAuYmNkVmVyc2lvbiA9IGh0b2xlMTYoMSksCisgICAgLndJbmRleCA9IGh0b2xlMTYoNCksCisgICAgLmJDb3VudCA9IGh0b2xlMTYoMSksCisgICAgLlJlc2VydmVkID0gaHRvbGUxNigwKSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZXh0X2NvbXBhdF9kZXNjIG10cF9vc19kZXNjX2NvbXBhdCA9IHsKKyAgICAuYkZpcnN0SW50ZXJmYWNlTnVtYmVyID0gMCwKKyAgICAuUmVzZXJ2ZWQxID0gaHRvbGUzMigxKSwKKyAgICAuQ29tcGF0aWJsZUlEID0geyAnTScsICdUJywgJ1AnIH0sCisgICAgLlN1YkNvbXBhdGlibGVJRCA9IHswfSwKKyAgICAuUmVzZXJ2ZWQyID0gezB9LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9leHRfY29tcGF0X2Rlc2MgcHRwX29zX2Rlc2NfY29tcGF0ID0geworICAgIC5iRmlyc3RJbnRlcmZhY2VOdW1iZXIgPSAwLAorICAgIC5SZXNlcnZlZDEgPSBodG9sZTMyKDEpLAorICAgIC5Db21wYXRpYmxlSUQgPSB7ICdQJywgJ1QnLCAnUCcgfSwKKyAgICAuU3ViQ29tcGF0aWJsZUlEID0gezB9LAorICAgIC5SZXNlcnZlZDIgPSB7MH0sCit9OworCitjb25zdCBzdHJ1Y3QgZGVzY192MiBtdHBfZGVzY192MiA9IHsKKyAgICAuaGVhZGVyID0geworICAgICAgICAubWFnaWMgPSBodG9sZTMyKEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUNfVjIpLAorICAgICAgICAubGVuZ3RoID0gaHRvbGUzMihzaXplb2Yoc3RydWN0IGRlc2NfdjIpKSwKKyAgICAgICAgLmZsYWdzID0gRlVOQ1RJT05GU19IQVNfRlNfREVTQyB8IEZVTkNUSU9ORlNfSEFTX0hTX0RFU0MgfAorICAgICAgICAgICAgICAgICBGVU5DVElPTkZTX0hBU19TU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfTVNfT1NfREVTQywKKyAgICB9LAorICAgIC5mc19jb3VudCA9IDQsCisgICAgLmhzX2NvdW50ID0gNCwKKyAgICAuc3NfY291bnQgPSA3LAorICAgIC5vc19jb3VudCA9IDEsCisgICAgLmZzX2Rlc2NzID0gbXRwX2ZzX2Rlc2NyaXB0b3JzLAorICAgIC5oc19kZXNjcyA9IG10cF9oc19kZXNjcmlwdG9ycywKKyAgICAuc3NfZGVzY3MgPSBtdHBfc3NfZGVzY3JpcHRvcnMsCisgICAgLm9zX2hlYWRlciA9IG10cF9vc19kZXNjX2hlYWRlciwKKyAgICAub3NfZGVzYyA9IG10cF9vc19kZXNjX2NvbXBhdCwKK307CisKK2NvbnN0IHN0cnVjdCBkZXNjX3YyIHB0cF9kZXNjX3YyID0geworICAgIC5oZWFkZXIgPSB7CisgICAgICAgIC5tYWdpYyA9IGh0b2xlMzIoRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQ19WMiksCisgICAgICAgIC5sZW5ndGggPSBodG9sZTMyKHNpemVvZihzdHJ1Y3QgZGVzY192MikpLAorICAgICAgICAuZmxhZ3MgPSBGVU5DVElPTkZTX0hBU19GU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfSFNfREVTQyB8CisgICAgICAgICAgICAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0MgfCBGVU5DVElPTkZTX0hBU19NU19PU19ERVNDLAorICAgIH0sCisgICAgLmZzX2NvdW50ID0gNCwKKyAgICAuaHNfY291bnQgPSA0LAorICAgIC5zc19jb3VudCA9IDcsCisgICAgLm9zX2NvdW50ID0gMSwKKyAgICAuZnNfZGVzY3MgPSBwdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gcHRwX2hzX2Rlc2NyaXB0b3JzLAorICAgIC5zc19kZXNjcyA9IHB0cF9zc19kZXNjcmlwdG9ycywKKyAgICAub3NfaGVhZGVyID0gbXRwX29zX2Rlc2NfaGVhZGVyLAorICAgIC5vc19kZXNjID0gcHRwX29zX2Rlc2NfY29tcGF0LAorfTsKKworY29uc3Qgc3RydWN0IGRlc2NfdjEgbXRwX2Rlc2NfdjEgPSB7CisgICAgLmhlYWRlciA9IHsKKyAgICAgICAgLm1hZ2ljID0gaHRvbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDKSwKKyAgICAgICAgLmxlbmd0aCA9IGh0b2xlMzIoc2l6ZW9mKHN0cnVjdCBkZXNjX3YxKSksCisgICAgICAgIC5mc19jb3VudCA9IDQsCisgICAgICAgIC5oc19jb3VudCA9IDQsCisgICAgfSwKKyAgICAuZnNfZGVzY3MgPSBtdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gbXRwX2hzX2Rlc2NyaXB0b3JzLAorfTsKKworY29uc3Qgc3RydWN0IGRlc2NfdjEgcHRwX2Rlc2NfdjEgPSB7CisgICAgLmhlYWRlciA9IHsKKyAgICAgICAgLm1hZ2ljID0gaHRvbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDKSwKKyAgICAgICAgLmxlbmd0aCA9IGh0b2xlMzIoc2l6ZW9mKHN0cnVjdCBkZXNjX3YxKSksCisgICAgICAgIC5mc19jb3VudCA9IDQsCisgICAgICAgIC5oc19jb3VudCA9IDQsCisgICAgfSwKKyAgICAuZnNfZGVzY3MgPSBwdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gcHRwX2hzX2Rlc2NyaXB0b3JzLAorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5oIGIvbWVkaWEvbXRwL010cERlc2NyaXB0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjMzkzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1UUF9ERVNDUklQVE9SU19ICisjZGVmaW5lIE1UUF9ERVNDUklQVE9SU19ICisKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2Z1bmN0aW9uZnMuaD4KKyNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGludCBNQVhfUEFDS0VUX1NJWkVfRlMgPSA2NDsKK2NvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX0hTID0gNTEyOworY29uc3RleHByIGludCBNQVhfUEFDS0VUX1NJWkVfU1MgPSAxMDI0OworY29uc3RleHByIGludCBNQVhfUEFDS0VUX1NJWkVfRVYgPSAyODsKKworc3RydWN0IGZ1bmNfZGVzYyB7CisgICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRmOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBzaW5rOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBzb3VyY2U7CisgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGludHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3NfZnVuY19kZXNjIHsKKyAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGludGY7CisgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNpbms7CisgICAgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc2lua19jb21wOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBzb3VyY2U7CisgICAgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc291cmNlX2NvbXA7CisgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGludHI7CisgICAgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgaW50cl9jb21wOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGRlc2NfdjEgeworICAgIHN0cnVjdCB1c2JfZnVuY3Rpb25mc19kZXNjc19oZWFkX3YxIHsKKyAgICAgICAgX19sZTMyIG1hZ2ljOworICAgICAgICBfX2xlMzIgbGVuZ3RoOworICAgICAgICBfX2xlMzIgZnNfY291bnQ7CisgICAgICAgIF9fbGUzMiBoc19jb3VudDsKKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGhlYWRlcjsKKyAgICBzdHJ1Y3QgZnVuY19kZXNjIGZzX2Rlc2NzLCBoc19kZXNjczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBkZXNjX3YyIHsKKyAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfZGVzY3NfaGVhZF92MiBoZWFkZXI7CisgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZSBkZXBlbmRzIG9uIHRoZSBmbGFncyBpbiB0aGUgaGVhZGVyLgorICAgIF9fbGUzMiBmc19jb3VudDsKKyAgICBfX2xlMzIgaHNfY291bnQ7CisgICAgX19sZTMyIHNzX2NvdW50OworICAgIF9fbGUzMiBvc19jb3VudDsKKyAgICBzdHJ1Y3QgZnVuY19kZXNjIGZzX2Rlc2NzLCBoc19kZXNjczsKKyAgICBzdHJ1Y3Qgc3NfZnVuY19kZXNjIHNzX2Rlc2NzOworICAgIHN0cnVjdCB1c2Jfb3NfZGVzY19oZWFkZXIgb3NfaGVhZGVyOworICAgIHN0cnVjdCB1c2JfZXh0X2NvbXBhdF9kZXNjIG9zX2Rlc2M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyBPUyBkZXNjcmlwdG9yIGNvbnRlbnRzIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gU2VlIGIvNjQ3OTA1MzYuCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZGVzY192MikgPT0gc2l6ZW9mKHVzYl9mdW5jdGlvbmZzX2Rlc2NzX2hlYWRfdjIpICsKKyAgICAgICAgMTYgKyAyICogc2l6ZW9mKHN0cnVjdCBmdW5jX2Rlc2MpICsgc2l6ZW9mKHN0cnVjdCBzc19mdW5jX2Rlc2MpICsKKyAgICAgICAgc2l6ZW9mKHVzYl9vc19kZXNjX2hlYWRlcikgKyBzaXplb2YodXNiX2V4dF9jb21wYXRfZGVzYyksCisgICAgICAgICJTaXplIG9mIG10cCBkZXNjcmlwdG9yIGlzIGluY29ycmVjdCEiKTsKKworI2RlZmluZSBTVFJfSU5URVJGQUNFICJNVFAiCitzdHJ1Y3QgZnVuY3Rpb25mc19sYW5nIHsKKyAgICBfX2xlMTYgY29kZTsKKyAgICBjaGFyIHN0cjFbc2l6ZW9mKFNUUl9JTlRFUkZBQ0UpXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBmdW5jdGlvbmZzX3N0cmluZ3MgeworICAgIHN0cnVjdCB1c2JfZnVuY3Rpb25mc19zdHJpbmdzX2hlYWQgaGVhZGVyOworICAgIHN0cnVjdCBmdW5jdGlvbmZzX2xhbmcgbGFuZzA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitleHRlcm4gY29uc3Qgc3RydWN0IGRlc2NfdjIgbXRwX2Rlc2NfdjI7CitleHRlcm4gY29uc3Qgc3RydWN0IGRlc2NfdjIgcHRwX2Rlc2NfdjI7CitleHRlcm4gY29uc3Qgc3RydWN0IGRlc2NfdjEgbXRwX2Rlc2NfdjE7CitleHRlcm4gY29uc3Qgc3RydWN0IGRlc2NfdjEgcHRwX2Rlc2NfdjE7CitleHRlcm4gY29uc3Qgc3RydWN0IGZ1bmN0aW9uZnNfc3RyaW5ncyBtdHBfc3RyaW5nczsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIE1UUF9ERVNDUklQVE9SU19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2SGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCmluZGV4IDlhYTBhZWMuLjZhYTU3YWMgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCkBAIC0xNCw1NyArMTQsMzcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgIklNdHBIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBEZXZIYW5kbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdGV4cHIgY2hhciBtdHBfZGV2X3BhdGhbXSA9ICIvZGV2L210cF91c2IiOwogCi1jbGFzcyBNdHBEZXZIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Ci1wcml2YXRlOgotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtRmQ7Ci0KLXB1YmxpYzoKLSAgICBNdHBEZXZIYW5kbGUoKTsKLSAgICB+TXRwRGV2SGFuZGxlKCk7Ci0gICAgaW50IHJlYWQodm9pZCAqZGF0YSwgaW50IGxlbik7Ci0gICAgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOwotCi0gICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCk7Ci0gICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcik7Ci0gICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpOwotCi0gICAgaW50IHN0YXJ0KCk7Ci0gICAgdm9pZCBjbG9zZSgpOwotCi0gICAgaW50IGNvbmZpZ3VyZShib29sIHB0cCk7Ci19OwotCiBNdHBEZXZIYW5kbGU6Ok10cERldkhhbmRsZSgpCiAgICAgOiBtRmQoLTEpIHt9OwogCiBNdHBEZXZIYW5kbGU6On5NdHBEZXZIYW5kbGUoKSB7fQogCi1pbnQgTXRwRGV2SGFuZGxlOjpyZWFkKHZvaWQgKmRhdGEsIGludCBsZW4pIHsKK2ludCBNdHBEZXZIYW5kbGU6OnJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgewogICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBsZW4pOwogfQogCi1pbnQgTXRwRGV2SGFuZGxlOjp3cml0ZShjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKSB7CitpbnQgTXRwRGV2SGFuZGxlOjp3cml0ZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7CiAgICAgcmV0dXJuIDo6d3JpdGUobUZkLCBkYXRhLCBsZW4pOwogfQogCkBAIC04MSw3ICs2MSw3IEBACiB9CiAKIGludCBNdHBEZXZIYW5kbGU6OnN0YXJ0KCkgewotICAgIG1GZCA9IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihtdHBfZGV2X3BhdGgsIE9fUkRXUikpKTsKKyAgICBtRmQucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4obXRwX2Rldl9wYXRoLCBPX1JEV1IpKSk7CiAgICAgaWYgKG1GZCA9PSAtMSkgcmV0dXJuIC0xOwogICAgIHJldHVybiAwOwogfQpAQCAtOTUsNiArNzUsNCBAQAogICAgIHJldHVybiAwOwogfQogCi1JTXRwSGFuZGxlICpnZXRfbXRwX2hhbmRsZSgpIHsKLSAgICByZXR1cm4gbmV3IE10cERldkhhbmRsZSgpOwotfQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldkhhbmRsZS5oIGIvbWVkaWEvbXRwL010cERldkhhbmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDgwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2SGFuZGxlLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERVZfSEFORExFX0gKKyNkZWZpbmUgX01UUF9ERVZfSEFORExFX0gKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlICJJTXRwSGFuZGxlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGV2SGFuZGxlIDogcHVibGljIElNdHBIYW5kbGUgeworcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgbUZkOworCitwdWJsaWM6CisgICAgTXRwRGV2SGFuZGxlKCk7CisgICAgfk10cERldkhhbmRsZSgpOworICAgIGludCByZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworICAgIGludCB3cml0ZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKKworICAgIGludCByZWNlaXZlRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIsIGJvb2wpOworICAgIGludCBzZW5kRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIpOworICAgIGludCBzZW5kRXZlbnQobXRwX2V2ZW50IG1lKTsKKworICAgIGludCBzdGFydCgpOworICAgIHZvaWQgY2xvc2UoKTsKKworICAgIGludCBjb25maWd1cmUoYm9vbCBwdHApOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9GRlNfSEFORExFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNDb21wYXRIYW5kbGUuY3BwIGIvbWVkaWEvbXRwL010cEZmc0NvbXBhdEhhbmRsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkNzNmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBGZnNDb21wYXRIYW5kbGUuY3BwCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9mdW5jdGlvbmZzLmg+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiUG9zaXhBc3luY0lPLmgiCisjaW5jbHVkZSAiTXRwRmZzQ29tcGF0SGFuZGxlLmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNkZWZpbmUgRlVOQ1RJT05GU19FTkRQT0lOVF9BTExPQyAgICAgICBfSU9SKCdnJywgMjMxLCBfX3UzMikKKworbmFtZXNwYWNlIHsKKworLy8gTXVzdCBiZSBkaXZpc2libGUgYnkgYWxsIG1heCBwYWNrZXQgc2l6ZSB2YWx1ZXMKK2NvbnN0ZXhwciBpbnQgTUFYX0ZJTEVfQ0hVTktfU0laRSA9IDMxNDU3Mjg7CisKKy8vIFNhZmUgdmFsdWVzIHNpbmNlIHNvbWUgZGV2aWNlcyBjYW5ub3QgaGFuZGxlIGxhcmdlIERNQXMKKy8vIFRvIGdldCBnb29kIHBlcmZvcm1hbmNlLCBvdmVycmlkZSB0aGVzZSB3aXRoCisvLyBoaWdoZXIgdmFsdWVzIHBlciBkZXZpY2UgdXNpbmcgdGhlIHByb3BlcnRpZXMKKy8vIHN5cy51c2IuZmZzLm1heF9yZWFkIGFuZCBzeXMudXNiLmZmcy5tYXhfd3JpdGUKK2NvbnN0ZXhwciBpbnQgVVNCX0ZGU19NQVhfV1JJVEUgPSBNVFBfQlVGRkVSX1NJWkU7Citjb25zdGV4cHIgaW50IFVTQl9GRlNfTUFYX1JFQUQgPSBNVFBfQlVGRkVSX1NJWkU7CisKK3N0YXRpY19hc3NlcnQoVVNCX0ZGU19NQVhfV1JJVEUgPiAwLCAiTWF4IHIvdyB2YWx1ZXMgbXVzdCBiZSA+IDAhIik7CitzdGF0aWNfYXNzZXJ0KFVTQl9GRlNfTUFYX1JFQUQgPiAwLCAiTWF4IHIvdyB2YWx1ZXMgbXVzdCBiZSA+IDAhIik7CisKK2NvbnN0ZXhwciB1bnNpZ25lZCBpbnQgTUFYX01UUF9GSUxFX1NJWkUgPSAweEZGRkZGRkZGOworCitjb25zdGV4cHIgc2l6ZV90IEVORFBPSU5UX0FMTE9DX1JFVFJJRVMgPSAxMDsKKworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRmZzQ29tcGF0SGFuZGxlOjpNdHBGZnNDb21wYXRIYW5kbGUoKSA6CisgICAgbU1heFdyaXRlKFVTQl9GRlNfTUFYX1dSSVRFKSwKKyAgICBtTWF4UmVhZChVU0JfRkZTX01BWF9SRUFEKSB7fQorCitNdHBGZnNDb21wYXRIYW5kbGU6On5NdHBGZnNDb21wYXRIYW5kbGUoKSB7fQorCitpbnQgTXRwRmZzQ29tcGF0SGFuZGxlOjp3cml0ZUhhbmRsZShpbnQgZmQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBjb25zdCBjaGFyKiBidWYgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaW50IHdyaXRlX2xlbiA9IHN0ZDo6bWluKG1NYXhXcml0ZSwgbGVuKTsKKyAgICAgICAgaW50IG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShmZCwgYnVmLCB3cml0ZV9sZW4pKTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobiA8IHdyaXRlX2xlbikgeworICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibGVzcyB3cml0dGVuIHRoYW4gZXhwZWN0ZWQiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSBuOworICAgICAgICBsZW4gLT0gbjsKKyAgICAgICAgcmV0ICs9IG47CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBNdHBGZnNDb21wYXRIYW5kbGU6OnJlYWRIYW5kbGUoaW50IGZkLCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgY2hhciogYnVmID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGRhdGEpOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGludCByZWFkX2xlbiA9IHN0ZDo6bWluKG1NYXhSZWFkLCBsZW4pOworICAgICAgICBpbnQgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OnJlYWQoZmQsIGJ1ZiwgcmVhZF9sZW4pKTsKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVhZCBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0ICs9IG47CisgICAgICAgIGlmIChuIDwgcmVhZF9sZW4pIC8vIGRvbmUgcmVhZGluZyBlYXJseQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZiArPSBuOworICAgICAgICBsZW4gLT0gbjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cEZmc0NvbXBhdEhhbmRsZTo6c3RhcnQoKSB7CisgICAgbUxvY2subG9jaygpOworCisgICAgaWYgKCFvcGVuRW5kcG9pbnRzKCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOVU1fSU9fQlVGUzsgaSsrKSB7CisgICAgICAgIG1Jb2J1ZltpXS5idWZzLnJlc2l6ZShNQVhfRklMRV9DSFVOS19TSVpFKTsKKyAgICAgICAgcG9zaXhfbWFkdmlzZShtSW9idWZbaV0uYnVmcy5kYXRhKCksIE1BWF9GSUxFX0NIVU5LX1NJWkUsCisgICAgICAgICAgICAgICAgUE9TSVhfTUFEVl9TRVFVRU5USUFMIHwgUE9TSVhfTUFEVl9XSUxMTkVFRCk7CisgICAgfQorCisgICAgLy8gR2V0IGRldmljZSBzcGVjaWZpYyByL3cgc2l6ZQorICAgIG1NYXhXcml0ZSA9IGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJzeXMudXNiLmZmcy5tYXhfd3JpdGUiLCBVU0JfRkZTX01BWF9XUklURSk7CisgICAgbU1heFJlYWQgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgic3lzLnVzYi5mZnMubWF4X3JlYWQiLCBVU0JfRkZTX01BWF9SRUFEKTsKKworICAgIHNpemVfdCBhdHRlbXB0cyA9IDA7CisgICAgd2hpbGUgKG1NYXhXcml0ZSA+PSBVU0JfRkZTX01BWF9XUklURSAmJiBtTWF4UmVhZCA+PSBVU0JfRkZTX01BWF9SRUFEICYmCisgICAgICAgICAgICBhdHRlbXB0cyA8IEVORFBPSU5UX0FMTE9DX1JFVFJJRVMpIHsKKyAgICAgICAgLy8gSWYgbGFyZ2VyIGNvbnRpZ3VvdXMgY2h1bmtzIG9mIG1lbW9yeSBhcmVuJ3QgYXZhaWxhYmxlLCBhdHRlbXB0IHRvIHRyeQorICAgICAgICAvLyBzbWFsbGVyIGFsbG9jYXRpb25zLgorICAgICAgICBpZiAoaW9jdGwobUJ1bGtJbiwgRlVOQ1RJT05GU19FTkRQT0lOVF9BTExPQywgc3RhdGljX2Nhc3Q8X191MzI+KG1NYXhXcml0ZSkpIHx8CisgICAgICAgICAgICBpb2N0bChtQnVsa091dCwgRlVOQ1RJT05GU19FTkRQT0lOVF9BTExPQywgc3RhdGljX2Nhc3Q8X191MzI+KG1NYXhSZWFkKSkpIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9ERVYpIHsKKyAgICAgICAgICAgICAgICAvLyBEcml2ZXIgaGFzbid0IGVuYWJsZWQgZW5kcG9pbnRzIHlldC4KKyAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgICAgICAgICAgICAgICBhdHRlbXB0cyArPSAxOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1heFdyaXRlIC89IDI7CisgICAgICAgICAgICBtTWF4UmVhZCAvPTI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUcnkgdG8gc3RhcnQgTXRwU2VydmVyIGFueXdheSwgd2l0aCB0aGUgc21hbGxlc3QgbWF4IHIvdyB2YWx1ZXMKKyAgICBtTWF4V3JpdGUgPSBVU0JfRkZTX01BWF9XUklURTsKKyAgICBtTWF4UmVhZCA9IFVTQl9GRlNfTUFYX1JFQUQ7CisgICAgUExPRyhFUlJPUikgPDwgIkZ1bmN0aW9uZnMgY291bGQgbm90IGFsbG9jYXRlIGFueSBtZW1vcnkhIjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IE10cEZmc0NvbXBhdEhhbmRsZTo6cmVhZCh2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7CisgICAgcmV0dXJuIHJlYWRIYW5kbGUobUJ1bGtPdXQsIGRhdGEsIGxlbik7Cit9CisKK2ludCBNdHBGZnNDb21wYXRIYW5kbGU6OndyaXRlKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICByZXR1cm4gd3JpdGVIYW5kbGUobUJ1bGtJbiwgZGF0YSwgbGVuKTsKK30KKworaW50IE10cEZmc0NvbXBhdEhhbmRsZTo6cmVjZWl2ZUZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyLCBib29sIHplcm9fcGFja2V0KSB7CisgICAgLy8gV2hlbiByZWNlaXZpbmcgZmlsZXMsIHRoZSBpbmNvbWluZyBsZW5ndGggaXMgZ2l2ZW4gaW4gMzIgYml0cy4KKyAgICAvLyBBID40RyBmaWxlIGlzIGdpdmVuIGFzIDB4RkZGRkZGRkYKKyAgICB1aW50MzJfdCBmaWxlX2xlbmd0aCA9IG1mci5sZW5ndGg7CisgICAgdWludDY0X3Qgb2Zmc2V0ID0gbWZyLm9mZnNldDsKKyAgICBpbnQgcGFja2V0X3NpemUgPSBnZXRQYWNrZXRTaXplKG1CdWxrT3V0KTsKKworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtSW9idWZbMF0uYnVmcy5kYXRhKCk7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YTIgPSBtSW9idWZbMV0uYnVmcy5kYXRhKCk7CisKKyAgICBzdHJ1Y3QgYWlvY2IgYWlvOworICAgIGFpby5haW9fZmlsZGVzID0gbWZyLmZkOworICAgIGFpby5haW9fYnVmID0gbnVsbHB0cjsKKyAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBib29sIHJlYWQgPSBmYWxzZTsKKyAgICBib29sIHdyaXRlID0gZmFsc2U7CisKKyAgICBwb3NpeF9mYWR2aXNlKG1mci5mZCwgMCwgMCwgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFKTsKKworICAgIC8vIEJyZWFrIGRvd24gdGhlIGZpbGUgaW50byBwaWVjZXMgdGhhdCBmaXQgaW4gYnVmZmVycworICAgIHdoaWxlIChmaWxlX2xlbmd0aCA+IDAgfHwgd3JpdGUpIHsKKyAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbGVuZ3RoID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1BWF9GSUxFX0NIVU5LX1NJWkUpLCBmaWxlX2xlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIFJlYWQgZGF0YSBmcm9tIFVTQiwgaGFuZGxlIGVycm9ycyBhZnRlciB3YWl0aW5nIGZvciB3cml0ZSB0aHJlYWQuCisgICAgICAgICAgICByZXQgPSByZWFkSGFuZGxlKG1CdWxrT3V0LCBkYXRhLCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoZmlsZV9sZW5ndGggIT0gTUFYX01UUF9GSUxFX1NJWkUgJiYgcmV0IDwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3cml0ZSkgeworICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoZSBsYXN0IHdyaXRlIHJlcXVlc3QKKyAgICAgICAgICAgIGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpOworCisgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IGFpb19yZXR1cm4oJmFpbyk7CisgICAgICAgICAgICBpZiAod3JpdHRlbiA9PSAtMSkgeworICAgICAgICAgICAgICAgIGVycm5vID0gYWlvX2Vycm9yKCZhaW8pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHdyaXR0ZW4pIDwgYWlvLmFpb19uYnl0ZXMpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgYWJvdmUKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlYWQpIHsKKyAgICAgICAgICAgIGlmIChmaWxlX2xlbmd0aCA9PSBNQVhfTVRQX0ZJTEVfU0laRSkgeworICAgICAgICAgICAgICAgIC8vIEZvciBsYXJnZXIgZmlsZXMsIHJlY2VpdmUgdW50aWwgYSBzaG9ydCBwYWNrZXQgaXMgcmVjZWl2ZWQuCisgICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBmaWxlX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxlX2xlbmd0aCAtPSByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFbnF1ZXVlIGEgbmV3IHdyaXRlIHJlcXVlc3QKKyAgICAgICAgICAgIGFpb19wcmVwYXJlKCZhaW8sIGRhdGEsIGxlbmd0aCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGFpb193cml0ZSgmYWlvKTsKKworICAgICAgICAgICAgb2Zmc2V0ICs9IHJldDsKKyAgICAgICAgICAgIHN0ZDo6c3dhcChkYXRhLCBkYXRhMik7CisKKyAgICAgICAgICAgIHdyaXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlYWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBSZWNlaXZlIGFuIGVtcHR5IHBhY2tldCBpZiBzaXplIGlzIGEgbXVsdGlwbGUgb2YgdGhlIGVuZHBvaW50IHNpemUuCisgICAgaWYgKHJldCAlIHBhY2tldF9zaXplID09IDAgfHwgemVyb19wYWNrZXQpIHsKKyAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSg6OnJlYWQobUJ1bGtPdXQsIGRhdGEsIHBhY2tldF9zaXplKSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgTXRwRmZzQ29tcGF0SGFuZGxlOjpzZW5kRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIpIHsKKyAgICB1aW50NjRfdCBmaWxlX2xlbmd0aCA9IG1mci5sZW5ndGg7CisgICAgdWludDMyX3QgZ2l2ZW5fbGVuZ3RoID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE1BWF9NVFBfRklMRV9TSVpFKSwKKyAgICAgICAgICAgIGZpbGVfbGVuZ3RoICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpOworICAgIHVpbnQ2NF90IG9mZnNldCA9IG1mci5vZmZzZXQ7CisgICAgaW50IHBhY2tldF9zaXplID0gZ2V0UGFja2V0U2l6ZShtQnVsa0luKTsKKworICAgIC8vIElmIGZpbGVfbGVuZ3RoIGlzIGxhcmdlciB0aGFuIGEgc2l6ZV90LCB0cnVuY2F0aW5nIHdvdWxkIHByb2R1Y2UgdGhlIHdyb25nIGNvbXBhcmlzb24uCisgICAgLy8gSW5zdGVhZCwgcHJvbW90ZSB0aGUgbGVmdCBzaWRlIHRvIDY0IGJpdHMsIHRoZW4gdHJ1bmNhdGUgdGhlIHNtYWxsIHJlc3VsdC4KKyAgICBpbnQgaW5pdF9yZWFkX2xlbiA9IHN0ZDo6bWluKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHBhY2tldF9zaXplIC0gc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpLCBmaWxlX2xlbmd0aCk7CisKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhID0gbUlvYnVmWzBdLmJ1ZnMuZGF0YSgpOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEyID0gbUlvYnVmWzFdLmJ1ZnMuZGF0YSgpOworCisgICAgcG9zaXhfZmFkdmlzZShtZnIuZmQsIDAsIDAsIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSk7CisKKyAgICBzdHJ1Y3QgYWlvY2IgYWlvOworICAgIGFpby5haW9fZmlsZGVzID0gbWZyLmZkOworICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OworICAgIGludCByZXQsIGxlbmd0aDsKKyAgICBpbnQgZXJyb3IgPSAwOworICAgIGJvb2wgcmVhZCA9IGZhbHNlOworICAgIGJvb2wgd3JpdGUgPSBmYWxzZTsKKworICAgIC8vIFNlbmQgdGhlIGhlYWRlciBkYXRhCisgICAgbXRwX2RhdGFfaGVhZGVyICpoZWFkZXIgPSByZWludGVycHJldF9jYXN0PG10cF9kYXRhX2hlYWRlcio+KGRhdGEpOworICAgIGhlYWRlci0+bGVuZ3RoID0gaHRvbGUzMihnaXZlbl9sZW5ndGgpOworICAgIGhlYWRlci0+dHlwZSA9IGh0b2xlMTYoMik7IC8qIGRhdGEgcGFja2V0ICovCisgICAgaGVhZGVyLT5jb21tYW5kID0gaHRvbGUxNihtZnIuY29tbWFuZCk7CisgICAgaGVhZGVyLT50cmFuc2FjdGlvbl9pZCA9IGh0b2xlMzIobWZyLnRyYW5zYWN0aW9uX2lkKTsKKworICAgIC8vIFNvbWUgaG9zdHMgZG9uJ3Qgc3VwcG9ydCBoZWFkZXIvZGF0YSBzZXBhcmF0aW9uIGV2ZW4gdGhvdWdoIE1UUCBhbGxvd3MgaXQKKyAgICAvLyBIYW5kbGUgYnkgZmlsbGluZyBmaXJzdCBwYWNrZXQgd2l0aCBpbml0aWFsIGZpbGUgZGF0YQorICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkocHJlYWQobWZyLmZkLCByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhKSArCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpLCBpbml0X3JlYWRfbGVuLCBvZmZzZXQpKQorICAgICAgICAgICAgIT0gaW5pdF9yZWFkX2xlbikgcmV0dXJuIC0xOworICAgIGlmICh3cml0ZUhhbmRsZShtQnVsa0luLCBkYXRhLCBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSArIGluaXRfcmVhZF9sZW4pID09IC0xKSByZXR1cm4gLTE7CisgICAgZmlsZV9sZW5ndGggLT0gaW5pdF9yZWFkX2xlbjsKKyAgICBvZmZzZXQgKz0gaW5pdF9yZWFkX2xlbjsKKyAgICByZXQgPSBpbml0X3JlYWRfbGVuICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcik7CisKKyAgICAvLyBCcmVhayBkb3duIHRoZSBmaWxlIGludG8gcGllY2VzIHRoYXQgZml0IGluIGJ1ZmZlcnMKKyAgICB3aGlsZSAoZmlsZV9sZW5ndGggPiAwKSB7CisgICAgICAgIGlmIChyZWFkKSB7CisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgcHJldmlvdXMgcmVhZCB0byBmaW5pc2gKKyAgICAgICAgICAgIGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpOworICAgICAgICAgICAgcmV0ID0gYWlvX3JldHVybigmYWlvKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IGFpb19lcnJvcigmYWlvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYWlvLmFpb19uYnl0ZXMpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbGVfbGVuZ3RoIC09IHJldDsKKyAgICAgICAgICAgIG9mZnNldCArPSByZXQ7CisgICAgICAgICAgICBzdGQ6OnN3YXAoZGF0YSwgZGF0YTIpOworICAgICAgICAgICAgcmVhZCA9IGZhbHNlOworICAgICAgICAgICAgd3JpdGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVycm9yID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsZV9sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBsZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTUFYX0ZJTEVfQ0hVTktfU0laRSksIGZpbGVfbGVuZ3RoKTsKKyAgICAgICAgICAgIC8vIFF1ZXVlIHVwIGFub3RoZXIgcmVhZAorICAgICAgICAgICAgYWlvX3ByZXBhcmUoJmFpbywgZGF0YSwgbGVuZ3RoLCBvZmZzZXQpOworICAgICAgICAgICAgYWlvX3JlYWQoJmFpbyk7CisgICAgICAgICAgICByZWFkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3cml0ZSkgeworICAgICAgICAgICAgaWYgKHdyaXRlSGFuZGxlKG1CdWxrSW4sIGRhdGEyLCByZXQpID09IC0xKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0ICUgcGFja2V0X3NpemUgPT0gMCkgeworICAgICAgICAvLyBJZiB0aGUgbGFzdCBwYWNrZXQgd2Fzbid0IHNob3J0LCBzZW5kIGEgZmluYWwgZW1wdHkgcGFja2V0CisgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShtQnVsa0luLCBkYXRhLCAwKSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0NvbXBhdEhhbmRsZS5oIGIvbWVkaWEvbXRwL010cEZmc0NvbXBhdEhhbmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjE0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRmZzQ29tcGF0SGFuZGxlLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9GRlNfQ09NUEFUX0hBTkRMRV9ICisjZGVmaW5lIF9NVFBfRkZTX0NPTVBBVF9IQU5ETEVfSAorCisjaW5jbHVkZSA8TXRwRmZzSGFuZGxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIE10cEZmc0hhbmRsZVRlc3Q7CisKK2NsYXNzIE10cEZmc0NvbXBhdEhhbmRsZSA6IHB1YmxpYyBNdHBGZnNIYW5kbGUgeworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBmcmllbmQgY2xhc3MgYW5kcm9pZDo6TXRwRmZzSGFuZGxlVGVzdDsKK3ByaXZhdGU6CisgICAgaW50IHdyaXRlSGFuZGxlKGludCBmZCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisgICAgaW50IHJlYWRIYW5kbGUoaW50IGZkLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKKworICAgIHNpemVfdCBtTWF4V3JpdGU7CisgICAgc2l6ZV90IG1NYXhSZWFkOworCitwdWJsaWM6CisgICAgaW50IHJlYWQodm9pZCogZGF0YSwgc2l6ZV90IGxlbikgb3ZlcnJpZGU7CisgICAgaW50IHdyaXRlKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIG92ZXJyaWRlOworICAgIGludCByZWNlaXZlRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIsIGJvb2wgemVyb19wYWNrZXQpIG92ZXJyaWRlOworICAgIGludCBzZW5kRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogT3BlbiBmZnMgZW5kcG9pbnRzIGFuZCBhbGxvY2F0ZSBuZWNlc3Nhcnkga2VybmVsIGFuZCB1c2VyIG1lbW9yeS4KKyAgICAgKiBXaWxsIHNsZWVwIHVudGlsIGVuZHBvaW50cyBhcmUgZW5hYmxlZCwgZm9yIHVwIHRvIDEgc2Vjb25kLgorICAgICAqLworICAgIGludCBzdGFydCgpIG92ZXJyaWRlOworCisgICAgTXRwRmZzQ29tcGF0SGFuZGxlKCk7CisgICAgfk10cEZmc0NvbXBhdEhhbmRsZSgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9GRlNfQ09NUEFUX0hBTkRMRV9ICisKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKaW5kZXggOTEzOTkyNS4uMjE3ZTBjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKQEAgLTE2LDMwNiArMTYsNDMgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhc3luY2lvL0FzeW5jSU8uaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9mdW5jdGlvbmZzLmg+Ci0jaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL2VuZGlhbi5oPgorI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiQXN5bmNJTy5oIgorI2luY2x1ZGUgIlBvc2l4QXN5bmNJTy5oIgorI2luY2x1ZGUgIk10cERlc2NyaXB0b3JzLmgiCiAjaW5jbHVkZSAiTXRwRmZzSGFuZGxlLmgiCiAjaW5jbHVkZSAibXRwLmgiCiAKLSNkZWZpbmUgY3B1X3RvX2xlMTYoeCkgIGh0b2xlMTYoeCkKLSNkZWZpbmUgY3B1X3RvX2xlMzIoeCkgIGh0b2xlMzIoeCkKLQotI2RlZmluZSBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DICAgICAgIF9JT1IoJ2cnLCAyMzEsIF9fdTMyKQotCiBuYW1lc3BhY2UgewogCiBjb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQX0lOW10gPSAiL2Rldi91c2ItZmZzL210cC9lcDEiOwogY29uc3RleHByIGNoYXIgRkZTX01UUF9FUF9PVVRbXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMiI7CiBjb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQX0lOVFJbXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMyI7CiAKLWNvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX0ZTID0gNjQ7Ci1jb25zdGV4cHIgaW50IE1BWF9QQUNLRVRfU0laRV9IUyA9IDUxMjsKLWNvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX1NTID0gMTAyNDsKLQotLy8gTXVzdCBiZSBkaXZpc2libGUgYnkgYWxsIG1heCBwYWNrZXQgc2l6ZSB2YWx1ZXMKLWNvbnN0ZXhwciBpbnQgTUFYX0ZJTEVfQ0hVTktfU0laRSA9IDMxNDU3Mjg7Ci0KLS8vIFNhZmUgdmFsdWVzIHNpbmNlIHNvbWUgZGV2aWNlcyBjYW5ub3QgaGFuZGxlIGxhcmdlIERNQXMKLS8vIFRvIGdldCBnb29kIHBlcmZvcm1hbmNlLCBvdmVycmlkZSB0aGVzZSB3aXRoCi0vLyBoaWdoZXIgdmFsdWVzIHBlciBkZXZpY2UgdXNpbmcgdGhlIHByb3BlcnRpZXMKLS8vIHN5cy51c2IuZmZzLm1heF9yZWFkIGFuZCBzeXMudXNiLmZmcy5tYXhfd3JpdGUKLWNvbnN0ZXhwciBpbnQgVVNCX0ZGU19NQVhfV1JJVEUgPSBNVFBfQlVGRkVSX1NJWkU7Ci1jb25zdGV4cHIgaW50IFVTQl9GRlNfTUFYX1JFQUQgPSBNVFBfQlVGRkVSX1NJWkU7Citjb25zdGV4cHIgdW5zaWduZWQgQUlPX0JVRlNfTUFYID0gMTI4OworY29uc3RleHByIHVuc2lnbmVkIEFJT19CVUZfTEVOID0gMTYzODQ7CiAKIGNvbnN0ZXhwciB1bnNpZ25lZCBGRlNfTlVNX0VWRU5UUyA9IDU7CiAKLXN0YXRpY19hc3NlcnQoVVNCX0ZGU19NQVhfV1JJVEUgPiAwLCAiTWF4IHIvdyB2YWx1ZXMgbXVzdCBiZSA+IDAhIik7Ci1zdGF0aWNfYXNzZXJ0KFVTQl9GRlNfTUFYX1JFQUQgPiAwLCAiTWF4IHIvdyB2YWx1ZXMgbXVzdCBiZSA+IDAhIik7Citjb25zdGV4cHIgdW5zaWduZWQgTUFYX0ZJTEVfQ0hVTktfU0laRSA9IEFJT19CVUZTX01BWCAqIEFJT19CVUZfTEVOOwogCi1jb25zdGV4cHIgdW5zaWduZWQgaW50IE1BWF9NVFBfRklMRV9TSVpFID0gMHhGRkZGRkZGRjsKK2NvbnN0ZXhwciB1aW50MzJfdCBNQVhfTVRQX0ZJTEVfU0laRSA9IDB4RkZGRkZGRkY7CiAKLWNvbnN0ZXhwciBzaXplX3QgRU5EUE9JTlRfQUxMT0NfUkVUUklFUyA9IDEwOwotCi1zdHJ1Y3QgZnVuY19kZXNjIHsKLSAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGludGY7Ci0gICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNpbms7Ci0gICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNvdXJjZTsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gaW50cjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBzc19mdW5jX2Rlc2MgewotICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50ZjsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc2luazsKLSAgICBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzaW5rX2NvbXA7Ci0gICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNvdXJjZTsKLSAgICBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzb3VyY2VfY29tcDsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gaW50cjsKLSAgICBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBpbnRyX2NvbXA7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZGVzY192MSB7Ci0gICAgc3RydWN0IHVzYl9mdW5jdGlvbmZzX2Rlc2NzX2hlYWRfdjEgewotICAgICAgICBfX2xlMzIgbWFnaWM7Ci0gICAgICAgIF9fbGUzMiBsZW5ndGg7Ci0gICAgICAgIF9fbGUzMiBmc19jb3VudDsKLSAgICAgICAgX19sZTMyIGhzX2NvdW50OwotICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgaGVhZGVyOwotICAgIHN0cnVjdCBmdW5jX2Rlc2MgZnNfZGVzY3MsIGhzX2Rlc2NzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGRlc2NfdjIgewotICAgIHN0cnVjdCB1c2JfZnVuY3Rpb25mc19kZXNjc19oZWFkX3YyIGhlYWRlcjsKLSAgICAvLyBUaGUgcmVzdCBvZiB0aGUgc3RydWN0dXJlIGRlcGVuZHMgb24gdGhlIGZsYWdzIGluIHRoZSBoZWFkZXIuCi0gICAgX19sZTMyIGZzX2NvdW50OwotICAgIF9fbGUzMiBoc19jb3VudDsKLSAgICBfX2xlMzIgc3NfY291bnQ7Ci0gICAgX19sZTMyIG9zX2NvdW50OwotICAgIHN0cnVjdCBmdW5jX2Rlc2MgZnNfZGVzY3MsIGhzX2Rlc2NzOwotICAgIHN0cnVjdCBzc19mdW5jX2Rlc2Mgc3NfZGVzY3M7Ci0gICAgc3RydWN0IHVzYl9vc19kZXNjX2hlYWRlciBvc19oZWFkZXI7Ci0gICAgc3RydWN0IHVzYl9leHRfY29tcGF0X2Rlc2Mgb3NfZGVzYzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLWNvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgbXRwX2ludGVyZmFjZV9kZXNjID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0lOVEVSRkFDRV9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSU5URVJGQUNFLAotICAgIC5iSW50ZXJmYWNlTnVtYmVyID0gMCwKLSAgICAuYk51bUVuZHBvaW50cyA9IDMsCi0gICAgLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19TVElMTF9JTUFHRSwKLSAgICAuYkludGVyZmFjZVN1YkNsYXNzID0gMSwKLSAgICAuYkludGVyZmFjZVByb3RvY29sID0gMSwKLSAgICAuaUludGVyZmFjZSA9IDEsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIHB0cF9pbnRlcmZhY2VfZGVzYyA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9JTlRFUkZBQ0VfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0lOVEVSRkFDRSwKLSAgICAuYkludGVyZmFjZU51bWJlciA9IDAsCi0gICAgLmJOdW1FbmRwb2ludHMgPSAzLAotICAgIC5iSW50ZXJmYWNlQ2xhc3MgPSBVU0JfQ0xBU1NfU1RJTExfSU1BR0UsCi0gICAgLmJJbnRlcmZhY2VTdWJDbGFzcyA9IDEsCi0gICAgLmJJbnRlcmZhY2VQcm90b2NvbCA9IDEsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gZnNfc2luayA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAxIHwgVVNCX0RJUl9JTiwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfRlMsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gZnNfc291cmNlID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDIgfCBVU0JfRElSX09VVCwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfRlMsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gZnNfaW50ciA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAzIHwgVVNCX0RJUl9JTiwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKLSAgICAuYkludGVydmFsID0gNiwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBoc19zaW5rID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDEgfCBVU0JfRElSX0lOLAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9IUywKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBoc19zb3VyY2UgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMiB8IFVTQl9ESVJfT1VULAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9IUywKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBoc19pbnRyID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDMgfCBVU0JfRElSX0lOLAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAotICAgIC5iSW50ZXJ2YWwgPSA2LAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX3NpbmsgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX1NTLAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX3NvdXJjZSA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX1NTLAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX2ludHIgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMyB8IFVTQl9ESVJfSU4sCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfU1MsCi0gICAgLmJJbnRlcnZhbCA9IDYsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19zaW5rX2NvbXAgPSB7Ci0gICAgLmJMZW5ndGggPSBzaXplb2Yoc3Nfc2lua19jb21wKSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCi0gICAgLmJNYXhCdXJzdCA9IDYsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19zb3VyY2VfY29tcCA9IHsKLSAgICAuYkxlbmd0aCA9IHNpemVvZihzc19zb3VyY2VfY29tcCksCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAotICAgIC5iTWF4QnVyc3QgPSA2LAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3NfaW50cl9jb21wID0gewotICAgIC5iTGVuZ3RoID0gc2l6ZW9mKHNzX2ludHJfY29tcCksCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAotfTsKLQotY29uc3Qgc3RydWN0IGZ1bmNfZGVzYyBtdHBfZnNfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBtdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBmc19zaW5rLAotICAgIC5zb3VyY2UgPSBmc19zb3VyY2UsCi0gICAgLmludHIgPSBmc19pbnRyLAotfTsKLQotY29uc3Qgc3RydWN0IGZ1bmNfZGVzYyBtdHBfaHNfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBtdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBoc19zaW5rLAotICAgIC5zb3VyY2UgPSBoc19zb3VyY2UsCi0gICAgLmludHIgPSBoc19pbnRyLAotfTsKLQotY29uc3Qgc3RydWN0IHNzX2Z1bmNfZGVzYyBtdHBfc3NfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBtdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBzc19zaW5rLAotICAgIC5zaW5rX2NvbXAgPSBzc19zaW5rX2NvbXAsCi0gICAgLnNvdXJjZSA9IHNzX3NvdXJjZSwKLSAgICAuc291cmNlX2NvbXAgPSBzc19zb3VyY2VfY29tcCwKLSAgICAuaW50ciA9IHNzX2ludHIsCi0gICAgLmludHJfY29tcCA9IHNzX2ludHJfY29tcCwKLX07Ci0KLWNvbnN0IHN0cnVjdCBmdW5jX2Rlc2MgcHRwX2ZzX2Rlc2NyaXB0b3JzID0gewotICAgIC5pbnRmID0gcHRwX2ludGVyZmFjZV9kZXNjLAotICAgIC5zaW5rID0gZnNfc2luaywKLSAgICAuc291cmNlID0gZnNfc291cmNlLAotICAgIC5pbnRyID0gZnNfaW50ciwKLX07Ci0KLWNvbnN0IHN0cnVjdCBmdW5jX2Rlc2MgcHRwX2hzX2Rlc2NyaXB0b3JzID0gewotICAgIC5pbnRmID0gcHRwX2ludGVyZmFjZV9kZXNjLAotICAgIC5zaW5rID0gaHNfc2luaywKLSAgICAuc291cmNlID0gaHNfc291cmNlLAotICAgIC5pbnRyID0gaHNfaW50ciwKLX07Ci0KLWNvbnN0IHN0cnVjdCBzc19mdW5jX2Rlc2MgcHRwX3NzX2Rlc2NyaXB0b3JzID0gewotICAgIC5pbnRmID0gcHRwX2ludGVyZmFjZV9kZXNjLAotICAgIC5zaW5rID0gc3Nfc2luaywKLSAgICAuc2lua19jb21wID0gc3Nfc2lua19jb21wLAotICAgIC5zb3VyY2UgPSBzc19zb3VyY2UsCi0gICAgLnNvdXJjZV9jb21wID0gc3Nfc291cmNlX2NvbXAsCi0gICAgLmludHIgPSBzc19pbnRyLAotICAgIC5pbnRyX2NvbXAgPSBzc19pbnRyX2NvbXAsCi19OwotCi0jZGVmaW5lIFNUUl9JTlRFUkZBQ0UgIk1UUCIKLWNvbnN0IHN0cnVjdCB7Ci0gICAgc3RydWN0IHVzYl9mdW5jdGlvbmZzX3N0cmluZ3NfaGVhZCBoZWFkZXI7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgX19sZTE2IGNvZGU7Ci0gICAgICAgIGNvbnN0IGNoYXIgc3RyMVtzaXplb2YoU1RSX0lOVEVSRkFDRSldOwotICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgbGFuZzA7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHN0cmluZ3MgPSB7Ci0gICAgLmhlYWRlciA9IHsKLSAgICAgICAgLm1hZ2ljID0gY3B1X3RvX2xlMzIoRlVOQ1RJT05GU19TVFJJTkdTX01BR0lDKSwKLSAgICAgICAgLmxlbmd0aCA9IGNwdV90b19sZTMyKHNpemVvZihzdHJpbmdzKSksCi0gICAgICAgIC5zdHJfY291bnQgPSBjcHVfdG9fbGUzMigxKSwKLSAgICAgICAgLmxhbmdfY291bnQgPSBjcHVfdG9fbGUzMigxKSwKLSAgICB9LAotICAgIC5sYW5nMCA9IHsKLSAgICAgICAgLmNvZGUgPSBjcHVfdG9fbGUxNigweDA0MDkpLAotICAgICAgICAuc3RyMSA9IFNUUl9JTlRFUkZBQ0UsCi0gICAgfSwKLX07Ci0KLXN0cnVjdCB1c2Jfb3NfZGVzY19oZWFkZXIgbXRwX29zX2Rlc2NfaGVhZGVyID0gewotICAgIC5pbnRlcmZhY2UgPSBodG9sZTMyKDEpLAotICAgIC5kd0xlbmd0aCA9IGh0b2xlMzIoc2l6ZW9mKHVzYl9vc19kZXNjX2hlYWRlcikgKyBzaXplb2YodXNiX2V4dF9jb21wYXRfZGVzYykpLAotICAgIC5iY2RWZXJzaW9uID0gaHRvbGUxNigxKSwKLSAgICAud0luZGV4ID0gaHRvbGUxNig0KSwKLSAgICAuYkNvdW50ID0gaHRvbGUxNigxKSwKLSAgICAuUmVzZXJ2ZWQgPSBodG9sZTE2KDApLAotfTsKLQotc3RydWN0IHVzYl9leHRfY29tcGF0X2Rlc2MgbXRwX29zX2Rlc2NfY29tcGF0ID0gewotICAgIC5iRmlyc3RJbnRlcmZhY2VOdW1iZXIgPSAwLAotICAgIC5SZXNlcnZlZDEgPSBodG9sZTMyKDEpLAotICAgIC5Db21wYXRpYmxlSUQgPSB7ICdNJywgJ1QnLCAnUCcgfSwKLSAgICAuU3ViQ29tcGF0aWJsZUlEID0gezB9LAotICAgIC5SZXNlcnZlZDIgPSB7MH0sCi19OwotCi1zdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBwdHBfb3NfZGVzY19jb21wYXQgPSB7Ci0gICAgLmJGaXJzdEludGVyZmFjZU51bWJlciA9IDAsCi0gICAgLlJlc2VydmVkMSA9IGh0b2xlMzIoMSksCi0gICAgLkNvbXBhdGlibGVJRCA9IHsgJ1AnLCAnVCcsICdQJyB9LAotICAgIC5TdWJDb21wYXRpYmxlSUQgPSB7MH0sCi0gICAgLlJlc2VydmVkMiA9IHswfSwKLX07CitzdHJ1Y3QgdGltZXNwZWMgWkVST19USU1FT1VUID0geyAwLCAwIH07CiAKIHN0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cyB7CiAgICAgdWludDE2X3QgIHdMZW5ndGg7CkBAIC0zMjYsOSArNjMsMTcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1NdHBGZnNIYW5kbGU6Ok10cEZmc0hhbmRsZSgpIDoKLSAgICBtTWF4V3JpdGUoVVNCX0ZGU19NQVhfV1JJVEUpLAotICAgIG1NYXhSZWFkKFVTQl9GRlNfTUFYX1JFQUQpIHt9CitpbnQgTXRwRmZzSGFuZGxlOjpnZXRQYWNrZXRTaXplKGludCBmZnNfZmQpIHsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZGVzYzsKKyAgICBpZiAoaW9jdGwoZmZzX2ZkLCBGVU5DVElPTkZTX0VORFBPSU5UX0RFU0MsIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4oJmRlc2MpKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGdldCBGRlMgYnVsay1pbiBkZXNjcmlwdG9yIjsKKyAgICAgICAgcmV0dXJuIE1BWF9QQUNLRVRfU0laRV9IUzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZGVzYy53TWF4UGFja2V0U2l6ZTsKKyAgICB9Cit9CisKK010cEZmc0hhbmRsZTo6TXRwRmZzSGFuZGxlKCkge30KIAogTXRwRmZzSGFuZGxlOjp+TXRwRmZzSGFuZGxlKCkge30KIApAQCAtMzM4LDczICs4MywxMDggQEAKICAgICBtQnVsa091dC5yZXNldCgpOwogfQogCitib29sIE10cEZmc0hhbmRsZTo6b3BlbkVuZHBvaW50cygpIHsKKyAgICBpZiAobUJ1bGtJbiA8IDApIHsKKyAgICAgICAgbUJ1bGtJbi5yZXNldChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihGRlNfTVRQX0VQX0lOLCBPX1JEV1IpKSk7CisgICAgICAgIGlmIChtQnVsa0luIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUF9JTiA8PCAiOiBjYW5ub3Qgb3BlbiBidWxrIGluIGVwIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQnVsa091dCA8IDApIHsKKyAgICAgICAgbUJ1bGtPdXQucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oRkZTX01UUF9FUF9PVVQsIE9fUkRXUikpKTsKKyAgICAgICAgaWYgKG1CdWxrT3V0IDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUF9PVVQgPDwgIjogY2Fubm90IG9wZW4gYnVsayBvdXQgZXAiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1JbnRyIDwgMCkgeworICAgICAgICBtSW50ci5yZXNldChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihGRlNfTVRQX0VQX0lOVFIsIE9fUkRXUikpKTsKKyAgICAgICAgaWYgKG1JbnRyIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUF9JTlRSIDw8ICI6IGNhbm5vdCBvcGVuIGludHIgZXAiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE10cEZmc0hhbmRsZTo6YWR2aXNlKGludCBmZCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOVU1fSU9fQlVGUzsgaSsrKSB7CisgICAgICAgIGlmIChwb3NpeF9tYWR2aXNlKG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKKyAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKSA8IDApCisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1hZHZpc2UiOworICAgIH0KKyAgICBpZiAocG9zaXhfZmFkdmlzZShmZCwgMCwgMCwKKyAgICAgICAgICAgICAgICBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UgfCBQT1NJWF9GQURWX1dJTExORUVEKSA8IDApCisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmFkdmlzZSI7Cit9CisKIGJvb2wgTXRwRmZzSGFuZGxlOjppbml0RnVuY3Rpb25mcygpIHsKLSAgICBzc2l6ZV90IHJldDsKLSAgICBzdHJ1Y3QgZGVzY192MSB2MV9kZXNjcmlwdG9yOwotICAgIHN0cnVjdCBkZXNjX3YyIHYyX2Rlc2NyaXB0b3I7Ci0KLSAgICB2Ml9kZXNjcmlwdG9yLmhlYWRlci5tYWdpYyA9IGNwdV90b19sZTMyKEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUNfVjIpOwotICAgIHYyX2Rlc2NyaXB0b3IuaGVhZGVyLmxlbmd0aCA9IGNwdV90b19sZTMyKHNpemVvZih2Ml9kZXNjcmlwdG9yKSk7Ci0gICAgdjJfZGVzY3JpcHRvci5oZWFkZXIuZmxhZ3MgPSBGVU5DVElPTkZTX0hBU19GU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfSFNfREVTQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DVElPTkZTX0hBU19TU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfTVNfT1NfREVTQzsKLSAgICB2Ml9kZXNjcmlwdG9yLmZzX2NvdW50ID0gNDsKLSAgICB2Ml9kZXNjcmlwdG9yLmhzX2NvdW50ID0gNDsKLSAgICB2Ml9kZXNjcmlwdG9yLnNzX2NvdW50ID0gNzsKLSAgICB2Ml9kZXNjcmlwdG9yLm9zX2NvdW50ID0gMTsKLSAgICB2Ml9kZXNjcmlwdG9yLmZzX2Rlc2NzID0gbVB0cCA/IHB0cF9mc19kZXNjcmlwdG9ycyA6IG10cF9mc19kZXNjcmlwdG9yczsKLSAgICB2Ml9kZXNjcmlwdG9yLmhzX2Rlc2NzID0gbVB0cCA/IHB0cF9oc19kZXNjcmlwdG9ycyA6IG10cF9oc19kZXNjcmlwdG9yczsKLSAgICB2Ml9kZXNjcmlwdG9yLnNzX2Rlc2NzID0gbVB0cCA/IHB0cF9zc19kZXNjcmlwdG9ycyA6IG10cF9zc19kZXNjcmlwdG9yczsKLSAgICB2Ml9kZXNjcmlwdG9yLm9zX2hlYWRlciA9IG10cF9vc19kZXNjX2hlYWRlcjsKLSAgICB2Ml9kZXNjcmlwdG9yLm9zX2Rlc2MgPSBtUHRwID8gcHRwX29zX2Rlc2NfY29tcGF0IDogbXRwX29zX2Rlc2NfY29tcGF0OwotCiAgICAgaWYgKG1Db250cm9sIDwgMCkgeyAvLyBtaWdodCBoYXZlIGFscmVhZHkgZG9uZSB0aGlzIGJlZm9yZQogICAgICAgICBtQ29udHJvbC5yZXNldChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihGRlNfTVRQX0VQMCwgT19SRFdSKSkpOwogICAgICAgICBpZiAobUNvbnRyb2wgPCAwKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCBGRlNfTVRQX0VQMCA8PCAiOiBjYW5ub3Qgb3BlbiBjb250cm9sIGVuZHBvaW50IjsKLSAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKDo6d3JpdGUobUNvbnRyb2wsICZ2Ml9kZXNjcmlwdG9yLCBzaXplb2YodjJfZGVzY3JpcHRvcikpKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIHYxX2Rlc2NyaXB0b3IuaGVhZGVyLm1hZ2ljID0gY3B1X3RvX2xlMzIoRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQyk7Ci0gICAgICAgICAgICB2MV9kZXNjcmlwdG9yLmhlYWRlci5sZW5ndGggPSBjcHVfdG9fbGUzMihzaXplb2YodjFfZGVzY3JpcHRvcikpOwotICAgICAgICAgICAgdjFfZGVzY3JpcHRvci5oZWFkZXIuZnNfY291bnQgPSA0OwotICAgICAgICAgICAgdjFfZGVzY3JpcHRvci5oZWFkZXIuaHNfY291bnQgPSA0OwotICAgICAgICAgICAgdjFfZGVzY3JpcHRvci5mc19kZXNjcyA9IG1QdHAgPyBwdHBfZnNfZGVzY3JpcHRvcnMgOiBtdHBfZnNfZGVzY3JpcHRvcnM7Ci0gICAgICAgICAgICB2MV9kZXNjcmlwdG9yLmhzX2Rlc2NzID0gbVB0cCA/IHB0cF9oc19kZXNjcmlwdG9ycyA6IG10cF9oc19kZXNjcmlwdG9yczsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVAwIDw8ICJTd2l0Y2hpbmcgdG8gVjEgZGVzY3JpcHRvciBmb3JtYXQiOwotICAgICAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKDo6d3JpdGUobUNvbnRyb2wsICZ2MV9kZXNjcmlwdG9yLCBzaXplb2YodjFfZGVzY3JpcHRvcikpKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUDAgPDwgIldyaXRpbmcgZGVzY3JpcHRvcnMgZmFpbGVkIjsKLSAgICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShtQ29udHJvbCwgJnN0cmluZ3MsIHNpemVvZihzdHJpbmdzKSkpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUDAgPDwgIldyaXRpbmcgc3RyaW5ncyBmYWlsZWQiOwotICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGlmICghd3JpdGVEZXNjcmlwdG9ycygpKSB7CisgICAgICAgICAgICBjbG9zZUNvbmZpZygpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChtQnVsa0luID4gLTEgfHwgbUJ1bGtPdXQgPiAtMSB8fCBtSW50ciA+IC0xKQotICAgICAgICBMT0coV0FSTklORykgPDwgIkVuZHBvaW50cyB3ZXJlIG5vdCBjbG9zZWQgYmVmb3JlIGNvbmZpZ3VyZSEiOwotCiAgICAgcmV0dXJuIHRydWU7Cit9CiAKLWVycjoKLSAgICBjbG9zZUNvbmZpZygpOwotICAgIHJldHVybiBmYWxzZTsKK2Jvb2wgTXRwRmZzSGFuZGxlOjp3cml0ZURlc2NyaXB0b3JzKCkgeworICAgIHNzaXplX3QgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKDo6d3JpdGUobUNvbnRyb2wsCisgICAgICAgICAgICAgICAgJihtUHRwID8gcHRwX2Rlc2NfdjIgOiBtdHBfZGVzY192MiksIHNpemVvZihkZXNjX3YyKSkpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVAwIDw8ICJTd2l0Y2hpbmcgdG8gVjEgZGVzY3JpcHRvciBmb3JtYXQiOworICAgICAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShtQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgJihtUHRwID8gcHRwX2Rlc2NfdjEgOiBtdHBfZGVzY192MSksIHNpemVvZihkZXNjX3YxKSkpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUDAgPDwgIldyaXRpbmcgZGVzY3JpcHRvcnMgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShtQ29udHJvbCwgJm10cF9zdHJpbmdzLCBzaXplb2YobXRwX3N0cmluZ3MpKSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUDAgPDwgIldyaXRpbmcgc3RyaW5ncyBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIE10cEZmc0hhbmRsZTo6Y2xvc2VDb25maWcoKSB7CiAgICAgbUNvbnRyb2wucmVzZXQoKTsKIH0KIAotdm9pZCBNdHBGZnNIYW5kbGU6OmNvbnRyb2xMb29wKCkgewotICAgIHdoaWxlICghaGFuZGxlRXZlbnQoKSkge30KLSAgICBMT0coREVCVUcpIDw8ICJNdHAgc2VydmVyIHNodXR0aW5nIGRvd24iOworaW50IE10cEZmc0hhbmRsZTo6ZG9Bc3luYyh2b2lkKiBkYXRhLCBzaXplX3QgbGVuLCBib29sIHJlYWQpIHsKKyAgICBzdHJ1Y3QgaW9fZXZlbnQgaW9ldnNbMV07CisgICAgaWYgKGxlbiA+IEFJT19CVUZfTEVOKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk10cCByZWFkL3dyaXRlIHRvbyBsYXJnZSAiIDw8IGxlbjsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbUlvYnVmWzBdLmJ1ZlswXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRhdGEpOworICAgIGlmIChpb2J1ZlN1Ym1pdCgmbUlvYnVmWzBdLCByZWFkID8gbUJ1bGtPdXQgOiBtQnVsa0luLCBsZW4sIHJlYWQpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW50IHJldCA9IHdhaXRFdmVudHMoJm1Jb2J1ZlswXSwgMSwgaW9ldnMsIG51bGxwdHIpOworICAgIG1Jb2J1ZlswXS5idWZbMF0gPSBtSW9idWZbMF0uYnVmcy5kYXRhKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cEZmc0hhbmRsZTo6cmVhZCh2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7CisgICAgcmV0dXJuIGRvQXN5bmMoZGF0YSwgbGVuLCB0cnVlKTsKK30KKworaW50IE10cEZmc0hhbmRsZTo6d3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbikgeworICAgIHJldHVybiBkb0FzeW5jKGNvbnN0X2Nhc3Q8dm9pZCo+KGRhdGEpLCBsZW4sIGZhbHNlKTsKIH0KIAogaW50IE10cEZmc0hhbmRsZTo6aGFuZGxlRXZlbnQoKSB7CisKICAgICBzdGQ6OnZlY3Rvcjx1c2JfZnVuY3Rpb25mc19ldmVudD4gZXZlbnRzKEZGU19OVU1fRVZFTlRTKTsKICAgICB1c2JfZnVuY3Rpb25mc19ldmVudCAqZXZlbnQgPSBldmVudHMuZGF0YSgpOwogICAgIGludCBuYnl0ZXMgPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjpyZWFkKG1Db250cm9sLCBldmVudCwKQEAgLTQzMiw3ICsyMTIsNyBAQAogICAgICAgICAgICAgICAgIHJldCA9IC0xOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0coREVCVUcpIDw8ICJNdHAgRXZlbnQgIiA8PCBldmVudC0+dHlwZSA8PCAiICh1bmtub3duKSI7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNdHAgRXZlbnQgIiA8PCBldmVudC0+dHlwZSA8PCAiICh1bmtub3duKSI7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKQEAgLTQ0NiwxNjkgKzIyNiw4NiBAQAogICAgIHVpbnQxNl90IHZhbHVlID0gc2V0dXAtPndWYWx1ZTsKICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWY7CiAgICAgYnVmLnJlc2l6ZShsZW5ndGgpOworICAgIGludCByZXQgPSAwOwogCiAgICAgaWYgKCEodHlwZSAmIFVTQl9ESVJfSU4pKSB7CiAgICAgICAgIGlmICg6OnJlYWQobUNvbnRyb2wsIGJ1Zi5kYXRhKCksIGxlbmd0aCkgIT0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICBQTE9HKERFQlVHKSA8PCAiTXRwIGVycm9yIGN0cmxyZXEgcmVhZCBkYXRhIjsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSByZWFkIGRhdGEiOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCh0eXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfQ0xBU1MgJiYgaW5kZXggPT0gMCAmJiB2YWx1ZSA9PSAwKSB7CiAgICAgICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgTVRQX1JFUV9SRVNFVDoKKyAgICAgICAgY2FzZSBNVFBfUkVRX0NBTkNFTDoKKyAgICAgICAgICAgIGVycm5vID0gRUNBTkNFTEVEOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfUkVRX0dFVF9ERVZJQ0VfU1RBVFVTOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cykpIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzKSArIDQpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMgKnN0ID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMqPihidWYuZGF0YSgpKTsKICAgICAgICAgICAgIHN0LT53TGVuZ3RoID0gaHRvbGUxNihzaXplb2Yoc3QpKTsKLSAgICAgICAgICAgIHN0LT53Q29kZSA9IE1UUF9SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKKyAgICAgICAgICAgICAgICBzdC0+d0xlbmd0aCArPSA0OworICAgICAgICAgICAgICAgIHN0LT53Q29kZSA9IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKmVuZHBvaW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihzdCArIDEpOworICAgICAgICAgICAgICAgIGVuZHBvaW50c1swXSA9IGlvY3RsKG1CdWxrSW4sIEZVTkNUSU9ORlNfRU5EUE9JTlRfUkVWTUFQKTsKKyAgICAgICAgICAgICAgICBlbmRwb2ludHNbMV0gPSBpb2N0bChtQnVsa091dCwgRlVOQ1RJT05GU19FTkRQT0lOVF9SRVZNQVApOworICAgICAgICAgICAgICAgIG1DYW5jZWxlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdC0+d0NvZGUgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsZW5ndGggPSBzdC0+d0xlbmd0aDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgTXRwIGNsYXNzIHJlcXVlc3QhICIgPDwgY29kZTsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBNdHAgY2xhc3MgcmVxdWVzdCEgIiA8PCBjb2RlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIHJlcXVlc3QgdHlwZSAiIDw8IHR5cGU7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCByZXF1ZXN0IHR5cGUgIiA8PCB0eXBlOwogICAgIH0KIAogICAgIGlmICh0eXBlICYgVVNCX0RJUl9JTikgewogICAgICAgICBpZiAoOjp3cml0ZShtQ29udHJvbCwgYnVmLmRhdGEoKSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKLSAgICAgICAgICAgIFBMT0coREVCVUcpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSB3cml0ZSBkYXRhIjsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSB3cml0ZSBkYXRhIjsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotaW50IE10cEZmc0hhbmRsZTo6d3JpdGVIYW5kbGUoaW50IGZkLCBjb25zdCB2b2lkKiBkYXRhLCBpbnQgbGVuKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJNVFAgYWJvdXQgdG8gd3JpdGUgZmQgPSAiIDw8IGZkIDw8ICIsIGxlbj0iIDw8IGxlbjsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBjb25zdCBjaGFyKiBidWYgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7Ci0gICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgaW50IHdyaXRlX2xlbiA9IHN0ZDo6bWluKG1NYXhXcml0ZSwgbGVuKTsKLSAgICAgICAgaW50IG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShmZCwgYnVmLCB3cml0ZV9sZW4pKTsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSBpZiAobiA8IHdyaXRlX2xlbikgewotICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibGVzcyB3cml0dGVuIHRoYW4gZXhwZWN0ZWQiOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZiArPSBuOwotICAgICAgICBsZW4gLT0gbjsKLSAgICAgICAgcmV0ICs9IG47Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBNdHBGZnNIYW5kbGU6OnJlYWRIYW5kbGUoaW50IGZkLCB2b2lkKiBkYXRhLCBpbnQgbGVuKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJNVFAgYWJvdXQgdG8gcmVhZCBmZCA9ICIgPDwgZmQgPDwgIiwgbGVuPSIgPDwgbGVuOwotICAgIGludCByZXQgPSAwOwotICAgIGNoYXIqIGJ1ZiA9IHN0YXRpY19jYXN0PGNoYXIqPihkYXRhKTsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpbnQgcmVhZF9sZW4gPSBzdGQ6Om1pbihtTWF4UmVhZCwgbGVuKTsKLSAgICAgICAgaW50IG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjpyZWFkKGZkLCBidWYsIHJlYWRfbGVuKSk7Ci0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgRVJST1I6IGZkID0gIiA8PCBmZCA8PCAiLCBuID0gIiA8PCBuOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldCArPSBuOwotICAgICAgICBpZiAobiA8IHJlYWRfbGVuKSAvLyBkb25lIHJlYWRpbmcgZWFybHkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBidWYgKz0gbjsKLSAgICAgICAgbGVuIC09IG47Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBNdHBGZnNIYW5kbGU6OnNwbGljZVJlYWRIYW5kbGUoaW50IGZkLCBpbnQgcGlwZV9vdXQsIGludCBsZW4pIHsKLSAgICBMT0coVkVSQk9TRSkgPDwgIk1UUCBhYm91dCB0byBzcGxpY2UgcmVhZCBmZCA9ICIgPDwgZmQgPDwgIiwgbGVuPSIgPDwgbGVuOwotICAgIGludCByZXQgPSAwOwotICAgIGxvZmZfdCBkdW1teW9mZjsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpbnQgcmVhZF9sZW4gPSBzdGQ6Om1pbihtTWF4UmVhZCwgbGVuKTsKLSAgICAgICAgZHVtbXlvZmYgPSAwOwotICAgICAgICBpbnQgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWShzcGxpY2UoZmQsICZkdW1teW9mZiwgcGlwZV9vdXQsIG51bGxwdHIsIHJlYWRfbGVuLCAwKSk7Ci0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInNwbGljZSByZWFkIEVSUk9SOiBmZCA9ICIgPDwgZmQgPDwgIiwgbiA9ICIgPDwgbjsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXQgKz0gbjsKLSAgICAgICAgaWYgKG4gPCByZWFkX2xlbikgLy8gZG9uZSByZWFkaW5nIGVhcmx5Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbGVuIC09IG47Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBNdHBGZnNIYW5kbGU6OnJlYWQodm9pZCogZGF0YSwgaW50IGxlbikgewotICAgIHJldHVybiByZWFkSGFuZGxlKG1CdWxrT3V0LCBkYXRhLCBsZW4pOwotfQotCi1pbnQgTXRwRmZzSGFuZGxlOjp3cml0ZShjb25zdCB2b2lkKiBkYXRhLCBpbnQgbGVuKSB7Ci0gICAgcmV0dXJuIHdyaXRlSGFuZGxlKG1CdWxrSW4sIGRhdGEsIGxlbik7Ci19Ci0KIGludCBNdHBGZnNIYW5kbGU6OnN0YXJ0KCkgewogICAgIG1Mb2NrLmxvY2soKTsKIAotICAgIG1CdWxrSW4ucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oRkZTX01UUF9FUF9JTiwgT19SRFdSKSkpOwotICAgIGlmIChtQnVsa0luIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCBGRlNfTVRQX0VQX0lOIDw8ICI6IGNhbm5vdCBvcGVuIGJ1bGsgaW4gZXAiOworICAgIGlmICghb3BlbkVuZHBvaW50cygpKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogCi0gICAgbUJ1bGtPdXQucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oRkZTX01UUF9FUF9PVVQsIE9fUkRXUikpKTsKLSAgICBpZiAobUJ1bGtPdXQgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVBfT1VUIDw8ICI6IGNhbm5vdCBvcGVuIGJ1bGsgb3V0IGVwIjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1JbnRyLnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKEZGU19NVFBfRVBfSU5UUiwgT19SRFdSKSkpOwotICAgIGlmIChtSW50ciA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUDAgPDwgIjogY2Fubm90IG9wZW4gaW50ciBlcCI7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtQnVmZmVyMS5yZXNpemUoTUFYX0ZJTEVfQ0hVTktfU0laRSk7Ci0gICAgbUJ1ZmZlcjIucmVzaXplKE1BWF9GSUxFX0NIVU5LX1NJWkUpOwotICAgIHBvc2l4X21hZHZpc2UobUJ1ZmZlcjEuZGF0YSgpLCBNQVhfRklMRV9DSFVOS19TSVpFLAotICAgICAgICAgICAgUE9TSVhfTUFEVl9TRVFVRU5USUFMIHwgUE9TSVhfTUFEVl9XSUxMTkVFRCk7Ci0gICAgcG9zaXhfbWFkdmlzZShtQnVmZmVyMi5kYXRhKCksIE1BWF9GSUxFX0NIVU5LX1NJWkUsCi0gICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKTsKLQotICAgIC8vIEhhbmRsZSBjb250cm9sIHJlcXVlc3RzLgotICAgIHN0ZDo6dGhyZWFkIHQoW3RoaXNdKCkgeyB0aGlzLT5jb250cm9sTG9vcCgpOyB9KTsKLSAgICB0LmRldGFjaCgpOwotCi0gICAgLy8gR2V0IGRldmljZSBzcGVjaWZpYyByL3cgc2l6ZQotICAgIG1NYXhXcml0ZSA9IGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJzeXMudXNiLmZmcy5tYXhfd3JpdGUiLCBVU0JfRkZTX01BWF9XUklURSk7Ci0gICAgbU1heFJlYWQgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgic3lzLnVzYi5mZnMubWF4X3JlYWQiLCBVU0JfRkZTX01BWF9SRUFEKTsKLQotICAgIHNpemVfdCBhdHRlbXB0cyA9IDA7Ci0gICAgd2hpbGUgKG1NYXhXcml0ZSA+PSBVU0JfRkZTX01BWF9XUklURSAmJiBtTWF4UmVhZCA+PSBVU0JfRkZTX01BWF9SRUFEICYmCi0gICAgICAgICAgICBhdHRlbXB0cyA8IEVORFBPSU5UX0FMTE9DX1JFVFJJRVMpIHsKLSAgICAgICAgLy8gSWYgbGFyZ2VyIGNvbnRpZ3VvdXMgY2h1bmtzIG9mIG1lbW9yeSBhcmVuJ3QgYXZhaWxhYmxlLCBhdHRlbXB0IHRvIHRyeQotICAgICAgICAvLyBzbWFsbGVyIGFsbG9jYXRpb25zLgotICAgICAgICBpZiAoaW9jdGwobUJ1bGtJbiwgRlVOQ1RJT05GU19FTkRQT0lOVF9BTExPQywgc3RhdGljX2Nhc3Q8X191MzI+KG1NYXhXcml0ZSkpIHx8Ci0gICAgICAgICAgICBpb2N0bChtQnVsa091dCwgRlVOQ1RJT05GU19FTkRQT0lOVF9BTExPQywgc3RhdGljX2Nhc3Q8X191MzI+KG1NYXhSZWFkKSkpIHsKLSAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9ERVYpIHsKLSAgICAgICAgICAgICAgICAvLyBEcml2ZXIgaGFzbid0IGVuYWJsZWQgZW5kcG9pbnRzIHlldC4KLSAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKLSAgICAgICAgICAgICAgICBhdHRlbXB0cyArPSAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1heFdyaXRlIC89IDI7Ci0gICAgICAgICAgICBtTWF4UmVhZCAvPTI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTlVNX0lPX0JVRlM7IGkrKykgeworICAgICAgICBtSW9idWZbaV0uYnVmcy5yZXNpemUoTUFYX0ZJTEVfQ0hVTktfU0laRSk7CisgICAgICAgIG1Jb2J1ZltpXS5pb2NiLnJlc2l6ZShBSU9fQlVGU19NQVgpOworICAgICAgICBtSW9idWZbaV0uaW9jYnMucmVzaXplKEFJT19CVUZTX01BWCk7CisgICAgICAgIG1Jb2J1ZltpXS5idWYucmVzaXplKEFJT19CVUZTX01BWCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBBSU9fQlVGU19NQVg7IGorKykgeworICAgICAgICAgICAgbUlvYnVmW2ldLmJ1ZltqXSA9IG1Jb2J1ZltpXS5idWZzLmRhdGEoKSArIGogKiBBSU9fQlVGX0xFTjsKKyAgICAgICAgICAgIG1Jb2J1ZltpXS5pb2NiW2pdID0gJm1Jb2J1ZltpXS5pb2Nic1tqXTsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBUcnkgdG8gc3RhcnQgTXRwU2VydmVyIGFueXdheSwgd2l0aCB0aGUgc21hbGxlc3QgbWF4IHIvdyB2YWx1ZXMKLSAgICBQTE9HKEVSUk9SKSA8PCAiRnVuY3Rpb25mcyBjb3VsZCBub3QgYWxsb2NhdGUgYW55IG1lbW9yeSEiOworCisgICAgbWVtc2V0KCZtQ3R4LCAwLCBzaXplb2YobUN0eCkpOworICAgIGlmIChpb19zZXR1cChBSU9fQlVGU19NQVgsICZtQ3R4KSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgInVuYWJsZSB0byBzZXR1cCBhaW8iOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1FdmVudEZkLnJlc2V0KGV2ZW50ZmQoMCwgRUZEX05PTkJMT0NLKSk7CisgICAgbVBvbGxGZHNbMF0uZmQgPSBtQ29udHJvbDsKKyAgICBtUG9sbEZkc1swXS5ldmVudHMgPSBQT0xMSU47CisgICAgbVBvbGxGZHNbMV0uZmQgPSBtRXZlbnRGZDsKKyAgICBtUG9sbEZkc1sxXS5ldmVudHMgPSBQT0xMSU47CisKKyAgICBtQ2FuY2VsZWQgPSBmYWxzZTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjMwLDIxNyArMzI3LDM2OCBAQAogICAgIGlmICghaW5pdEZ1bmN0aW9uZnMoKSkgewogICAgICAgICByZXQgPSAtMTsKICAgICB9CisKICAgICBtTG9jay51bmxvY2soKTsKICAgICByZXR1cm4gcmV0OwogfQogCiB2b2lkIE10cEZmc0hhbmRsZTo6Y2xvc2UoKSB7CisgICAgaW9fZGVzdHJveShtQ3R4KTsKICAgICBjbG9zZUVuZHBvaW50cygpOwogICAgIG1Mb2NrLnVubG9jaygpOwogfQogCi0vKiBSZWFkIGZyb20gVVNCIGFuZCB3cml0ZSB0byBhIGxvY2FsIGZpbGUuICovCi1pbnQgTXRwRmZzSGFuZGxlOjpyZWNlaXZlRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIsIGJvb2wgemVyb19wYWNrZXQpIHsKLSAgICAvLyBXaGVuIHJlY2VpdmluZyBmaWxlcywgdGhlIGluY29taW5nIGxlbmd0aCBpcyBnaXZlbiBpbiAzMiBiaXRzLgotICAgIC8vIEEgPjRHIGZpbGUgaXMgZ2l2ZW4gYXMgMHhGRkZGRkZGRgotICAgIHVpbnQzMl90IGZpbGVfbGVuZ3RoID0gbWZyLmxlbmd0aDsKLSAgICB1aW50NjRfdCBvZmZzZXQgPSBtZnIub2Zmc2V0OwotICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBtQnVsa091dF9kZXNjOwotICAgIGludCBwYWNrZXRfc2l6ZTsKK2ludCBNdHBGZnNIYW5kbGU6OndhaXRFdmVudHMoc3RydWN0IGlvX2J1ZmZlciAqYnVmLCBpbnQgbWluX2V2ZW50cywgc3RydWN0IGlvX2V2ZW50ICpldmVudHMsCisgICAgICAgIGludCAqY291bnRlcikgeworICAgIGludCBudW1fZXZlbnRzID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgZXJyb3IgPSAwOwogCi0gICAgaWYgKGlvY3RsKG1CdWxrT3V0LCBGVU5DVElPTkZTX0VORFBPSU5UX0RFU0MsIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4oJm1CdWxrT3V0X2Rlc2MpKSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGdldCBGRlMgYnVsay1vdXQgZGVzY3JpcHRvciI7Ci0gICAgICAgIHBhY2tldF9zaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhY2tldF9zaXplID0gbUJ1bGtPdXRfZGVzYy53TWF4UGFja2V0U2l6ZTsKKyAgICB3aGlsZSAobnVtX2V2ZW50cyA8IG1pbl9ldmVudHMpIHsKKyAgICAgICAgaWYgKHBvbGwobVBvbGxGZHMsIDIsIDApID09IC0xKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIGR1cmluZyBwb2xsKCkiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtUG9sbEZkc1swXS5yZXZlbnRzICYgUE9MTElOKSB7CisgICAgICAgICAgICBtUG9sbEZkc1swXS5yZXZlbnRzID0gMDsKKyAgICAgICAgICAgIGlmIChoYW5kbGVFdmVudCgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVBvbGxGZHNbMV0ucmV2ZW50cyAmIFBPTExJTikgeworICAgICAgICAgICAgbVBvbGxGZHNbMV0ucmV2ZW50cyA9IDA7CisgICAgICAgICAgICB1aW50NjRfdCBldl9jbnQgPSAwOworCisgICAgICAgICAgICBpZiAoOjpyZWFkKG1FdmVudEZkLCAmZXZfY250LCBzaXplb2YoZXZfY250KSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIHVuYWJsZSB0byByZWFkIGV2ZW50ZmQiOworICAgICAgICAgICAgICAgIGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBpb19nZXRldmVudHMgd2lsbCByZXR1cm4gbW9yZSBldmVudHMgdGhhbiB0aGUgZXZlbnRGZCByZXBvcnRlZCwKKyAgICAgICAgICAgIC8vIHNpbmNlIGV2ZW50cyBtYXkgYXBwZWFyIGluIHRoZSB0aW1lIGJldHdlZW4gdGhlIGNhbGxzLiBJbiB0aGlzIGNhc2UsIHRoZSBldmVudEZkIHdpbGwKKyAgICAgICAgICAgIC8vIHNob3cgdXAgYXMgcmVhZGFibGUgbmV4dCBpdGVyYXRpb24sIGJ1dCB0aGVyZSB3aWxsIGJlIGZld2VyIG9yIG5vIGV2ZW50cyB0byBhY3R1YWxseQorICAgICAgICAgICAgLy8gd2FpdCBmb3IuIFRodXMgd2UgbmV2ZXIgd2FudCBpb19nZXRldmVudHMgdG8gYmxvY2suCisgICAgICAgICAgICBpbnQgdGhpc19ldmVudHMgPSBURU1QX0ZBSUxVUkVfUkVUUlkoaW9fZ2V0ZXZlbnRzKG1DdHgsIDAsIEFJT19CVUZTX01BWCwgZXZlbnRzLCAmWkVST19USU1FT1VUKSk7CisgICAgICAgICAgICBpZiAodGhpc19ldmVudHMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIGdldHRpbmcgZXZlbnRzIjsKKyAgICAgICAgICAgICAgICBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWRkIHVwIHRoZSB0b3RhbCBhbW91bnQgb2YgZGF0YSBhbmQgZmluZCBlcnJvcnMgb24gdGhlIHdheS4KKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGhpc19ldmVudHMpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRzW2pdLnJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSAtZXZlbnRzW2pdLnJlczsKKyAgICAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBnb3QgZXJyb3IgZXZlbnQgYXQgIiA8PCBqIDw8ICIgYW5kICIgPDwgYnVmLT5hY3R1YWwgPDwgIiB0b3RhbCI7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCArPSBldmVudHNbal0ucmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtX2V2ZW50cyArPSB0aGlzX2V2ZW50czsKKyAgICAgICAgICAgIGlmIChjb3VudGVyKQorICAgICAgICAgICAgICAgICpjb3VudGVyICs9IHRoaXNfZXZlbnRzOworICAgICAgICB9CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgZXJybm8gPSBlcnJvcjsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBNdHBGZnNIYW5kbGU6OmNhbmNlbFRyYW5zYWN0aW9uKCkgeworICAgIC8vIERldmljZSBjYW5jZWxzIGJ5IHN0YWxsaW5nIGJvdGggYnVsayBlbmRwb2ludHMuCisgICAgaWYgKDo6cmVhZChtQnVsa0luLCBudWxscHRyLCAwKSAhPSAtMSB8fCBlcnJubyAhPSBFQkFETVNHKQorICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIHN0YWxsIGZhaWxlZCBvbiBidWxrIGluIjsKKyAgICBpZiAoOjp3cml0ZShtQnVsa091dCwgbnVsbHB0ciwgMCkgIT0gLTEgfHwgZXJybm8gIT0gRUJBRE1TRykKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBzdGFsbCBmYWlsZWQgb24gYnVsayBvdXQiOworICAgIG1DYW5jZWxlZCA9IHRydWU7CisgICAgZXJybm8gPSBFQ0FOQ0VMRUQ7Cit9CisKK2ludCBNdHBGZnNIYW5kbGU6OmNhbmNlbEV2ZW50cyhzdHJ1Y3QgaW9jYiAqKmlvY2IsIHN0cnVjdCBpb19ldmVudCAqZXZlbnRzLCB1bnNpZ25lZCBzdGFydCwKKyAgICAgICAgdW5zaWduZWQgZW5kKSB7CisgICAgLy8gU29tZSBtYW5wYWdlcyBmb3IgaW9fY2FuY2VsIGFyZSBvdXQgb2YgZGF0ZSBhbmQgaW5jb3JyZWN0LgorICAgIC8vIGlvX2NhbmNlbCB3aWxsIHJldHVybiAtRUlOUFJPR1JFU1Mgb24gc3VjY2VzcyBhbmQgZG9lcworICAgIC8vIG5vdCBwbGFjZSB0aGUgZXZlbnQgaW4gdGhlIGdpdmVuIG1lbW9yeS4gV2UgaGF2ZSB0byB1c2UKKyAgICAvLyBpb19nZXRldmVudHMgdG8gd2FpdCBmb3IgYWxsIHRoZSBldmVudHMgd2UgY2FuY2VsbGVkLgorICAgIGludCByZXQgPSAwOworICAgIHVuc2lnbmVkIG51bV9ldmVudHMgPSAwOworICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87CisgICAgZXJybm8gPSAwOworCisgICAgZm9yICh1bnNpZ25lZCBqID0gc3RhcnQ7IGogPCBlbmQ7IGorKykgeworICAgICAgICBpZiAoaW9fY2FuY2VsKG1DdHgsIGlvY2Jbal0sIG51bGxwdHIpICE9IC0xIHx8IGVycm5vICE9IEVJTlBST0dSRVNTKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGNvdWxkbid0IGNhbmNlbCByZXF1ZXN0ICIgPDwgajsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bV9ldmVudHMrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobnVtX2V2ZW50cyAhPSBlbmQgLSBzdGFydCkgeworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgZXJybm8gPSBFSU87CisgICAgfQorICAgIGludCBldnMgPSBURU1QX0ZBSUxVUkVfUkVUUlkoaW9fZ2V0ZXZlbnRzKG1DdHgsIG51bV9ldmVudHMsIEFJT19CVUZTX01BWCwgZXZlbnRzLCBudWxscHRyKSk7CisgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkPihldnMpICE9IG51bV9ldmVudHMpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBjb3VsZG4ndCBjYW5jZWwgYWxsIHJlcXVlc3RzLCBnb3QgIiA8PCBldnM7CisgICAgICAgIHJldCA9IC0xOwogICAgIH0KIAotICAgIGNoYXIgKmRhdGEgPSBtQnVmZmVyMS5kYXRhKCk7Ci0gICAgY2hhciAqZGF0YTIgPSBtQnVmZmVyMi5kYXRhKCk7CisgICAgdWludDY0X3QgZXZfY250ID0gMDsKKyAgICBpZiAobnVtX2V2ZW50cyAmJiA6OnJlYWQobUV2ZW50RmQsICZldl9jbnQsIHNpemVvZihldl9jbnQpKSA9PSAtMSkKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBVbmFibGUgdG8gcmVhZCBldmVudCBmZCI7CisKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgLy8gUmVzdG9yZSBlcnJubyBzaW5jZSBpdCBwcm9iYWJseSBnb3Qgb3ZlcnJpZGVuIHdpdGggRUlOUFJPR1JFU1MuCisgICAgICAgIGVycm5vID0gc2F2ZV9lcnJubzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cEZmc0hhbmRsZTo6aW9idWZTdWJtaXQoc3RydWN0IGlvX2J1ZmZlciAqYnVmLCBpbnQgZmQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCByZWFkKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgYnVmLT5hY3R1YWwgPSBBSU9fQlVGU19NQVg7CisgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IEFJT19CVUZTX01BWDsgaisrKSB7CisgICAgICAgIHVuc2lnbmVkIHJxX2xlbmd0aCA9IHN0ZDo6bWluKEFJT19CVUZfTEVOLCBsZW5ndGggLSBBSU9fQlVGX0xFTiAqIGopOworICAgICAgICBpb19wcmVwKGJ1Zi0+aW9jYltqXSwgZmQsIGJ1Zi0+YnVmW2pdLCBycV9sZW5ndGgsIDAsIHJlYWQpOworICAgICAgICBidWYtPmlvY2Jbal0tPmFpb19mbGFncyB8PSBJT0NCX0ZMQUdfUkVTRkQ7CisgICAgICAgIGJ1Zi0+aW9jYltqXS0+YWlvX3Jlc2ZkID0gbUV2ZW50RmQ7CisKKyAgICAgICAgLy8gTm90IGVub3VnaCBkYXRhLCBzbyB0YWJsZSBpcyB0cnVuY2F0ZWQuCisgICAgICAgIGlmIChycV9sZW5ndGggPCBBSU9fQlVGX0xFTiB8fCBsZW5ndGggPT0gQUlPX0JVRl9MRU4gKiAoaiArIDEpKSB7CisgICAgICAgICAgICBidWYtPmFjdHVhbCA9IGogKyAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBpb19zdWJtaXQobUN0eCwgYnVmLT5hY3R1YWwsIGJ1Zi0+aW9jYi5kYXRhKCkpOworICAgIGlmIChyZXQgIT0gc3RhdGljX2Nhc3Q8aW50PihidWYtPmFjdHVhbCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBpb19zdWJtaXQgZ290ICIgPDwgcmV0IDw8ICIgZXhwZWN0ZWQgIiA8PCBidWYtPmFjdHVhbDsKKyAgICAgICAgaWYgKHJldCAhPSAtMSkgeworICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBNdHBGZnNIYW5kbGU6OnJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCkgeworICAgIC8vIFdoZW4gcmVjZWl2aW5nIGZpbGVzLCB0aGUgaW5jb21pbmcgbGVuZ3RoIGlzIGdpdmVuIGluIDMyIGJpdHMuCisgICAgLy8gQSA+PTRHIGZpbGUgaXMgZ2l2ZW4gYXMgMHhGRkZGRkZGRgorICAgIHVpbnQzMl90IGZpbGVfbGVuZ3RoID0gbWZyLmxlbmd0aDsKKyAgICB1aW50NjRfdCBvZmZzZXQgPSBtZnIub2Zmc2V0OwogCiAgICAgc3RydWN0IGFpb2NiIGFpbzsKICAgICBhaW8uYWlvX2ZpbGRlcyA9IG1mci5mZDsKICAgICBhaW8uYWlvX2J1ZiA9IG51bGxwdHI7CiAgICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307Ci0gICAgaW50IHJldCA9IC0xOwotICAgIHNpemVfdCBsZW5ndGg7Ci0gICAgYm9vbCByZWFkID0gZmFsc2U7Ci0gICAgYm9vbCB3cml0ZSA9IGZhbHNlOwotICAgIGJvb2wgc2hvcnRfcGFja2V0ID0gZmFsc2U7CiAKLSAgICBwb3NpeF9mYWR2aXNlKG1mci5mZCwgMCwgMCwgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFKTsKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBzdHJ1Y3QgaW9fZXZlbnQgaW9ldnNbQUlPX0JVRlNfTUFYXTsKKyAgICBib29sIGhhc193cml0ZSA9IGZhbHNlOworICAgIGJvb2wgZXJyb3IgPSBmYWxzZTsKKyAgICBib29sIHdyaXRlX2Vycm9yID0gZmFsc2U7CisgICAgaW50IHBhY2tldF9zaXplID0gZ2V0UGFja2V0U2l6ZShtQnVsa091dCk7CisgICAgYm9vbCBzaG9ydF9wYWNrZXQgPSBmYWxzZTsKKyAgICBhZHZpc2UobWZyLmZkKTsKIAogICAgIC8vIEJyZWFrIGRvd24gdGhlIGZpbGUgaW50byBwaWVjZXMgdGhhdCBmaXQgaW4gYnVmZmVycwotICAgIHdoaWxlIChmaWxlX2xlbmd0aCA+IDAgfHwgd3JpdGUpIHsKKyAgICB3aGlsZSAoZmlsZV9sZW5ndGggPiAwIHx8IGhhc193cml0ZSkgeworICAgICAgICAvLyBRdWV1ZSBhbiBhc3luY2hyb25vdXMgcmVhZCBmcm9tIFVTQi4KICAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID4gMCkgewogICAgICAgICAgICAgbGVuZ3RoID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1BWF9GSUxFX0NIVU5LX1NJWkUpLCBmaWxlX2xlbmd0aCk7Ci0KLSAgICAgICAgICAgIC8vIFJlYWQgZGF0YSBmcm9tIFVTQiwgaGFuZGxlIGVycm9ycyBhZnRlciB3YWl0aW5nIGZvciB3cml0ZSB0aHJlYWQuCi0gICAgICAgICAgICByZXQgPSByZWFkSGFuZGxlKG1CdWxrT3V0LCBkYXRhLCBsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAoZmlsZV9sZW5ndGggIT0gTUFYX01UUF9GSUxFX1NJWkUgJiYgcmV0IDwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChpb2J1ZlN1Ym1pdCgmbUlvYnVmW2ldLCBtQnVsa091dCwgbGVuZ3RoLCB0cnVlKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAod3JpdGUpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgcmV0dXJuIHN0YXR1cyBvZiB0aGUgbGFzdCB3cml0ZSByZXF1ZXN0CisgICAgICAgIC8vIEdldCB0aGUgcmV0dXJuIHN0YXR1cyBvZiB0aGUgbGFzdCB3cml0ZSByZXF1ZXN0LgorICAgICAgICBpZiAoaGFzX3dyaXRlKSB7CiAgICAgICAgICAgICBhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKTsKLQogICAgICAgICAgICAgaW50IHdyaXR0ZW4gPSBhaW9fcmV0dXJuKCZhaW8pOwotICAgICAgICAgICAgaWYgKHdyaXR0ZW4gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBlcnJubyA9IGFpb19lcnJvcigmYWlvKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90Pih3cml0dGVuKSA8IGFpby5haW9fbmJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGVycm5vID0gd3JpdHRlbiA9PSAtMSA/IGFpb19lcnJvcigmYWlvKSA6IEVJTzsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIHdyaXRpbmcgdG8gZGlzayI7CisgICAgICAgICAgICAgICAgd3JpdGVfZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGhhc193cml0ZSA9IGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgYWJvdmUKLSAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChyZWFkKSB7CisgICAgICAgIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSByZWFkIHJlcXVlc3QsIGFuZCBxdWV1ZSBhIHdyaXRlIHRvIGRpc2suCisgICAgICAgIGlmIChmaWxlX2xlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG51bV9ldmVudHMgPSAwOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0X2kgPSBtSW9idWZbaV0uYWN0dWFsOworICAgICAgICAgICAgd2hpbGUgKG51bV9ldmVudHMgPCBzaG9ydF9pKSB7CisgICAgICAgICAgICAgICAgLy8gR2V0IGFsbCBldmVudHMgdXAgdG8gdGhlIHNob3J0IHJlYWQsIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHdhaXQgZm9yIGVhY2ggZXZlbnQgc2luY2UgZGF0YSB0cmFuc2ZlciBjb3VsZCBlbmQgYXQgYW55IHRpbWUuCisgICAgICAgICAgICAgICAgaW50IHRoaXNfZXZlbnRzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZXZlbnRfcmV0ID0gd2FpdEV2ZW50cygmbUlvYnVmW2ldLCAxLCBpb2V2cywgJnRoaXNfZXZlbnRzKTsKKyAgICAgICAgICAgICAgICBudW1fZXZlbnRzICs9IHRoaXNfZXZlbnRzOworCisgICAgICAgICAgICAgICAgaWYgKGV2ZW50X3JldCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBjYW5jZWxFdmVudHMobUlvYnVmW2ldLmlvY2IuZGF0YSgpLCBpb2V2cywgbnVtX2V2ZW50cywgbUlvYnVmW2ldLmFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ICs9IGV2ZW50X3JldDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRoaXNfZXZlbnRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0IGlvX2V2ZW50IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBzdHJ1Y3QgaW9jYiBhcyBhIF9fdTY0LgorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8X191NjQ+KGlvZXZzW2pdLnJlcykgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGlvY2IqPihpb2V2c1tqXS5vYmopLT5haW9fbmJ5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBmb3VuZCBhIHNob3J0IGV2ZW50LiBTdG9yZSB0aGUgaW5kZXggc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyB3b24ndCBuZWNlc3NhcmlseSBhcnJpdmUgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHF1ZXVlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0X2kgPSAoaW9ldnNbal0ub2JqIC0gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdD4obUlvYnVmW2ldLmlvY2JzLmRhdGEoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBzaXplb2Yoc3RydWN0IGlvY2IpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0X3BhY2tldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvcnRfcGFja2V0KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbEV2ZW50cyhtSW9idWZbaV0uaW9jYi5kYXRhKCksIGlvZXZzLCBzaG9ydF9pLCBtSW9idWZbaV0uYWN0dWFsKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZV9lcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID09IE1BWF9NVFBfRklMRV9TSVpFKSB7CiAgICAgICAgICAgICAgICAgLy8gRm9yIGxhcmdlciBmaWxlcywgcmVjZWl2ZSB1bnRpbCBhIHNob3J0IHBhY2tldCBpcyByZWNlaXZlZC4KICAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbGVfbGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnRfcGFja2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA8IHN0YXRpY19jYXN0PGludD4obGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIGZpbGUgaXMgbGVzcyB0aGFuIDRHIGFuZCB3ZSBnZXQgYSBzaG9ydCBwYWNrZXQsIGl0J3MgYW4gZXJyb3IuCisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTXRwIGdvdCB1bmV4cGVjdGVkIHNob3J0IHBhY2tldCI7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSZWNlaXZlIGFuIGVtcHR5IHBhY2tldCBpZiBzaXplIGlzIGEgbXVsdGlwbGUgb2YgdGhlIGVuZHBvaW50IHNpemUuCiAgICAgICAgICAgICAgICAgZmlsZV9sZW5ndGggLT0gcmV0OwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod3JpdGVfZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gRW5xdWV1ZSBhIG5ldyB3cml0ZSByZXF1ZXN0Ci0gICAgICAgICAgICBhaW8uYWlvX2J1ZiA9IGRhdGE7Ci0gICAgICAgICAgICBhaW8uYWlvX3NpbmsgPSBtZnIuZmQ7Ci0gICAgICAgICAgICBhaW8uYWlvX29mZnNldCA9IG9mZnNldDsKLSAgICAgICAgICAgIGFpby5haW9fbmJ5dGVzID0gcmV0OworICAgICAgICAgICAgYWlvX3ByZXBhcmUoJmFpbywgbUlvYnVmW2ldLmJ1ZnMuZGF0YSgpLCByZXQsIG9mZnNldCk7CiAgICAgICAgICAgICBhaW9fd3JpdGUoJmFpbyk7CiAKICAgICAgICAgICAgIG9mZnNldCArPSByZXQ7Ci0gICAgICAgICAgICBzdGQ6OnN3YXAoZGF0YSwgZGF0YTIpOwotCi0gICAgICAgICAgICB3cml0ZSA9IHRydWU7Ci0gICAgICAgICAgICByZWFkID0gZmFsc2U7CisgICAgICAgICAgICBpID0gKGkgKyAxKSAlIE5VTV9JT19CVUZTOworICAgICAgICAgICAgaGFzX3dyaXRlID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoKHJldCAlIHBhY2tldF9zaXplID09IDAgJiYgIXNob3J0X3BhY2tldCkgfHwgemVyb19wYWNrZXQpIHsKLSAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSg6OnJlYWQobUJ1bGtPdXQsIGRhdGEsIHBhY2tldF9zaXplKSkgIT0gMCkgeworICAgICAgICAvLyBSZWNlaXZlIGFuIGVtcHR5IHBhY2tldCBpZiBzaXplIGlzIGEgbXVsdGlwbGUgb2YgdGhlIGVuZHBvaW50IHNpemUKKyAgICAgICAgLy8gYW5kIHdlIGRpZG4ndCBhbHJlYWR5IGdldCBhbiBlbXB0eSBwYWNrZXQgZnJvbSB0aGUgaGVhZGVyIG9yIGxhcmdlIGZpbGUuCisgICAgICAgIGlmIChyZWFkKG1Jb2J1ZlswXS5idWZzLmRhdGEoKSwgcGFja2V0X3NpemUpICE9IDApIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotLyogUmVhZCBmcm9tIGEgbG9jYWwgZmlsZSBhbmQgc2VuZCBvdmVyIFVTQi4gKi8KIGludCBNdHBGZnNIYW5kbGU6OnNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgewogICAgIHVpbnQ2NF90IGZpbGVfbGVuZ3RoID0gbWZyLmxlbmd0aDsKICAgICB1aW50MzJfdCBnaXZlbl9sZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTUFYX01UUF9GSUxFX1NJWkUpLAogICAgICAgICAgICAgZmlsZV9sZW5ndGggKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSk7CiAgICAgdWludDY0X3Qgb2Zmc2V0ID0gbWZyLm9mZnNldDsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgbUJ1bGtJbl9kZXNjOwotICAgIGludCBwYWNrZXRfc2l6ZTsKLQotICAgIGlmIChpb2N0bChtQnVsa0luLCBGVU5DVElPTkZTX0VORFBPSU5UX0RFU0MsIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4oJm1CdWxrSW5fZGVzYykpKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZ2V0IEZGUyBidWxrLWluIGRlc2NyaXB0b3IiOwotICAgICAgICBwYWNrZXRfc2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9IUzsKLSAgICB9IGVsc2UgewotICAgICAgICBwYWNrZXRfc2l6ZSA9IG1CdWxrSW5fZGVzYy53TWF4UGFja2V0U2l6ZTsKLSAgICB9CisgICAgaW50IHBhY2tldF9zaXplID0gZ2V0UGFja2V0U2l6ZShtQnVsa0luKTsKIAogICAgIC8vIElmIGZpbGVfbGVuZ3RoIGlzIGxhcmdlciB0aGFuIGEgc2l6ZV90LCB0cnVuY2F0aW5nIHdvdWxkIHByb2R1Y2UgdGhlIHdyb25nIGNvbXBhcmlzb24uCiAgICAgLy8gSW5zdGVhZCwgcHJvbW90ZSB0aGUgbGVmdCBzaWRlIHRvIDY0IGJpdHMsIHRoZW4gdHJ1bmNhdGUgdGhlIHNtYWxsIHJlc3VsdC4KICAgICBpbnQgaW5pdF9yZWFkX2xlbiA9IHN0ZDo6bWluKAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHBhY2tldF9zaXplIC0gc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpLCBmaWxlX2xlbmd0aCk7CiAKLSAgICBjaGFyICpkYXRhID0gbUJ1ZmZlcjEuZGF0YSgpOwotICAgIGNoYXIgKmRhdGEyID0gbUJ1ZmZlcjIuZGF0YSgpOwotCi0gICAgcG9zaXhfZmFkdmlzZShtZnIuZmQsIDAsIDAsIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSk7CisgICAgYWR2aXNlKG1mci5mZCk7CiAKICAgICBzdHJ1Y3QgYWlvY2IgYWlvOwogICAgIGFpby5haW9fZmlsZGVzID0gbWZyLmZkOwogICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OwotICAgIGludCByZXQsIGxlbmd0aDsKLSAgICBpbnQgZXJyb3IgPSAwOwotICAgIGJvb2wgcmVhZCA9IGZhbHNlOwotICAgIGJvb2wgd3JpdGUgPSBmYWxzZTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgbGVuZ3RoLCBudW1fcmVhZDsKKyAgICB1bnNpZ25lZCBpID0gMDsKKyAgICBzdHJ1Y3QgaW9fZXZlbnQgaW9ldnNbQUlPX0JVRlNfTUFYXTsKKyAgICBib29sIGVycm9yID0gZmFsc2U7CisgICAgYm9vbCBoYXNfd3JpdGUgPSBmYWxzZTsKIAogICAgIC8vIFNlbmQgdGhlIGhlYWRlciBkYXRhCi0gICAgbXRwX2RhdGFfaGVhZGVyICpoZWFkZXIgPSByZWludGVycHJldF9jYXN0PG10cF9kYXRhX2hlYWRlcio+KGRhdGEpOwotICAgIGhlYWRlci0+bGVuZ3RoID0gX19jcHVfdG9fbGUzMihnaXZlbl9sZW5ndGgpOwotICAgIGhlYWRlci0+dHlwZSA9IF9fY3B1X3RvX2xlMTYoMik7IC8qIGRhdGEgcGFja2V0ICovCi0gICAgaGVhZGVyLT5jb21tYW5kID0gX19jcHVfdG9fbGUxNihtZnIuY29tbWFuZCk7Ci0gICAgaGVhZGVyLT50cmFuc2FjdGlvbl9pZCA9IF9fY3B1X3RvX2xlMzIobWZyLnRyYW5zYWN0aW9uX2lkKTsKKyAgICBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8bXRwX2RhdGFfaGVhZGVyKj4obUlvYnVmWzBdLmJ1ZnMuZGF0YSgpKTsKKyAgICBoZWFkZXItPmxlbmd0aCA9IGh0b2xlMzIoZ2l2ZW5fbGVuZ3RoKTsKKyAgICBoZWFkZXItPnR5cGUgPSBodG9sZTE2KDIpOyAvLyBkYXRhIHBhY2tldAorICAgIGhlYWRlci0+Y29tbWFuZCA9IGh0b2xlMTYobWZyLmNvbW1hbmQpOworICAgIGhlYWRlci0+dHJhbnNhY3Rpb25faWQgPSBodG9sZTMyKG1mci50cmFuc2FjdGlvbl9pZCk7CiAKICAgICAvLyBTb21lIGhvc3RzIGRvbid0IHN1cHBvcnQgaGVhZGVyL2RhdGEgc2VwYXJhdGlvbiBldmVuIHRob3VnaCBNVFAgYWxsb3dzIGl0CiAgICAgLy8gSGFuZGxlIGJ5IGZpbGxpbmcgZmlyc3QgcGFja2V0IHdpdGggaW5pdGlhbCBmaWxlIGRhdGEKLSAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKG1mci5mZCwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZGF0YSkgKworICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkocHJlYWQobWZyLmZkLCBtSW9idWZbMF0uYnVmcy5kYXRhKCkgKwogICAgICAgICAgICAgICAgICAgICBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSwgaW5pdF9yZWFkX2xlbiwgb2Zmc2V0KSkKICAgICAgICAgICAgICE9IGluaXRfcmVhZF9sZW4pIHJldHVybiAtMTsKLSAgICBpZiAod3JpdGVIYW5kbGUobUJ1bGtJbiwgZGF0YSwgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikgKyBpbml0X3JlYWRfbGVuKSA9PSAtMSkgcmV0dXJuIC0xOworICAgIGlmICh3cml0ZShtSW9idWZbMF0uYnVmcy5kYXRhKCksIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpICsgaW5pdF9yZWFkX2xlbikgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKICAgICBmaWxlX2xlbmd0aCAtPSBpbml0X3JlYWRfbGVuOwogICAgIG9mZnNldCArPSBpbml0X3JlYWRfbGVuOwogICAgIHJldCA9IGluaXRfcmVhZF9sZW4gKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKTsKIAogICAgIC8vIEJyZWFrIGRvd24gdGhlIGZpbGUgaW50byBwaWVjZXMgdGhhdCBmaXQgaW4gYnVmZmVycwotICAgIHdoaWxlKGZpbGVfbGVuZ3RoID4gMCkgewotICAgICAgICBpZiAocmVhZCkgewotICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHJlYWQgdG8gZmluaXNoCi0gICAgICAgICAgICBhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKTsKLSAgICAgICAgICAgIHJldCA9IGFpb19yZXR1cm4oJmFpbyk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSBhaW9fZXJyb3IoJmFpbyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IGFpby5haW9fbmJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWxlX2xlbmd0aCAtPSByZXQ7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gcmV0OwotICAgICAgICAgICAgc3RkOjpzd2FwKGRhdGEsIGRhdGEyKTsKLSAgICAgICAgICAgIHJlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHdyaXRlID0gdHJ1ZTsKKyAgICB3aGlsZShmaWxlX2xlbmd0aCA+IDAgfHwgaGFzX3dyaXRlKSB7CisgICAgICAgIGlmIChmaWxlX2xlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIFF1ZXVlIHVwIGEgcmVhZCBmcm9tIGRpc2suCisgICAgICAgICAgICBsZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTUFYX0ZJTEVfQ0hVTktfU0laRSksIGZpbGVfbGVuZ3RoKTsKKyAgICAgICAgICAgIGFpb19wcmVwYXJlKCZhaW8sIG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgbGVuZ3RoLCBvZmZzZXQpOworICAgICAgICAgICAgYWlvX3JlYWQoJmFpbyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZXJyb3IgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGhhc193cml0ZSkgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgdXNiIHdyaXRlLiBDYW5jZWwgdW53cml0dGVuIHBvcnRpb24gaWYgdGhlcmUncyBhbiBlcnJvci4KKyAgICAgICAgICAgIGludCBudW1fZXZlbnRzID0gMDsKKyAgICAgICAgICAgIGlmICh3YWl0RXZlbnRzKCZtSW9idWZbKGktMSklTlVNX0lPX0JVRlNdLCBtSW9idWZbKGktMSklTlVNX0lPX0JVRlNdLmFjdHVhbCwgaW9ldnMsCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2V2ZW50cykgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGNhbmNlbEV2ZW50cyhtSW9idWZbKGktMSklTlVNX0lPX0JVRlNdLmlvY2IuZGF0YSgpLCBpb2V2cywgbnVtX2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jb2J1ZlsoaS0xKSVOVU1fSU9fQlVGU10uYWN0dWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc193cml0ZSA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID4gMCkgewotICAgICAgICAgICAgbGVuZ3RoID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE1BWF9GSUxFX0NIVU5LX1NJWkUpLCBmaWxlX2xlbmd0aCk7Ci0gICAgICAgICAgICAvLyBRdWV1ZSB1cCBhbm90aGVyIHJlYWQKLSAgICAgICAgICAgIGFpby5haW9fYnVmID0gZGF0YTsKLSAgICAgICAgICAgIGFpby5haW9fb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgYWlvLmFpb19uYnl0ZXMgPSBsZW5ndGg7Ci0gICAgICAgICAgICBhaW9fcmVhZCgmYWlvKTsKLSAgICAgICAgICAgIHJlYWQgPSB0cnVlOworICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHJlYWQgdG8gZmluaXNoCisgICAgICAgICAgICBhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKTsKKyAgICAgICAgICAgIG51bV9yZWFkID0gYWlvX3JldHVybigmYWlvKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KG51bV9yZWFkKSA8IGFpby5haW9fbmJ5dGVzKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSBudW1fcmVhZCA9PSAtMSA/IGFpb19lcnJvcigmYWlvKSA6IEVJTzsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIHJlYWRpbmcgZnJvbSBkaXNrIjsKKyAgICAgICAgICAgICAgICBjYW5jZWxUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsZV9sZW5ndGggLT0gbnVtX3JlYWQ7CisgICAgICAgICAgICBvZmZzZXQgKz0gbnVtX3JlYWQ7CisKKyAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUXVldWUgdXAgYSB3cml0ZSB0byB1c2IuCisgICAgICAgICAgICBpZiAoaW9idWZTdWJtaXQoJm1Jb2J1ZltpXSwgbUJ1bGtJbiwgbnVtX3JlYWQsIGZhbHNlKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc193cml0ZSA9IHRydWU7CisgICAgICAgICAgICByZXQgPSBudW1fcmVhZDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh3cml0ZSkgewotICAgICAgICAgICAgaWYgKHdyaXRlSGFuZGxlKG1CdWxrSW4sIGRhdGEyLCByZXQpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgaSA9IChpICsgMSkgJSBOVU1fSU9fQlVGUzsKICAgICB9CiAKICAgICBpZiAocmV0ICUgcGFja2V0X3NpemUgPT0gMCkgewogICAgICAgICAvLyBJZiB0aGUgbGFzdCBwYWNrZXQgd2Fzbid0IHNob3J0LCBzZW5kIGEgZmluYWwgZW1wdHkgcGFja2V0Ci0gICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShtQnVsa0luLCBkYXRhLCAwKSkgIT0gMCkgeworICAgICAgICBpZiAod3JpdGUobUlvYnVmWzBdLmJ1ZnMuZGF0YSgpLCAwKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtODY1LDcgKzcxMywzIEBACiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotSU10cEhhbmRsZSAqZ2V0X2Zmc19oYW5kbGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpNdHBGZnNIYW5kbGUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oCmluZGV4IGRhMGNkOWYuLjIzNDcwMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuaAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmgKQEAgLTE4LDMwICsxOCw1NCBAQAogI2RlZmluZSBfTVRQX0ZGU19IQU5ETEVfSAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Fpb19hYmkuaD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8SU10cEhhbmRsZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIE10cEZmc0hhbmRsZVRlc3Q7Citjb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQMFtdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAwIjsKKworY29uc3RleHByIGludCBOVU1fSU9fQlVGUyA9IDI7CisKK3N0cnVjdCBpb19idWZmZXIgeworICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCBpb2NiPiBpb2NiczsgICAgIC8vIEhvbGRzIG1lbW9yeSBmb3IgYWxsIGlvY2JzLiBOb3QgdXNlZCBkaXJlY3RseS4KKyAgICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgaW9jYio+IGlvY2I7ICAgICAvLyBQb2ludGVycyB0byBpbmRpdmlkdWFsIGlvY2JzLCBmb3Igc3lzY2FsbHMKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBidWZzOyAgICAvLyBBIGxhcmdlIGJ1ZmZlciwgdXNlZCB3aXRoIGZpbGVzeXN0ZW0gaW8KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyKj4gYnVmOyAgICAvLyBQb2ludGVycyB3aXRoaW4gdGhlIGxhcmdlciBidWZmZXIsIGZvciBzeXNjYWxscworICAgIHVuc2lnbmVkIGFjdHVhbDsgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnVmZmVycyBzdWJtaXR0ZWQgZm9yIHRoaXMgcmVxdWVzdAorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIE10cEZmc0hhbmRsZVRlc3Q7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgTXRwRmZzSGFuZGxlVGVzdF90ZXN0Q29udHJvbF9UZXN0OwogCiBjbGFzcyBNdHBGZnNIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Ci0gICAgZnJpZW5kIGNsYXNzIGFuZHJvaWQ6Ok10cEZmc0hhbmRsZVRlc3Q7Ci1wcml2YXRlOgotICAgIGludCB3cml0ZUhhbmRsZShpbnQgZmQsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOwotICAgIGludCByZWFkSGFuZGxlKGludCBmZCwgdm9pZCAqZGF0YSwgaW50IGxlbik7Ci0gICAgaW50IHNwbGljZVJlYWRIYW5kbGUoaW50IGZkLCBpbnQgZmRfb3V0LCBpbnQgbGVuKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gZnJpZW5kIGNsYXNzIE10cEZmc0hhbmRsZVRlc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGZyaWVuZCBjbGFzcyBNdHBGZnNIYW5kbGVUZXN0X3Rlc3RDb250cm9sX1Rlc3Q7Citwcm90ZWN0ZWQ6CiAgICAgYm9vbCBpbml0RnVuY3Rpb25mcygpOworICAgIGJvb2wgd3JpdGVEZXNjcmlwdG9ycygpOwogICAgIHZvaWQgY2xvc2VDb25maWcoKTsKICAgICB2b2lkIGNsb3NlRW5kcG9pbnRzKCk7Ci0gICAgdm9pZCBkb1NlbmRFdmVudChtdHBfZXZlbnQgbWUpOwotCi0gICAgdm9pZCBjb250cm9sTG9vcCgpOworICAgIHZvaWQgYWR2aXNlKGludCBmZCk7CisgICAgaW50IGhhbmRsZUNvbnRyb2xSZXF1ZXN0KGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcXVlc3QpOworICAgIGludCBkb0FzeW5jKHZvaWQqIGRhdGEsIHNpemVfdCBsZW4sIGJvb2wgcmVhZCk7CiAgICAgaW50IGhhbmRsZUV2ZW50KCk7Ci0gICAgaW50IGhhbmRsZUNvbnRyb2xSZXF1ZXN0KGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnNldHVwKTsKKyAgICB2b2lkIGNhbmNlbFRyYW5zYWN0aW9uKCk7CisgICAgdm9pZCBkb1NlbmRFdmVudChtdHBfZXZlbnQgbWUpOworICAgIGJvb2wgb3BlbkVuZHBvaW50cygpOworCisgICAgc3RhdGljIGludCBnZXRQYWNrZXRTaXplKGludCBmZnNfZmQpOwogCiAgICAgYm9vbCBtUHRwOworICAgIGJvb2wgbUNhbmNlbGVkOwogCi0gICAgc3RkOjp0aW1lZF9tdXRleCBtTG9jazsKKyAgICBzdGQ6OnRpbWVkX211dGV4IG1Mb2NrOyAvLyBwcm90ZWN0cyBjb25maWd1cmUoKSB2cyBtYWluIGxvb3AKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtQ29udHJvbDsKICAgICAvLyAiaW4iIGZyb20gdGhlIGhvc3QncyBwZXJzcGVjdGl2ZSA9PiBzaW5rIGZvciBtdHAgc2VydmVyCkBAIC01MCwyOCArNzQsMzUgQEAKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgbUJ1bGtPdXQ7CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIG1JbnRyOwogCi0gICAgaW50IG1NYXhXcml0ZTsKLSAgICBpbnQgbU1heFJlYWQ7CisgICAgYWlvX2NvbnRleHRfdCBtQ3R4OwogCi0gICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbUJ1ZmZlcjE7Ci0gICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbUJ1ZmZlcjI7CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIG1FdmVudEZkOworICAgIHN0cnVjdCBwb2xsZmQgbVBvbGxGZHNbMl07CisKKyAgICBzdHJ1Y3QgaW9fYnVmZmVyIG1Jb2J1ZltOVU1fSU9fQlVGU107CisKKyAgICAvLyBTdWJtaXQgYW4gaW8gcmVxdWVzdCBvZiBnaXZlbiBsZW5ndGguIFJldHVybiBhbW91bnQgc3VibWl0dGVkIG9yIC0xLgorICAgIGludCBpb2J1ZlN1Ym1pdChzdHJ1Y3QgaW9fYnVmZmVyICpidWYsIGludCBmZCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIHJlYWQpOworCisgICAgLy8gQ2FuY2VsIHN1Ym1pdHRlZCByZXF1ZXN0cyBmcm9tIHN0YXJ0IHRvIGVuZCBpbiB0aGUgZ2l2ZW4gYXJyYXkuIFJldHVybiAwIG9yIC0xLgorICAgIGludCBjYW5jZWxFdmVudHMoc3RydWN0IGlvY2IgKippb2NiLCBzdHJ1Y3QgaW9fZXZlbnQgKmV2ZW50cywgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCk7CisKKyAgICAvLyBXYWl0IGZvciBhdCBtaW5pbXVtIHRoZSBnaXZlbiBudW1iZXIgb2YgZXZlbnRzLiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgcmV0dXJuZWQKKyAgICAvLyBldmVudHMuIEluY3JlbWVudHMgY291bnRlciBieSB0aGUgbnVtYmVyIG9mIGV2ZW50cyByZXR1cm5lZC4KKyAgICBpbnQgd2FpdEV2ZW50cyhzdHJ1Y3QgaW9fYnVmZmVyICpidWYsIGludCBtaW5fZXZlbnRzLCBzdHJ1Y3QgaW9fZXZlbnQgKmV2ZW50cywgaW50ICpjb3VudGVyKTsKIAogcHVibGljOgotICAgIGludCByZWFkKHZvaWQgKmRhdGEsIGludCBsZW4pOwotICAgIGludCB3cml0ZShjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKyAgICBpbnQgcmVhZCh2b2lkICpkYXRhLCBzaXplX3QgbGVuKSBvdmVycmlkZTsKKyAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgb3ZlcnJpZGU7CiAKLSAgICBpbnQgcmVjZWl2ZUZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyLCBib29sIHplcm9fcGFja2V0KTsKLSAgICBpbnQgc2VuZEZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyKTsKLSAgICBpbnQgc2VuZEV2ZW50KG10cF9ldmVudCBtZSk7CisgICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCkgb3ZlcnJpZGU7CisgICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgb3ZlcnJpZGU7CisgICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpIG92ZXJyaWRlOwogCi0gICAgLyoqCi0gICAgICogT3BlbiBmZnMgZW5kcG9pbnRzIGFuZCBhbGxvY2F0ZSBuZWNlc3Nhcnkga2VybmVsIGFuZCB1c2VyIG1lbW9yeS4KLSAgICAgKiBXaWxsIHNsZWVwIHVudGlsIGVuZHBvaW50cyBhcmUgZW5hYmxlZCwgZm9yIHVwIHRvIDEgc2Vjb25kLgotICAgICAqLwotICAgIGludCBzdGFydCgpOwotICAgIHZvaWQgY2xvc2UoKTsKKyAgICBpbnQgc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CiAKLSAgICBpbnQgY29uZmlndXJlKGJvb2wgcHRwKTsKKyAgICBpbnQgY29uZmlndXJlKGJvb2wgcHRwKSBvdmVycmlkZTsKIAogICAgIE10cEZmc0hhbmRsZSgpOwogICAgIH5NdHBGZnNIYW5kbGUoKTsKQEAgLTkwLDUgKzEyMSw1IEBACiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotI2VuZGlmIC8vIF9NVFBfRkZfSEFORExFX0gKKyNlbmRpZiAvLyBfTVRQX0ZGU19IQU5ETEVfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IDY3ZmQyMjEuLmJiMDQxNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxkaXJlbnQuaD4KQEAgLTMxLDYgKzMyLDkgQEAKIAogI2luY2x1ZGUgIk10cERlYnVnLmgiCiAjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBEZXZIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBGZnNDb21wYXRIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBGZnNIYW5kbGUuaCIKICNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCiAjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKICNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKQEAgLTY0LDggKzY4LDggQEAKICAgICBNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSwKICAgICBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAogLy8gICAgTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFLAotLy8gICAgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCwKLS8vICAgIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QsCisgICAgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCwKKyAgICBNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNULAogICAgIE1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNULAogLy8gICAgTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUsCiAgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCwKQEAgLTk2LDE2ICsxMDAsMTIgQEAKIH07CiAKIE10cFNlcnZlcjo6TXRwU2VydmVyKE10cERhdGFiYXNlKiBkYXRhYmFzZSwgYm9vbCBwdHAsCi0gICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb01hbnVmYWN0dXJlciwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXRwU3RyaW5nJiBkZXZpY2VJbmZvTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb0RldmljZVZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb1NlcmlhbE51bWJlcikKICAgICA6ICAgbURhdGFiYXNlKGRhdGFiYXNlKSwKICAgICAgICAgbVB0cChwdHApLAotICAgICAgICBtRmlsZUdyb3VwKGZpbGVHcm91cCksCi0gICAgICAgIG1GaWxlUGVybWlzc2lvbihmaWxlUGVybSksCi0gICAgICAgIG1EaXJlY3RvcnlQZXJtaXNzaW9uKGRpcmVjdG9yeVBlcm0pLAogICAgICAgICBtRGV2aWNlSW5mb01hbnVmYWN0dXJlcihkZXZpY2VJbmZvTWFudWZhY3R1cmVyKSwKICAgICAgICAgbURldmljZUluZm9Nb2RlbChkZXZpY2VJbmZvTW9kZWwpLAogICAgICAgICBtRGV2aWNlSW5mb0RldmljZVZlcnNpb24oZGV2aWNlSW5mb0RldmljZVZlcnNpb24pLApAQCAtMTI1LDE1ICsxMjUsMTkgQEAKIElNdHBIYW5kbGUqIE10cFNlcnZlcjo6c0hhbmRsZSA9IG51bGxwdHI7CiAKIGludCBNdHBTZXJ2ZXI6OmNvbmZpZ3VyZShib29sIHVzZVB0cCkgeworICAgIGJvb2wgZmZzX29rID0gYWNjZXNzKEZGU19NVFBfRVAwLCBXX09LKSA9PSAwOwogICAgIGlmIChzSGFuZGxlID09IG51bGxwdHIpIHsKLSAgICAgICAgYm9vbCBmZnNfb2sgPSBhY2Nlc3MoRkZTX01UUF9FUDAsIFdfT0spID09IDA7Ci0gICAgICAgIHNIYW5kbGUgPSBmZnNfb2sgPyBnZXRfZmZzX2hhbmRsZSgpIDogZ2V0X210cF9oYW5kbGUoKTsKKyAgICAgICAgaWYgKGZmc19vaykgeworICAgICAgICAgICAgYm9vbCBhaW9fY29tcGF0ID0gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJzeXMudXNiLmZmcy5haW9fY29tcGF0IiwgZmFsc2UpOworICAgICAgICAgICAgc0hhbmRsZSA9IGFpb19jb21wYXQgPyBuZXcgTXRwRmZzQ29tcGF0SGFuZGxlKCkgOiBuZXcgTXRwRmZzSGFuZGxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzSGFuZGxlID0gbmV3IE10cERldkhhbmRsZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50IHJldCA9IHNIYW5kbGUtPmNvbmZpZ3VyZSh1c2VQdHApOwogICAgIGlmIChyZXQpIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIE1UUCBkcml2ZXIhIik7CiAgICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoInN5cy51c2IuZmZzLm10cC5yZWFkeSIsICIxIik7Ci0KICAgICByZXR1cm4gcmV0OwogfQogCkBAIC00MjksNiArNDMzLDEyIEBACiAgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUOgogICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0RlbGV0ZU9iamVjdCgpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9Db3B5T2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb01vdmVPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0M6CiAgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcERlc2MoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODc4LDYgKzg4OCw3IEBACiAgICAgICAgIGxlbmd0aCA9IGZpbGVMZW5ndGggLSBvZmZzZXQ7CiAKICAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopcGF0aEJ1ZjsKKyAgICBBTE9HVigic2VuZGluZyBwYXJ0aWFsICVzICUiIFBSSXU2NCAiICUiIFBSSXUzMiwgZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwogICAgIG1mci5mZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKICAgICBpZiAobWZyLmZkIDwgMCkgewpAQCAtOTg3LDEyICs5OTgsOSBAQAogICAgIH0KIAogICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKLSAgICAgICAgbW9kZV90IG1hc2sgPSB1bWFzaygwKTsKLSAgICAgICAgaW50IHJldCA9IG1rZGlyKChjb25zdCBjaGFyICopcGF0aCwgbURpcmVjdG9yeVBlcm1pc3Npb24pOwotICAgICAgICB1bWFzayhtYXNrKTsKLSAgICAgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKKyAgICAgICAgaW50IHJldCA9IG1ha2VGb2xkZXIoKGNvbnN0IGNoYXIgKilwYXRoKTsKKyAgICAgICAgaWYgKHJldCkKICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKLSAgICAgICAgY2hvd24oKGNvbnN0IGNoYXIgKilwYXRoLCBnZXR1aWQoKSwgbUZpbGVHcm91cCk7CiAKICAgICAgICAgLy8gU2VuZE9iamVjdCBkb2VzIG5vdCBnZXQgc2VudCBmb3IgZGlyZWN0b3JpZXMsIHNvIGNhbGwgZW5kU2VuZE9iamVjdCBoZXJlIGluc3RlYWQKICAgICAgICAgbURhdGFiYXNlLT5lbmRTZW5kT2JqZWN0KHBhdGgsIGhhbmRsZSwgTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiwgTVRQX1JFU1BPTlNFX09LKTsKQEAgLTEwMTEsNiArMTAxOSwxNTIgQEAKICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOwogfQogCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb01vdmVPYmplY3QoKSB7CisgICAgaWYgKCFoYXNTdG9yYWdlKCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICBpZiAobVJlcXVlc3QuZ2V0UGFyYW1ldGVyQ291bnQoKSA8IDMpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdEhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHN0b3JhZ2VJRCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworICAgIE10cFN0cmluZyBwYXRoOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQ7CisKKyAgICBNdHBTdHJpbmcgZnJvbVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQ7CisgICAgTXRwT2JqZWN0SW5mbyBpbmZvKG9iamVjdEhhbmRsZSk7CisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RJbmZvKG9iamVjdEhhbmRsZSwgaW5mbyk7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChvYmplY3RIYW5kbGUsIGZyb21QYXRoLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLy8gc3BlY2lhbCBjYXNlIHRoZSByb290CisgICAgaWYgKHBhcmVudCA9PSAwKSB7CisgICAgICAgIHBhdGggPSBzdG9yYWdlLT5nZXRQYXRoKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCBwYXJlbnRMZW5ndGg7CisgICAgICAgIE10cE9iamVjdEZvcm1hdCBwYXJlbnRGb3JtYXQ7CisgICAgICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgocGFyZW50LCBwYXRoLCBwYXJlbnRMZW5ndGgsIHBhcmVudEZvcm1hdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKHBhcmVudEZvcm1hdCAhPSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKHBhdGhbcGF0aC5zaXplKCkgLSAxXSAhPSAnLycpCisgICAgICAgIHBhdGggKz0gIi8iOworICAgIHBhdGggKz0gaW5mby5tTmFtZTsKKworICAgIGlmIChpbmZvLm1TdG9yYWdlSUQgPT0gc3RvcmFnZUlEKSB7CisgICAgICAgIEFMT0dWKCJNb3ZpbmcgZmlsZSBmcm9tICVzIHRvICVzIiwgKGNvbnN0IGNoYXIqKWZyb21QYXRoLCAoY29uc3QgY2hhciopcGF0aCk7CisgICAgICAgIGlmIChyZW5hbWUoZnJvbVBhdGgsIHBhdGgpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVuYW1lKCkgZmFpbGVkIGZyb20gIiA8PCBmcm9tUGF0aCA8PCAiIHRvICIgPDwgcGF0aDsKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk1vdmluZyBhY3Jvc3Mgc3RvcmFnZXMgZnJvbSAlcyB0byAlcyIsIChjb25zdCBjaGFyKilmcm9tUGF0aCwgKGNvbnN0IGNoYXIqKXBhdGgpOworICAgICAgICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgICAgIGludCByZXQgPSBtYWtlRm9sZGVyKChjb25zdCBjaGFyICopcGF0aCk7CisgICAgICAgICAgICByZXQgKz0gY29weVJlY3Vyc2l2ZShmcm9tUGF0aCwgcGF0aCk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlbGV0ZVBhdGgoZnJvbVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvcHlGaWxlKGZyb21QYXRoLCBwYXRoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWxldGVQYXRoKGZyb21QYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSBtb3ZlIGZhaWxlZCwgdW5kbyB0aGUgZGF0YWJhc2UgY2hhbmdlCisgICAgaWYgKHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+bW92ZU9iamVjdChvYmplY3RIYW5kbGUsIHBhcmVudCwgc3RvcmFnZUlELCBwYXRoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvQ29weU9iamVjdCgpIHsKKyAgICBpZiAoIWhhc1N0b3JhZ2UoKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgaWYgKG1SZXF1ZXN0LmdldFBhcmFtZXRlckNvdW50KCkgPCAzKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOworICAgIE10cE9iamVjdEhhbmRsZSBvYmplY3RIYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gZ2V0U3RvcmFnZShzdG9yYWdlSUQpOworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7CisgICAgaWYgKCFzdG9yYWdlKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKKyAgICBNdHBTdHJpbmcgcGF0aDsKKworICAgIE10cFN0cmluZyBmcm9tUGF0aDsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdDsKKyAgICBNdHBPYmplY3RJbmZvIGluZm8ob2JqZWN0SGFuZGxlKTsKKyAgICByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEluZm8ob2JqZWN0SGFuZGxlLCBpbmZvKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKG9iamVjdEhhbmRsZSwgZnJvbVBhdGgsIGZpbGVMZW5ndGgsIGZvcm1hdCk7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgdGhlIHJvb3QKKyAgICBpZiAocGFyZW50ID09IDApIHsKKyAgICAgICAgcGF0aCA9IHN0b3JhZ2UtPmdldFBhdGgoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHBhcmVudExlbmd0aDsKKyAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IHBhcmVudEZvcm1hdDsKKyAgICAgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChwYXJlbnQsIHBhdGgsIHBhcmVudExlbmd0aCwgcGFyZW50Rm9ybWF0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAocGFyZW50Rm9ybWF0ICE9IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSRU5UX09CSkVDVDsKKyAgICB9CisKKyAgICAvLyBjaGVjayBzcGFjZSBmaXJzdAorICAgIGlmICgodWludDY0X3QpIGZpbGVMZW5ndGggPiBzdG9yYWdlLT5nZXRGcmVlU3BhY2UoKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TVE9SQUdFX0ZVTEw7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aCArPSAiLyI7CisgICAgcGF0aCArPSBpbmZvLm1OYW1lOworCisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5TZW5kT2JqZWN0KChjb25zdCBjaGFyKilwYXRoLAorICAgICAgICAgICAgZm9ybWF0LCBwYXJlbnQsIHN0b3JhZ2VJRCwgZmlsZUxlbmd0aCwgaW5mby5tRGF0ZU1vZGlmaWVkKTsKKyAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HVigiQ29weWluZyBmaWxlIGZyb20gJXMgdG8gJXMiLCAoY29uc3QgY2hhciopZnJvbVBhdGgsIChjb25zdCBjaGFyKilwYXRoKTsKKyAgICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgaW50IHJldCA9IG1ha2VGb2xkZXIoKGNvbnN0IGNoYXIgKilwYXRoKTsKKyAgICAgICAgcmV0ICs9IGNvcHlSZWN1cnNpdmUoZnJvbVBhdGgsIHBhdGgpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjb3B5RmlsZShmcm9tUGF0aCwgcGF0aCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgbURhdGFiYXNlLT5lbmRTZW5kT2JqZWN0KHBhdGgsIGhhbmRsZSwgZm9ybWF0LCByZXN1bHQpOworICAgIGlmIChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTikKKyAgICAgICAgbURhdGFiYXNlLT5kb1NjYW5EaXJlY3RvcnkocGF0aCk7CisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKIE10cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2VuZE9iamVjdCgpIHsKICAgICBpZiAoIWhhc1N0b3JhZ2UoKSkKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwpAQCAtMTA0MiwxMCArMTE5NiwxMCBAQAogICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KLSAgICBmY2hvd24obWZyLmZkLCBnZXR1aWQoKSwgbUZpbGVHcm91cCk7CisgICAgZmNob3duKG1mci5mZCwgZ2V0dWlkKCksIEZJTEVfR1JPVVApOwogICAgIC8vIHNldCBwZXJtaXNzaW9ucwogICAgIG1hc2sgPSB1bWFzaygwKTsKLSAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOworICAgIGZjaG1vZChtZnIuZmQsIEZJTEVfUEVSTSk7CiAgICAgdW1hc2sobWFzayk7CiAKICAgICBpZiAoaW5pdGlhbERhdGEgPiAwKSB7CkBAIC0xMTE1LDY1ICsxMjY5LDYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCBkZWxldGVSZWN1cnNpdmUoY29uc3QgY2hhciogcGF0aCkgewotICAgIGNoYXIgcGF0aGJ1ZltQQVRIX01BWF07Ci0gICAgc2l6ZV90IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7Ci0gICAgaWYgKHBhdGhMZW5ndGggPj0gc2l6ZW9mKHBhdGhidWYpIC0gMSkgewotICAgICAgICBBTE9HRSgicGF0aCB0b28gbG9uZzogJXNcbiIsIHBhdGgpOwotICAgIH0KLSAgICBzdHJjcHkocGF0aGJ1ZiwgcGF0aCk7Ci0gICAgaWYgKHBhdGhidWZbcGF0aExlbmd0aCAtIDFdICE9ICcvJykgewotICAgICAgICBwYXRoYnVmW3BhdGhMZW5ndGgrK10gPSAnLyc7Ci0gICAgfQotICAgIGNoYXIqIGZpbGVTcG90ID0gcGF0aGJ1ZiArIHBhdGhMZW5ndGg7Ci0gICAgaW50IHBhdGhSZW1haW5pbmcgPSBzaXplb2YocGF0aGJ1ZikgLSBwYXRoTGVuZ3RoIC0gMTsKLQotICAgIERJUiogZGlyID0gb3BlbmRpcihwYXRoKTsKLSAgICBpZiAoIWRpcikgewotICAgICAgICBBTE9HRSgib3BlbmRpciAlcyBmYWlsZWQ6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OwotICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBlbnRyeS0+ZF9uYW1lOwotCi0gICAgICAgIC8vIGlnbm9yZSAiLiIgYW5kICIuLiIKLSAgICAgICAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09IDAgfHwgKG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gMCkpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBuYW1lTGVuZ3RoID0gc3RybGVuKG5hbWUpOwotICAgICAgICBpZiAobmFtZUxlbmd0aCA+IHBhdGhSZW1haW5pbmcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJwYXRoICVzLyVzIHRvbyBsb25nXG4iLCBwYXRoLCBuYW1lKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LT5kX3R5cGUgPT0gRFRfRElSKSB7Ci0gICAgICAgICAgICBkZWxldGVSZWN1cnNpdmUocGF0aGJ1Zik7Ci0gICAgICAgICAgICBybWRpcihwYXRoYnVmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVubGluayhwYXRoYnVmKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjbG9zZWRpcihkaXIpOwotfQotCi1zdGF0aWMgdm9pZCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7Ci0gICAgICAgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKLSAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoKTsKLSAgICAgICAgICAgIHJtZGlyKHBhdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdW5saW5rKHBhdGgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoImRlbGV0ZVBhdGggc3RhdCBmYWlsZWQgZm9yICVzOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotfQotCiBNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0RlbGV0ZU9iamVjdCgpIHsKICAgICBpZiAoIWhhc1N0b3JhZ2UoKSkKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggMDhhOWU0YS4uMDIwNGIwOSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtNDMsMTIgKzQzLDYgQEAKICAgICAvLyBhcHBlYXIgYXMgYSBQVFAgZGV2aWNlCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUHRwOwogCi0gICAgLy8gZ3JvdXAgdG8gb3duIG5ldyBmaWxlcyBhbmQgZm9sZGVycwotICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVHcm91cDsKLSAgICAvLyBwZXJtaXNzaW9ucyBmb3IgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcwotICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVQZXJtaXNzaW9uOwotICAgIGludCAgICAgICAgICAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb247Ci0KICAgICAvLyBNYW51ZmFjdHVyZXIgdG8gcmVwb3J0IGluIERldmljZUluZm8KICAgICBNdHBTdHJpbmcgICAgICAgICAgIG1EZXZpY2VJbmZvTWFudWZhY3R1cmVyOwogICAgIC8vIE1vZGVsIHRvIHJlcG9ydCBpbiBEZXZpY2VJbmZvCkBAIC0xMDUsNyArOTksNiBAQAogCiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIHB0cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9NYW51ZmFjdHVyZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9Nb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb0RldmljZVZlcnNpb24sCkBAIC0xNjEsNiArMTU0LDggQEAKICAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZE9iamVjdEluZm8oKTsKICAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZE9iamVjdCgpOwogICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9EZWxldGVPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvTW92ZU9iamVjdCgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9Db3B5T2JqZWN0KCk7CiAgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BEZXNjKCk7CiAgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldERldmljZVByb3BEZXNjKCk7CiAgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRQYXJ0aWFsT2JqZWN0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwIGIvbWVkaWEvbXRwL010cFV0aWxzLmNwcAppbmRleCBlYmYzNjAxLi4zZjU2NDhiIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTE2LDEzICsxNiwyNiBAQAogCiAjZGVmaW5lIExPR19UQUcgIk10cFV0aWxzIgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3NlbmRmaWxlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgIk10cFV0aWxzLmgiCiAKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY29uc3RleHByIHVuc2lnbmVkIGxvbmcgRklMRV9DT1BZX1NJWkUgPSAyNjIxNDQ7CisKIC8qCiBEYXRlVGltZSBzdHJpbmdzIGZvbGxvdyBhIGNvbXBhdGlibGUgc3Vic2V0IG9mIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIElTTyA4NjAxLCBhbmQKIHRha2UgdGhlIGZvcm0gb2YgYSBVbmljb2RlIHN0cmluZyBmb3JtYXR0ZWQgYXM6ICJZWVlZTU1ERFRoaG1tc3MucyIuIEluIHRoaXMKQEAgLTc4LDQgKzkxLDE0MiBAQAogICAgICAgICB0bS50bV9tZGF5LCB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7CiB9CiAKK2ludCBtYWtlRm9sZGVyKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBtb2RlX3QgbWFzayA9IHVtYXNrKDApOworICAgIGludCByZXQgPSBta2RpcigoY29uc3QgY2hhciAqKXBhdGgsIERJUl9QRVJNKTsKKyAgICB1bWFzayhtYXNrKTsKKyAgICBpZiAocmV0ICYmIHJldCAhPSAtRUVYSVNUKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGZvbGRlciAiIDw8IHBhdGg7CisgICAgICAgIHJldCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIGNob3duKChjb25zdCBjaGFyICopcGF0aCwgZ2V0dWlkKCksIEZJTEVfR1JPVVApOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIENvcGllcyB0YXJnZXQgcGF0aCBhbmQgYWxsIGNoaWxkcmVuIHRvIGRlc3RpbmF0aW9uIHBhdGguCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0aW5nIG51bWJlciBvZiBmYWlsdXJlcworICovCitpbnQgY29weVJlY3Vyc2l2ZShjb25zdCBjaGFyICpmcm9tUGF0aCwgY29uc3QgY2hhciAqdG9QYXRoKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RyaW5nIGZyb21QYXRoU3RyKGZyb21QYXRoKTsKKyAgICBzdHJpbmcgdG9QYXRoU3RyKHRvUGF0aCk7CisKKyAgICBESVIqIGRpciA9IG9wZW5kaXIoZnJvbVBhdGgpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuZGlyICIgPDwgZnJvbVBhdGggPDwgIiBmYWlsZWQiOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChmcm9tUGF0aFN0cltmcm9tUGF0aFN0ci5zaXplKCktMV0gIT0gJy8nKQorICAgICAgICBmcm9tUGF0aFN0ciArPSAnLyc7CisgICAgaWYgKHRvUGF0aFN0clt0b1BhdGhTdHIuc2l6ZSgpLTFdICE9ICcvJykKKyAgICAgICAgdG9QYXRoU3RyICs9ICcvJzsKKworICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OworICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBlbnRyeS0+ZF9uYW1lOworCisgICAgICAgIC8vIGlnbm9yZSAiLiIgYW5kICIuLiIKKyAgICAgICAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09IDAgfHwgKG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gMCkpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgb2xkRmlsZSA9IGZyb21QYXRoU3RyICsgbmFtZTsKKyAgICAgICAgc3RyaW5nIG5ld0ZpbGUgPSB0b1BhdGhTdHIgKyBuYW1lOworCisgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX0RJUikgeworICAgICAgICAgICAgcmV0ICs9IG1ha2VGb2xkZXIobmV3RmlsZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldCArPSBjb3B5UmVjdXJzaXZlKG9sZEZpbGUuY19zdHIoKSwgbmV3RmlsZS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCArPSBjb3B5RmlsZShvbGRGaWxlLmNfc3RyKCksIG5ld0ZpbGUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGNvcHlGaWxlKGNvbnN0IGNoYXIgKmZyb21QYXRoLCBjb25zdCBjaGFyICp0b1BhdGgpIHsKKyAgICBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZnJvbUZkKG9wZW4oZnJvbVBhdGgsIE9fUkRPTkxZKSk7CisgICAgaWYgKGZyb21GZCA9PSAtMSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gY29weSBmcm9tICIgPDwgZnJvbVBhdGg7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIHRvRmQob3Blbih0b1BhdGgsIE9fQ1JFQVQgfCBPX1dST05MWSwgRklMRV9QRVJNKSk7CisgICAgaWYgKHRvRmQgPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGNvcHkgdG8gIiA8PCB0b1BhdGg7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2ZmX3Qgb2Zmc2V0ID0gMDsKKworICAgIHN0cnVjdCBzdGF0IHNzdGF0ID0ge307CisgICAgaWYgKHN0YXQoZnJvbVBhdGgsICZzc3RhdCkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG9mZl90IGxlbmd0aCA9IHNzdGF0LnN0X3NpemU7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgICAgIHNzaXplX3QgdHJhbnNmZXJfbGVuZ3RoID0gc3RkOjptaW4obGVuZ3RoIC0gb2Zmc2V0LCAob2ZmX3QpIEZJTEVfQ09QWV9TSVpFKTsKKyAgICAgICAgcmV0ID0gc2VuZGZpbGUodG9GZCwgZnJvbUZkLCAmb2Zmc2V0LCB0cmFuc2Zlcl9sZW5ndGgpOworICAgICAgICBpZiAocmV0ICE9IHRyYW5zZmVyX2xlbmd0aCkgeworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ29weWluZyBmYWlsZWQhIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGF1dG8gZW5kID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZGlmZiA9IGVuZCAtIHN0YXJ0OworICAgIExPRyhERUJVRykgPDwgIkNvcGllZCBhIGZpbGUgd2l0aCBNVFAuIFRpbWU6ICIgPDwgZGlmZi5jb3VudCgpIDw8ICIgcywgU2l6ZTogIiA8PCBsZW5ndGggPDwKKyAgICAgICAgIiwgUmF0ZTogIiA8PCAoKGRvdWJsZSkgbGVuZ3RoKSAvIGRpZmYuY291bnQoKSA8PCAiIGJ5dGVzL3MiOworICAgIGNob3duKHRvUGF0aCwgZ2V0dWlkKCksIEZJTEVfR1JPVVApOworICAgIHJldHVybiByZXQgPT0gLTEgPyAtMSA6IDA7Cit9CisKK3ZvaWQgZGVsZXRlUmVjdXJzaXZlKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBzdHJpbmcgcGF0aFN0cihwYXRoKTsKKyAgICBpZiAocGF0aFN0cltwYXRoU3RyLnNpemUoKS0xXSAhPSAnLycpIHsKKyAgICAgICAgcGF0aFN0ciArPSAnLyc7CisgICAgfQorCisgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGgpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuZGlyICIgPDwgcGF0aCA8PCAiIGZhaWxlZCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeTsKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKKworICAgICAgICAvLyBpZ25vcmUgIi4iIGFuZCAiLi4iCisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcGF0aFN0ci5hcHBlbmQobmFtZSk7CisgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX0RJUikgeworICAgICAgICAgICAgZGVsZXRlUmVjdXJzaXZlKHBhdGhTdHIuY19zdHIoKSk7CisgICAgICAgICAgICBybWRpcihwYXRoU3RyLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5saW5rKHBhdGhTdHIuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2VkaXIoZGlyKTsKK30KKwordm9pZCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoKTsKKyAgICAgICAgICAgIHJtZGlyKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5saW5rKHBhdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImRlbGV0ZVBhdGggc3RhdCBmYWlsZWQgZm9yICIgPDwgcGF0aDs7CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmggYi9tZWRpYS9tdHAvTXRwVXRpbHMuaAppbmRleCA2MWY5MDU1Li5iN2M3MmY1IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwVXRpbHMuaAorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuaApAQCAtMTcsMTMgKzE3LDI1IEBACiAjaWZuZGVmIF9NVFBfVVRJTFNfSAogI2RlZmluZSBfTVRQX1VUSUxTX0gKIAorI2luY2x1ZGUgInByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIgorCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY29uc3RleHByIGludCBGSUxFX0dST1VQID0gQUlEX01FRElBX1JXOworY29uc3RleHByIGludCBGSUxFX1BFUk0gPSAwNjY0OworY29uc3RleHByIGludCBESVJfUEVSTSA9IDA3NzU7CisKIGJvb2wgcGFyc2VEYXRlVGltZShjb25zdCBjaGFyKiBkYXRlVGltZSwgdGltZV90JiBvdXRTZWNvbmRzKTsKIHZvaWQgZm9ybWF0RGF0ZVRpbWUodGltZV90IHNlY29uZHMsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlckxlbmd0aCk7CiAKK2ludCBtYWtlRm9sZGVyKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGNvcHlSZWN1cnNpdmUoY29uc3QgY2hhciAqZnJvbVBhdGgsIGNvbnN0IGNoYXIgKnRvUGF0aCk7CitpbnQgY29weUZpbGUoY29uc3QgY2hhciAqZnJvbVBhdGgsIGNvbnN0IGNoYXIgKnRvUGF0aCk7Cit2b2lkIGRlbGV0ZVJlY3Vyc2l2ZShjb25zdCBjaGFyKiBwYXRoKTsKK3ZvaWQgZGVsZXRlUGF0aChjb25zdCBjaGFyKiBwYXRoKTsKKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIF9NVFBfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL09XTkVSUyBiL21lZGlhL210cC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5MzA3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9PV05FUlMKQEAgLTAsMCArMSBAQAoremhhbmdqZXJyeUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmNwcCBiL21lZGlhL210cC9Qb3NpeEFzeW5jSU8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2M1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlBvc2l4QXN5bmNJTy5oIgorCituYW1lc3BhY2UgeworCit2b2lkIHJlYWRfZnVuYyhzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgeworICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKGFpb2NicC0+YWlvX2ZpbGRlcywKKyAgICAgICAgICAgICAgICBhaW9jYnAtPmFpb19idWYsIGFpb2NicC0+YWlvX25ieXRlcywgYWlvY2JwLT5haW9fb2Zmc2V0KSk7CisgICAgaWYgKGFpb2NicC0+cmV0ID09IC0xKSBhaW9jYnAtPmVycm9yID0gZXJybm87Cit9CisKK3ZvaWQgd3JpdGVfZnVuYyhzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgeworICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHB3cml0ZShhaW9jYnAtPmFpb19maWxkZXMsCisgICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOworICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOworfQorCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2Fpb2NiOjp+YWlvY2IoKSB7CisgICAgQ0hFQ0soIXRocmVhZC5qb2luYWJsZSgpKTsKK30KKworaW50IGFpb19yZWFkKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7CisgICAgYWlvY2JwLT50aHJlYWQgPSBzdGQ6OnRocmVhZChyZWFkX2Z1bmMsIGFpb2NicCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhaW9fd3JpdGUoc3RydWN0IGFpb2NiICphaW9jYnApIHsKKyAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHdyaXRlX2Z1bmMsIGFpb2NicCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhaW9fZXJyb3IoY29uc3Qgc3RydWN0IGFpb2NiICphaW9jYnApIHsKKyAgICByZXR1cm4gYWlvY2JwLT5lcnJvcjsKK30KKworc3NpemVfdCBhaW9fcmV0dXJuKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7CisgICAgcmV0dXJuIGFpb2NicC0+cmV0OworfQorCitpbnQgYWlvX3N1c3BlbmQoc3RydWN0IGFpb2NiICphaW9jYnBbXSwgaW50IG4sCisgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYWlvY2JwW2ldLT50aHJlYWQuam9pbigpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhaW9fcHJlcGFyZShzdHJ1Y3QgYWlvY2IgKmFpb2NicCwgdm9pZCogYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCkgeworICAgIGFpb2NicC0+YWlvX2J1ZiA9IGJ1ZjsKKyAgICBhaW9jYnAtPmFpb19vZmZzZXQgPSBvZmZzZXQ7CisgICAgYWlvY2JwLT5haW9fbmJ5dGVzID0gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmggYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwYWFlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9Qb3NpeEFzeW5jSU8uaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfUE9TSVhBU1lOQ0lPX0gKKyNkZWZpbmUgX1BPU0lYQVNZTkNJT19ICisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKioKKyAqIFByb3ZpZGVzIGEgc3Vic2V0IG9mIFBPU0lYIGFpbyBvcGVyYXRpb25zLgorICovCisKK3N0cnVjdCBhaW9jYiB7CisgICAgaW50IGFpb19maWxkZXM7CisgICAgdm9pZCAqYWlvX2J1ZjsKKworICAgIG9mZl90IGFpb19vZmZzZXQ7CisgICAgc2l6ZV90IGFpb19uYnl0ZXM7CisKKyAgICAvLyBVc2VkIGludGVybmFsbHkKKyAgICBzdGQ6OnRocmVhZCB0aHJlYWQ7CisgICAgc3NpemVfdCByZXQ7CisgICAgaW50IGVycm9yOworCisgICAgfmFpb2NiKCk7Cit9OworCisvLyBTdWJtaXQgYSByZXF1ZXN0IGZvciBJTyB0byBiZSBjb21wbGV0ZWQKK2ludCBhaW9fcmVhZChzdHJ1Y3QgYWlvY2IgKik7CitpbnQgYWlvX3dyaXRlKHN0cnVjdCBhaW9jYiAqKTsKKworLy8gU3VzcGVuZCBjdXJyZW50IHRocmVhZCB1bnRpbCBnaXZlbiBJTyBpcyBjb21wbGV0ZSwgYXQgd2hpY2ggcG9pbnQKKy8vIGl0cyByZXR1cm4gdmFsdWUgYW5kIGFueSBlcnJvcnMgY2FuIGJlIGFjY2Vzc2VkCisvLyBBbGwgc3VibWl0dGVkIHJlcXVlc3RzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3VzcGVuZC4KKy8vIGFpb2NiLT5haW9fYnVmIG11c3QgcmVmZXIgdG8gdmFsaWQgbWVtb3J5IHVudGlsIGFmdGVyIHRoZSBzdXNwZW5kIGNhbGwKK2ludCBhaW9fc3VzcGVuZChzdHJ1Y3QgYWlvY2IgKltdLCBpbnQsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKTsKK2ludCBhaW9fZXJyb3IoY29uc3Qgc3RydWN0IGFpb2NiICopOworc3NpemVfdCBhaW9fcmV0dXJuKHN0cnVjdCBhaW9jYiAqKTsKKworLy8gSGVscGVyIG1ldGhvZCBmb3Igc2V0dGluZyBhaW9jYiBtZW1iZXJzCit2b2lkIGFpb19wcmVwYXJlKHN0cnVjdCBhaW9jYiAqLCB2b2lkKiwgc2l6ZV90LCBvZmZfdCk7CisKKyNlbmRpZiAvLyBQT1NJWEFTWU5DSU9fSAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGZlNzAxOGIuLjA3NTAyMDggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMSw4ICszMSw5IEBACiB9CiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJhc3luY19pb190ZXN0IiwKLSAgICBzcmNzOiBbIkFzeW5jSU9fdGVzdC5jcHAiXSwKKyAgICBuYW1lOiAicG9zaXhfYXN5bmNfaW9fdGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3JjczogWyJQb3NpeEFzeW5jSU9fdGVzdC5jcHAiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJtdHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL0FzeW5jSU9fdGVzdC5jcHAgYi9tZWRpYS9tdHAvdGVzdHMvQXN5bmNJT190ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmNDUzOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvdGVzdHMvQXN5bmNJT190ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2RlZmluZSBMT0dfVEFHICJBc3luY0lPX3Rlc3QuY3BwIgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Rlc3RfdXRpbHMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQXN5bmNJTy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNvbnN0ZXhwciBpbnQgVEVTVF9QQUNLRVRfU0laRSA9IDUxMjsKLWNvbnN0ZXhwciBpbnQgUE9PTF9DT1VOVCA9IDEwOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZHVtbXlEYXRhU3RyID0KLSAgICAiLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3RcbiAqXG4gKiBMaWNlbnNlZCB1biIKLSAgICAiZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1cyIKLSAgICAiZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgYyIKLSAgICAib3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSIKLSAgICAiLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgcyIKLSAgICAib2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiICIKLSAgICAiQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MgbyIKLSAgICAiciBpbXBsaWVkLlxuICogU2UiOwotCi0KLWNsYXNzIEFzeW5jSU9UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgVGVtcG9yYXJ5RmlsZSBkdW1teV9maWxlOwotCi0gICAgQXN5bmNJT1Rlc3QoKSB7fQotICAgIH5Bc3luY0lPVGVzdCgpIHt9Ci19OwotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RSZWFkKSB7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgRVhQRUNUX0VRKHdyaXRlKGR1bW15X2ZpbGUuZmQsIGR1bW15RGF0YVN0ci5jX3N0cigpLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgc3RydWN0IGFpb2NiIGFpbzsKLSAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKLSAgICBhaW8uYWlvX2ZpbGRlcyA9IGR1bW15X2ZpbGUuZmQ7Ci0gICAgYWlvLmFpb19idWYgPSBidWY7Ci0gICAgYWlvLmFpb19vZmZzZXQgPSAwOwotICAgIGFpby5haW9fbmJ5dGVzID0gVEVTVF9QQUNLRVRfU0laRTsKLQotICAgIEVYUEVDVF9FUShhaW9fcmVhZCgmYWlvKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3JldHVybigmYWlvKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgRVhQRUNUX1NUUkVRKGJ1ZiwgZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwotfQotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RXcml0ZSkgewotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKLSAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwotICAgIHN0cnVjdCBhaW9jYiBhaW87Ci0gICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307Ci0gICAgYWlvLmFpb19maWxkZXMgPSBkdW1teV9maWxlLmZkOwotICAgIGFpby5haW9fYnVmID0gY29uc3RfY2FzdDxjaGFyKj4oZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwotICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKLSAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0KLSAgICBFWFBFQ1RfRVEoYWlvX3dyaXRlKCZhaW8pLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOwotICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7Ci19Ci0KLVRFU1RfRihBc3luY0lPVGVzdCwgdGVzdEVycm9yKSB7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgc3RydWN0IGFpb2NiIGFpbzsKLSAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKLSAgICBhaW8uYWlvX2ZpbGRlcyA9IC0xOwotICAgIGFpby5haW9fYnVmID0gY29uc3RfY2FzdDxjaGFyKj4oZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwotICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKLSAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0KLSAgICBFWFBFQ1RfRVEoYWlvX3dyaXRlKCZhaW8pLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOwotICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCAtMSk7Ci0gICAgRVhQRUNUX0VRKGFpb19lcnJvcigmYWlvKSwgRUJBREYpOwotfQotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RTcGxpY2VSZWFkKSB7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgaW50IHBpcGVGZFsyXTsKLSAgICBFWFBFQ1RfRVEocGlwZShwaXBlRmQpLCAwKTsKLSAgICBFWFBFQ1RfRVEod3JpdGUoZHVtbXlfZmlsZS5mZCwgZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBzdHJ1Y3QgYWlvY2IgYWlvOwotICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OwotICAgIGFpby5haW9fZmlsZGVzID0gZHVtbXlfZmlsZS5mZDsKLSAgICBhaW8uYWlvX3NpbmsgPSBwaXBlRmRbMV07Ci0gICAgYWlvLmFpb19vZmZzZXQgPSAwOwotICAgIGFpby5haW9fbmJ5dGVzID0gVEVTVF9QQUNLRVRfU0laRTsKLQotICAgIEVYUEVDVF9FUShhaW9fc3BsaWNlX3JlYWQoJmFpbyksIDApOwotICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIFRFU1RfUEFDS0VUX1NJWkUpOwotCi0gICAgRVhQRUNUX0VRKHJlYWQocGlwZUZkWzBdLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7Ci19Ci0KLVRFU1RfRihBc3luY0lPVGVzdCwgdGVzdFNwbGljZVdyaXRlKSB7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgaW50IHBpcGVGZFsyXTsKLSAgICBFWFBFQ1RfRVEocGlwZShwaXBlRmQpLCAwKTsKLSAgICBFWFBFQ1RfRVEod3JpdGUocGlwZUZkWzFdLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIHN0cnVjdCBhaW9jYiBhaW87Ci0gICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307Ci0gICAgYWlvLmFpb19maWxkZXMgPSBwaXBlRmRbMF07Ci0gICAgYWlvLmFpb19zaW5rID0gZHVtbXlfZmlsZS5mZDsKLSAgICBhaW8uYWlvX29mZnNldCA9IDA7Ci0gICAgYWlvLmFpb19uYnl0ZXMgPSBURVNUX1BBQ0tFVF9TSVpFOwotCi0gICAgRVhQRUNUX0VRKGFpb19zcGxpY2Vfd3JpdGUoJmFpbyksIDApOwotICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIEVYUEVDVF9FUShyZWFkKGR1bW15X2ZpbGUuZmQsIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKLX0KLQotVEVTVF9GKEFzeW5jSU9UZXN0LCB0ZXN0UG9vbFdyaXRlKSB7Ci0gICAgYWlvX3Bvb2xfd3JpdGVfaW5pdCgpOwotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKiBQT09MX0NPVU5UICsgMV07Ci0gICAgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKiBQT09MX0NPVU5UXSA9ICdcMCc7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFBPT0xfQ09VTlQ7IGkrKykgewotICAgICAgICBzdHJ1Y3QgYWlvY2IgKmFpb3AgPSBuZXcgc3RydWN0IGFpb2NiOwotICAgICAgICBhaW9wLT5haW9fZmlsZGVzID0gZHVtbXlfZmlsZS5mZDsKLSAgICAgICAgYWlvcC0+YWlvX3Bvb2xfYnVmID0gc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4obmV3IGNoYXJbVEVTVF9QQUNLRVRfU0laRV0pOwotICAgICAgICBtZW1jcHkoYWlvcC0+YWlvX3Bvb2xfYnVmLmdldCgpLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgICAgIGFpb3AtPmFpb19vZmZzZXQgPSBpICogVEVTVF9QQUNLRVRfU0laRTsKLSAgICAgICAgYWlvcC0+YWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0gICAgICAgIEVYUEVDVF9FUShhaW9fcG9vbF93cml0ZShhaW9wKSwgMCk7Ci0gICAgfQotICAgIGFpb19wb29sX2VuZCgpOwotICAgIEVYUEVDVF9FUShyZWFkKGR1bW15X2ZpbGUuZmQsIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlQpLCBURVNUX1BBQ0tFVF9TSVpFICogUE9PTF9DT1VOVCk7Ci0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFBPT0xfQ09VTlQ7IGkrKykKLSAgICAgICAgc3MgPDwgZHVtbXlEYXRhU3RyOwotCi0gICAgRVhQRUNUX1NUUkVRKGJ1Ziwgc3Muc3RyKCkuY19zdHIoKSk7Ci19Ci0KLVRFU1RfRihBc3luY0lPVGVzdCwgdGVzdFNwbGljZVBvb2xXcml0ZSkgewotICAgIGFpb19wb29sX3NwbGljZV9pbml0KCk7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlQgKyAxXTsKLSAgICBidWZbVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlRdID0gJ1wwJzsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUE9PTF9DT1VOVDsgaSsrKSB7Ci0gICAgICAgIGludCBwaXBlRmRbMl07Ci0gICAgICAgIEVYUEVDVF9FUShwaXBlKHBpcGVGZCksIDApOwotICAgICAgICBFWFBFQ1RfRVEod3JpdGUocGlwZUZkWzFdLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgICAgICBzdHJ1Y3QgYWlvY2IgKmFpb3AgPSBuZXcgc3RydWN0IGFpb2NiOwotICAgICAgICBhaW9wLT5haW9fZmlsZGVzID0gcGlwZUZkWzBdOwotICAgICAgICBhaW9wLT5haW9fc2luayA9IGR1bW15X2ZpbGUuZmQ7Ci0gICAgICAgIGFpb3AtPmFpb19vZmZzZXQgPSBpICogVEVTVF9QQUNLRVRfU0laRTsKLSAgICAgICAgYWlvcC0+YWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0gICAgICAgIEVYUEVDVF9FUShhaW9fcG9vbF93cml0ZShhaW9wKSwgMCk7Ci0gICAgfQotICAgIGFpb19wb29sX2VuZCgpOwotICAgIEVYUEVDVF9FUShyZWFkKGR1bW15X2ZpbGUuZmQsIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlQpLCBURVNUX1BBQ0tFVF9TSVpFICogUE9PTF9DT1VOVCk7Ci0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFBPT0xfQ09VTlQ7IGkrKykKLSAgICAgICAgc3MgPDwgZHVtbXlEYXRhU3RyOwotCi0gICAgRVhQRUNUX1NUUkVRKGJ1Ziwgc3Muc3RyKCkuY19zdHIoKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVfdGVzdC5jcHAgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwCmluZGV4IDU1NGY4NjcuLjljOTE2YjcgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVfdGVzdC5jcHAKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZmc0hhbmRsZV90ZXN0LmNwcApAQCAtMjUsMTMgKzI1LDEzIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlICJNdHBEZXNjcmlwdG9ycy5oIgogI2luY2x1ZGUgIk10cEZmc0hhbmRsZS5oIgorI2luY2x1ZGUgIk10cEZmc0NvbXBhdEhhbmRsZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNvbnN0ZXhwciBpbnQgTUFYX0ZJTEVfQ0hVTktfU0laRSA9IDMgKiAxMDI0ICogMTAyNDsKLQotY29uc3RleHByIGludCBURVNUX1BBQ0tFVF9TSVpFID0gNTEyOworY29uc3RleHByIGludCBURVNUX1BBQ0tFVF9TSVpFID0gNTAwOwogY29uc3RleHByIGludCBTTUFMTF9NVUxUID0gMzA7CiBjb25zdGV4cHIgaW50IE1FRF9NVUxUID0gNTEwOwogCkBAIC00MywxNyArNDMsMTkgQEAKICAgICAiLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgcyIKICAgICAib2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiICIKICAgICAiQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MgbyIKLSAgICAiciBpbXBsaWVkLlxuICogU2UiOworICAgICJyIGltIjsKIAogLyoqCiAgKiBGdW5jdGlvbmFsIHRlc3RzIGZvciB0aGUgTXRwRmZzSGFuZGxlIGNsYXNzLiBFbnN1cmVzIGhlYWRlciBhbmQgZGF0YSBpbnRlZ3JpdHkKICAqIGJ5IG1vY2tpbmcgZmZzIGVuZHBvaW50cyBhcyBwaXBlcyB0byBjYXB0dXJlIGlucHV0IC8gb3V0cHV0LgogICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIGNsYXNzIE10cEZmc0hhbmRsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKIHByb3RlY3RlZDoKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SU10cEhhbmRsZT4gaGFuZGxlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNdHBGZnNIYW5kbGU+IGhhbmRsZTsKIAogICAgIC8vIFBpcGVzIGZvciByZWFkaW5nIGVuZHBvaW50IGRhdGEKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgY29udHJvbDsKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgYnVsa19pbjsKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgYnVsa19vdXQ7CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGludHI7CkBAIC02Miw4OCArNjQsMTU0IEBACiAKICAgICBNdHBGZnNIYW5kbGVUZXN0KCkgewogICAgICAgICBpbnQgZmRbMl07Ci0gICAgICAgIGhhbmRsZSA9IHN0ZDo6dW5pcXVlX3B0cjxJTXRwSGFuZGxlPihnZXRfZmZzX2hhbmRsZSgpKTsKLSAgICAgICAgTXRwRmZzSGFuZGxlICpmZnNfaGFuZGxlID0gc3RhdGljX2Nhc3Q8TXRwRmZzSGFuZGxlKj4oaGFuZGxlLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoZmZzX2hhbmRsZSAhPSBOVUxMKTsKKyAgICAgICAgaGFuZGxlID0gc3RkOjptYWtlX3VuaXF1ZTxUPigpOworCisgICAgICAgIEVYUEVDVF9FUShwaXBlKGZkKSwgMCk7CisgICAgICAgIGNvbnRyb2wucmVzZXQoZmRbMF0pOworICAgICAgICBoYW5kbGUtPm1Db250cm9sLnJlc2V0KGZkWzFdKTsKIAogICAgICAgICBFWFBFQ1RfRVEocGlwZShmZCksIDApOwogICAgICAgICBFWFBFQ1RfRVEoZmNudGwoZmRbMF0sIEZfU0VUUElQRV9TWiwgMTA0ODU3NiksIDEwNDg1NzYpOwogICAgICAgICBidWxrX2luLnJlc2V0KGZkWzBdKTsKLSAgICAgICAgZmZzX2hhbmRsZS0+bUJ1bGtJbi5yZXNldChmZFsxXSk7CisgICAgICAgIGhhbmRsZS0+bUJ1bGtJbi5yZXNldChmZFsxXSk7CiAKICAgICAgICAgRVhQRUNUX0VRKHBpcGUoZmQpLCAwKTsKICAgICAgICAgRVhQRUNUX0VRKGZjbnRsKGZkWzBdLCBGX1NFVFBJUEVfU1osIDEwNDg1NzYpLCAxMDQ4NTc2KTsKICAgICAgICAgYnVsa19vdXQucmVzZXQoZmRbMV0pOwotICAgICAgICBmZnNfaGFuZGxlLT5tQnVsa091dC5yZXNldChmZFswXSk7CisgICAgICAgIGhhbmRsZS0+bUJ1bGtPdXQucmVzZXQoZmRbMF0pOwogCiAgICAgICAgIEVYUEVDVF9FUShwaXBlKGZkKSwgMCk7CiAgICAgICAgIGludHIucmVzZXQoZmRbMF0pOwotICAgICAgICBmZnNfaGFuZGxlLT5tSW50ci5yZXNldChmZFsxXSk7CisgICAgICAgIGhhbmRsZS0+bUludHIucmVzZXQoZmRbMV0pOwogCi0gICAgICAgIGZmc19oYW5kbGUtPm1CdWZmZXIxLnJlc2l6ZShNQVhfRklMRV9DSFVOS19TSVpFKTsKLSAgICAgICAgZmZzX2hhbmRsZS0+bUJ1ZmZlcjIucmVzaXplKE1BWF9GSUxFX0NIVU5LX1NJWkUpOworICAgICAgICBFWFBFQ1RfRVEoaGFuZGxlLT5zdGFydCgpLCAwKTsKICAgICB9CiAKLSAgICB+TXRwRmZzSGFuZGxlVGVzdCgpIHt9CisgICAgfk10cEZmc0hhbmRsZVRlc3QoKSB7CisgICAgICAgIGhhbmRsZS0+Y2xvc2UoKTsKKyAgICB9CiB9OwogCi1URVNUX0YoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFJlYWQpIHsKLSAgICBFWFBFQ1RfRVEod3JpdGUoYnVsa19vdXQsIGR1bW15RGF0YVN0ci5jX3N0cigpLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7Cit0eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8TXRwRmZzSGFuZGxlLCBNdHBGZnNDb21wYXRIYW5kbGU+IG10cEhhbmRsZXM7CitUWVBFRF9URVNUX0NBU0UoTXRwRmZzSGFuZGxlVGVzdCwgbXRwSGFuZGxlcyk7CisKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdENvbnRyb2wpIHsKKyAgICBFWFBFQ1RfVFJVRSh0aGlzLT5oYW5kbGUtPndyaXRlRGVzY3JpcHRvcnMoKSk7CisgICAgc3RydWN0IGRlc2NfdjIgZGVzYzsKKyAgICBzdHJ1Y3QgZnVuY3Rpb25mc19zdHJpbmdzIHN0cmluZ3M7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+Y29udHJvbCwgJmRlc2MsIHNpemVvZihkZXNjKSksIChsb25nKXNpemVvZihkZXNjKSk7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+Y29udHJvbCwgJnN0cmluZ3MsIHNpemVvZihzdHJpbmdzKSksIChsb25nKXNpemVvZihzdHJpbmdzKSk7CisgICAgRVhQRUNUX1RSVUUoc3RkOjptZW1jbXAoJmRlc2MsICZtdHBfZGVzY192Miwgc2l6ZW9mKGRlc2MpKSA9PSAwKTsKKyAgICBFWFBFQ1RfVFJVRShzdGQ6Om1lbWNtcCgmc3RyaW5ncywgJm10cF9zdHJpbmdzLCBzaXplb2Yoc3RyaW5ncykpID09IDApOworfQorCitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWFkKSB7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmJ1bGtfb3V0LCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwogICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKICAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwotICAgIEVYUEVDVF9FUShoYW5kbGUtPnJlYWQoYnVmLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7CisgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+cmVhZChidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7CiB9CiAKLVRFU1RfRihNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0V3JpdGUpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFdyaXRlKSB7CiAgICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwogICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgRVhQRUNUX0VRKGhhbmRsZS0+d3JpdGUoZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfRVEocmVhZChidWxrX2luLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT53cml0ZShkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOworICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmJ1bGtfaW4sIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwogICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZVNtYWxsKSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZUVtcHR5KSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOworICAgIGludCBzaXplID0gMDsKKyAgICBjaGFyIGJ1ZltzaXplICsgMV07CisgICAgYnVmW3NpemVdID0gJ1wwJzsKKworICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBzaXplOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CisKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+YnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CisKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5kdW1teV9maWxlLmZkLCBidWYsIHNpemUpLCBzaXplKTsKK30KKworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0UmVjZWl2ZUZpbGVTbWFsbCkgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIG10cF9maWxlX3JhbmdlIG1mcjsKICAgICBpbnQgc2l6ZSA9IFRFU1RfUEFDS0VUX1NJWkUgKiBTTUFMTF9NVUxUOwogICAgIGNoYXIgYnVmW3NpemUgKyAxXTsKICAgICBidWZbc2l6ZV0gPSAnXDAnOwogCisgICAgbWZyLm9mZnNldCA9IDA7CiAgICAgbWZyLmxlbmd0aCA9IHNpemU7Ci0gICAgbWZyLmZkID0gZHVtbXlfZmlsZS5mZDsKKyAgICBtZnIuZmQgPSB0aGlzLT5kdW1teV9maWxlLmZkOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU01BTExfTVVMVDsgaSsrKQogICAgICAgICBzcyA8PCBkdW1teURhdGFTdHI7CiAKLSAgICBFWFBFQ1RfRVEod3JpdGUoYnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKLSAgICBFWFBFQ1RfRVEoaGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmJ1bGtfb3V0LCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+cmVjZWl2ZUZpbGUobWZyLCBmYWxzZSksIDApOwogCi0gICAgRVhQRUNUX0VRKHJlYWQoZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+ZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CiAKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBzcy5zdHIoKS5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZU1lZCkgeworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0UmVjZWl2ZUZpbGVNZWQpIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKICAgICBtdHBfZmlsZV9yYW5nZSBtZnI7CiAgICAgaW50IHNpemUgPSBURVNUX1BBQ0tFVF9TSVpFICogTUVEX01VTFQ7CiAgICAgY2hhciBidWZbc2l6ZSArIDFdOwogICAgIGJ1ZltzaXplXSA9ICdcMCc7CiAKKyAgICBtZnIub2Zmc2V0ID0gMDsKICAgICBtZnIubGVuZ3RoID0gc2l6ZTsKLSAgICBtZnIuZmQgPSBkdW1teV9maWxlLmZkOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRURfTVVMVDsgaSsrKQogICAgICAgICBzcyA8PCBkdW1teURhdGFTdHI7CiAKLSAgICBFWFBFQ1RfRVEod3JpdGUoYnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKLSAgICBFWFBFQ1RfRVEoaGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmJ1bGtfb3V0LCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+cmVjZWl2ZUZpbGUobWZyLCBmYWxzZSksIDApOwogCi0gICAgRVhQRUNUX0VRKHJlYWQoZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+ZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CiAKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBzcy5zdHIoKS5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZVNtYWxsKSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZU1lZFBhcnRpYWwpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBtdHBfZmlsZV9yYW5nZSBtZnI7CisgICAgaW50IHNpemUgPSBURVNUX1BBQ0tFVF9TSVpFICogTUVEX01VTFQ7CisgICAgY2hhciBidWZbc2l6ZSArIDFdOworICAgIGJ1ZltzaXplXSA9ICdcMCc7CisKKyAgICBtZnIuZmQgPSB0aGlzLT5kdW1teV9maWxlLmZkOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVEX01VTFQ7IGkrKykKKyAgICAgICAgc3MgPDwgZHVtbXlEYXRhU3RyOworCisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmJ1bGtfb3V0LCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CisKKyAgICBzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CisgICAgc3RkOjptdDE5OTM3IGdlbihyZCgpKTsKKyAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjw+IGRpcygxLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0ICE9IHNpemUpIHsKKyAgICAgICAgbWZyLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgaW50IGxlbmd0aCA9IHN0ZDo6bWluKHNpemUgLSBvZmZzZXQsIGRpcyhnZW4pKTsKKyAgICAgICAgbWZyLmxlbmd0aCA9IGxlbmd0aDsKKworICAgICAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CisgICAgICAgIG9mZnNldCArPSBsZW5ndGg7CisgICAgfQorCisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+ZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoYnVmLCBzcy5zdHIoKS5jX3N0cigpKTsKK30KKworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0U2VuZEZpbGVTbWFsbCkgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIG10cF9maWxlX3JhbmdlIG1mcjsKICAgICBtZnIuY29tbWFuZCA9IDQyOwpAQCAtMTU0LDE0ICsyMjIsMTQgQEAKICAgICBidWZbc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpXSA9ICdcMCc7CiAKICAgICBtZnIubGVuZ3RoID0gc2l6ZTsKLSAgICBtZnIuZmQgPSBkdW1teV9maWxlLmZkOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTTUFMTF9NVUxUOyBpKyspCiAgICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKIAotICAgIEVYUEVDVF9FUSh3cml0ZShkdW1teV9maWxlLmZkLCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7Ci0gICAgRVhQRUNUX0VRKGhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmR1bW15X2ZpbGUuZmQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKIAotICAgIEVYUEVDVF9FUShyZWFkKGJ1bGtfaW4sIGJ1Ziwgc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5idWxrX2luLCBidWYsIHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpKTsKIAogICAgIHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IG10cF9kYXRhX2hlYWRlcio+KGJ1Zik7CkBAIC0xNzIsNyArMjQwLDcgQEAKICAgICBFWFBFQ1RfRVEoaGVhZGVyLT50cmFuc2FjdGlvbl9pZCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigxMzM3KSk7CiB9CiAKLVRFU1RfRihNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0U2VuZEZpbGVNZWQpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRGaWxlTWVkKSB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOwogICAgIG1mci5jb21tYW5kID0gNDI7CkBAIC0xODMsMTQgKzI1MSwxNCBAQAogICAgIGJ1ZltzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcildID0gJ1wwJzsKIAogICAgIG1mci5sZW5ndGggPSBzaXplOwotICAgIG1mci5mZCA9IGR1bW15X2ZpbGUuZmQ7CisgICAgbWZyLmZkID0gdGhpcy0+ZHVtbXlfZmlsZS5mZDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1FRF9NVUxUOyBpKyspCiAgICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKIAotICAgIEVYUEVDVF9FUSh3cml0ZShkdW1teV9maWxlLmZkLCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7Ci0gICAgRVhQRUNUX0VRKGhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmR1bW15X2ZpbGUuZmQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKIAotICAgIEVYUEVDVF9FUShyZWFkKGJ1bGtfaW4sIGJ1Ziwgc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5idWxrX2luLCBidWYsIHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpKTsKIAogICAgIHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IG10cF9kYXRhX2hlYWRlcio+KGJ1Zik7CkBAIC0yMDEsMTAgKzI2OSwxMCBAQAogICAgIEVYUEVDVF9FUShoZWFkZXItPnRyYW5zYWN0aW9uX2lkLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDEzMzcpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZU1lZFBhcnRpYWwpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRGaWxlTWVkUGFydGlhbCkgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIG10cF9maWxlX3JhbmdlIG1mcjsKLSAgICBtZnIuZmQgPSBkdW1teV9maWxlLmZkOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CiAgICAgbWZyLmNvbW1hbmQgPSA0MjsKICAgICBtZnIudHJhbnNhY3Rpb25faWQgPSAxMzM3OwogICAgIGludCBzaXplID0gVEVTVF9QQUNLRVRfU0laRSAqIE1FRF9NVUxUOwpAQCAtMjE0LDcgKzI4Miw3IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRURfTVVMVDsgaSsrKQogICAgICAgICBzcyA8PCBkdW1teURhdGFTdHI7CiAKLSAgICBFWFBFQ1RfRVEod3JpdGUoZHVtbXlfZmlsZS5mZCwgc3Muc3RyKCkuY19zdHIoKSwgc2l6ZSksIHNpemUpOworICAgIEVYUEVDVF9FUSh3cml0ZSh0aGlzLT5kdW1teV9maWxlLmZkLCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CiAKICAgICBzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CiAgICAgc3RkOjptdDE5OTM3IGdlbihyZCgpKTsKQEAgLTIyNSw5ICsyOTMsOSBAQAogICAgICAgICBpbnQgbGVuZ3RoID0gc3RkOjptaW4oc2l6ZSAtIG9mZnNldCwgZGlzKGdlbikpOwogICAgICAgICBtZnIubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICBjaGFyIHRlbXBfYnVmW2xlbmd0aCArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpXTsKLSAgICAgICAgRVhQRUNUX0VRKGhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CisgICAgICAgIEVYUEVDVF9FUSh0aGlzLT5oYW5kbGUtPnNlbmRGaWxlKG1mciksIDApOwogCi0gICAgICAgIEVYUEVDVF9FUShyZWFkKGJ1bGtfaW4sIHRlbXBfYnVmLCBsZW5ndGggKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCisgICAgICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmJ1bGtfaW4sIHRlbXBfYnVmLCBsZW5ndGggKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZz4obGVuZ3RoICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpKTsKIAogICAgICAgICBzdHJ1Y3QgbXRwX2RhdGFfaGVhZGVyICpoZWFkZXIgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIqPih0ZW1wX2J1Zik7CkBAIC0yNDEsNyArMzA5LDcgQEAKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBzcy5zdHIoKS5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZUVtcHR5KSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZUVtcHR5KSB7CiAgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOwogICAgIG1mci5jb21tYW5kID0gNDI7CiAgICAgbWZyLnRyYW5zYWN0aW9uX2lkID0gMTMzNzsKQEAgLTI1MSwxMSArMzE5LDExIEBACiAgICAgYnVmW3NpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKV0gPSAnXDAnOwogCiAgICAgbWZyLmxlbmd0aCA9IHNpemU7Ci0gICAgbWZyLmZkID0gZHVtbXlfZmlsZS5mZDsKKyAgICBtZnIuZmQgPSB0aGlzLT5kdW1teV9maWxlLmZkOwogCi0gICAgRVhQRUNUX0VRKGhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CisgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CiAKLSAgICBFWFBFQ1RfRVEocmVhZChidWxrX2luLCBidWYsIHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+YnVsa19pbiwgYnVmLCBzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZz4oc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSk7CiAKICAgICBzdHJ1Y3QgbXRwX2RhdGFfaGVhZGVyICpoZWFkZXIgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIqPihidWYpOwpAQCAtMjY1LDE1ICszMzMsMTUgQEAKICAgICBFWFBFQ1RfRVEoaGVhZGVyLT50cmFuc2FjdGlvbl9pZCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigxMzM3KSk7CiB9CiAKLVRFU1RfRihNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0U2VuZEV2ZW50KSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRXZlbnQpIHsKICAgICBzdHJ1Y3QgbXRwX2V2ZW50IGV2ZW50OwogICAgIGV2ZW50Lmxlbmd0aCA9IFRFU1RfUEFDS0VUX1NJWkU7CiAgICAgZXZlbnQuZGF0YSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGR1bW15RGF0YVN0ci5jX3N0cigpKTsKICAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICsgMV07CiAgICAgYnVmW1RFU1RfUEFDS0VUX1NJWkVdID0gJ1wwJzsKIAotICAgIGhhbmRsZS0+c2VuZEV2ZW50KGV2ZW50KTsKLSAgICByZWFkKGludHIsIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSk7CisgICAgdGhpcy0+aGFuZGxlLT5zZW5kRXZlbnQoZXZlbnQpOworICAgIHJlYWQodGhpcy0+aW50ciwgYnVmLCBURVNUX1BBQ0tFVF9TSVpFKTsKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9fdGVzdC5jcHAgYi9tZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjlhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJQb3NpeEFzeW5jSU9fdGVzdC5jcHAiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGVzdF91dGlscy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJQb3NpeEFzeW5jSU8uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgaW50IFRFU1RfUEFDS0VUX1NJWkUgPSA1MTI7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBkdW1teURhdGFTdHIgPQorICAgICIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdFxuICpcbiAqIExpY2Vuc2VkIHVuIgorICAgICJkZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzIgorICAgICJlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjIgorICAgICJvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIgorICAgICItMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzIgorICAgICJvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgIgorICAgICJCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvIgorICAgICJyIGltcGxpZWQuXG4gKiBTZSI7CisKKworY2xhc3MgUG9zaXhBc3luY0lPVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIFRlbXBvcmFyeUZpbGUgZHVtbXlfZmlsZTsKKworICAgIFBvc2l4QXN5bmNJT1Rlc3QoKSB7fQorICAgIH5Qb3NpeEFzeW5jSU9UZXN0KCkge30KK307CisKK1RFU1RfRihQb3NpeEFzeW5jSU9UZXN0LCB0ZXN0UmVhZCkgeworICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKKyAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOworICAgIEVYUEVDVF9FUSh3cml0ZShkdW1teV9maWxlLmZkLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOworICAgIHN0cnVjdCBhaW9jYiBhaW87CisgICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307CisgICAgYWlvLmFpb19maWxkZXMgPSBkdW1teV9maWxlLmZkOworICAgIGFpby5haW9fYnVmID0gYnVmOworICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKKyAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7CisKKyAgICBFWFBFQ1RfRVEoYWlvX3JlYWQoJmFpbyksIDApOworICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7CisgICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIFRFU1RfUEFDS0VUX1NJWkUpOworICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKK30KKworVEVTVF9GKFBvc2l4QXN5bmNJT1Rlc3QsIHRlc3RXcml0ZSkgeworICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKKyAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOworICAgIHN0cnVjdCBhaW9jYiBhaW87CisgICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307CisgICAgYWlvLmFpb19maWxkZXMgPSBkdW1teV9maWxlLmZkOworICAgIGFpby5haW9fYnVmID0gY29uc3RfY2FzdDxjaGFyKj4oZHVtbXlEYXRhU3RyLmNfc3RyKCkpOworICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKKyAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7CisKKyAgICBFWFBFQ1RfRVEoYWlvX3dyaXRlKCZhaW8pLCAwKTsKKyAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOworICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7Cit9CisKK1RFU1RfRihQb3NpeEFzeW5jSU9UZXN0LCB0ZXN0RXJyb3IpIHsKKyAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICsgMV07CisgICAgYnVmW1RFU1RfUEFDS0VUX1NJWkVdID0gJ1wwJzsKKyAgICBzdHJ1Y3QgYWlvY2IgYWlvOworICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OworICAgIGFpby5haW9fZmlsZGVzID0gLTE7CisgICAgYWlvLmFpb19idWYgPSBjb25zdF9jYXN0PGNoYXIqPihkdW1teURhdGFTdHIuY19zdHIoKSk7CisgICAgYWlvLmFpb19vZmZzZXQgPSAwOworICAgIGFpby5haW9fbmJ5dGVzID0gVEVTVF9QQUNLRVRfU0laRTsKKworICAgIEVYUEVDVF9FUShhaW9fd3JpdGUoJmFpbyksIDApOworICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7CisgICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIC0xKTsKKyAgICBFWFBFQ1RfRVEoYWlvX2Vycm9yKCZhaW8pLCBFQkFERik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IDE5MzE0OTYuLjk5Y2Y1ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNDQsMTEgKzQ0LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlX2J1ZmZlci5oPgogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNiAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKK19fQkVHSU5fREVDTFMKIAogLyoqCiAgKiBBSW1hZ2UgaXMgYW4gb3BhcXVlIHR5cGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gaW1hZ2UgZ2VuZXJhdGVkIGJ5IHtAbGluayBBSW1hZ2VSZWFkZXJ9LgpAQCAtNTE5LDYgKzUxNSw4IEBACiAgICAgaW50MzJfdCBib3R0b207CiB9IEFJbWFnZUNyb3BSZWN0OwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI0CisKIC8qKgogICogUmV0dXJuIHRoZSBpbWFnZSBiYWNrIHRoZSB0aGUgc3lzdGVtIGFuZCBkZWxldGUgdGhlIEFJbWFnZSBvYmplY3QgZnJvbSBtZW1vcnkuCiAgKgpAQCAtNzY0LDkgKzc2Miw3IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorX19FTkRfREVDTFMKIAogI2VuZGlmIC8vX05ES19JTUFHRV9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCmluZGV4IDdhMGMxN2IuLmE4NjY3YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaApAQCAtNDIsMTEgKzQyLDcgQEAKICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrSW1hZ2UuaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI0CitfX0JFR0lOX0RFQ0xTCiAKIC8qKgogICogQUltYWdlIGlzIGFuIG9wYXF1ZSB0eXBlIHRoYXQgYWxsb3dzIGRpcmVjdCBhcHBsaWNhdGlvbiBhY2Nlc3MgdG8gaW1hZ2UgZGF0YSByZW5kZXJlZCBpbnRvIGEKQEAgLTU0LDYgKzUwLDggQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQUltYWdlUmVhZGVyIEFJbWFnZVJlYWRlcjsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAorCiAvKioKICAqIENyZWF0ZSBhIG5ldyByZWFkZXIgZm9yIGltYWdlcyBvZiB0aGUgZGVzaXJlZCBzaXplIGFuZCBmb3JtYXQuCiAgKgpAQCAtNDY1LDEwICs0NjMsNyBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorX19FTkRfREVDTFMKIAogI2VuZGlmIC8vX05ES19JTUFHRV9SRUFERVJfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKaW5kZXggN2U3ZTgxZS4uMTQ0ZGUyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaApAQCAtMzQsMTMgKzM0LDExIEBACiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKK19fQkVHSU5fREVDTFMKIAogc3RydWN0IEFOYXRpdmVXaW5kb3c7Cit0eXBlZGVmIHN0cnVjdCBBTmF0aXZlV2luZG93IEFOYXRpdmVXaW5kb3c7CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKIAogc3RydWN0IEFNZWRpYUNvZGVjOwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWMgQU1lZGlhQ29kZWM7CkBAIC02Miw2ICs2MCw4IEBACiAgICAgQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVIgPSAtMQogfTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorCiAvKioKICAqIENyZWF0ZSBjb2RlYyBieSBuYW1lLiBVc2UgdGhpcyBpZiB5b3Uga25vdyB0aGUgZXhhY3QgY29kZWMgeW91IHdhbnQgdG8gdXNlLgogICogV2hlbiBjb25maWd1cmluZywgeW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHRoZSBjb2RlYyBhcyBhbgpAQCAtMTQ5LDYgKzE0OSw3IEBACiAKICNpZiAoZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgfHwgXAogICAgIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTAorI2luY2x1ZGUgPGFzc2VydC5oPgogc3RhdGljX2Fzc2VydChzaXplb2YoX29mZl90X2NvbXBhdCkgPT0gc2l6ZW9mKGxvbmcpLAogICAgICAgICAgICAgICAiX29mZl90X2NvbXBhdCBkb2VzIG5vdCBtYXRjaCB0aGUgTkRLIEFCSS4gU2VlICIKICAgICAgICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyb2lkLW5kay9uZGsvaXNzdWVzLzQ1OS4iKTsKQEAgLTIwOCw2ICsyMDksOCBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZSgKICAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNgorCiAvKioKICAqIENyZWF0ZXMgYSBTdXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGlucHV0IHRvIGVuY29kZXIsIGluIHBsYWNlIG9mIGlucHV0IGJ1ZmZlcnMKICAqCkBAIC0yNzgsNyArMjgxLDcgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShBTWVkaWFDb2RlYyAqbURhdGEpOwogCi0KKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAogdHlwZWRlZiBlbnVtIHsKICAgICBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0NMRUFSID0gMCwKQEAgLTM2MCw4ICszNjMsNiBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKK19fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfTUVESUFfQ09ERUNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmgKaW5kZXggOTIzNjc2NS4uZDMxZGJkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oCkBAIC0zMiwxNyArMzIsMTUgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorX19CRUdJTl9ERUNMUwogCiBzdHJ1Y3QgQU1lZGlhQ3J5cHRvOwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ3J5cHRvIEFNZWRpYUNyeXB0bzsKIAogdHlwZWRlZiB1aW50OF90IEFNZWRpYVVVSURbMTZdOwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCisKIGJvb2wgQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCk7CiAKIGJvb2wgQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKTsKQEAgLTUzLDggKzUxLDYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9DUllQVE9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKaW5kZXggY2JhNDM4MC4uOWU5ZjRjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCkBAIC0zMywxMSArMzMsNyBAQAogCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKK19fQkVHSU5fREVDTFMKIAogc3RydWN0IEFNZWRpYURybTsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYURybSBBTWVkaWFEcm07CkBAIC01Miw3ICs0OCw2IEBACiB0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlTZXRJZDsKIHR5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNlY3VyZVN0b3A7CiAKLQogdHlwZWRlZiBlbnVtIEFNZWRpYURybUV2ZW50VHlwZSB7CiAgICAgLyoqCiAgICAgICogVGhpcyBldmVudCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBhcHAgbmVlZHMgdG8gcmVxdWVzdCBhIGNlcnRpZmljYXRlIGZyb20KQEAgLTgzLDYgKzc4LDcgQEAKIHR5cGVkZWYgdm9pZCAoKkFNZWRpYURybUV2ZW50TGlzdGVuZXIpKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKICAgICAgICAgQU1lZGlhRHJtRXZlbnRUeXBlIGV2ZW50VHlwZSwgaW50IGV4dHJhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YVNpemUpOwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCiAKIC8qKgogICogUXVlcnkgaWYgdGhlIGdpdmVuIHNjaGVtZSBpZGVudGlmaWVkIGJ5IGl0cyBVVUlEIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSwgYW5kCkBAIC00NTIsOCArNDQ4LDYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy9fTkRLX01FRElBX0RSTV9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKaW5kZXggMWI1MTM2NC4uZGE2MWI2NCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaApAQCAtMzAsMTEgKzMwLDcgQEAKIAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKK19fQkVHSU5fREVDTFMKIAogdHlwZWRlZiBlbnVtIHsKICAgICBBTUVESUFfT0sgPSAwLApAQCAtNjcsMTAgKzYzLDYgQEAKIAogfSBtZWRpYV9zdGF0dXNfdDsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAppbmRleCBjMzE4MGRjLi5iZjBlNDZkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTM1LDE1ICszNSwxMiBAQAogI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDIxCitfX0JFR0lOX0RFQ0xTCiAKIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3I7CiB0eXBlZGVmIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgQU1lZGlhRXh0cmFjdG9yOwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCiAKIC8qKgogICogQ3JlYXRlIG5ldyBtZWRpYSBleHRyYWN0b3IKQEAgLTE2Myw4ICsxNjAsNiBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKK19fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCBhMmEyMWQyLi4wMThhYjc2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTMyLDE1ICszMiwxMyBAQAogCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKK19fQkVHSU5fREVDTFMKIAogc3RydWN0IEFNZWRpYUZvcm1hdDsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYUZvcm1hdCBBTWVkaWFGb3JtYXQ7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKKwogQU1lZGlhRm9ybWF0ICpBTWVkaWFGb3JtYXRfbmV3KCk7CiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfZGVsZXRlKEFNZWRpYUZvcm1hdCopOwogCkBAIC0xMDksOCArMTA3LDYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oCmluZGV4IDI1OTg3YTIuLjFlY2QxY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmgKQEAgLTM1LDExICszNSw3IEBACiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorX19CRUdJTl9ERUNMUwogCiBzdHJ1Y3QgQU1lZGlhTXV4ZXI7CiB0eXBlZGVmIHN0cnVjdCBBTWVkaWFNdXhlciBBTWVkaWFNdXhlcjsKQEAgLTQ5LDYgKzQ1LDggQEAKICAgICBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX1dFQk0gICA9IDEsCiB9IE91dHB1dEZvcm1hdDsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorCiAvKioKICAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIKICAqLwpAQCAtMTE3LDggKzExNSw2IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfTVVYRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCAzOWYwNGZiLi45MWY0ZDM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMjU2OSw2ICsyNTY5LDcgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0LT5tRWZmZWN0Q2hhaW5zLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZWMgPSB0LT5tRWZmZWN0Q2hhaW5zW2pdOwogICAgICAgICAgICAgaWYgKGVjLT5zZXNzaW9uSWQoKSA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewpAQCAtMjU3OCw2ICsyNTc5LDcgQEAKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IHQgPSBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHQtPm1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBlYyA9IHQtPm1FZmZlY3RDaGFpbnNbal07CiAgICAgICAgICAgICBjaGFpbnMucHVzaChlYyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCmluZGV4IDY0NzVmMjIuLjJlNGZiOGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCkBAIC03OCw3ICs3OCwxMiBAQAogICAgIHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7CiAgICAgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKICAgICB1aW50MzJfdCBvbGRlc3RDbG9zZWQgPSBib3VuZHMgPj4gMTY7Ci0gICAgdWludDMyX3QgbiA9IChuZXdlc3RPcGVuIC0gb2xkZXN0Q2xvc2VkKSAmIDB4RkZGRjsKKworICAgIC8vdWludDMyX3QgbiA9IChuZXdlc3RPcGVuIC0gb2xkZXN0Q2xvc2VkKSAmIDB4RkZGRjsKKyAgICB1aW50MzJfdCBuOworICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3cobmV3ZXN0T3Blbiwgb2xkZXN0Q2xvc2VkLCAmbik7CisgICAgbiA9IG4gJiAweEZGRkY7CisKICAgICBpZiAobiA+IG1TYW1wbGluZ04pIHsKICAgICAgICAgQUxPR0UoInRvbyBtYW55IHNhbXBsZXMgJXUiLCBuKTsKICAgICAgICAgbiA9IG1TYW1wbGluZ047CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggZTIwMmNhNC4uMmFhMTRlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMzMwNywxMCArMzMwNywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhyZWFkTG9vcF9taXggKHNpZ25pZmljYW50IGZvciBoZWF2eSBtaXhpbmcsIGVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBvbiBsb3cgdGllciBwcm9jZXNzb3JzKQogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIE9LIGlmIGRlbHRhTXMgaXMgYW4gb3ZlcmVzdGltYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZWx0YU1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RXcml0ZUZpbmlzaGVkIC0gcHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZCkgLyAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCB0aHJvdHRsZU1zID0gbUhhbGZCdWZmZXJNcyAtIGRlbHRhTXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIE9LIGlmIGRlbHRhTXMgKGFuZCBkZWx0YU5zKSBpcyBhbiBvdmVyZXN0aW1hdGUuCisgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhTnM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWx0YU5zID0gbGFzdFdyaXRlRmluaXNoZWQgLSBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkOworICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCxwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLCAmZGVsdGFOcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlbHRhTXMgPSBkZWx0YU5zIC8gMTAwMDAwMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCB0aHJvdHRsZU1zID0gKGludDMyX3QpbUhhbGZCdWZmZXJNcyAtIGRlbHRhTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ25lZCltSGFsZkJ1ZmZlck1zID49IHRocm90dGxlTXMgJiYgdGhyb3R0bGVNcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAodGhyb3R0bGVNcyAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBvZiB0aHJvdHRsZSBzdGFydCBvbiB2ZXJib3NlIGxvZwpAQCAtNjc3NCw3ICs2Nzc4LDcgQEAKICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkbyBub3Qgd2FpdCBmb3IgdGhlIGV2ZW50IGZvciBtb3JlIHRoYW4gQXVkaW9TeXN0ZW06OmtTeW5jUmVjb3JkU3RhcnRUaW1lT3V0TXMKLSAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tRnJhbWVzVG9Ecm9wID0gLQorICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1GcmFtZXNUb0Ryb3AgPSAtKHNzaXplX3QpCiAgICAgICAgICAgICAgICAgICAgICgoQXVkaW9TeXN0ZW06OmtTeW5jUmVjb3JkU3RhcnRUaW1lT3V0TXMgKiByZWNvcmRUcmFjay0+bVNhbXBsZVJhdGUpIC8gMTAwMCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDBmMjUxNTMuLmZlOTMzNjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0xMTAxLDExICsxMTAxLDEyIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCB0eXBlKQogewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN5bmNFdmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TeW5jRXZlbnRzLnNpemUoKTspIHsKICAgICAgICAgaWYgKG1TeW5jRXZlbnRzW2ldLT50eXBlKCkgPT0gdHlwZSkgewogICAgICAgICAgICAgbVN5bmNFdmVudHNbaV0tPnRyaWdnZXIoKTsKICAgICAgICAgICAgIG1TeW5jRXZlbnRzLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgaS0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCA5MDlhZjA5Li43ZTc3ZTg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtNjIsNyArNjIsOCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IG4+Ci1jb25zdGV4cHIgVCBmbnYxYShjb25zdCBjaGFyICgmZmlsZSlbbl0sIGludCBpID0gbiAtIDEpIHsKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQorY29uc3RleHByIFQgZm52MWEoY29uc3QgY2hhciAoJmZpbGUpW25dLCBzc2l6ZV90IGkgPSAoc3NpemVfdCluIC0gMSkgewogICAgIHJldHVybiBpID09IC0xID8gb2Zmc2V0X2Jhc2lzPFQ+KCkgOiAoZm52MWE8VD4oZmlsZSwgaSAtIDEpIF4gZmlsZVtpXSkgKiBGTlZfcHJpbWU8VD4oKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGI0MTc2MzEuLjdhZjJlNzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTg1OSw3ICs4NTksNyBAQAogICAgIH0KIAogICAgIC8vIGNoZWNrIHNhbWUgcGVuZGluZyBjb21tYW5kcyB3aXRoIGxhdGVyIHRpbWUgc3RhbXBzIGFuZCBlbGltaW5hdGUgdGhlbQotICAgIGZvciAoaSA9IG1BdWRpb0NvbW1hbmRzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgIGZvciAoaSA9IChzc2l6ZV90KW1BdWRpb0NvbW1hbmRzLnNpemUoKS0xOyBpID49IDA7IGktLSkgewogICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQyID0gbUF1ZGlvQ29tbWFuZHNbaV07CiAgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBubyBuZWVkIHRvIHNjYW4gdGhlIHJlc3Qgb2YgbUF1ZGlvQ29tbWFuZHMKICAgICAgICAgaWYgKGNvbW1hbmQyLT5tVGltZSA8PSBjb21tYW5kLT5tVGltZSkgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA3ZWMzY2NiLi4xZmJiYTU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTkxLDkgKzkxLDYgQEAKIAogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgogCi0jIFdvcmthcm91bmQgZm9yIGludmFsaWQgdW51c2VkLWxhbWJkYS1jYXB0dXJlIHdhcm5pbmcgaHR0cDovL2IvMzgzNDk0OTEKLUxPQ0FMX0NMQU5HX0NGTEFHUyArPSAtV25vLWVycm9yPXVudXNlZC1sYW1iZGEtY2FwdHVyZQotCiBMT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmFzZXJ2aWNlCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMjBiZDVlNC4uNmFiZmE4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTI0MywyOSArMjQzLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIWNhbWVyYUZvdW5kKSB7Ci0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBjb3N0OwotICAgICAgICAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0UmVzb3VyY2VDb3N0KGNhbWVyYUlkLCAmY29zdCk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2UgcmVzb3VyY2UgY29zdDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gY29uZmxpY3Rpbmc7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uZmxpY3RpbmcuZW1wbGFjZShTdHJpbmc4KGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzW2ldLmNfc3RyKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKLSAgICAgICAgICAgICAgICBtQ2FtZXJhU3RhdGVzLmVtcGxhY2UoaWQ4LAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZDgsIGNvc3QucmVzb3VyY2VDb3N0LCBjb25mbGljdGluZykpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkU3RhdGVzKGlkOCk7CiAgICAgICAgIH0KIAogICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaWQ4LCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpOwotCi0gICAgICAgIGlmIChtRmxhc2hsaWdodC0+aGFzRmxhc2hVbml0KGlkOCkpIHsKLSAgICAgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5hZGQoaWQ4LCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMzAwLDYgKzI4MSwzMSBAQAogICAgIGVudW1lcmF0ZVByb3ZpZGVycygpOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmFkZFN0YXRlcyhjb25zdCBTdHJpbmc4IGlkKSB7CisgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQoaWQuY19zdHIoKSk7CisgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QgY29zdDsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRSZXNvdXJjZUNvc3QoY2FtZXJhSWQsICZjb3N0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgZGV2aWNlIHJlc291cmNlIGNvc3Q6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnNldDxTdHJpbmc4PiBjb25mbGljdGluZzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbmZsaWN0aW5nLmVtcGxhY2UoU3RyaW5nOChjb3N0LmNvbmZsaWN0aW5nRGV2aWNlc1tpXS5jX3N0cigpKSk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CisgICAgICAgIG1DYW1lcmFTdGF0ZXMuZW1wbGFjZShpZCwgc3RkOjptYWtlX3NoYXJlZDxDYW1lcmFTdGF0ZT4oaWQsIGNvc3QucmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nKSk7CisgICAgfQorCisgICAgaWYgKG1GbGFzaGxpZ2h0LT5oYXNGbGFzaFVuaXQoaWQpKSB7CisgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5hZGQoaWQsIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRik7CisgICAgfQorICAgIGxvZ0RldmljZUFkZGVkKGlkLCAiRGV2aWNlIGFkZGVkIik7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGlkLAogICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3SGFsU3RhdHVzKSB7CiAgICAgQUxPR0koIiVzOiBTdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JXMsIG5ld1N0YXR1cz0lZCIsIF9fRlVOQ1RJT05fXywKQEAgLTMxMSw4ICszMTcsMTMgQEAKIAogICAgIGlmIChzdGF0ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIGlmIChuZXdTdGF0dXMgPT0gU3RhdHVzSW50ZXJuYWw6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogVW5rbm93biBjYW1lcmEgSUQgJXMsIHByb2JhYmx5IG5ld2x5IHJlZ2lzdGVyZWQ/IiwKKyAgICAgICAgICAgIEFMT0dJKCIlczogVW5rbm93biBjYW1lcmEgSUQgJXMsIGEgbmV3IGNhbWVyYSBpcyBhZGRlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyBGaXJzdCBhZGQgYXMgYWJzZW50IHRvIG1ha2Ugc3VyZSBjbGllbnRzIGFyZSBub3RpZmllZCBiZWxvdworICAgICAgICAgICAgYWRkU3RhdGVzKGlkKTsKKworICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG5ld1N0YXR1cywgaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBCYWQgY2FtZXJhIElEICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgIH0KQEAgLTIyMjksOCArMjI0MCwxMSBAQAogICAgICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIG1PcHNBY3RpdmUgPSBmYWxzZTsKIAorICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IGRpc2Nvbm5lY3RzLiBUaGlzIHNob3VsZAorICAgICAgICAvLyByZWxlYXNlIHRoZSBjYW1lcmEsIGJ1dCBhY3R1YWxseSBvbmx5IGlmIGl0IHdhcyBpbiBhIHByb3BlcgorICAgICAgICAvLyBmdW5jdGlvbmFsIHN0YXRlLCBpLmUuIHdpdGggc3RhdHVzIE5PVF9BVkFJTEFCTEUKICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PFN0YXR1c0ludGVybmFsPiByZWplY3RlZCA9IHtTdGF0dXNJbnRlcm5hbDo6UFJFU0VOVCwKLSAgICAgICAgICAgICAgICBTdGF0dXNJbnRlcm5hbDo6RU5VTUVSQVRJTkd9OworICAgICAgICAgICAgICAgIFN0YXR1c0ludGVybmFsOjpFTlVNRVJBVElORywgU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UfTsKIAogICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIFBSRVNFTlQgaWYgdGhlIGNhbWVyYSBpcyBub3QgaW4gZWl0aGVyIG9mIHRoZSByZWplY3RlZCBzdGF0ZXMKICAgICAgICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6UFJFU0VOVCwKQEAgLTIzMjIsNyArMjMzNiw3IEBACiAKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBpZCwgaW50IGNvc3QsCiAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZykgOiBtSWQoaWQpLAotICAgICAgICBtU3RhdHVzKFN0YXR1c0ludGVybmFsOjpQUkVTRU5UKSwgbUNvc3QoY29zdCksIG1Db25mbGljdGluZyhjb25mbGljdGluZykge30KKyAgICAgICAgbVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6Tk9UX1BSRVNFTlQpLCBtQ29zdChjb3N0KSwgbUNvbmZsaWN0aW5nKGNvbmZsaWN0aW5nKSB7fQogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6fkNhbWVyYVN0YXRlKCkge30KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDZkNWRkZTguLmU5MzczYTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTUxMiw2ICs1MTIsOSBAQAogICAgIC8vIEV1bWVyYXRlIGFsbCBjYW1lcmEgcHJvdmlkZXJzIGluIHRoZSBzeXN0ZW0KICAgICBzdGF0dXNfdCBlbnVtZXJhdGVQcm92aWRlcnMoKTsKIAorICAgIC8vIEFkZCBhIG5ldyBjYW1lcmEgdG8gY2FtZXJhIGFuZCB0b3JjaCBzdGF0ZSBsaXN0cworICAgIHZvaWQgYWRkU3RhdGVzKGNvbnN0IFN0cmluZzggaWQpOworCiAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QsIGJlZm9yZSB3ZSBhY3F1aXJlIHRoZSBzZXJ2aWNlIGxvY2suCiAgICAgLy8gVGhlIHJldHVybmVkIG9yaWdpbmFsQ2xpZW50UGlkIGlzIHRoZSBQSUQgb2YgdGhlIG9yaWdpbmFsIHByb2Nlc3MgdGhhdCB3YW50cyB0byBjb25uZWN0IHRvCiAgICAgLy8gY2FtZXJhLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGE0MDdkMGIuLjkxMGRkNzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTEzNiw3ICsxMzYsMTIgQEAKICAgICBjb25zdCBjaGFyICplbmRkdW1wID0gIlxuXG4iOwogICAgIHdyaXRlKGZkLCBlbmRkdW1wLCBzdHJsZW4oZW5kZHVtcCkpOwogCi0gICAgcmV0dXJuIG1IYXJkd2FyZS0+ZHVtcChmZCwgYXJncyk7CisgICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGhhcmR3YXJlID0gbUhhcmR3YXJlOworICAgIGlmIChoYXJkd2FyZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZS0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIEFMT0dJKCIlczogY2FtZXJhIGRldmljZSBjbG9zZWQgYWxyZWFkeSwgc2tpcCBkdW1waW5nIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCA2ZmI1YzIxLi4wMmE3NjE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC0yMjAyLDYgKzIyMDIsMTQgQEAKICAgICAgICAgICAgICAgICBub3JtYWxpemVkWFRvQXJyYXkobWV0ZXJpbmdBcmVhc1tqXS5yaWdodCk7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAzXSA9CiAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFlUb0FycmF5KG1ldGVyaW5nQXJlYXNbal0uYm90dG9tKTsKKyAgICAgICAgICAgIC8vIFJlcXVlc3RlZCBzaXplIG1heSBiZSB6ZXJvIGJ5IHJvdW5kaW5nIGVycm9yIHdpdGgvd2l0aG91dCB6b29taW5nLgorICAgICAgICAgICAgLy8gVGhlIGFlIHJlZ2lvbnMgc2hvdWxkIGJlIGF0IGxlYXN0IDEgaWYgbWV0ZXJpbmcgd2lkdGgvaGVpZ2h0IGlzIG5vdCB6ZXJvLgorICAgICAgICAgICAgaWYgKHJlcU1ldGVyaW5nQXJlYXNbaSArIDBdID09IHJlcU1ldGVyaW5nQXJlYXNbaSArIDJdKSB7CisgICAgICAgICAgICAgICAgcmVxTWV0ZXJpbmdBcmVhc1tpICsgMl0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXFNZXRlcmluZ0FyZWFzW2kgKyAxXSA9PSByZXFNZXRlcmluZ0FyZWFzW2kgKyAzXSkgeworICAgICAgICAgICAgICAgIHJlcU1ldGVyaW5nQXJlYXNbaSArIDNdKys7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAwXSA9IDA7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAxXSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggYzAzZThhMi4uMDljMmQ4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtNjY4LDcgKzY2OCw3IEBACiAKICAgICBpZiAobUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQpIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQWxyZWFkeSBoYXMgYW4gaW5wdXQgc3RyZWFtICIKLSAgICAgICAgICAgICAgICAiY29uZmlndXJlZCAoSUQgJXpkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgbUlucHV0U3RyZWFtLmlkKTsKKyAgICAgICAgICAgICAgICAiY29uZmlndXJlZCAoSUQgJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBtSW5wdXRTdHJlYW0uaWQpOwogICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkgKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9BTFJFQURZX0VYSVNUUywgbXNnLnN0cmluZygpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IGU2YTZhMjEuLmFlM2JiYzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC0xMzQ0LDcgKzEzNDQsNyBAQAogICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKICAgICB9CiAKLSAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICBkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCmluZGV4IGZhZWIwYTcuLjFlYWQ5NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKQEAgLTE4LDE0ICsxOCwxNyBAQAogCiAjIHNlcnZpY2UgZXhlY3V0YWJsZQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjIHNlY2NvbXAgaXMgbm90IHJlcXVpcmVkIGZvciBjb3ZlcmFnZSBidWlsZC4KK2lmbmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IG1lZGlhY29kZWMucG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBtZWRpYWNvZGVjLnBvbGljeQorZW5kaWYKIExPQ0FMX1NSQ19GSUxFUyA6PSBtYWluX2NvZGVjc2VydmljZS5jcHAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYm1lZGlhX29teCBcCiAgICAgbGlibWVkaWFjb2RlY3NlcnZpY2UgXAogICAgIGxpYmJpbmRlciBcCiAgICAgbGlidXRpbHMgXAotICAgIGxpYmd1aSBcCiAgICAgbGlibG9nIFwKICAgICBsaWJiYXNlIFwKICAgICBsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciBcCkBAIC00NSw3ICs0OCw3IEBACiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAogIyBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5Ci1pZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIGFybSBhcm02NCkpCitpZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIHg4NiB4ODZfNjQgYXJtIGFybTY0KSkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IG1lZGlhY29kZWMucG9saWN5CiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy1hcm0ucG9saWN5CmluZGV4IGNiZDdmYjkuLmE3NTFiNGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy1hcm0ucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy1hcm0ucG9saWN5CkBAIC01Myw2ICs1Myw3IEBACiBmc3RhdGF0NjQ6IDEKIHVnZXRybGltaXQ6IDEKIGdldGRlbnRzNjQ6IDEKK2dldHJhbmRvbTogMQogCiAjIGZvciBhdHRhY2hpbmcgdG8gZGVidWdnZXJkIG9uIHByb2Nlc3MgY3Jhc2gKIHNpZ2FjdGlvbjogMQpAQCAtNjgsMyArNjksNCBAQAogcmVjdm1zZzogMQogZ2V0cGlkOiAxCiBnZXR0aWQ6IDEKK3Byb2Nlc3Nfdm1fcmVhZHY6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyYzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CkBAIC0wLDAgKzEsNjkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCitmc3RhdDY0OiAxCittYWR2aXNlOiAxCitmc3RhdGF0NjQ6IDEKK2Z1dGV4OiAxCittdW5tYXA6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorbHNlZWs6IDEKK2Nsb25lOiAxCitzaWdhbHRzdGFjazogMQorc2V0cHJpb3JpdHk6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCit1Z2V0cmxpbWl0OiAxCityZWFkbGlua2F0OiAxCitfbGxzZWVrOiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQorZHVwOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKKworIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCitzb2NrZXRjYWxsOiAxCitzaWdhY3Rpb246IDEKK3Rna2lsbDogMQorcnRfc2lncHJvY21hc2s6IDEKK2ZjbnRsNjQ6IDEKK3J0X3Rnc2lncXVldWVpbmZvOiAxCitnZXRldWlkMzI6IDEKK2dldGdpZDMyOiAxCitnZXRlZ2lkMzI6IDEKK2dldGdyb3VwczMyOiAxCitnZXRkZW50czY0OiAxCitwaXBlMjogMQorcHBvbGw6IDEKKworIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCitnZXR0aWQ6IDEKK3NjaGVkX3lpZWxkOiAxCitnZXRwaWQ6IDEKK2dldHRpZDogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKaW5kZXggMWViYjdmZi4uZDQxZGEzOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCkBAIC0zLDYgKzMsNyBAQAogIyBzZXJ2aWNlIGxpYnJhcnkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfU1JDX0ZJTEVTIDo9IE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYnN0YWdlZnJpZ2h0IGxpYmJpbmRlciBsaWJ1dGlscyBsaWJsb2cKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhZXh0cmFjdG9yc2VydmljZQogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpAQCAtMjEsNiArMjIsNyBAQAogTE9DQUxfTU9EVUxFOj0gbWVkaWFleHRyYWN0b3IKIExPQ0FMX0lOSVRfUkMgOj0gbWVkaWFleHRyYWN0b3IucmMKIExPQ0FMX0NfSU5DTFVERVMgOj0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYQorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCiAjIHNlcnZpY2Ugc2VjY29tcCBmaWx0ZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm0ucG9saWN5CmluZGV4IDIzZDM0OWQuLjRmYTY5ZDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtLnBvbGljeQpAQCAtMzksNiArMzksNyBAQAogZ2V0ZWdpZDMyOiAxCiBnZXRncm91cHMzMjogMQogbmFub3NsZWVwOiAxCitnZXRyYW5kb206IDEKIAogIyBmb3IgRmlsZVNvdXJjZQogcmVhZGxpbmthdDogMQpAQCAtNjEsMyArNjIsNCBAQAogcHBvbGw6IDEKIGdldHBpZDogMQogZ2V0dGlkOiAxCitwcm9jZXNzX3ZtX3JlYWR2OiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kKaW5kZXggNDJlMGQ3NS4uZWVkODA0YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeQpAQCAtMTksNiArMTksNyBAQAogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCiBjbG9uZTogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCiBsc2VlazogMQogbmV3ZnN0YXRhdDogMQogZmFjY2Vzc2F0OiAxCkBAIC0yOCwxMCArMjksMTAgQEAKIHJ0X3NpZ3JldHVybjogMQogZ2V0cmxpbWl0OiAxCiBuYW5vc2xlZXA6IDEKK2dldHJhbmRvbTogMQogCiAjIGZvciBGaWxlU291cmNlCiByZWFkbGlua2F0OiAxCi1fbGxzZWVrOiAxCiAKICMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAogdGdraWxsOiAxCkBAIC01MiwzICs1Myw0IEBACiBwcG9sbDogMQogZ2V0cGlkOiAxCiBnZXR0aWQ6IDEKK3Byb2Nlc3Nfdm1fcmVhZHY6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5CmluZGV4IDc2NDAzZjIuLjNiMzdmOTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Ni5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2LnBvbGljeQpAQCAtMzcsNiArMzcsNyBAQAogZ2V0ZWdpZDMyOiAxCiBnZXRncm91cHMzMjogMQogbmFub3NsZWVwOiAxCitnZXRyYW5kb206IDEKIAogIyBmb3IgRmlsZVNvdXJjZQogcmVhZGxpbmthdDogMQpAQCAtNTYsNiArNTcsNyBAQAogZ2V0ZGVudHM2NDogMQogcGlwZTI6IDEKIHBwb2xsOiAxCitwcm9jZXNzX3ZtX3JlYWR2OiAxCiAKICMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgogZ2V0dGlkOiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjgxMWQzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtMCwwICsxLDIxIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhbG9nc2VydmljZSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJJTWVkaWFMb2dTZXJ2aWNlLmNwcCIsCisgICAgICAgICJNZWRpYUxvZ1NlcnZpY2UuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjNiMTg2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gTWVkaWFMb2dTZXJ2aWNlLmNwcCBJTWVkaWFMb2dTZXJ2aWNlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmJpbmRlciBsaWJ1dGlscyBsaWJsb2cgbGlibmJhaW8gbGliYXVkaW91dGlscwotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJtZWRpYWxvZ3NlcnZpY2UKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLm1rCmluZGV4IGI2ZmNhY2MuLjY3MDU1YTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5tawpAQCAtMSw5ICsxLDEyIEBACiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKK21pbmlqYWlsX2NvbW1vbl9jZmxhZ3MgOj0gLVdhbGwgLVdlcnJvcgorCiAjIFNtYWxsIGxpYnJhcnkgZm9yIG1lZGlhLmV4dHJhY3RvciBhbmQgbWVkaWEuY29kZWMgc2FuZGJveGluZy4KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IGxpYmF2c2VydmljZXNfbWluaWphaWwKIExPQ0FMX1NSQ19GSUxFUyA6PSBtaW5pamFpbC5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAkKG1pbmlqYWlsX2NvbW1vbl9jZmxhZ3MpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmJhc2UgbGlibWluaWphaWwKIExPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCkBAIC0xMyw3ICsxNiw4IEBACiBMT0NBTF9NT0RVTEUgOj0gbGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IKIExPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfU1JDX0ZJTEVTIDo9IG1pbmlqYWlsLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJiYXNlIGxpYm1pbmlqYWlsX3ZlbmRvcgorTE9DQUxfQ0ZMQUdTIDo9ICQobWluaWphaWxfY29tbW9uX2NmbGFncykKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYmFzZSBsaWJtaW5pamFpbAogTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApAQCAtMjEsNSArMjUsNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gbGliYXZzZXJ2aWNlc19taW5pamFpbF91bml0dGVzdAogTE9DQUxfU1JDX0ZJTEVTIDo9IG1pbmlqYWlsLmNwcCBhdl9zZXJ2aWNlc19taW5pamFpbF91bml0dGVzdC5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAkKG1pbmlqYWlsX2NvbW1vbl9jZmxhZ3MpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmJhc2UgbGlibWluaWphaWwKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcAppbmRleCBjMzE1NTdlLi5mYjk5MWJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCkBAIC0xOCw2ICsxOCw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlICJTaGFyZWRNZW1vcnlQcm94eS5oIgogCg==